¿Te resulta más fácil leer con fondo crema, un tono de color, más contraste o un texto más grande? Elige tus colores y tu texto una sola vez, para todas las páginas.

Lección gratuita

Publicar, suscribirse y filtrar temas

Después de esta lección: Puedo escribir un filtro de tema con los comodines + y # y decir qué mensajes recibe.

Lección de 55 min4 comandosLaboratorio de mensajería MQTT: cómo hablan los dispositivos con un intermediario, en el navegador

Quien envía no sabe quién recibe

Publicar y suscribirse es un modo de comunicar aparatos en el que quien envía un mensaje no sabe quién lo recibirá. En MQTT, un sensor publica en un tema, y cualquier programa interesado se suscribe a él.

Con un filtro de tema puedes escuchar un solo sensor, todos los de una sala o todos los de la casa.

Al final de esta lección

Nota

Puedo escribir un filtro de tema con los comodines + y # y decir qué mensajes recibe.

Palabras clave

PalabraQué significaEjemplo
Publicarenviar un mensaje a un tema del broker
Suscribirsepedir al broker los mensajes de un tema
Filtro de temael tema al que te suscribes, con o sin comodines
Comodínun símbolo que vale por una parte del tema+
Mensaje retenidoel último mensaje de un tema, que el broker guarda
Nivelcada parte de un tema entre dos barras

Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.

Publicador y suscriptor no se conocen

Un sensor publica sus lecturas en un tema. Un móvil se suscribe a ese tema y recibe cada mensaje que llegue después. Ninguno de los dos sabe nada del otro: los une el broker.

Por eso se puede añadir un segundo móvil, o una alarma, sin tocar el sensor.

Un filtro puede valer para varios temas

Un tema se escribe por niveles separados por barras: home/kitchen/temperature tiene tres. Un filtro puede sustituir niveles con comodines.

El comodín + vale por un solo nivel. El comodín # vale por todos los niveles que siguen, y solo puede ir al final.

Ejemplo resuelto: qué recibe cada filtro

Filtrohome/livingroom/temperaturehome/kitchen/temperaturehome/door/statehome/livingroom/humidity
home/+/temperatureSíSíNoNo
home/livingroom/+SíNoNoSí
home/+/stateNoNoSíNo
home/#SíSíSíSí

Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.

Escucha las temperaturas de todas las habitaciones

Comando
docker exec broker mosquitto_sub -t 'home/+/temperature' -v -C 3 -W 10

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Con + salen solo los temas que encajan

Salen tres líneas. Cada una empieza por home/kitchen/temperature o por home/livingroom/temperature y acaba con un número entero.

La humedad y la puerta no salen: no encajan con el filtro, porque su último nivel no es temperature. Los números cambian según el segundo en que pulses Run, así que mira la forma de la respuesta.

Escucha todo lo que cuelga de la cocina

Comando
docker exec broker mosquitto_sub -t 'home/kitchen/#' -v -C 2 -W 5

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Con # entran todos los niveles de debajo

Este filtro recibe cualquier tema que empiece por home/kitchen/. En el laboratorio la cocina tiene un solo sensor, así que salen dos líneas con el mismo tema, home/kitchen/temperature, y un número entero cada una.

La primera llega al instante y la segunda, un segundo después más o menos. El motivo está más abajo.

Un mensaje retenido espera al suscriptor tardío

Si te suscribes tarde, el broker normalmente no te cuenta lo que pasó antes. Un mensaje retenido es la excepción: el broker guarda el último de ese tema y lo entrega a cualquiera que se suscriba.

En el laboratorio, la puerta es retenida y la humedad no. Prueba los dos Run y compara cuánto tardan.

Pide el estado de la puerta

Comando
docker exec broker mosquitto_sub -t home/door/state -v -C 1 -W 5

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Pide la humedad de la sala

Comando
docker exec broker mosquitto_sub -t home/livingroom/humidity -v -C 1 -W 5

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Un error frecuente

Advertencia

Mucha gente cree que suscribirse es preguntar un valor al sensor. No lo es. El sensor publica cuando quiere, y el broker solo reparte el mensaje a quien está suscrito en ese momento. Por eso existen los mensajes retenidos: sin ellos, un suscriptor tardío no sabría nada.

Compara un filtro con un tema por niveles

Código: python
filtro = "home/+/temperature"   # cambia el filtro
tema = "home/kitchen/temperature"

niveles_f = filtro.split("/")
niveles_t = tema.split("/")

encaja = len(niveles_f) == len(niveles_t)
for i in range(min(len(niveles_f), len(niveles_t))):
    if niveles_f[i] != "+" and niveles_f[i] != niveles_t[i]:
        encaja = False
print(encaja)

Sobre este laboratorio y su código: Laboratorio de mensajería MQTT: cómo hablan los dispositivos con un intermediario, en el navegador

¿Enseñas a una clase? Asigna este módulo a tus alumnos con guía del profesor, tareas con corrección automática y un laboratorio para cada alumno.