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