Está en la página 1de 33

TRABAJO

MQTT sobre ESP8266 con SCADA NodeRED

Comunicaciones IIoT - MQTT


Master en Mecatrónica
1
Repaso del protocolo MQTT
● MQTT: Message Queuing Telemetry Transport

● Sobre TCP (tiene asignado el puerto 1883 o el 8883 sobre TLS).

● Modelo publicación/suscripción.

● Conceptos:

● Broker: es el gestor de la organización de la información y de su intercambio.

● Cliente: es quien se comunica con el broker para enviar o recibir información.

● Publicador: es el cliente que publica


● Suscriptor: es el cliente que recibe

● Topic: es el modelo de organización de la información que se envía o recibe


en el broker. El publicador (publisher) publica en un topic, y el suscriptor se
suscribe a un topic.

2
MQTT. Arquitectura 1

Subscriber

Publisher

Brocker
Subscriber
Topic
Publisher
Topic

Publisher
Subscriber

3
MQTT: Arquitectura 2

Temperatura

Sensor MensajeA = 27º


Display

publisher topic subscriber

Actuador
Sensor MensajeB = 504lm
MensajeB = 504lm
Luminosidad

4
MQTT: topics

El topic MQTT está incluido en cada mensaje PUBLISH.


El topic tiene la forma jerárquica:


site/line/machine/data. Se pueden utilizar “+” para sustituir por “un nivel cualquiera”
o “#” por “varios niveles cualquiera”.

El símbolo $ está reservado para información de sistema y no se usa en los nombres
de topic.

Para evitar incompatibilidades, se recomienda utilizar letras ASCII y números


No se pueden utilizar “wildcards” en publicación (sólo en suscripción)


Los topics pueden tener una longitud de 64kB


Muy flexible: p.ej. “sensor botón1” y “sensor botón2”: estados ON/OFF para ambos.


Opción A: topic1 “Boton1”, topic2 “Boton2”

Opción B: topic: “Botones”. Separación de variables en JSON. Los dispositivos (los
botones) tienen diferentes Ids.


Un topic se crea cuando el primer cliente se suscribe a él.


Un topic se borra cuando el último cliente suscrito se desconecta.

5
MQTT: Topics

Observaciones sobre topics


No se pueden conocer todos los topics salvo que te suscribas a #.


Para saber las conexiones y eventos en un broker, hay que
suscribirse a:


$SYS/broker/connection/#

$SYS/broker/log/#


No se pueden conocer los suscriptores de un topic.

6
MQTT: Calidad de servicio QoS

● MQTT ofrece 3 niveles de QoS. El uso de cualquiera de ellos depende del grado de
confiabilidad requerido en el envío de mensajes.

● El QoS de MQTT se aplica al proceso de envío, ya sea desde el cliente hacia el broker o a la
inversa.

● El cliente escoge el máximo nivel de QoS que recibirá.

● QoS 0: El receptor (ya sea broker en el caso de publicación, o cliente en caso de suscripción)
recibe el mensaje como máximo una vez.

● QoS 1: El receptor recibe el mensaje al menos una vez.

● QoS 2: El receptor recibe el mensaje exáctamente una vez.

7
MQTT: Calidad de servicio QoS

● Es necesario ver el sistema QoS de MQTT de forma global en formato publicación/suscripción.

● Ejemplo1:
● Si un mensaje se publica con QoS 2 y un cliente se suscribe con QoS 0, el mensaje se

enviará hacia el suscriptor con QoS 0 (desde el broker).


● Si un nuevo cliente se suscribe con QoS 2, el mensaje se enviará a ese nuevo suscriptor

con QoS 2.

● Ejemplo2:
● Si un cliente publica con QoS 0, y un cliente se suscribe con QoS 2, el suscriptor lo recibirá

con QoS 0, es decir, es posible que el suscriptor no reciba el mensaje.

● La comunicación publicador/suscriptor a través del broker, siempre tendrá la menor de las QoS
de ambas conexiones.

● A mayor QoS, mayor retardo de comunicación.

● Se puede recomendar para sistemas de sensorización/actuación una comunicación mas o


menos contínua con QoS 0.

8
MQTT Installación (en Linux Debian)

- Brocker

$ sudo apt-get install mosquitto

