Sistema de gestión de colas de espera simple con Openwrt y mqtt.

Objetivo: Crear un sistema de control de colas de espera mediante un router con Openwrt con entrada USB. La pantalla de turno actual se realizará con una simple página Web en javascript. Al pulsar la tecla “+” del teclado numérico, pasará al número siguiente. Al pulsar la tecla “-” irá al número anterior.

Utilizaremos el protocolo mqtt con un servidor público de internet (broker.hivemq.com) más adelante te diré como utilizar otros servidores.

Esto nos aportará las siguientes ventajas:

  • La página web puede estar en local o en un servidor web remoto.
  • Sólo necesitamos un navegador en pantalla completa para visualizar el número actual.
  • Puede ser actualizado desde cualquier lugar con conexión a Internet.
  • Puede ser consultado desde cualquier lugar por lo que el que espera su número sólo tiene que tener la página web abierta en un dispositivo móvil.
  • Pueden añadirse varios routers con Openwrt con teclado para que puedan incrementar los números varios usuarios.
  • Un televisor con navegador de Internet integrado puede funcionar de manera autónoma sin problema.
  • Realizar una aplicación para un dispositivo móvil es sencillo ya que solo necesita alojar una página Web dentro del dispositivo.

La publicación del número actual se ha realizado con shell script funcionando en Linux sin problemas. (Siempre que tengamos un cliente de mqtt actualizado).

Vamos a dividir el proceso en tres fases:

  • Creación de la página WEB.
  • Creación de los Scripts de actualización del número actual.
  • Instalar paquetes necesarios, pasar los scripts a Openwrt, y configurar triggerhappy.

Primera fase: Creación de la página WEB.

Primer paso: Descarga de página Web.

Para la creación de la página web hemos partido del siguiente código simple mqtt websocket example que a su vez utiliza Eclipse Paho JavaScript Client.

Con unos añadidos a dicho código el resultado lo puedes descargar en el siguiente enlace en un archivo GESTION_TURNOS.zip.

Sólo tendrás que bajártelo, descomprimirlo y abrir el archivo Suturno.html en un navegador. Podrás modificar el contenido a tu antojo para adaptarlo a tus necesidades.

Ya está configurado para ser usado en el servidor de pruebas broker.hivemq.com. En el futuro te interesará cambiar de servidor a uno propio con más seguridad y para configurarlo lo harás dentro del fichero config.js. Debemos asegurarnos que el servidor elegido admite websockets y por qué puerto escucha para tal fin. Los dos parámetros importantes de configuración del archivo config.js son host y puerto (que debe ser de tipo websocket). Para cambiar de host o también llamado broker mqtt puedes utilizar los siguientes:

Servidor: test.mosca.io
Puerto: 1883,80 (websocket)

Servidor: iot.eclipse.org
Puerto: 1883, 80 (websocket path="/ws")

Servidor: broker.mqttdashboard.com
Puerto: 1883, 8000 (websocket)

Servidor: test.mosquitto.org
Puerto: 1883,8080 (websocket)

Servidor: mqtt.dioty.co
Puerto: 1883, 8080 (websocket)

Segundo paso: Prueba de funcionamiento.

Deberás descargar algún cliente de mqtt. Lo encontrarás para casi cualquier sistema operativo.

Yo desde mi Linux Mint he usado mosquitto_clients. Para instalarlo he puesto lo siguiente:

sudo add-apt-repository ppa:mosquitto-dev/mosquitto-ppa
sudo apt-get update
sudo apt-get install mosquitto-clients

Con la página web abierta en un navegador escribe lo siguiente en el terminal:

mosquitto_pub -t "numero" -h "broker.hivemq.com" -m "A-01" -r

A continuación:

mosquitto_pub -t "numero" -h "broker.hivemq.com" -m "A-02" -r

Luego:

mosquitto_pub -t "numero" -h "broker.hivemq.com" -m  "A-03" -r

Al momento ves como la página se actualiza automáticamente con el texto que queramos poner.

Segunda fase: Creación de los Scripts de actualización del número actual.

Esto lo puedes hacer tanto en tu linux como dentro del Openwrt.

Primer paso: Creación del script que incrementa los números.

Haremos:

nano suma_turno.sh

Meteremos dentro lo siguiente:

#!/bin/bash

servidor="broker.hivemq.com"
topic="numero"

# Obtenemos el ultimo valor guardado C 1 lee el valor y corta la subscripcion
info=$(mosquitto_sub -t $topic -h $servidor -C 1)

# Metemos en un array la letra y el numero
IFS='-' read -r -a array <<< "$info"
letra="${array[0]}"
num="${array[1]}"

if [ $num = "99" ]; then
 nuevo_numero="00"
