Pasarela MQTT

La pasarela MQTT lleva los nodos de LoRa peer-to-peer al Internet y viceversa. Esta documentación le guiará paso a paso. La aplicación de la pasarela está completa y no requiere ninguna programación para su funcionamiento. Sin embargo, todo el código fuente de la pasarela LoRa está disponible y puede ser personalizado cuando sea necesario.

Esta guía comenzará con la configuración básica y añadirá más capacidades más adelante, incluyendo la recepción de mensajes de LoRa en un teléfono móvil.

Si sigue las instrucciones de esta guía debería ser capaz de tener todo funcionando en unos 20 minutos.

Características de la pasarela MQTT

  • RadioShuttle soporte de protocolo LoRa peer-to-peer
  • Reenvío de mensajes MQTT a nodos específicos de LoRa
  • Reenvío de mensajes LoRa a un servidor de MQTT (también llamado MQTT Broker)
  • Amplio informe de estado en la pantalla OLED (registro adicional en el monitor serie)
  • Conexión/reconexión automática a una red WiFi (y/o red WiFi alternativa)
  • Conexión/reconexión automática a un servidor MQTT (y/o a un servidor MQTT alternativo)
  • Actualización automática del reloj a través de NTP (al inicio, después una vez a la semana)
  • Vigilancia de las operaciones por un watchdog y reinicio si no responde
  • Soporte de encriptación SSL para la comunicación MQTT (mqtts)
  • Soporte de encriptación AES para los mensajes LoRa
  • Soporte para 1000 nodos LoRa

Preparación

  • Asegúrese de tener a mano un nodo LoRa, por ejemplo, una tarjeta ECO Power o Turtle, o una segunda tarjeta Eagle.
  • Asegúrese de tener el IDE de Arduino instalado y funcionando. Para más detalles véase la página Puesta en Servicio.
  • Asegúrese de tener una cuenta MQTT con nombre de usuario, contraseña, nombre de host, puerto y topic.
  • Asegúrese de tener a mano su SSID y contraseña de WiFi.

Configurar los parámetros de la pasarela MQTT

  • Active la aplicación “PropertyEditor” de los ejemplos de Arduino incluidos pulsando el pulsador “Reset” una vez y luego manteniendo pulsado el pulsador “User” durante unos 5 segundos (hasta que la aplicación “PropertyEditor” se inicie en la ventana “Monitor Serie”).
  • Establezca las siguientes propiedades de WiFi: WIFI_SSID, WIFI_PASSWORD (se admite una configuración alternativa de WiFi en caso de que la principal no esté disponible). Opcionalmente, establezca una propiedad HOSTNAME para dar un nombre a la pasarela MQTT, por ejemplo,“mygateway1”.
  • Establezca la propiedad MQTT_SERVER:
    mqtt://user:password@hostname:port
    o usando SSL:
    mqtts://user:password@hostname:port
  • Configure la propiedad MQTT_TOPIC_GATEWAY que se utiliza para el intercambio de mensajes con el servidor MQTT (el topic también debe ser configurado/permitido en el servidor MQTT). Una configuración alternativa del servidor MQTT (MQTT_SERVER_ALT) es soportada en caso de que el servidor principal MQTT no esté disponible. Opcionalmente, establezca la contraseña AES a través de la propiedad LORA_APP_PWD (cuando se utiliza una contraseña de la aplicación LoRa, ésta debe ser establecida e idéntica en todos los nodos LoRa). Para enviar un mensaje de prueba a otro nodo LoRa, también es necesario especificar el LORA_REMOTE_ID de la tarjeta remoto.

Nota:
Las cuentas anónimas de MQTT (sin nombre de usuario ni contraseña) no están soportadas porque esto introduciría limitaciones cuando se usan con la aplicación “MQTT Push Client” que requiere un nombre de usuario.

Instalar el software de pasarela MQTT en la tarjeta Eagle

  • Cargue la aplicación “ESP32RadioShuttleMQTTGateway” de los ejemplos de Arduino incluidos. Se puede encontrar en el menú de Arduino: Archivo -> Ejemplos -> Arduino-mbed-API Library.
  • Seleccione la tarjeta: “Heltec WiFi LoRa 32(V2)” del menú Herramientas -> Placa -> ESP32 Arduino

Cuando la aplicación se inicia, debería conectarse a la red WiFi y luego establecer una conexión con el servidor MQTT. La pantalla OLED de la tarjeta mostrará los estados de WiFi y MQTT.

La pantalla se atenuará después de un corto período, pulsando brevemente el pulsador “User” la volverá a encender.

