Cómo monitorizar tu 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 su 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 Ubidots .
Al final de este tutorial, deberías 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 tu router. Como sistema operativo Linux, te 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. Por eso usaremos Lua, un lenguaje potente, rápido y ligero , utilizado principalmente en dispositivos embebidos.
Paso 1: Configuración del enrutador
Para completar esta guía, necesitará un router compatible con OpenWrt. Puede encontrar una lista de routers compatibles en su sitio web . Siga las instrucciones específicas del router para flashear su dispositivo.
Nota: Este tutorial se ha realizado y probado con OpenWrt versión 10.03.1 (Backfire).
Paso 2: Instalar 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, acceda a su router a través de la interfaz web, vaya a la pestaña "Sistema" y haga clic en la opción "Software". Finalmente, localice las bibliotecas necesarias e instálelas:
Alternativamente, puede iniciar sesión en su enrutador a través de SSH y utilizar la herramienta de administración de paquetes 'opkg' desde la consola para instalar los paquetes:
opkg instala luasocket luci-lib-json
Paso 3: Prepara tu cuenta Ubidots
Abre tu Ubidots , ve a la pestaña Fuentes para crear una fuente de datos llamada "Openwrt Router" y luego una variable llamada "Latencia de Internet". Anota el "ID de la variable", que necesitaremos incluir en nuestro código Lua:
Crea un TOKEN permanente en la pestaña de tu perfil y anótalo: también lo necesitaremos para nuestro código Lua.
Paso 4: Codificación de su 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 mediante SSH. Comencemos creando un archivo de configuración llamado "config.lua" para almacenar algunos parámetros:
mkdir /root/ubidots
cd /root/ubidots
nano config.lua
Inserta el siguiente código, reemplazando tu Token y Variable ID con los de tu cuenta Ubidots :
conf local = { variables = { ['52d481d9f91b284cd22af757'] = '8.8.8.8', }, -- Agregue una identificación de variable por cada sitio para verificar el ping token = '9xtbvHL8hFKxfkmlXUW3qNoUpOEZAtp0qkkwPqffbn6DiR3ElRJ4B5m1hZMs', -- Reemplace con su propio token host = 'ubidots.com', -- Host para establecer la conexión port = '80', -- Puerto donde el servicio está escuchando } return conf
Dónde:
- Variables : Puede listar variables individuales, cada una representando el Ubidots y el host al que se debe hacer 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. Dirección API de Ubidots
- 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 " :
nano ubidots_ping.lua
Inserte el siguiente código en el archivo creado:
!usr/bin/env lua -- Cargando configuración principal local config = require "config" -- Biblioteca para leer salida de comando local io = require "io" -- Cargar el módulo http local http = require "socket.http" -- Cargando bibliotecas ltn12 y json desde el framework luci local ltn12 = require "luci.ltn12" local json = require "luci.json" local host = string.format("http://%s:%d", config.host, config.port or 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 ~= '' then -- Obteniendo el tiempo de respuesta de la salida de ping. rtime = string.match(l, "time=(%d+.%d)") end print(rtime) local dtime = string.format('{"value": %s}', rtime) print(dtime) -- Enviar valor a la variable recuperada local rsp, code, tr = http.request{ url=string.format("%s/api/v1.6/variables/%s/values/", host, var_id), method = "POST", headers = { ['X-Auth-Token'] = config.token, ['Content-Type'] = "application/json", ['Content-Length'] = string.len(dtime) }, redirect = true, source = ltn12.source.string(dtime), sink = ltn12.sink.file(io.stdout) } end
Por último, pero no menos importante, asegurémonos de que el programa tenga los permisos correctos:
chmod +x ubidots_ping.lua
Por último, ejecutemos la aplicación una vez para asegurarnos de que funciona:
lua ubidots
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: Configurar un trabajo Cron para enviar datos cada minuto
Una vez que esté seguro de que el script funciona, cree un trabajo cron para automatizar la medición y publicación de valores de latencia.
Puede editar la tabla cron de OpenWrt a través de la consola SSH:
crontab -e
Crea una entrada que llame a tu programa cada minuto:
cd /root/ubidots/; lua /root/ubidots/ubidots_ping.lua >> /dev/null
Guarde los cambios y verifique que el programa esté enviando datos cada minuto.
Ahora que tienes estos datos en Ubidots , ve a la pestaña " Dashboard " de tu cuenta y crea un widget de gráfico de líneas como el que se muestra al principio de esta página. También puedes crear indicadores, diagramas de dispersión para comparar la latencia con otra variable (por ejemplo, la velocidad) y muchos otros tipos de widgets en tiempo real.
También puedes crear alertas por SMS o correo electrónico cuando la latencia sea demasiado alta:
Terminando
En este ejemplo, pudimos medir la latencia de Internet experimentada por un router OpenWrt. Aprendimos a usar el lenguaje de programación Lua para enviar un valor a Ubidots, lo que permite conectar cualquier dispositivo con 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
- Creando un mapa en tiempo real sin escribir ningún código web
¿Tienes más ideas para proyectos? ¡Crea una cuenta Ubidots y hazlas realidad!