Control de colas para tiendas barato con Openwrt y mosquitto

Es fácil encontrarnos en grandes superficies con una pantalla que nos va diciendo cual es la caja que nos toca para poder pagar mientras hacemos cola. Vamos a crear con Openwrt un sistema donde el cajero que termine con un cliente, al pulsar un botón indique la caja que le toca al siguiente cliente de la cola.Necesitaremos lo siguiente:

  • Un router con Openwrt que tenga entrada USB.
  • Una tarjeta de sonido usb.
  • Unos altavoces para que el router nos diga algo como: “Siguiente cliente pase por caja X”
  • Un Ordenador con pantalla. Como ordenador podemos usar una raspnerry pi. La información de la siguiente caja la mostrará en una página web, por lo que desde cualquier dispositivo con un navegador web podremos ver la siguiente caja que toca. Desde un teléfono móvil conectado a la misma red que nuestro router, podremos verlo también. Podemos ver en el siguiente vídeo el resultado final:
Resultado final del proyecto.

¿Cómo lo haremos?

En el router con Openwrt instalaremos un servidor mqtt (Mosquitto). Dicho servidor luego se puede poner en otro dispositivo o incluso podremos usar alguno público o privado en Internet (eso sí, dicho servidor (broker) deberá permitir websockets). Enviaremos a un canal en dicho servidor llamado “cola_de_cajas”. Cuando un cajero envíe un mensaje mqtt a dicho canal que sea “1”, el router lanzará por altavoces a través de la tarjeta de sonido usb que le habremos configurado, una locución que diga “Siguiente cliente pase por caja 1”. Con la caja 2 pasará lo mismo y así con todas las cajas de la tienda.

El mismo router alojará una página web con contenido en javascript, que estará siempre a la escucha de lo que aparezca en el canal. Si en el canal “cola_de_cajas” recibe el valor 1 visualizará “PASE POR CAJA Nº 1”, si recibe un 2 visualizará “PASE POR CAJA Nª 2”, y así con las demás cajas.

Paso 1.-Preparando el router.

Accedemos por ssh al router con Openwrt, lo conectaremos para que tenga salida a Internet e instalaremos lo siguiente:

  • Servidor Mosquitto:
    Este paso te lo puedes saltar si vas a utilizar un servidor de mosquitto en remoto.
opkg update
opkg install mosquitto-ssl libmosquitto-ssl mosquitto-client-ssl

El comando opkg update solo hace falta ponerlo una vez. Las siguientes puedes omitirlo.

  • El cliente de mosquitto:
opkg update
opkg install mosquitto-client-ssl

Para que nuestro router esté pendiente de lo que reciba el servidor mosquitto y que luego reproduzca por la tarjeta de sonido la locución.

  • Lo necesario para que funcione la tarjeta de sonido:
opkg update
opkg install kmod-usb-core kmod-usb-ohci kmod-usb-uhci kmod-usb2 kmod-usb-audio

Algunos de estos paquetes probablemente ya están instalados en el sistema. Los pongo porque más vale prevenir… Lo peor que nos puede pasar es que nos diga que ya está instalado.

  • El Programa para reproducir sonido:
opkg update
opkg install alsa-utils
  • El editor nano:
opkg update
opkg install nano

Esto lo instalo porque lo prefiero al editor vi para cambiar configuraciones. Si te manejas con vi, no te lo instales.

Paso 2.-Haciendo que el router hable

Conecta la tarjeta de sonido usb y ponle unos cascos o unos altavoces. Por ssh nos descargaremos las locuciones, instalaremos el paquete unzip para descomprimirlas, crearemos el directorio para descomprimirlas, las descomprimiremos y eliminaremos el archivo zip y paquete unzip para que no ocupen espacio, con los siguientes comandos:

cd /root/
wget http://openwrt.tuinstituto.es/wp-content/uploads/2022/07/voces.zip
opkg update; opkg install unzip
mkdir /root/voces
unzip /root/voces.zip -d /root/voces
rm /root/voces.zip

Ahora probamos si funcionan con el siguiente comando:

aplay -f S16_LE -D plughw:0,0 /root/voces/paseporcajanumero.wav /root/voces/5.wav

Puedes variar las voces. Las he sacado de https://ttsmp3.com/ , las he troceado con audacity y las he guardado en formato wav que es lo que soporta el aplay. Con aplay no puedes reproducir mp3. He preparado voces para 20 cajas.

Ahora creamos un script que llamaremos escucha.sh para que oiga lo que le llega por mosquitto.

nano /root/escucha.sh

Introducimos el siguiente código dentro del archivo. Debes tener en cuenta que si usas otro servidor de mosquitto en otra ip, debes cambiar los parámetros en la variable broker y puerto.

#!/bin/sh
# Configuracion del servidor mqtt que escuchamos
broker="127.0.0.1"
port="1883"
topic_input="cajas/cola_de_cajas"

#Directorio donde guardamos las voces

dvoces="/root/voces"

#Ponemos el cliente de mosquitto escuchando
mosquitto_sub -t $topic_input -h $broker| while read value; do

case $value in
    1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16|17|18|19|20)
        aplay -f S16_LE -D plughw:0,0 $dvoces/paseporcajanumero.wav $dvoces/$value.wav
        ;;
    *)
        echo "Valor no correcto"
        ;;
esac
done

Lo guardamos con con ctrl-x y le damos permisos de ejecución:

chmod +x /root/escucha.sh

Ahora abre la configuración del servidor de mosquitto que instalamos en el router:

nano /etc/mosquitto/mosquitto.conf