En el brocker, mosquitto se administra como un servicio (service start, stop, restart …)

$ sudo service start mosquitto

El puerto de escucha por defecto es el TCP 1883. Es conveniente cambiarlo. En:


/etc/mosquitto/mosquitto.conf (o en /etc/mosquitto/conf.d/mosquitto.conf si el primero tiene la linea:
include_dir /etc/mosquitto/conf.d) poner:

port 1993

- Clientes (publisher y/o subscriber)

$ sudo apt-get install mosquitto-clients

El comando de operación para subscriber

$ mosquitto_sub –d –t topic

El comando de operación para publisher

$ mosquitto_pub –d –t topic –m “Hola golfos”

9
MQTT: Uso básico de publish/subscribe

- Publish:

$ mosquitto_pub -h localhost -p 1993 -m “hola mundo” -t alumnos/MDC3453z/trabajo

-d debug
-u nombre usuario
-P password
-i nombre cliente
-I prefijo de ID de cliente

- Subscribe:

Cliente mosquitto_sub:

$ mosquitto_sub -h localhost -p 1993 -t alumnos/MDC3453z/# -v -C 3 -q 0 -d

-v verbose
-q QoS
-d debug
-C X finalizar tras X mensajes.

Suscribirse a mensajes de control del broker:

$ mosquitto_sub -h localhost -p 1884 -t $SYS/#

10
MQTT Autenticación:


El brocker se puede configurar para ser accesible mediante usuario/password. En ese caso no
se puede establecer una conexión MQTT sin autenticación.


Se puede utilizar para accesos a topics.


El usuario y la password se transmiten en texto plano (podría ser capturado de forma sencilla).


Proceso en Brocker


Crear un fichero de texto con formato “usuario:passwd”

Encriptar el fichero:

$ mosquitto_passwd -U ficheropasswd


Copiar ficheropasswd en /etc/mosquitto.

Editar mosquitto.conf:
…..
allow_anonymous false
password_file /etc/mosquitto/ficheropasswd
…..

Reiniciar mosquitto

11
MQTT Autenticación: cliente

- Cliente mosquitto:

$ mosquitto_pub -h localhost -p 1884 -m “hola mundo” -t alumnos/MDC3453z/trabajo -u MDC3453z -P mipasswd

-d debug
-u nombre usuario
-P password
-i nombre cliente
-I prefijo de ID de cliente

- Cliente paho (python):

Usar la función “username_pw_set()” antes de establecer conexión. El formato es:

username_pw_set(username=”MDC3453z”,password=”mipasswd”)

12
MQTT. Cliente ESP8266
Arquitectura
Envío de datos de sensorización desde un ESP8266 hacia un brocker mosquitto con dashboard NodeRED.

- Los datos serán generados artificialmente en bucle dentro del ESP8266.


- El brocker mosquitto y el dashboard NodeRED estarán en la misma máquina. Se provee un broker Mosquitto y un dashboard NodeRED
por usuario (Ver última transparencia)

13
MQTT. Cliente ESP8266
Instalación Arduino IDE
Seguir instrucciones de: https://www.arduino.cc/en/Guide

- Bajarse la última versión de: “https://www.arduino.cc/en/software”


- Funciona perfectamente en Linux y Windows.
- Para Linux 64 bits.
- El paquete de software es un tar.xz. La última versión mientras se escribía este documento es la arduino-1.8.13-linux64.tar.xz

- Extraer el paquete en un directorio al gusto del usuario:

$ tar -xf arduino-1.8.13-linux64.tar.xz

- Confirmar que el fichero install.sh extraido tiene permisos de ejecución y ejecutarlo:

$ ls -l install.sh
-rwxr-xr-x 1 cacho cacho 11070 Jun 16 2020 install.sh
$ ./install.sh

El script tarda un cierto tiempo en instalarse … es necesario tener paciencia.

- Ejecutar arduino. Se puede hacer desde el mismo directorio donde estaba el script de instalación “install.sh” (en el caso del ejemplo
en el directorio “/home/cacho/Arduino/arduino-1.8.13ç7”), o posiblemente desde algún nuevo icono del escritorio, o directamente desde
cualquier directorio dependiendo de si se incluyó el ejecutable en el PATH durante la instalación.

