comunika_gsm 0.1.6 → 0.1.7
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/comunika_gsm.rb +1 -0
- data/lib/comunika_gsm/gsm.rb +68 -12
- data/lib/comunika_gsm/gsm2.rb +113 -0
- data/lib/comunika_gsm/js/pdu.js +0 -359
- data/lib/comunika_gsm/js/pdu.min.js +1 -1
- data/lib/comunika_gsm/js/pdu2.js +809 -0
- data/lib/comunika_gsm/modem.rb +19 -67
- data/lib/comunika_gsm/pdu.rb +35 -76
- data/lib/comunika_gsm/version.rb +1 -1
- metadata +4 -2
data/lib/comunika_gsm/modem.rb
CHANGED
@@ -12,88 +12,40 @@ module ComunikaGsm
|
|
12
12
|
@@devices
|
13
13
|
end
|
14
14
|
|
15
|
-
def self.clear
|
16
|
-
@@devices.each {|d| d.gsm.close }
|
17
|
-
@@devices = []
|
18
|
-
end
|
19
|
-
|
20
15
|
# Initialize devices
|
21
16
|
def self.load(params={})
|
22
|
-
self.clear
|
23
17
|
threads = []
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
gsm = GSM.new(:port => port, :debug => params[:debug])
|
18
|
+
self.ports.each do |port|
|
19
|
+
threads << Thread.new {
|
20
|
+
gsm = GSM2.new(:port => port, :debug => params[:debug])
|
28
21
|
if gsm.status
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
22
|
+
result = gsm.cmd("AT\r\n")
|
23
|
+
if result.to_s.length > 0
|
24
|
+
imei = gsm.cmd("AT+CGSN\r\n")
|
25
|
+
iccid = gsm.cmd("AT+CRSM=176,12258,0,0,10\r\n")
|
26
|
+
provider = gsm.cmd("AT+COPS?\r\n")
|
27
|
+
signal = gsm.cmd("AT+CSQ\r\n")
|
28
|
+
unless @@devices.find {|m| m[:imei] == imei}
|
29
|
+
@@devices << {:port => port,:gsm => gsm, :imei => imei, :iccid => iccid, :provider => provider, :signal => signal}
|
30
|
+
end
|
31
|
+
else
|
32
|
+
gsm.close
|
35
33
|
end
|
36
|
-
else
|
37
|
-
g.close
|
38
34
|
end
|
39
|
-
|
40
|
-
Thread.current.kill
|
41
35
|
}
|
42
36
|
end
|
43
37
|
|
44
38
|
while threads.count > 0
|
45
|
-
threads.delete_if{|t| !t.alive? }
|
39
|
+
threads.delete_if {|t| !t.alive? }
|
46
40
|
end
|
47
41
|
|
48
|
-
@@devices
|
42
|
+
@@devices.collect! {|d| Device.new(d) }#.uniq {|d| d[:imei] }#.find_all{|dev| dev.status == true }.uniq!{|d| d.imei }
|
49
43
|
end
|
50
44
|
|
51
|
-
class
|
52
|
-
attr_accessor :
|
45
|
+
class Device
|
46
|
+
attr_accessor :port, :gsm, :imei, :iccid, :provider, :signal
|
53
47
|
def initialize(params)
|
54
|
-
@
|
55
|
-
@provider = params[:provider]; @iccid = params[:iccid]
|
56
|
-
end
|
57
|
-
|
58
|
-
def send_sms(msg)
|
59
|
-
return {id: nil, status: "ERROR", code: "304"} if msg[:number].length == 0
|
60
|
-
return {id: nil, status: "ERROR", code: "304"} if msg[:number].length < 11
|
61
|
-
return {id: nil, status: "ERROR", code: "503"} if msg[:message].length == 0
|
62
|
-
|
63
|
-
## GENERATE PDU TO MESSAGE ##
|
64
|
-
pdu = PDU.encode(:number => msg[:number].prepend("+55"), :smsc => msg[:smsc], :message => msg[:message])
|
65
|
-
|
66
|
-
# cmd("AT+CMGS=\"#{options[:number]}\"\r")
|
67
|
-
# res = cmd("#{options[:message][0..160]}#{26.chr}")
|
68
|
-
@gsm.cmd("AT+CMGS=#{pdu.size}\r")
|
69
|
-
res = @gsm.cmd("#{pdu.body}#{26.chr}")
|
70
|
-
|
71
|
-
sleep 3
|
72
|
-
while res.length == 0
|
73
|
-
res = @gsm.wait
|
74
|
-
end
|
75
|
-
|
76
|
-
if res.include?('+CMGS')
|
77
|
-
res = res.scan(/\+(\S+)\: (\d+)\r\n/)
|
78
|
-
status = 'OK'
|
79
|
-
code = "-1"
|
80
|
-
id = res.first[1]
|
81
|
-
elsif res.include?('+CMS')
|
82
|
-
res = res.scan(/\+CMS (\S+)\: (\d+)/).first
|
83
|
-
status = 'ERROR'
|
84
|
-
code = res[1]
|
85
|
-
id = nil
|
86
|
-
end
|
87
|
-
@total += 1
|
88
|
-
{:id => id, :code => code, :status => status}
|
89
|
-
end
|
90
|
-
|
91
|
-
def messages
|
92
|
-
sms = @gsm.cmd("AT+CMGL=4\r\n")
|
93
|
-
msgs = sms.scan(/\+CMGL\:\s*?(\d+),\s*?(\d+),.*?\,s*?(\d+)\r\n(.*)/)
|
94
|
-
|
95
|
-
## IDS: 0 - ID, 1 -- ,2 - size, 3 - PDU
|
96
|
-
msgs.collect!{ |m| PDU::PDUDecode.new(connection: @gsm, id: m[0], size: m[2], pdu: m[3].chomp).decode }# rescue nil
|
48
|
+
@port = params[:port]; @gsm = params[:gsm]; @iccid = params[:iccid]; @provider = params[:provider]; @signal = params[:signal]
|
97
49
|
end
|
98
50
|
end
|
99
51
|
end
|
data/lib/comunika_gsm/pdu.rb
CHANGED
@@ -5,105 +5,64 @@ module ComunikaGsm
|
|
5
5
|
return unless params[:message]
|
6
6
|
return unless params[:number]
|
7
7
|
result = @@pdu_converter.call("stringToPDU",params[:message],params[:number],params[:smsc] || '',params[:ecoding] || 7,params[:sms_class] || 1,params[:valid],params[:deliver] || true,params[:valid_flag] || false)
|
8
|
-
|
8
|
+
self.parse_json(result)
|
9
9
|
end
|
10
10
|
|
11
11
|
def self.decode(pdu)
|
12
|
-
@@pdu_converter.call("getPDUMetaInfo", pdu)
|
12
|
+
result = @@pdu_converter.call("getPDUMetaInfo", pdu)
|
13
|
+
self.parse_json(result)
|
13
14
|
end
|
14
15
|
|
15
|
-
|
16
|
-
|
17
|
-
def initialize(pdu)
|
18
|
-
pdu = pdu.split(/\n/)
|
19
|
-
@size = pdu[0]; @body = pdu[1]
|
20
|
-
end
|
16
|
+
def self.parse_json(value)
|
17
|
+
JSON.parse(value, :symbolize_names => true) ## Return hash with name in format symbol
|
21
18
|
end
|
22
19
|
|
23
20
|
class PDUDecode
|
24
|
-
attr_accessor :id, :size, :pdu, :smsc, :number, :
|
25
|
-
:tp_pid, :tp_dcs_popis, :
|
26
|
-
attr_writer :
|
21
|
+
attr_accessor :id, :size, :pdu, :smsc, :number, :sms_id, :status,
|
22
|
+
:tp_pid, :tp_dcs_popis, :message, :length, :validity, :connection, :mlenght
|
23
|
+
attr_writer :sent_at, :receipt_at, :mtype
|
27
24
|
def initialize(params)
|
28
25
|
@id = params[:id]; @size = params[:size]; @pdu = params[:pdu]; @mtype = params[:mtype]; @smsc = params[:smsc]
|
29
|
-
@number = params[:number]; @
|
30
|
-
@status = params[:status]; @tp_pid = params[:tp_pid]; @tp_dcs_popis = params[:tp_dcs_popis]; @
|
31
|
-
@
|
26
|
+
@number = params[:number]; @sms_id = params[:sms_id]; @sent_at = params[:sent_at]; @discharge_at = params[:receipt_at]
|
27
|
+
@status = params[:status]; @tp_pid = params[:tp_pid]; @tp_dcs_popis = params[:tp_dcs_popis]; @message = params[:message]
|
28
|
+
@length = params[:mlength]; @validity = params[:validity]; @mtype = params[:mtype]
|
32
29
|
@connection = params[:connection]
|
33
30
|
end
|
34
31
|
|
35
32
|
def decode
|
36
|
-
|
37
|
-
|
38
|
-
data = m.split(/\::::/)
|
39
|
-
case data[0].strip
|
40
|
-
when 'type'
|
41
|
-
set_mtype(data[1].strip)
|
42
|
-
when 'smsc'
|
43
|
-
@smsc = data[1].strip
|
44
|
-
when 'sender'
|
45
|
-
@number = data[1].strip
|
46
|
-
when 'messageref'
|
47
|
-
@messageref = data[1].strip
|
48
|
-
when 'timestamp'
|
49
|
-
@send_at = data[1].strip
|
50
|
-
when 'timestamp2'
|
51
|
-
@discharge_at = data[1].strip
|
52
|
-
when 'status byte'
|
53
|
-
@status = "0x#{data[1].strip}".to_i(16)
|
54
|
-
when 'tp_pid'
|
55
|
-
@tp_pid = data[1].strip
|
56
|
-
when 'tp_pid'
|
57
|
-
@tp_pid = data[1].strip
|
58
|
-
when 'tp_dcs'
|
59
|
-
@tp_dcs = data[1].strip
|
60
|
-
when 'tp_dcs-popis'
|
61
|
-
@tp_dcs_popis = data[1].strip
|
62
|
-
when 'mclass'
|
63
|
-
@mclass = data[1].strip
|
64
|
-
when 'alphabet'
|
65
|
-
@alphabet = data[1].strip
|
66
|
-
when 'message'
|
67
|
-
@message = data[1].strip
|
68
|
-
when 'length'
|
69
|
-
@length = data[1].strip
|
70
|
-
end
|
71
|
-
end
|
72
|
-
return self
|
33
|
+
PDU.decode(self.pdu).each {|k,v| instance_variable_set("@#{k.to_s}",v)}
|
34
|
+
self
|
73
35
|
end
|
74
36
|
|
75
|
-
def
|
76
|
-
return @
|
77
|
-
Time.parse(@
|
37
|
+
def sent_at
|
38
|
+
return @sent_at.nil?
|
39
|
+
Time.parse(@sent_at.sub(/(\d+)\D+(\d+)\D+(\d+)/, '\1/\2/20\3')).strftime('%Y/%m/%d %H:%M:%S')
|
78
40
|
end
|
79
41
|
|
80
|
-
def
|
81
|
-
return if @
|
42
|
+
def receipt_at
|
43
|
+
return if @receipt_at.nil?
|
82
44
|
Time.parse(@discharge_at.sub(/(\d+)\D+(\d+)\D+(\d+)/, '\1/\2/20\3')).strftime('%Y/%m/%d %H:%M:%S')
|
83
45
|
end
|
84
46
|
|
85
|
-
def
|
86
|
-
@
|
47
|
+
def mtype
|
48
|
+
case @mtype
|
49
|
+
when 'Receipt requested'
|
50
|
+
'INCOMING'
|
51
|
+
when 'Status Report'
|
52
|
+
'REPORT'
|
53
|
+
when 'Unknown Message'
|
54
|
+
'REPORT'
|
55
|
+
when 'Receive message'
|
56
|
+
'INCOMING'
|
57
|
+
when 'Data Header'
|
58
|
+
'MULTIPART'
|
59
|
+
else
|
60
|
+
'UNKNOWN'
|
61
|
+
end
|
87
62
|
end
|
88
63
|
|
89
|
-
|
90
|
-
|
91
|
-
case tp
|
92
|
-
when 'receive message'
|
93
|
-
@mtype = "INCOMING"
|
94
|
-
when 'status report'
|
95
|
-
@mtype = 'REPORT'
|
96
|
-
when 'unknown message'
|
97
|
-
@mtype = 'UNKNOWN'
|
98
|
-
when 'receipt requested'
|
99
|
-
if @status.nil?
|
100
|
-
@mtype = 'INCOMING'
|
101
|
-
else
|
102
|
-
@mtype = "REPORT"
|
103
|
-
end
|
104
|
-
when 'data header'
|
105
|
-
@mtype = 'MULTIPART'
|
106
|
-
end
|
64
|
+
def delete
|
65
|
+
@connection.cmd("AT+CMGD=#{@id}\r\n")
|
107
66
|
end
|
108
67
|
end
|
109
68
|
end
|
data/lib/comunika_gsm/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: comunika_gsm
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jefferson Silva
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-09-
|
11
|
+
date: 2017-09-22 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -75,8 +75,10 @@ extra_rdoc_files: []
|
|
75
75
|
files:
|
76
76
|
- lib/comunika_gsm.rb
|
77
77
|
- lib/comunika_gsm/gsm.rb
|
78
|
+
- lib/comunika_gsm/gsm2.rb
|
78
79
|
- lib/comunika_gsm/js/pdu.js
|
79
80
|
- lib/comunika_gsm/js/pdu.min.js
|
81
|
+
- lib/comunika_gsm/js/pdu2.js
|
80
82
|
- lib/comunika_gsm/modem.rb
|
81
83
|
- lib/comunika_gsm/pdu.rb
|
82
84
|
- lib/comunika_gsm/version.rb
|