Estado de la pasarela MQTT

Se puede ver un estado extenso en el archivo de registro “Monitor Serie” de Arduino, que registra muchos detalles, incluyendo las contraseñas de WiFi y MQTT para propósitos de depuración. Si las contraseñas no deberían ser registradas, la opción de depuración debe ser desactivada cambiando SetDebug(true) a SetDebug(false) en la función setup() del programa de pasarela (“ESP32RadioShuttleMQTT.ino”).

Pantalla en modo “MQTT gateway”

Línea 1

  • ID del dispositivo RadioShuttle de la pasarela (por razones de espacio sólo se muestran los tres últimos dígitos)
  • La hora actual (en formato hh:mm:ss)
    Inicialmente se muestra el tiempo de instalación del programa, después de un corto período la pantalla cambia al tiempo correcto adquirido del servidor NTP (asumiendo que el WiFi está disponible)

Línea 2

  • SSID WiFi (nombre) y RSSI WiFi (fuerza)
    Después de que la pasarela se inicie, la pantalla mostrará el SSID WiFi. Una vez que se establezca la conexión WiFi, también mostrará el valor de RSSI WiFi (por ejemplo, “HELIOSOG (-62)”)
  • Un SSID WiFi de menos de -85 indica una pobre fuerza de la señal de WiFi
  • El SSID WiFi sólo se muestra hasta que se recibe el primer mensaje de LoRa
  • Se mostrará el último mensaje LoRa recibido (sólo algunos caracteres). En caso de que el mensaje contenga datos binarios, se mostrará un volcado hexadecimal del último mensaje

Línea 3

  • Dirección y puerto del servidor MQTT

Línea 4

  • Paquetes LoRa recibidos/transmitidos RX(xx) TX(xx)
  • Fuerza de la señal de los últimos paquetes recibidos dBm(xxx)
    A veces el valor también se llama RSSI y normalmente oscila entre -40 y -150 (con -40 dBm estando cerca y -150 dBm estando lejos)

Línea 5

  • Estado WiFi: Offline o Online
  • Estado MQTT: Offline o Online

Para evitar que la pantalla OLED se queme, se atenuará automáticamente después de un corto período. Pulsando brevemente el pulsador “User” se encenderá de nuevo. La pantalla también se encenderá cuando se reciba un mensaje LoRa.

Configuración de un nodo LoRa

Se puede usar cualquiera tarjeta soportada por RadioShuttle, actualmente estas son LongRa, ECO Power, Turtle e Eagle.

Tarjetas Arduino (ECO Power, Eagle, LongRa)

En este ejemplo usamos uno de las tarjetas basadas en Arduino, ECO Power.

  • Instale el software RadioShuttle en la tarjeta ECO Power (véase Puesta en Servicio).
  • Active la aplicación “PropertyEditor” presionando el pulsador “Reset” una vez y luego manteniendo presionado el pulsador “User” durante aproximadamente 5 segundos (hasta que la aplicación “PropertyEditor” se inicie en la ventana “Monitor Serie”).
  • Ponga LORA_REMOTE_ID al ID de la tarjeta de la pasarela MQTT (Eagle). El ID del dispositivo de la tarjeta Eagle se mostrará durante el arranque en el “Monitor Serie” de Arduino.
  • Ponga LORA_RADIO_TYPE = 3 (nodo en línea) o 1 (nodo fuera de línea). Véase también el cuadro en Instalación de un Croquis de RadioShuttle para ECO Power.

Después de iniciar la tarjeta ECO Power, al pulsar el pulsador “User” se enviará un mensaje de prueba a la pasarela MQTT. Esto puede ser monitoreado en la pantalla de la pasarela. El mensaje también se envía al servidor MQTT.

Tarjeta basada en Mbed (Turtle)

En este ejemplo usamos nuestra tarjeta basada en Mbed, Turtle.

  • Instale el software RadioShuttle en la tarjeta Turtle (véase Puesta en Servicio).
  • Después de que el software se haya instalado con éxito, se inicia el programa de terminal. Dentro de 10 segundos escriba p y presione ENTER para iniciar la aplicación “PropertyEditor”.
  • Ponga LORA_REMOTE_ID al ID de la tarjeta de la pasarela MQTT (Eagle):
    s12=<ID of the Eagle board>
    El ID de la tarjeta Eagle se mostrará durante el arranque en el “Monitor Serie” de Arduino.
  • Ponga LORA_RADIO_TYPE = 3 (nodo en línea) o 1 (nodo fuera de línea). Véase también el cuadro en la página Instalación del Programa RadioShuttle para Turtle.

