3.1 MQTT – Esquema del mensaje de estado o acción

Referencia: MQTT, https://mqtt.org/ . Mosquitto, https://mosquitto.org/

1. MQTT  Concepto

MQTT (Message Queing Telemetry Transport) es un protocolo de comunicación entre máquinas (M2M) ligero y simplificado que sirve para comunicar estados o acciones de los dispositivos.

Una vez conectado el dispositivo a la red WiFi (sección anterior), el siguiente paso consiste en enviar los mensajes de estado, o recibir las instrucciones de acción que son llamados los mensajes MQTT.

mensajes MQTT
Estado Acción
encendido/apagado encender/apagar
ON / OFF 1/0
26° C bajar a 26° C

Para administrar los mensajes de requiere servidor que opere como oficina de correos, también llamado «broker«.

El ‘broker’ recibe los mensajes publicados por los dispositivos (pub) y los re-envia a los destinatarios o suscriptores (sub) conectados al servicio de mensajería.

El broker MQTT seleccionado para el ejercicio es Mosquitto por ser de tipo «open source». El broker se puede implementar en un equipo servidor e incluso en una laptop con objetivos de pruebas básicas.

2. MQTT – Protocolo

Los mensajes MQTT en los dispositivos tienen dos tipos de procesos:

  • Publicación o envío de mensajes de estado (pub)
  • Suscripción o recepción de mensajes de estado (sub)

Por ejemplo, para anunciar el cambio de estado de una puerta como abierta o cerrada usando un sensor se realiza la acción de publicación hacia un broker.

3. MQTT – Parámetros de comunicación

Un mensaje MQTT tiene  elementos semejantes a un correo electrónico. Para mostrar la semejanza, se usa como ejemplo un mensaje con la acción de apagar una lámpara de la oficina en la siguiente tabla.

correo electrónico MQTT
De: Juan Dispositivo/MQTT_ID: lampara01
Para: María Broker/puerto: 192.168.10.50:1883
Asunto: lámpara de oficina tópico: ‘oficina/lampara’
Mensaje: Apagar por favor, la dejé encendida estado/acción: ‘OFF’

Los elementos del mensaje en el esquema IoT y MQTT se muestran sobre el esquema IoT para el caso del sensor en una puerta. Se observa la forma de identificar cada elemento en cada componente o capa del modelo IoT.

Semejante a la conexión de WiFi hacia el Router, en MQTT se requiere disponer de los datos de un «administrador de mensajes» o «broker MQTT», que lo identifiquen en la red y a la vez también algún medio de control de uso como usuario y contraseña.

broker MQTT
Parámetro valor
dirección IP 192.168.10.50
puerto 1883
usuario usuarioprueba
contraseña usuarioclave

El broker MQTT además de identificarse por la dirección IP y usa un número de puerto para identificar también el servicio, pues pueden existir otros procesos en el mismo «servidor». El puerto básico es 1883, en el caso que se use encriptación de mensajes por TLS/SSL el puerto cambia a 8883.

En el ejemplo, se presentan valores que deben ser actualizados con los datos correspondientes a la configuración del broker que esté usando.

// MQTT: Servidor
char* MQTT_IP = "192.168.10.50";
uint16_t MQTT_puerto = 1883;
char* MQTT_usuario = "usuarioprueba";
char* MQTT_contrasena = "usuarioclave";

El dispositivo también debe ser identificado para el mensaje, teniendo como parámetros complementarios el identificador MQTT_ID.

Otro parámetro es el tema o tópico (MQTT_TOPIC) que también se usa para ubicar el dispositivo en un entorno o área y una variable de estado o acción separada mediante una barra de división «/».

El estado del dispositivo o valor de sensor se establece en una variable MQTT_Estado.

// MQTT: Dispositivo
char* MQTT_ID = "DispositivoLED";
char* MQTT_TOPIC = "oficina/mensaje";
char MQTT_SensorEstado[10] = "OFF";
boolean mqtt_desconectado = true;

Para el proceso también se puede usar una bandera de conectado o desconectado, para determinar si es posible enviar el mensaje sobre la red de datos.

En la práctica un dispositivo podría disponer de uno o mas sensores y/o actuador. Por ejemplo el sensor DHT11 entrega valores de temperatura y humedad, y disponer de un interruptor relé para encender o apagar un foco. En estos casos sería necesario distinguir varios tópicos o estados para el dispositivo.

4.  Esquema de instrucciones por Bloques

En el esquema de instrucciones por bloques para el dispositivo se requiere añadir algunas partes para operar con MQTT.  El mensaje MQTT viaja sobre una red de datos como WiFi, por lo que es necesario haber completado la parte de conexión a Wifi descrita en la sección anterior.

4.1 Bloque de inicio

Los procesos para mensajería con MQTT se pueden manejar con la librería es PubSubClient.h que se añade en el gestor de librerías del IDE.

Revise que se encuentre disponible en el menú de programa/incluir librería/gestor de librerias, de no ser así, aparece el botón de instalar en la ventana de la figura.

Con lo que se puede incluir la librería y los proceso para establecer un cliente en el broker MQTT.

#include <PubSubClient.h>

// Clientes WiFi y MQTT
WiFiClient wificlient;
PubSubClient mqttclient(wificlient);

4.2 Bloque de configuración setup()

Se requiere realizar una conexión con el broker MQTT, se forma semejante a la conexión al router, por lo que se crea un proceso denominado inicia_mqtt() solamente si se ha establecido una conexión WiFi.

4.3 Blucle o lazo de operación Loop()

Una vez realizada la lectura del sensor, de tener disponible una conexión WiFi y una conexión a un broker MQTT se realiza la publicación del valor del sensor en el tópico correspondiente.

    publica_estado();

4.4 Bloques de procedimiento inicia_mqtt() y publica_estado()

El procedimiento inicia_mqtt() se encarga de establecer los parámetros del broker y la conexión, que de completarse inicializa el estado del dispositivo publicando el valor del sensor o actuador.

  mqttclient.setServer(MQTT_IP, MQTT_puerto);
  mqttclient.connect(MQTT_ID, MQTT_usuario, MQTT_contrasena);
  //mqttclient.setCallback(callback);

  // Si conectado, inicializa estado
  if (mqttclient.connected()){
      publica_estado();
  }

El procedimiento de publicación de estado tiene dos partes, la conformación del mensaje y el envío del mensaje.

  // formato para envio (Texto)
  if (sensor_estado == true ){
    snprintf(MQTT_SensorEstado,10, "ON");
  }else{
    snprintf(MQTT_SensorEstado,10, "OFF");
  }

  // publicar estados
  if (mqttclient.connected()==true) {
    mqttclient.publish(MQTT_TOPIC,MQTT_SensorEstado,true);
  }

La siguiente página presenta el archivo con las instrucciones completas para la operación de un dispositivo.