Cómo monitorear su conexión a Internet usando OpenWrt y Ubidots
¿Su proveedor de Internet ofrece un servicio de buena calidad? Si la respuesta es “no”, ¿cómo se puede medir? Una buena manera de tener una idea de la calidad de Internet es hacer ping a un host remoto y observar los tiempos de respuesta. Esto es lo que llamamos "Latencia".
Esta guía explica cómo utilizar un OpenWrt para registrar los tiempos de respuesta devueltos por el programa PING y enviar estos tiempos a la nube Ubidots
Al final de este tutorial, debería poder crear un gráfico integrable como este; por cierto, estos son los datos reales de nuestra conexión a Internet:
OpenWrt es una distribución de Linux para su enrutador. Como caja de Linux, le permite administrar paquetes y configurar servicios como VPN, SSH, Telefonía, etc.
Sin embargo, se ejecuta en hardware limitado y cada servicio debe ser lo más ligero posible. Es por eso que usaremos Lua, un lenguaje potente, rápido y liviano que se usa principalmente para dispositivos integrados.
Paso 1: configurar su enrutador
Para completar esta guía necesitará un enrutador compatible con OpenWrt. Puede encontrar una lista de enrutadores compatibles en su sitio web . Siga las instrucciones específicas del enrutador para actualizar su dispositivo.
Nota: Este tutorial se realizó y probó con OpenWrt versión 10.03.1 (Backfire).
Paso 2: instale las bibliotecas necesarias
Nuestro programa utilizará dos bibliotecas Lua:
LuaSocket : contiene los métodos para crear solicitudes HTTP.
LuCi JSON : un conjunto de utilidades para manejar objetos JSON.
Para instalar estas bibliotecas, puede acceder a su enrutador a través de la interfaz web, navegar hasta la pestaña "Sistema" y luego hacer clic en la opción "Software". Finalmente, ubique las bibliotecas requeridas e instálelas:
Alternativamente, puede iniciar sesión en su enrutador a través de SSH y usar la herramienta de administración de paquetes 'opkg' desde la consola para instalar los paquetes:
opkg instala luasocket luci-lib-json
Paso 3: Prepare su cuenta Ubidots
Abra su Ubidots , navegue luego a la pestaña Fuentes para crear una fuente de datos llamada "Enrutador Openwrt" y luego una variable llamada "Latencia de Internet". Toma nota del “ID variable”, que tendremos que poner en nuestro código Lua:
Cree un TOKEN permanente en la pestaña de su perfil y anótelo; también lo necesitaremos para nuestro código Lua.
Paso 4: Codificando tu enrutador
Escribiremos un código para medir la latencia de Internet y luego lo enviaremos a Ubidots .
Para escribir un programa en su dispositivo OpenWrt, debe iniciar sesión a través de SSH. Comencemos creando un archivo de configuración llamado 'config.lua' para almacenar algunos parámetros:
mkdir /root/ ubidots
cd /raíz/ ubidots
nano config.lua
Inserta el siguiente código, reemplazando tu Token y Variable ID con los de tu cuenta Ubidots :
local conf = { variables = { ['52d481d9f91b284cd22af757'] = '8.8.8.8', }, -- Agregue una identificación de variable por cada sitio para verificar el token de ping = '9xtbvHL8hFKxfkmlXUW3qNoUpOEZAtp0qkkwPqffbn6DiR3ElRJ4B5m1hZMs', --Reemplace con el suyo propio host de token = ' industrial. ubidots .com', -- Host para establecer conexión puerto = '80', -- Puerto donde el servicio está escuchando } return conf
Dónde:
- variables : Puede enumerar variables individuales, cada una de las cuales representa el Ubidots y el host al que se debe realizar el PING. Para este ejemplo, usaremos el ID de nuestra variable y el host "Google.com".
- token : Un token fijo generado en la pestaña de tu perfil .
- host : El host al que se realizarán las solicitudes HTTP. Ubidots en este caso.
- puerto : Puerto donde el host está escuchando. 80 por defecto.
Ahora estamos listos para crear el programa LUA principal para medir y enviar la latencia. Cree un archivo llamado “ ubidots _ping.lua ”:
nano ubidots _ping.lua
Inserte el siguiente código en el archivo creado:
!usr/bin/env lua - Cargando la configuración principal local config = require "config" - Biblioteca para leer la salida del comando local io = require "io" - Carga el módulo http local http = require "socket.http" - cargando bibliotecas ltn12 y json desde luci framework local ltn12 = requiere "luci.ltn12" json local = requiere "luci.json" host local = string.format("http://%s:%d", config.host, config .port o 80) - Obteniendo el token recuperado para var_id, var_ip en pares (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 ~= '' entonces - Obteniendo el tiempo de respuesta de la salida de ping. rtime = string.match(l, "time=(%d+.%d)") end print(rtime) local dtime = string.format('{"valor": %s}', rtime) print(dtime) - - Publicar valor en la variable recuperada local rsp, código, tr = http.request{ url=string.format("%s/api/v1.6/variables/%s/values/", host, var_id), método = " POST", encabezados = { ['X-Auth-Token'] = config.token, ['Content-Type'] = "application/json", ['Content-Length'] = string.len(dtime) }, redirigir = verdadero, fuente = ltn12.source.string(dtime), fregadero = ltn12.sink.file(io.stdout) } fin
Por último, pero no menos importante, asegurémonos de que el programa tenga los permisos correctos:
chmod +x ubidots _ping.lua
Finalmente, ejecutemos la aplicación una vez para asegurarnos de que esté funcionando:
lua ubidots _ping.lua
Si todo salió bien, deberías poder ver una respuesta en formato JSON y luego ver el valor publicado en tu cuenta Ubidots :
Paso 5: configure un trabajo cron para enviar datos cada minuto
Una vez que se asegure de que el script esté funcionando, cree un trabajo cron para automatizar la medición y publicación de los valores de latencia.
Puede editar la tabla cron de OpenWrt a través de la consola SSH:
crontab-e
Cree una entrada que llame a su programa cada minuto:
cd /raíz/ ubidots /; lua /root/ ubidots / ubidots _ping.lua >> /dev/null
Guarde sus cambios y verifique que el programa envíe datos cada minuto.
Ahora que tiene estos datos en Ubidots , navegue hasta la pestaña " Dashboard " en su cuenta y cree un widget de gráfico de líneas como el que se encuentra al principio de esta página. También puede crear Gagues, diagramas de dispersión para comparar la latencia con otra variable (por ejemplo, ¿velocidad?) y muchos otros tipos de widgets en tiempo real.
También puede crear alertas por SMS o correo electrónico cuando la latencia sea demasiado alta:
Concluyendo
En este ejemplo, pudimos medir la latencia de Internet experimentada por un enrutador OpenWrt. Aprendimos cómo usar el lenguaje de programación Lua para enviar un valor a Ubidots , permitiéndole conectar cualquier tipo de dispositivo con tecnología Lua a nuestra nube.
También puedes usar Ubidots para transmitir otros tipos de datos de series temporales, como niveles de señal, niveles de ruido, GPS, etc. Quizás quieras consultar estos otros ejemplos:
- Construyendo un contador de personas con Raspberry Pi y Ubidots
- Crear un mapa en tiempo real sin escribir ningún código web
¿Tienes más ideas de proyectos? ¡Crea una cuenta Ubidots y hazlos realidad!