Vamos a hacer que escuche en todos las interfaces de red (0.0.0.0), en el puerto 1883, que cualquiera pueda enviar sin autenticación (para simplificar lo hacemos con usuarios anónimos, recuerda que cualquiera podrá enviar mensajes al servidor), y habilitamos websockets para que pueda ser accedido a través de un navegador web. Para ello ponemos esto al principio de la configuración:

listener 1883 0.0.0.0
allow_anonymous true
listener 18883
protocol websockets

Guardamos la configuración y reiniciamos el servidor de mosquitto:

/etc/init.d/mosquitto restart

Ahora ejecutamos el script de escucha, recuerda encender los altavoces.

/root/escucha.sh

Entramos por otra conexión ssh al router y enviaremos valores al servidor de mosquitto:

mosquitto_pub -t "cajas/cola_de_cajas" -h 127.0.0.1 -m "1"

Lo que va después de -t es el topic o canal al que le envío el mensaje, lo que va después de -h es la ip del servidor mosquitto. Puedo poner la ip del router en vez de 127.0.0.1. lo que va depués de -m es el mensaje que le mando al servidor. en este caso le envío un “1”. El script que hemos hecho al recibir el mensaje “1” reproduce “PASE POR CAJA NÚMERO” y después “1” por los altavoces.

Haciéndo que el script de escucha comience al arrancar el router.

Crearemos el siguiente fichero y le daremos a continuación permisos de ejecución:

nano /etc/init.d/escucha

Y le añadimos lo siguiente:

#!/bin/sh /etc/rc.common
# Example script
# Copyright (C) 2007 OpenWrt.org

START=99
STOP=15

start() {
        /root/escucha.sh &
}

stop() {

   kill -9 `ps |grep 'escucha'|grep -v grep|awk '{print $1}'`
}

Guardamos y le damos permiso de ejecución:

chmod +x /etc/init.d/escucha

Y haremos que arranque al encender el router con lo siguiente:

/etc/init.d/escucha enable

Prueba a arrancarlo con la orden /etc/init.d/escucha start y enviar al servidor de mosquitto un mensaje a ver si suena la locución. Con /etc/init.d/escucha stop podrás pararlo.

Paso 3.-Creando la página Web

Lo que nos queda es montar la página Web. Como el router ya trae su propio servidor web, alojaremos la página en el mismo dentro del directorio /www.

Podremos ver la página accediendo a http://<ip_del_router>/cola.html

Por ssh nos descargaremos los archivos con la página web, instalaremos el paquete unzip para descomprimirlas, , las descomprimiremos y eliminaremos el archivo zip y paquete unzip para que no ocupen espacio, con los siguientes comandos:

cd /root/
wget http://openwrt.tuinstituto.es/wp-content/uploads/2022/07/cola.zip
unzip /root/cola.zip -d /www/
rm /root/cola.zip
opkg remove unzip

Una vez descomprimidas editamos el archivo de configuración del cliente de mqtt que usa la página y pondremos la dirección IP de nuestro router en host o si usamos un servidor externo, la IP del mismo junto con el puerto websockets que use. En nuestro caso el puerto lo habíamos configurado en 18883 en un paso anterior.

nano /www/js/config.js

Buscamos host = 'PONGA_DIRECCIÓN_IP_O_HOSTNAME' y ponemos dentro de las comillas la IP o nombre del servidor que usemos. Por ejemplo host = '192.168.24.8' que en mi caso es la ip de mi router. guardamos y accedemos a nuestra página con:

http://<ip_del_router>/cola.html

Paso 4.-Enviando mensajes al servidor de mosquitto.

Para enviar al servidor de mosquito un mensaje, instalaremos en nuestro equipo un cliente de mosquitto.

En linux mint y derivados de ubuntu se instala con:

sudo apt install mosquitto-clients

Para enviar al servidor que está disponible por ejemplo la caja 4 lo haremos con el comando:

mosquitto_pub -t "cajas/cola_de_cajas" -h IP_DEL_ROUTER -m "4"

Añado un script para simular envíos hasta que le de a ctrl-C.

#!/bin/bash
HOST='IP_DEL_SERVIDOR_MQTT'
while true
 do
  number=`shuf -i 1-20 -n1`
  echo "Caja nº: $number"
  mosquitto_pub -t "cajas/cola_de_cajas" -h $HOST -m "$number"
  a=`shuf -i 5-15 -n1`
  echo "Espero $a segundos"
  sleep $a
done

Para verlo en pantalla completa abre el navegador, accede a la página Web y pulsa la tecla F11

Posibles problemas:

  • Yo he puesto al router lo he conectado a mi red a través de las bocas LAN. Le he puesto una ip estática y le he deshabilitado el servidor DHCP. Si lo conectas por la boca de WAN, probablemente necesites abrir el puerto en el firewall de Openwrt.

Añadido

Si quieres ver algo similar que he hecho y que no necesita de un router con openwrt instalado solo tienes que acceder a la siguiente página y activar los altavoces del ordenador: http://colas.cicloinformatica.es/

Al cargar la página, tu navegador se conecta a un broker mqtt público que se llama broker.emqx.io y sirve por el puerto de websockets nº 8083. Las instrucciones están debajo de dicha página. Aún así solo tienes que instalarte en tu máquina un cliente de mqtt y mandar lo siguiente:

mosquitto_pub -t "cajas/cola_de_cajas" -h "broker.emqx.io" -m "4"

Deja una respuesta

Tu dirección de correo electrónico no será publicada.

3 + 3 =