MQTT y Raspberry PI Pico W: Comience con Mosquitto (MicroPython)

Raspberry PI Pico W aporta conectividad a tus proyectos. Mosquitto es una de las comunicaciones más fiables, sencillas y rápidas para proyectos IoT. Por eso, MQTT y Raspberry PI Pico W seguramente te darán una gran flexibilidad para tus proyectos Smart Things.

Este tutorial le mostrará cómo usar Mosquitto (MQTT) con Raspebbry PI Pico W con MicroPython.

que es mosquito

MQTT es un protocolo de mensajería para Internet de las cosas (IoT). Está diseñado para usar un ancho de banda de red mínimo y un código reducido para transportar mensajes desde/hacia dispositivos IoT.

MQTT se utiliza en una amplia variedad de industrias, como la automotriz, la manufactura, las telecomunicaciones, el petróleo y el gas, etc.

La arquitectura Mosquitto incluye 3 actores principales.

  • El MQTT Publisher Client publica datos, generalmente recopilados de sensores. Son los dispositivos donde se generan los datos de fila. Puede pensar en estos dispositivos como estrellas de las redes sociales que publican continuamente su flujo de datos para quien quiera leer.
  • El cliente de suscriptor de MQTT es donde se visualizan los datos. En la redacción de nueva generación, son algo así como seguidores sociales que se “suscriben” a un tema específico para recibir notificaciones de cada nuevo dato sobre ese tema.
  • El MQTT Broker es un servicio intermedio que hace posible que los suscriptores obtengan datos y que los editores envíen los suyos. Los dispositivos IoT Publisher no suelen ser tan “inteligentes”: suelen tener una lógica muy sencilla para que su hardware sea lo más económico posible. Por lo tanto, se exige la recopilación y presentación de datos al corredor MQTT, que también administra el acceso y los permisos del suscriptor (cuando sea necesario).

La siguiente imagen ofrece un ejemplo visual de la arquitectura de publicación/suscripción de MQTT:

Mosquitto (MQTT) utiliza puertos estándar: el puerto TCP/IP 1883 está reservado con IANA para su uso con MQTT. El puerto TCP/IP 8883 también está registrado para usar MQTT sobre SSL.

Para probar MQTT, necesitaremos crear un MQTT Broker y un suscriptor, además de Raspberry PI Pico W (que funcionará como cliente editor de MQTT). En este tutorial, usaré una placa de computadora Raspberry PI (Raspberry PI 3 Modelo B) y también mostraré cómo organizar una configuración muy básica para el corredor y el suscriptor.

Lo que necesitamos

Como de costumbre, sugiero agregar desde ahora a su carrito de compras de comercio electrónico favorito todo el hardware necesario, para que al final pueda evaluar los costos generales y decidir si continúa con el proyecto o los elimina del carrito de compras. Entonces, el hardware será solo:

Consulta precios de hardware en los siguientes enlaces:

Procedimiento paso a paso

Para este tutorial, la placa de computadora Raspberry PI (RPI 3 modelo B) funcionará como intermediario y suscriptor de MQTT, mientras que Raspberry PI Pico W funcionará como editor de MQTT. Por supuesto, el agente/suscriptor de MQTT puede ser cualquier dispositivo capaz de hacer esto.

Preparar agente/suscriptor de MQTT con Raspberry PI Computer

Comience a instalar el sistema operativo en la placa de su computadora Raspberry PI.

Usaré Raspberry PI OS Lite para tener un sistema operativo rápido y sin periféricos.

Si aún no lo ha hecho, actualice su sistema operativo. Desde la terminal, usa el siguiente comando:

sudo apt update -y && sudo apt upgrade -y

Ahora puede instalar Mosquitto con el comando:

sudo apt install mosquitto mosquitto-clients -y

Compruebe que Mosquitto se está ejecutando correctamente:

