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.
@@ -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
- id = 0
25
- self.ports.each_with_index do |port,idx|
26
- threads << Thread.new{
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
- imei = gsm.imei
30
- iccid = gsm.iccid
31
- provider = gsm.provider
32
-
33
- unless @@devices.find {|d| d.imei == imei}
34
- @@devices << Modem.new(id: id += 1 ,:gsm => gsm, :imei => imei, :iccid => iccid, :provider => provider, :port => port)
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 Modem
52
- attr_accessor :id,:port, :imei, :iccid, :provider, :gsm, :total
45
+ class Device
46
+ attr_accessor :port, :gsm, :imei, :iccid, :provider, :signal
53
47
  def initialize(params)
54
- @id = params[:id]; @port = params[:port]; @imei = params[:imei]; @gsm = params[:gsm]; @total = params[:total] || 0
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
@@ -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
- PDU::PDUEncode.new(result)
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
- class PDUEncode
16
- attr_reader :size, :body
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, :messageref, :status, :mtype,
25
- :tp_pid, :tp_dcs_popis, :mclass, :alphabet, :message, :length, :validity, :connection, :mlenght
26
- attr_writer :send_at, :discharge_at
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]; @messageref = params[:messageref]; @send_at = params[:send_at]; @discharge_at = params[:discharge_at]
30
- @status = params[:status]; @tp_pid = params[:tp_pid]; @tp_dcs_popis = params[:tp_dcs_popis]; @mclass = params[:mclass]
31
- @alphabet = params[:alphabet]; @message = params[:message]; @length = params[:length]; @validity = params[:validity]
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
- msg = PDU.decode(self.pdu)
37
- msg.downcase.split(/\n/).each do |m|
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 send_at
76
- return @send_at.nil?
77
- Time.parse(@send_at.sub(/(\d+)\D+(\d+)\D+(\d+)/, '\1/\2/20\3')).strftime('%Y/%m/%d %H:%M:%S')
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 discharge_at
81
- return if @discharge_at.nil?
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 delete
86
- @connection.cmd("AT+CMGD=#{@id}\r\n")
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
- private
90
- def set_mtype(tp)
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
@@ -1,3 +1,3 @@
1
1
  module ComunikaGsm
2
- VERSION = "0.1.6"
2
+ VERSION = "0.1.7"
3
3
  end
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.6
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-20 00:00:00.000000000 Z
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