Por defecto, una propiedad PROG_CMDLINE vacía hace que el software inicie el programa “RadioTestNew”. Para iniciar otro programa introduzca el código de programa deseado, por ejemplo s80=b para iniciar inicialmente el programa «Blinky» (véase la Fig. 2 en la página Instalación del Programa RadioShuttle para Turtle).

Después de iniciar la tarjeta Turtle, al pulsar el pulsador “User” se enviará un mensaje de prueba a la pasarela MQTT. Esto puede ser monitoreado en la pantalla de la pasarela. El mensaje también se envía al servidor MQTT.

Mensajes de MQTT del / al servidor MQTT

Por lo general, varios clientes MQTT se conectan al servidor MQTT. Puede ser un PC, un smartphone, o incluso un cliente MQTT de Arduino. Explicaremos lo que se enviará/recibirá entre la pasarela MQTT y el servidor MQTT usando los siguientes tres ejemplos:

Mensaje LoRa recibido por la pasarela MQTT y reenviado al servidor MQTT

Después de que la pasarela MQTT ha recibido un mensaje de un nodo LoRa, lo reenvía al servidor MQTT. El topic se ve así:
loratest/HELIOS/myHost/LoRaRECV/11616/1/2
The content of the MQTT message is the LoRa message content. It is recommended to use very short messages (e.g. only a few bytes) to save energy on the LoRa node while sending, and to keep the network utilization low.

Un mensaje consiste en:

  • El topic MQTT (loratest/HELIOS) como se especifica en la propiedad de la pasarela MQTT_TOPIC_GATEWAY
  • Nombre de host como se especifica en la propiedad de la pasarela HOSTNAME (myHost si está vacío)
  • La clave (LoRaRECV) indica que la pasarela reenvía un mensaje LoRa recibido
  • El número 11616 indica el ID del nodo LoRa que envía el mensaje
  • El número 1 es el ID de la aplicación del nodo LoRa que envía el mensaje (el ID 1 es usado por todas las aplicaciones de muestra)
  • El último número indica el estado de recepción del nodo. Los números de estado válidos son:
    2 = se han recibido datos confirmados
    1 = se han recibido datos (no se ha solicitado confirmación)

Mensaje LoRa del servidor MQTT a la pasarela MQTT

Cuando la pasarela recibe un mensaje del servidor MQTT, y el topic configurado coincide, reenviará el contenido del mensaje al nodo remoto LoRa. El topic se parece a:
loratest/HELIOS/myHost/LoRaSEND/11616/1/1

  • Topic MQTT (lorates/HELIOS) como se especifica en la propiedad de la pasarela MQTT_TOPIC_GATEWAY
  • Nombre de host como se especifica en la propiedad de la pasarela HOSTNAME (myHost si está vacío)
  • Una clave (LoRaSEND) indica que la pasarela debería enviar un mensaje LoRa recibido
  • El número 11616 es el ID del nodo destino LoRa para este mensaje
  • El número 1 es el ID de la aplicación destino para este mensaje
  • El último número indica que un mensaje debe ser enviado:
    1 = con confirmación
    0 = sin confirmación al servidor MQTT
    El segundo bit (2) significa que el mensaje está sujeto a un cifrado AES, por ejemplo:
    2 Cifrado AES sin confirmación solicitada
    3 Cifrado AES con confirmación solicitada

Mensaje de confirmación de la pasarela de MQTT al servidor MQTT

Después de que un mensaje haya sido enviado desde el servidor MQTT a un nodo LoRa, se enviará un mensaje de estado al servidor MQTT para informarle sobre una transmisión de mensajes exitosa o fallida al nodo LoRa. Un topic de estado se parece a:
loratest/HELIOS/myHost/LoRaSTAT/11616/1/2
El contenido del mensaje es la cadena de estado, por ejemplo MS_SentCompletedConfirmed

  • Topic MQTT (loratest/HELIOS) como se especifica en la propiedad MQTT_TOPIC_GATEWAY
  • Una clave (LoRaSTAT) que la pasarela debería enviar un mensaje a un nodo LoRa
  • El número 11616 es el ID del nodo destino de LoRa para este mensaje
  • El número 1 es el ID de la aplicación destino para este mensaje
  • El último número es el estado de finalización del mensaje. Los números de estado válidos son:
    1 = la transmisión de mensajes se ha completado
    2 = la transmisión de mensajes ha sido completada y confirmada por el nodo receptor LoRa
    3 = la transmisión de mensajes se ha abortado después de un timeout (3 reintentos emitidos)
    4 = el nodo no aceptó el mensaje porque la autorización falló