pi@raspberrypi:~ € sudo systemctl status mosquitto.service ● mosquitto.service - Mosquitto MQTT Broker      Loaded: loaded (/lib/systemd/system/mosquitto.service; enabled; vendor preset: enabled)      Active: active (running) since Wed 2022-07-27 17:17:06 CEST; 1 day 4h ago        Docs: man:mosquitto.conf(5)              man:mosquitto(8)     Process: 474 ExecStartPre=/bin/mkdir -m 740 -p /var/log/mosquitto (code=exited, status=0/SUCCESS)     Process: 483 ExecStartPre=/bin/chown mosquitto /var/log/mosquitto (code=exited, status=0/SUCCESS)     Process: 486 ExecStartPre=/bin/mkdir -m 740 -p /run/mosquitto (code=exited, status=0/SUCCESS)     Process: 487 ExecStartPre=/bin/chown mosquitto /run/mosquitto (code=exited, status=0/SUCCESS)    Main PID: 489 (mosquitto)       Tasks: 1 (limit: 780)         CPU: 1min 15.183s      CGroup: /system.slice/mosquitto.service              └─489 /usr/sbin/mosquitto -c /etc/mosquitto/mosquitto.conf  Jul 27 17:17:06 raspberrypi systemd[1]: Starting Mosquitto MQTT Broker... Jul 27 17:17:06 raspberrypi systemd[1]: Started Mosquitto MQTT Broker. 

Para obtener una comunicación más segura, podemos configurar el usuario y la contraseña para agregar un poco de seguridad. Para este ejemplo, configuraré un usuario «pico» con la contraseña «picopassword», pero cámbielo por su favorito. Ejecute el siguiente comando (cambie «pico» con su nombre de usuario):

sudo mosquitto_passwd -c /etc/mosquitto/credentials pico

El proceso solicitará automáticamente una contraseña («picopassword» para mi ejemplo, pero use la suya). Se generará el archivo “/etc/mosquitto/credentials”, incluyendo su contraseña encriptada.

En este momento, se ha generado una contraseña, pero aún no se usa desde nuestro corredor MQTT. Debe configurarlo en su configuración de mosquitto. Ábrelo para editar:

sudo nano /etc/mosquitto/mosquitto.conf

Y agregue las siguientes líneas al final:

allow_anonymous false password_file /etc/mosquitto/credentials listener 1883

Finalmente, reinicie el servicio Mosquitto:

sudo systemctl restart mosquitto.service

Preparar MQTT Publisher con Raspberry PI Pico W

Desde el lado del corredor MQTT, el trabajo ya está hecho. Ahora podemos pasar a Raspberry PI Pico W.

Comience a preparar su firmware Raspberry PI Pico W. Tenga en cuenta que el firmware oficial de MicroPython aún podría no ser compatible con la conexión RPI Pico W. Por este motivo, consulte mi tutorial Primeros pasos con WiFi en Raspberry PI Pico W y MicroPython.

Una vez que la conexión WiFi funcione, deberás guardar en tu almacenamiento Raspberry PI Pico W los 2 siguientes módulos externos:

El primero ya se usó en el tutorial Primeros pasos con WiFi en Raspberry PI Pico W y MicroPython citado anteriormente y administra la conexión WiFi.

El umqttsimple.py ya se ha utilizado con el HAT ethernet WIZnet y funciona también con el RPI Pico W, lo que simplifica el proceso de comunicación MQTT. El tutorial My Smart Farm con Raspberry PI, RPI Pico y WIZnet Ethernet Hat es otro caso de uso para este módulo.

Finalmente, obtenga y guarde en su Raspberry PI Pico W también el siguiente script de MicroPython:

Aquí está el código que puedes editar para adaptarlo a tus proyectos. Lo siguiente le dará una breve explicación del código.

En primer lugar, importamos los módulos necesarios:

import netman import time from umqttsimple import MQTTClient from machine import Pin

Establecemos el país WiFi, SSID y contraseña (cámbialas por las de tu casa) e iniciamos la conexión WiFi:

