¿Está su proveedor de Internet ofreciendo 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 usar un router OpenWrt para registrar los tiempos de respuesta devueltos por el programa PING y enviar estos tiempos a la nube de Ubidots.
Al final de este tutorial, debería ser capaz de crear un gráfico embebible como este; por cierto, estos son los datos reales de nuestra conexión a Internet:
OpenWrt es una distribución de Linux para su router. Como una caja Linux, le permite gestionar 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 utilizaremos Lua, un lenguaje poderoso, rápido y ligero que se utiliza principalmente para dispositivos embebidos.
Paso 1: Configurando su Router
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 la versión 10.03.1 (Backfire) de OpenWrt.
Paso 2: Instalar las bibliotecas requeridas
Nuestro programa utilizará dos bibliotecas de 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 router a través de la interfaz web, navegar a la pestaña "Sistema" y luego hacer clic en la opción "Software". Finalmente, localice las bibliotecas requeridas e instálelas:
Alternativamente, puede iniciar sesión en su router a través de SSH y usar la herramienta de gestión de paquetes 'opkg' desde la consola para instalar los paquetes:
opkg install luasocket luci-lib-json
Paso 3: Prepare su cuenta de Ubidots
Abra su cuenta de Ubidots, navegue a la pestaña Dispositivos: "Router Openwrt" y luego seleccione una variable llamada "Latencia de Internet". Tome nota del "ID de Variable", que necesitaremos poner en nuestro código Lua:
Cree un TOKEN permanente en su pestaña de perfil y tómelo en cuenta; también lo necesitaremos para nuestro código Lua.
Paso 4: Codificando su Router
Escribiremos un código para medir la latencia de Internet y luego enviarlo a Ubidots.
Para escribir un programa en su dispositivo OpenWrt, debe estar conectado a través de SSH. Comencemos creando un archivo de configuración llamado ‘config.lua’ para almacenar algunos parámetros:
mkdir /root/ubidotscd /root/ubidotsnano config.lua
Inserte el siguiente código, reemplazando su Token y ID de Variable con los de su cuenta de Ubidots:
local conf = { variables = { ['52d481d9f91b284cd22af757'] = '8.8.8.8', }, -- Agregue un id de variable por cada sitio para verificar el ping token = '9xtbvHL8hFKxfkmlXUW3qNoUpOEZAtp0qkkwPqffbn6DiR3ElRJ4B5m1hZMs', --Reemplace con su propio token host = 'things.ubidots.com', -- Host para establecer conexión port = '80', -- Puerto donde el servicio está escuchando}return conf
ver rawconfig.lua alojado con ❤ por GitHub
Donde:
variables: Puede listar variables individuales, cada una representando el ID de Ubidots y el host al que se debe hacer el PING. Para este ejemplo, utilizaremos el ID de nuestra variable y el host “Google.com”.
token: Un token fijo generado en su cuenta de Ubidots. Aprenda a encontrarlo aquí.
host: El host al que se realizarán las solicitudes HTTP. La dirección API de Ubidots en este caso.
port: Puerto donde el host está escuchando. 80 por defecto.
Ahora estamos listos para crear el programa principal de LUA 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 configuración principallocal config = require "config"-- Biblioteca para leer la salida del comando local io = require "io"-- Cargar el módulo http local http = require "socket.http"-- cargando las bibliotecas ltn12 y json del marco 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 for var_id, var_ip in 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 -- Obteniendo el tiempo de respuesta de la salida del ping. rtime = string.match(l, "time=(%d+\.%d*)") end print(rtime) local dtime = string.format('{"value": %s}', rtime) print(dtime) -- Publicar valor en 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
ver rawubidots_ping.lua alojado con ❤ por GitHub
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ía poder ver una respuesta en formato JSON y luego ver el valor publicado en su cuenta de Ubidots:
Paso 5: Configurar 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 /root/ubidots/; lua /root/ubidots/ubidots_ping.lua >> /dev/null
Guarde sus cambios y verifique que el programa esté enviando datos cada minuto.
Ahora que tiene estos datos en Ubidots, navegue a la pestaña "Dashboard" en su cuenta y cree un widget de gráfico de líneas como el que está al principio de esta página. También puede crear medidores, gráficos de dispersión para comparar la latencia con otra variable (digamos, 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:
Conclusión
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, permitiéndole conectar cualquier tipo de dispositivo alimentado por Lua a nuestra nube.
También puede usar Ubidots para transmitir otros tipos de datos de series temporales, como niveles de señal, niveles de ruido, GPS, etc. Puede que desee consultar estos otros ejemplos:
¿Tiene más ideas de proyectos? ¡Cree una cuenta de Ubidots y hágalas realidad!
Publicado originalmente en Ubidots Blog el 24 de julio de 2014.