8 de abr. de 2011

Recuperar Clientes Conectados em Dispositivos Ubiquiti

Galera venho trazer uma solução que a dias me atormentava.
Problema: tenho uma torre wireless na zona rural com 4 bullets 2, conectado a painéis aquário, tenho poucos clientes conectados nesses bullets, o problema é que eu não conseguia saber quem eram os usuarios que estavam conectados neste bullet (ou pelo menos era bem complicado saber quem estava conectado). Por isso resolvi automatizar esta tarefa, uma coisa um tanto quanto simples de se falar, mas não muito de se fazer.
A solução encontrada foi capturar a pagina "stalist.html", que retorna os MAC Address conectados neste bullet, e depois tratar estes mac's e cruza-los com meu banco de dados de usuários.
Bom partindo deste ponto criei uma função em php para fazer este processo, foi um tanto quanto dolorido fazer isso (por conta dos socos na mesa), mas consegui chegar a uma solução para esta tarefa.
Segue abaixo o arquivo de função



<?php
#################################################
#            Classe para retornar               #
#              o MAC Address de                 #
#            Equipamentos Ubiquiti              #
#            para cruzamento de dados           #
#              com banco de dados               #
#                                               #
#              Desenvolvido por                 #
#             Fernando Piovezan                 #
#                Licença GPL                    #
#################################################

#################################################
#                 Agradecimentos                #
#duzao7667 -> forum.imasters.com.br             #
#pisicohtico -> forum.clubedohardware.com.br    #
#Manual PHP -> php.net                          #
#Avaliador de ER -> arquivodecodigos.net        #
#André D. Molin -> forum.imasters.com.br        #
#Everton da Rosa -> phpbrasil.com               #
#                                               #
#################################################


class retornaInfo {
      //variavel passada para a classe
      public $site;
   //função para retornar o mac address
   function retornaMac() {
      $url = file_get_contents($this->site);    //estrai o site da url passada
         $pattern1 = "/([0-9a-fA-F]{2}:{1}){5}[0-9a-fA-F]{2}/"; //cria o primeiro pattern para expressao regular
         $pattern2 = "/<[^>]*[^\/]>/i"; //cria o segundo pattern para expressao regular
         $html = preg_split($pattern2, $url, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE);
            for($i=0;$i<count($html);$i++) {
               preg_match($pattern1, $html[$i], $resultado);
                  if (!empty($resultado)) {
                     $mac[] = $html[$i];
               }
         }
   return $mac; //retorna o endereço mac
   }
   //função para retornar o nivel de sinal
   function retornaSinal () {
      $url = file_get_contents($this->site); //estrai o site da url passada
      $pattern3 = "/<\/a[^>]*><\/td[^>]*><td[^>]*>(.*?)<\/td>/"; //cria o terceiro pattern para expressao regular
      preg_match_all($pattern3, $url, $sinal); //retira o sinal por meio de expressao regular
   return $sinal[1]; //retorna o nivel do sinal
   }
}
?>
O que isto faz é pegar pagina "stalist.html" e trata-la para retornar o MAC Addres e o sinal em "-Dbm" dentro de um array com estas informações. Feito isso podemos utilizar estas informações do jeito que quiser e puder (as opções são muitas).

Para usar esta função é simples, como podem ver esta Orientado a Objeto então temos que trata-la com classe.

$site = "http://" .$nomeUsuario. ":" .$senhaUsuario. "@" .$ip. "/stalist.cgi"; include_once "conectado.php"; $obj = new retornaInfo; $obj->site = $site; $mac = $obj->retornaMac(); $sinal = $obj->retornaSinal(); 

a variável $site deve ter estes critérios pois precisa se autenticar para poder retornar a pagina
- explicação das variaveis

$nomeUsuario -> nome de usuario de conexão os Bullet
$senhaUsuario -> senha do usuario de conexao ao Bullet
$ip -> Ip do bullet para se conectar

Uso estas variáveis, pois posso utilizar quantos radio quiser com esta mesma função, hoje uso com 4 bullet's mas pretendo aumentar para uns 8 - 12.
Abaixo um exemplo do uso desta função em página em ambiente de execução.
Bom espero que ajude a comunidade ai que utiliza Ubiquiti

Obs. Foi testado em Bullet 2, Nano 2, Nano 5.
Obs2. Não sou nenhuma fera em php, só sou muito, muito persistente.

Qualquer duvida postem ai que na medida do possível eu ajudo.

Um comentário:

  1. Boa tarde
    Gostei muito detes tópico, pois era o que eu procurava na internet, pois não manjo de php e precisaria de um código pronto.

    Porem por não entendere de php tive dificuldade em conlcluir o código, seria possivel por uma enorme gentileza me enviar os arquivos php prontos somente para que eu possa incluir minhas informações como usuario, senha e ip do equipamento.

    Peço encarecidamente por este favor

    Atenciosamente
    Marcio
    marciosilvasousa@gmail.com

    E se possivel excluir este comentário assim que lê-lo

    ResponderExcluir