class JflAlarmes::JflMonitor

Attributes

close[RW]
events[RW]
server[RW]
thread[RW]

Public Instance Methods

force_close() click to toggle source
# File lib/jfl_alarmes.rb, line 31
def force_close()
  @close = true
  Thread.kill(@thread)
  @server.close
end
run(socket_port) click to toggle source

inicia o monitoramento

# File lib/jfl_alarmes.rb, line 13
def run(socket_port)

  if @server.nil?
    @close = false
    # fica escutando a porta 2034
    @server = TCPServer.new socket_port
    # lista de eventos
    @events = Array.new

    @thread = Thread.new{
      socket = @server.accept
      handle_connection(socket)
    }
  else
    puts "Thread já rodando use o comando force_close() para fechar a thread"
  end
end

Private Instance Methods

connection(content) click to toggle source
# File lib/jfl_alarmes.rb, line 83
def connection(content)
  event = JflEvent.new

  #0.        10.       20.       30.       40.       50.
  #012345678901234567890123456789012345678901234567890123456789
  #21ffffffffffffffffffffffffffffff5410ec8630590390039053a10608
  event.type = "!"
  event.imei = content[2..31]
  event.mac = content[32..43]
  event.conta_part_a = content[44..47]
  event.conta_part_b = content[48..51]
  event.versao = content[52..53]
  event.modelo = content[54..55]
  event.oper = content[56..57]
  event.status = content[58..59]

  event
end
contact_id(content) click to toggle source
# File lib/jfl_alarmes.rb, line 102
def contact_id(content)
    #0.        10.
    #0123456789012345678
    #$0390160201000A\x10

    event = JflEvent.new
    event.type = "$"
    event.account = content[1..4]
    event.event = content[5..8]
    event.partition = content[9..10]
    event.user_zone = content[11..13]
    event.count = content[14]
    event.status = content[15..]

    event
end
handle_connection(socket) click to toggle source
# File lib/jfl_alarmes.rb, line 41
def handle_connection(socket)
  loop do
    msg = socket.recvfrom(30) # recebe a mensage - 30 bytes - do cliente

    # Procedimento de conexão
    if(msg[0][0] == '!')
      @events << connection(msg[0].unpack('H*'))

      # Responde a conexão
      resp = "+"
      socket.write("+")
    end

    # Alteração de status
    if(msg[0][0] == '$')
      @events << contact_id(msg[0])
      keep_alive(socket)
    end

    # Keep alive
    if(msg[0][0] == '@')
      @events << keep_alive(socket)
    end
    
    if(@close)
      socket.close
      break
    end
  end
end
keep_alive(socket) click to toggle source
# File lib/jfl_alarmes.rb, line 72
def keep_alive(socket)
  # Keep Alive
  resp = "@1"
  socket.write(resp)
  
  event = JflEvent.new
  event.type = "@"
  event.status = "Enviado"
  event
end