Enviar mensajes MQTT a un smartphone

Después de aprender cómo se reenvían los mensajes al/desde el servidor MQTT, vamos un paso más allá y mostramos cómo se puede enviar un mensaje directamente a un smartphone. El smartphone puede incluso enviar un mensaje al nodo LoRa, a través de la pasarela MQTT.

  • Instale la aplicación “MQTT Push Client” para iOS o Android.
  • Configure la cuenta MQTT (usuario MQTT, contraseña, host).
  • Configure el topic MQTT en la aplicación, por ejemplo, “loratest/HELIOS”, como se especifica en la configuración de la pasarela:

¡Eso es! Los nuevos mensajes para este topic aparecerán en el smartphone después de que el nodo LoRa haya enviado un mensaje.

Enviar mensajes desde un smartphone

Añade una acción MQTT con los siguientes ajustes:

  • Nombre: «Hola nodo LoRa 11609»
  • Topic: loratest/HELIOS/LoRaSEND/phonename/11609/1/0
  • Nombre del smartphone: cualquier nombre, por ejemplo, “iPhone-Sergio”
  • El número 11609 es el ID del nodo destino LoRa para este mensaje
  • El número 1: es el ID de la aplicación para este mensaje
  • El último número (flags para la transmisión de mensajes):
    0 = no confirmación
    1 = el primer bit está puesto => enviar un mensaje con confirmación
    El segundo bit (2) significa que el mensaje está sujeto a un cifrado AES, por ejemplo
    2 Cifrado AES sin confirmación solicitada
    3 Cifrado AES con confirmación solicitada

Desde la ventana «Dashboard» de la aplicación la acción permite enviar datos al nodo LoRa. Esto puede ser un simple mensaje de control, por ejemplo, encender y apagar las luces.

Resumen

La pasarela MQTT permite el reenvío de mensajes versátiles entre los nodos LoRa de RadioShuttle peer-to-peer y el mundo IoT a través de MQTT. Esto puede ser un simple reporte de temperatura o un manejo avanzado de las máquinas. Toda la pasarela MQTT no requiere ninguna programación; sólo hay que introducir los parámetros WiFi y MQTT a través de la aplicación “PropertyEditor” y funcionará. Lo mismo es válido para el nodo LoRa. Se incluyen una docena de aplicaciones de prueba, sólo hay que activar/cargar la aplicación de sensor adecuada y la comunicación puede comenzar.

Nota de uso avanzado

Por defecto, todas las aplicaciones de prueba de RadioShuttle usan el ID de la aplicación “1” dentro del mensaje. Un campo mágico en el mensaje determina si el mensaje es procesado o ignorado. Para proyectos más grandes se pueden utilizar IDs de aplicaciones personalizadas cuando se registran a través de la función rs->RegisterApplication() al final de la función setup() en el archivo “.ino” del programa de ejemplo.
Cuando se utilizan mensajes cifrados AES, la contraseña debe establecerse de forma idéntica en todos los nodos LoRa y en la pasarela, utilizando “PropertyEditor”. Cuando se utilizan múltiples ID de aplicaciones, la contraseña debe ser especificada por ID de aplicación a través de la función rs->RegisterApplication().

Notas de rendimiento

Los mensajes MQTT pueden contener todo tipo de datos, por ejemplo, datos binarios, strings, HTML, o incluso mensajes codificados JSON. En las redes WiFi la longitud de los mensajes no es importante, mientras que en las redes LoRa la longitud del mensaje debe ser lo más corta posible. Por ejemplo, el ejemplo del sensor de temperatura RadioShuttle sólo utiliza 6 bytes o incluso menos para transmitir la humedad, la temperatura y el estado de la batería.

Hay tres razones principales para mantener el mensaje lo más corto posible:

  1. Evita una red de radio LoRa ocupada (permite que más dispositivos se comuniquen, supera el límite de 1% por hora de ocupación)
  2. Ahorra energía en los nodos LoRa alimentados por baterías
    (Por ejemplo, un mensaje de 12 bytes consume el doble de energía que un mensaje de 6 bytes)
  3. Acelera el tiempo de respuesta de la comunicación con pequeños mensajes. La modulación LoRa permite grandes distancias pero tiene una baja tasa de datos. Los pequeños mensajes entregan un tiempo de respuesta varias veces más rápido comparado con los grandes mensajes