Como monitorar sua conexão com a Internet usando OpenWrt e Ubidots
O seu provedor de Internet está oferecendo um serviço de boa qualidade? Se a resposta for “não”, como isso pode ser medido? Uma boa maneira de ter uma ideia da qualidade da sua Internet é fazer ping em um host remoto e observar os tempos de resposta. Isso é o que chamamos de “Latência”.
Este guia explica como usar um OpenWrt para registrar os tempos de resposta retornados pelo programa PING e enviar esses tempos para a Ubidots .
No final deste tutorial, você deverá ser capaz de criar um gráfico incorporável como este – a propósito, estes são os dados reais da nossa conexão com a Internet:
OpenWrt é uma distribuição Linux para seu roteador. Como uma caixa Linux, permite gerenciar pacotes e configurar serviços como VPN's, SSH, Telefonia, etc.
No entanto, ele funciona em hardware limitado e cada serviço deve ser o mais leve possível. É por isso que usaremos Lua, uma linguagem poderosa, rápida e leve, usada principalmente para dispositivos embarcados.
Passo 1: Configurando seu roteador
Para concluir este guia, você precisará de um roteador compatível com OpenWrt. Você pode encontrar uma lista de roteadores suportados em seu site . Siga as instruções específicas do roteador para atualizar seu dispositivo.
Nota: Este tutorial foi feito e testado com OpenWrt versão 10.03.1 (Backfire).
Etapa 2: instale as bibliotecas necessárias
Nosso programa usará duas bibliotecas Lua:
LuaSocket : Contém os métodos para criar solicitações HTTP.
LuCi JSON : Um conjunto de utilitários para lidar com objetos JSON.
Para instalar essas bibliotecas você pode acessar seu roteador através da interface web, navegar até a aba “Sistema” e a seguir clicar na opção “Software”. Por fim, localize as bibliotecas necessárias e instale-as:
Alternativamente, você pode fazer login no seu roteador via SSH e usar a ferramenta de gerenciamento de pacotes ‘opkg’ do console para instalar os pacotes:
opkg instalar luasocket luci-lib-json
Passo 3: Prepare sua conta Ubidots
Abra sua Ubidots , navegue até a guia Fontes para criar uma fonte de dados chamada “Roteador Openwrt” e depois uma variável chamada “Latência da Internet”. Anote o “ID da variável”, que precisaremos colocar em nosso código Lua:
Crie um TOKEN permanente na aba do seu perfil e anote-o – também precisaremos dele para nosso código Lua.
Etapa 4: codificando seu roteador
Escreveremos um código para medir a latência da Internet e depois o enviaremos para Ubidots .
Para escrever um programa em seu dispositivo OpenWrt, você deve estar logado via SSH. Vamos começar criando um arquivo de configuração chamado 'config.lua' para armazenar alguns parâmetros:
mkdir /root/ ubidots
cd /root/ ubidots
nanoconfig.lua
Insira o seguinte código, substituindo seu Token e Variable ID pelos da sua conta Ubidots :
local conf = {variáveis = { ['52d481d9f91b284cd22af757'] = '8.8.8.8', }, - Adicione um ID de variável por cada site para verificar o token de ping = '9xtbvHL8hFKxfkmlXUW3qNoUpOEZAtp0qkkwPqffbn6DiR3ElRJ4B5m1hZMs', --Substitua pelo seu próprio host de token = ' industrial. ubidots .com', -- Host para estabelecer conexão port = '80', -- Porta onde o serviço está escutando } return conf
Onde:
- variáveis : Você pode listar variáveis individuais, cada uma representando o Ubidots e o host para o qual o PING deve ser feito. Neste exemplo, usaremos o ID da nossa variável e o host “Google.com”.
- token : Um token fixo gerado na aba do seu perfil .
- host : o host para o qual as solicitações HTTP serão feitas. Ubidots neste caso.
- port : Porta onde o host está escutando. 80 por padrão.
Agora estamos prontos para criar o programa LUA principal para medir e enviar a latência. Crie um arquivo chamado “ ubidots _ping.lua ”:
nano ubidots _ping.lua
Insira o seguinte código no arquivo criado:
!usr/bin/env lua -- Carregando a configuração principal local config = require "config" -- Biblioteca para ler a saída do comando local io = require "io" -- Carrega o módulo http local http = require "socket.http" -- carregando bibliotecas ltn12 e json do luci framework local ltn12 = require "luci.ltn12" local json = require "luci.json" local host = string.format("http://%s:%d", config.host, config .port ou 80) - Obtendo o token recuperado para var_id, var_ip em pairs(config.variables) do print(var_id, var_ip) local f = io.popen(string.format('ping -c 1 -W 4 %s | grep ttl', var_ip)) local l = f:read("a") f:close() local rtime = '-1' if l ~= '' then -- Obtendo o tempo de resposta da saída do ping. rtime = string.match(l, "time=(%d+.%d)") end print(rtime) local dtime = string.format('{"value": %s}', rtime) print(dtime) - - Postar valor na variável local recuperada rsp, código, tr = http.request{ url=string.format("%s/api/v1.6/variables/%s/values/", Host, var_id), método = " POST", cabeçalhos = { ['X-Auth-Token'] = config.token, ['Content-Type'] = "application/json", ['Content-Length'] = string.len(dtime) }, redirecionamento = verdadeiro, fonte = ltn12.source.string(dtime), coletor = ltn12.sink.file(io.stdout) } fim
Por último, mas não menos importante, vamos garantir que o programa tenha as permissões corretas:
chmod +x ubidots _ping.lua
Finalmente, vamos executar o aplicativo uma vez para ter certeza de que está funcionando:
lua ubidots _ping.lua
Se tudo correr bem, você deverá conseguir ver uma resposta no formato JSON e depois ver o valor postado em sua conta Ubidots :
Etapa 5: configure um Cron job para enviar dados a cada minuto
Depois de ter certeza de que o script está funcionando, crie um cron job para automatizar a medição e publicação de valores de latência.
Você pode editar a tabela cron do OpenWrt através do console SSH:
crontab -e
Crie uma entrada que chame seu programa a cada minuto:
cd /root/ ubidots /; lua /root/ ubidots / ubidots _ping.lua >> /dev/null
Salve suas alterações e verifique se o programa está enviando dados a cada minuto.
Agora que você tem esses dados no Ubidots , navegue até a aba “ Dashboard ” da sua conta e crie um widget de gráfico de linhas como o do início desta página. Você também pode criar Gagues, gráficos de dispersão para comparar a latência com outra variável (digamos, velocidade?) E muitos outros tipos de widgets em tempo real.
Você também pode criar alertas por SMS ou e-mail quando a latência estiver muito alta:
Concluindo
Neste exemplo, conseguimos medir a latência da Internet experimentada por um roteador OpenWrt. Aprendemos como usar a linguagem de programação Lua para enviar um valor ao Ubidots , permitindo conectar qualquer tipo de dispositivo com Lua à nossa nuvem.
Você também pode usar Ubidots para transmitir outros tipos de dados de série temporal, como níveis de sinal, níveis de ruído, GPS, etc. Você pode querer verificar estes outros exemplos:
- Construindo um contador de pessoas com Raspberry Pi e Ubidots
- Criando um mapa em tempo real sem escrever nenhum código da web
Você tem mais ideias de projetos? Crie uma conta Ubidots e faça acontecer!