country = 'IT' ssid = 'yourWiFiSSID' password = 'yourWiFiPassword'  wifi_connection = netman.connectWiFi(ssid,password,country)

Las siguientes variables establecerán la conexión con su agente MQTT. En mi caso, mi Raspberry PI 3 Model B tiene como dirección IP 192.168.1.91, cámbiala por la de tu servidor MQTT. El client_id se puede configurar a su elección, algunos servicios MQTT (como ThingsBoard) le permiten usarlo para definir mejor sus sensores IoT. El user_t y password_t deben ser los mismos que los configurados en el capítulo anterior al asegurar la comunicación del intermediario MQTT en Raspberry PI 3 Modelo B. El topic_pub es el tema sobre el que publicaremos nuestros mensajes MQTT:

mqtt_server = '192.168.1.91' client_id = 'PicoW' user_t = 'pico' password_t = 'picopassword' topic_pub = 'hello'

La siguiente parte solo administra la conexión MQTT con el intermediario:

last_message = 0 message_interval = 5 counter = 0  def mqtt_connect():     client = MQTTClient(client_id, mqtt_server, user=user_t, password=password_t, keepalive=60)     client.connect()     print('Connected to %s MQTT Broker'%(mqtt_server))     return client  def reconnect():     print('Failed to connected to MQTT Broker. Reconnecting...')     time.sleep(5)     machine.reset()

Finalmente, el bucle principal.

La primera parte gestiona la conexión MQTT con el broker:

while True:     try:         client = mqtt_connect()     except OSError as e:         reconnect()

Una vez que se establece la conexión MQTT, publicar un mensaje MQTT sobre un tema específico es realmente simple con el uso de la instrucción client.publish(). El código restante solo administra las excepciones y desconecta al cliente (por supuesto, puedo mejorar los bucles while…):

    while True:         try:             client.publish(topic_pub, msg='Hello from Pico!')             print('published')             time.sleep(3)         except:             reconnect()             pass     client.disconnect()

Ejecute la prueba MQTT

El agente MQTT siempre se ejecuta en Raspberry PI 3 Modelo B, ya que es un servicio demonizado. Solo tenemos que iniciar el suscriptor de Mosquitto, para verificar si los mensajes se entregan, con el siguiente comando de terminal desde nuestra placa de computadora RPI (use su usuario/contraseña de Mosquitto en lugar de los del ejemplo):

pi@raspberrypi:~ € mosquitto_sub -d -t hello -u pico -P picopassword

Ahora también puede ejecutar (en el lado de Raspberry PI Pico W) el código mttq_picow.py de Thonny. Comenzará a intentar establecer la conexión WiFi, la conexión MQTT y luego enviará los mensajes moquitto (en caso de errores, verifique dos veces el usuario/contraseña y la IP):

>>> %Run -c €EDITOR_CONTENT waiting for connection... waiting for connection... waiting for connection... waiting for connection... connected ip = 192.168.1.42 Connected to 192.168.1.91 MQTT Broker published published published

Al mismo tiempo, en la placa de la computadora Raspberry PI, tendrá algo como lo siguiente, que indica que los mensajes se entregan correctamente:

pi@raspberrypi:~ € mosquitto_sub -d -t hello -u pico -P picopassword Client (null) sending CONNECT Client (null) received CONNACK (0) Client (null) sending SUBSCRIBE (Mid: 1, Topic: hello, QoS: 0, Options: 0x00) Client (null) received SUBACK Subscribed (mid: 1): 0 Client (null) received PUBLISH (d0, q0, r0, m0, 'hello', ... (16 bytes)) Hello from Pico! Client (null) received PUBLISH (d0, q0, r0, m0, 'hello', ... (16 bytes)) Hello from Pico! Client (null) received PUBLISH (d0, q0, r0, m0, 'hello', ... (16 bytes)) Hello from Pico!