class ComunikaGsm::GSM
Attributes
status[RW]
Public Class Methods
new(params)
click to toggle source
# File lib/comunika_gsm/gsm.rb, line 5 def initialize(params) return nil if params.empty? begin @@port = SerialPort.new("/dev/#{params[:port]}",19200,8,1, SerialPort::NONE) @@port.read_timeout = 250 ## Set timeout of command @@debug = params[:debug] res = cmd("ATE0\r\n") ## Set echo off if res.length > 0 cmd("AT+CMGF=0\r\n") ## Set PDU mode # @imei = imei # @iccid = iccid # @provider = provider # @signal_level = signal_level @status = true else return @status = false end rescue => ex return @status = false end end
Public Instance Methods
close()
click to toggle source
# File lib/comunika_gsm/gsm.rb, line 47 def close puts "Fechando conexão" @@port.close @status = false end
cmd(c)
click to toggle source
# File lib/comunika_gsm/gsm.rb, line 29 def cmd(c) begin @@port.write(c) normalize(c,wait) rescue => ex puts ex @status = false #close end end
iccid()
click to toggle source
# File lib/comunika_gsm/gsm.rb, line 96 def iccid cmd("AT+CRSM=176,12258,0,0,10\r\n") end
imei()
click to toggle source
# File lib/comunika_gsm/gsm.rb, line 92 def imei cmd("AT+CGSN\r\n") end
messages()
click to toggle source
# File lib/comunika_gsm/gsm.rb, line 84 def messages sms = cmd("AT+CMGL=4\r\n") msgs = sms.scan(/\+CMGL\:\s*?(\d+),\s*?(\d+),.*?\,s*?(\d+)\r\n(.*)/) ## IDS: 0 - ID, 1 -- ,2 - size, 3 - PDU msgs.collect!{ |m| PDU::PDUDecode.new(connection: self, id: m[0], size: m[2], pdu: m[3].chomp).decode }# rescue nil end
normalize(cmd,res)
click to toggle source
# File lib/comunika_gsm/gsm.rb, line 109 def normalize(cmd,res) case cmd.gsub(/\r\n/,'') when 'AT' || 'ATE0' res.scan(/\r\n(\S+)\r\n/)[0].first unless res.empty? when 'AT+COPS?' res.scan(/\"(.*?)\"/)[0].first when 'AT+CNUM' res.scan(/\"(.*?)\"/) when 'AT+CGSN' res.scan(/\r\n(\d+)\r\n/)[0].first when 'AT+CGMI' res.scan(/\r\n(\S+)\r\n/)[0].first when 'AT+CRSM=176,12258,0,0,10' res.scan(/\"(.*?)\"/)[0].first when 'AT+CSQ' res.scan(/\d+/)[0] else res end end
provider()
click to toggle source
# File lib/comunika_gsm/gsm.rb, line 100 def provider cmd("AT+COPS?\r\n") end
send_sms(msg)
click to toggle source
# File lib/comunika_gsm/gsm.rb, line 53 def send_sms(msg) return {id: nil, status: "ERROR", code: "304"} if msg[:number].length == 0 return {id: nil, status: "ERROR", code: "304"} if msg[:number].length < 11 return {id: nil, status: "ERROR", code: "503"} if msg[:message].length == 0 ## GENERATE PDU TO MESSAGE ## pdu = PDU.encode(:number => msg[:number].prepend("+55"), :smsc => msg[:smsc], :message => msg[:message]) cmd("AT+CMGS=#{pdu[:size]}\r") res = cmd("#{pdu[:pdu]}#{26.chr}") sleep 3 while res.length == 0 res = wait end if res.include?('+CMGS') res = res.scan(/\+(\S+)\: (\d+)\r\n/) status = 'OK' code = "-1" id = res.first[1] elsif res.include?('+CMS') res = res.scan(/\+CMS (\S+)\: (\d+)/).first status = 'ERROR' code = res[1] id = nil end {:id => id, :code => code, :status => status} end
signal_level()
click to toggle source
# File lib/comunika_gsm/gsm.rb, line 104 def signal_level cmd("AT+CSQ\r\n") end
wait()
click to toggle source
# File lib/comunika_gsm/gsm.rb, line 40 def wait buffer = @@port.read puts buffer if @@debug @@port.flush() buffer end