~/Arduino/arduino-1.8.13$ ./arduino

14
MQTT. Cliente ESP8266
Instalación de librerías necesarias para el módulo disponible del ESP8266
Se trabajará con el módulo WeMos D1 mini

En el entorno Arduino IDE, abrir “File-Preferences”

En el cuadro “Additional Boards Manager URL's poner:

http://arduino.esp8266.com/stable/package_esp8266com_index.json

15
MQTT. Cliente ESP8266
Instalación de librerías necesarias para el módulo disponible del ESP8266
Se cierra y se abre el Arduino IDE de nuevo.

En Tools → Board → Boards Manager se hace una búsqueda de “wemos” o directamente “esp8266”y aparece la librería “Esp8266 by
ESP8266 Community”, actualmente en su versión 2.7.4. Se pulsa “Install” y tras unos segundos aparece como “Installed”.

16
MQTT. Cliente ESP8266
“Hola mundo” ESP8266
A partir de ese momento, se selecciona para la realización, compilación y carga de los
programas la tarjeta “Wemos R1 D1 que aparece en la lista de tarjetas bajo el menu
“Tools”

17
MQTT. Cliente ESP8266
“Hola mundo” ESP8266
Open - Posiblemente, al seleccionar la tarjeta Wemos R1 D1 aparezca un
programa básico llamado “Blink” en la pantalla de edición. El
programa símplemente realiza un encendido/apagado intermitente
del led azul integrado en el ESP8266. Si no es así, puede
seleccionarse ese programa en el boton “Open” (flecha hacia arriba)
→ D1 mini examples → Basic → Blink.

- En todo caso, siempre se puede escribir el programa, cuyo


contenido es bastante explícito:

void setup() {
pinMode(BUILTIN_LED, OUTPUT); // initialize onboard LED as output
}

void loop() {
digitalWrite(BUILTIN_LED, HIGH); // turn on LED with voltage HIGH
delay(5000); // wait 5 seconds
digitalWrite(BUILTIN_LED, LOW); // turn off LED with voltage LOW
delay(500); // wait 0.5 seconds
}

- Al probarlo, es posible que el estado del LED este invertido, es


decir, que el estado “HIGH” sea apagado y el estado “LOW” sea
encendido.

18
MQTT. Cliente ESP8266
“Hola mundo” ESP8266
Upload - Para compilarlo y volcarlo hacia el dispositivo Wemos, este debe
estar conectado a un puerto USB del equipo y tener permisos (en el
caso de Linux) de escritura sobre ese puerto.

- La compilación y carga se realiza en el botón “Upload” (Flecha


derecha)

- Si por alguna razón no se tienen permisos de escritura en el puerto


/dev/ttyUSB0 se pueden conceder con el comando:

$ sudo chmod 777 /dev/ttyUSB0

- A veces (pocas) no carga el programa en la flash del ESP8266 a la


primera por algún fallo en verificación del código. En esos casos es
conveniente intentarlo de nuevo una segunda vez y revisar la
conectividad y calidad del cable USB-microUSB.

19
MQTT. Cliente ESP8266
Conexión inicial a una red WiFi del ESP8266
Para conectarse a una WiFi en modo “Cliente”, es necesario instalar la librería “WiFi” desde el menu “Sketch” → “Include Library” →
“Manage Libraries”. Se realiza la búsqueda de la librería “WiFi” y se selecciona la última versión (actualmente la 1.2.7) y se instala .. en
unos segundos aparecerá como “INSTALLED”

20
MQTT. Cliente ESP8266
Conexión inicial a una red WiFi del ESP8266
Un programa básico para establecer una conexión WiFi en el ESP8266 puede verse a continuación, donde también se establece una
monitorización a través del puerto serie USB que se puede visualizar pulsando en la “Lupa” superior de la derecha del entorno Arduino IDE.

La monitorizacion por consola devuelve la direccion IP asignada al ESP8266, por lo que sera posible hacer un ping desde cualquier equipo
conectado a la misma WiFi hacia el ESP.
Serial Monitor
Nota: sustituir SSID por el nombre de la WiFi, y PASSWORD por la clave WiFi.

#include <ESP8266WiFi.h> // Include the Wi-Fi library


const char* ssid = "SSID"; // The SSID (name) of the Wi-Fi network
const char* password = "PASSWORD"; // The password of the Wi-Fi network
void setup() {
Serial.begin(115200); // Start the Serial communication to send messages to the computer
delay(10);
Serial.println('\n');

WiFi.begin(ssid, password); // Connect to the network


Serial.print("Connecting to ");
Serial.print(ssid); Serial.println(" ...");
int i = 0;
while (WiFi.status() != WL_CONNECTED) { // Wait for the Wi-Fi to connect
delay(1000);
Serial.print(++i); Serial.print(' ');
}
Serial.println('\n');
Serial.println("Connection established!");
Serial.print("IP address:\t");
Serial.println(WiFi.localIP()); // Send the IP address of the ESP8266 to the computer
}
void loop() { }

21
MQTT. Cliente ESP8266
Uso de la librería MQTT “PubSubClient”
Para el uso de las funciones de publicacion/suscripcion MQTT sera necesario hacer uso de la libreria “PubSubClient”, que se instalara de la
misma forma que se instalo la libreria “WiFi”.

22
MQTT. Cliente ESP8266
Publicación en un broker MQTT
Una vez establecida conexión a una red WiFi con salida a Internet, podrá hacerse una publicación en un broker MQTT ubicado en cualquier
dirección pública de Internet.

Un ejemplo sería:.
// Printing the ESP IP address
#include <ESP8266WiFi.h>
Serial.println(WiFi.localIP());
#include <PubSubClient.h>
client.setServer(mqttServer, mqttPort);
const char* ssid = "SSID";
const char* password = "PASSWORD";
while (!client.connected()) {
Serial.println("Connecting to MQTT...");
const char* mqttServer = "BROKER_IP_ADDRESS";
const int mqttPort = BROKER_PORT;
if (client.connect("", mqttUser, mqttPassword )) {
const char* mqttUser = "BROKER_USER";
Serial.println("connected");
const char* mqttPassword = "BROKER_USER_PASSWORD";
} else {
Serial.print("failed ");
WiFiClient espClient;
delay(2000);
PubSubClient client(espClient);
}
}
int data = 0;
client.publish(“alumnos/MDC8974z/prueba", "Hello from ESP8266");
char PublishData[50];
}
void setup() {
void loop() {
// Initializing serial port for debugging purposes
String SensorData = "Data: ";
Serial.begin(115200);
SensorData.concat(data);
delay(10);
SensorData.toCharArray(PublishData, SensorData.length()+1);
Serial.println(ssid);
Serial.println(SensorData);
WiFi.begin(ssid, password);
client.publish(“alumnos/MDC8974z/prueba", PublishData);
while (WiFi.status() != WL_CONNECTED) {
client.loop();
delay(500);
data++;
}
Serial.println("WiFi connected");
}

23
MQTT. Node-RED.

1. Descripción

Node-RED se define como un “IoT Automation System”. Esto es una plataforma que sirve de pasarela
software entre los dispositivos IoT y entre estos y sistemas de control y servidores. Integra por tanto:

● Protocolos (MQTT, COAP, MODBUS... )

● Servicios (Web, …)

● Lenguaje de programación gráfico y scripting

● Sistemas de presentación.

24
MQTT. Node-RED.

25
MQTT. Node-RED. Instalación y arranque

2. Instalación y arranque
Depende del sistema operativo. Node Red funciona sobre Java.

● Debian (a partir de Jessie 8) y Raspbian (sobre RBPi 3). Están documentadas versiones anteriores.

$ bash <(curl -sL https://raw.githubusercontent.com/node-red/raspbian-deb-package/master/resources/update-nodejs-and-


nodered)

Puede aparecer algún warning, pero en general debería funcionar. En el caso de problemas, visualizar el log “/var/log/nodered-
install.log”

● Arrancar y parar:

$ node-red-start
$ node-red-stop

Para arranque automático con el sistema (o eliminación de arranque automático):

$ sudo systemctl enable nodered.service

$ sudo systemctl disable nodered.service

Para visualizar el log, systemd utiliza /var/log/system.log for logging. El filtrado de mensajes referidos a nodered

$ sudo journalctl -f -unodered -o cat 26


MQTT. Node-RED.
3. Operación básica
● Acceso

En cualquier navegador se accede a la IP donde está instalado Node- RED mediante https y el puerto configurado:

https://IPNODERED:PUERTO

Poner Usuario y contraseña.

Nota: Para los datos de conexión


ver última transparencia.

27
MQTT. Node-RED. Protección
4. Operación básica
● Conexión a mosquitto

El manejo de NodeRED es intuitivo, arrastrando módulos hacia el panel central, conectándo módulos entre sí y haciendo doble clik sobre
ellos para configurarlos.

Se selecciona el módulo mqtt de input (es una suscripción a un topic de un broker) y se arrastra al panel central. Se hace doble sobre él
y se configura:

28
MQTT. Node-RED. Protección
4. Operación básica
● Visualización básica

Se selecciona el módulo “debug” del conjunto de los módulos “output” y se arrastra al panel central. Se conecta al módulo de
suscripción.

Se pulsa “Deploy”

Si se publica algo en ese topic del broker, deberá aparecer en la pentaña “debug” de la derecha:

$ mosquitto_pub -h IPDELBROKER -t alumnos/MDC4345z/trabajo -m "Hola golfos" -p 1993 -u MDC3453z -P mipasswd

29
MQTT. Node-RED. Visualización Dashboard
5. Visualización dashboard
● Instalación del módulo:

Desde ~/.node-red/, se ejecuta:

$ npm I node-red-dashboard
$ sudo service nodered restart

Debe de aparecer en el conjunto de módulos de la izquierda, un grupo llamado “dashboard”

Se selecciona el módulo “text” y se le da doble-clic para configurar (se puede dejar la configuración por defecto). Se arrastra al panel central
y se conecta al módulo de suscripción. Se pulsa “Deploy”

30
MQTT. Node-RED. Visualización Dashboard
5. Visualización dashboard (cont)
- Visualización:

Se visualiza el dashboard en la url “https://IPNODERED:PUERTO/ui/”

Desde un cliente (por ejemplo el comando “mosquitto_pub” de Linux) se publica un mensaje de texto:

$ mosquitto_pub -h IPDELBROKER -t alumnos/MDC3543z/trabajo -u MDC3543z -p MIPASSWD -m "Data: 5" -p 1993

31
MQTT. Cliente ESP8266
SUGERENCIAS DE AMPLIACION

● Creacion por programa de un flujo de datos en el ESP8266 en forma de diente de sierra,


por ejemplo del 1 al 10 y vuelta a empezar. Transmision de los mismos al broker via MQTT
y presentacion en grafica en el NodeRED.

● Uso del formato “json” (libreria ArduinoJson) para la transmision de los datos. Tened en
cuenta que “json” es un formato estándar de codificación de datos para IioT. Ver
https://randomnerdtutorials.com/decoding-and-encoding-json-with-arduino-or-esp8266/

● Encendido del LED azul embebido en el ESP8266 desde el NodeRED. Sugerencia,


publicar el estado de un “switch” o un “button” en un topic del broker MQTT desde el
NodeRED y que el ESP8266 se suscriba a ese topic.

● Uso de sensores y actuadores reales, dependiendo de la disponibilidad existen diversos


shields (escudos) que se pueden conectar a los pines de IO del ESP8266.

32
MQTT. Cliente ESP8266
DATOS DE CONEXION

BROKER MQTT (mosquitto)

● DIRECCIÓN: nodered.cognosfera.net
● PUERTO: 1993
● USUARIO: 3 Iniciales (Mayúsculas) + 4 últimas cifras DNI + Letra DNI (minúscula), p.ej.
MDC4543z
● CLAVE USUARIO: orden inverso al usuario, p.ej. z3454CDM
● Topic: cualquier topic por debajo de: alumnos/”USUARIO”/, p.ej.
alumnos/MDC4543z/sensor1

NODE-RED

● URL: https://nodered.cognosfera.net:19XY
NOTA: 19XY (XY=índice del usuario en la lista de usuarios en FAITIC), p.ej
https://nodered.cognosfera.net:1921
● USUARIO: 3 Inciales (Mayúsculas) + 4 últimas cifras DNI + Letra DNI (minúscula), p.ej.
MDC4543z
● CLAVE USUARIO: orden inverso al usuario, p.ej. z3454CDM

33

También podría gustarte