else # Incrementamos en 1 el valor usando base 10
 nuevo_numero=$((10#$num + 1))
fi

# Formatea el numero con ceros delante.
n=`printf %02d $nuevo_numero`

# Publica de forma persistente -r la letra-numero
mosquitto_pub -t $topic -h $servidor -m "$letra-$n" -r

A continuación grabamos y le damos permisos de ejecución:

chmod +x suma_turno.sh

Lo ejecutamos varias veces y vemos como va cambiando:

./suma_turno.sh

Segundo paso: Creación del script que decrementa los números.

Haremos:

nano resta_turno.sh

Meteremos dentro lo siguiente:

#!/bin/bash

servidor="broker.hivemq.com"
topic="numero"

# Obtenemos el ultimo valor guardado C 1 lee el valor y corta la subscripcion
info=$(mosquitto_sub -t $topic -h $servidor -C 1)

# Metemos en un array la letra y el numero
IFS='-' read -r -a array <<< "$info"
letra="${array[0]}"
num="${array[1]}"

if [ $num = "00" ]; then
 nuevo_numero="99"
else # Incrementamos en 1 el valor usando base 10
 nuevo_numero=$((10#$num - 1))
fi

# Formatea el numero con ceros delante.
n=`printf %02d $nuevo_numero`
# Publica de forma persistente -r la letra-numero
mosquitto_pub -t $topic -h $servidor -m "$letra-$n" -r

A continuación grabamos y le damos permisos de ejecución:

chmod +x resta_turno.sh

Lo ejecutamos varias veces y vemos como va cambiando:

./resta_turno.sh

Tercera fase: Instalar paquetes necesarios, pasar los scripts a Openwrt, y configurar Triggerhappy.

Vamos a usar un router con Openwrt que tenga entrada USB. Deberá poder acceder a Internet para poder instalar los paquetes así que debes configurarlo para que tenga una dirección IP, una puerta de enlace y un servidor de DNS correcto para poder hacer las instalaciones.

Primer paso: Instalar los paquetes necesarios.

Entraremos al router a través de una terminal y pondremos:

opkg update

Para que el router reconozca los puertos USB:

opkg install kmod-usb-uhci
opkg install kmod-usb-ohci
opkg install kmod-usb2

Para que reconozca el teclado:

opkg install kmod-usb-hid
opkg install kmod-hid 
opkg install kmod-hid-generic

Para que funcione el el cliente de mosquitto:

opkg install mosquitto-client

Para que realice una acción al apretar una tecla:

opkg install triggerhappy

Para que entienda bash:

opkg install bash

Para poder editar el script:

opkg install nano

Segundo paso: pasar los scripts a Openwrt.

Nos posicionamos en el directorio root de Openwrt con la siguiente orden:

cd

Realizamos todos los pasos de la fase anterior: Creación de los Scripts de actualización del número actual.

Tercer paso: Configurar Triggerhappy.

Abriremos el fichero de configuración de Triggerhappy.

nano /etc/triggerhappy/triggers.d/example.conf

Y meteremos lo siguiente al final y guardamos:

KEY_KPPLUS    1    /root/suma_turno.sh
KEY_KPMINUS   1    /root/resta_turno.sh

Con esto hacemos que cuando se pulse la tecla “+” del teclado numérico se incremente un número, y cuando se pulse “-” le reste un número.

Si quieres cambiar las teclas léete este post  http://openwrt.tuinstituto.es/instalar-teclado-usb-en-openwrt-y-captura-de-eventos-con-triggerhappy.

Sólo queda conectar el teclado al router y ejecutar lo siguiente:

/etc/init.d/triggerhappy enable

/etc/init.d/triggerhappy restart

Al final debemos enviar la letra y el número por la que queremos que empiece el sistema:

mosquitto_pub -t "numero" -h "broker.hivemq.com" -m "A-00" -r

Siempre podrás implementar un script que cambie de letra mediante la anterior instrucción.

Con esto está terminado todo. Espero que lo disfrutes.

Posibles problemas:

  • Si el script te da error probablemente es que estás utilizando una versión de mosquitto-clients que no esté actualizada, y que no permita poner de forma permanente en el servidor el mensaje.
  • Si estás detrás de un firewall deberás utilizar un Servidor de Mqtt que garantice el acceso al servidor. Fíjate en los puertos de escucha del servidor. Lo ideal es que el puerto de Websocket sea el 80.
  • Los servidores de prueba públicos a veces se caen, se reinician o se saturan. Siempre será recomendable el uso de un servidor propio. Para localizar servidores públicos consulta esta página.
  • Si quieres montar un servidor de mosquitto en openwrt puedes instalarlo en casa detrás del router y redireccionar los puertos de escucha desde tu router por NAT. La instalación de dicho servidor es sencilla (http://openwrt.tuinstituto.es/mosquitto-broker-en-openwrt-mqtt) pero siempre tienes que tener en cuenta el uso de websockets.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *