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
| Palabra | Qué significa | Ejemplo |
|---|---|---|
| Publicar | enviar un mensaje a un tema del broker | |
| Suscribirse | pedir al broker los mensajes de un tema | |
| Filtro de tema | el tema al que te suscribes, con o sin comodines | |
| Comodín | un símbolo que vale por una parte del tema | + |
| Mensaje retenido | el último mensaje de un tema, que el broker guarda | |
| Nivel | cada 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
| Filtro | home/livingroom/temperature | home/kitchen/temperature | home/door/state | home/livingroom/humidity |
|---|---|---|---|---|
| home/+/temperature | Sí | Sí | No | No |
| home/livingroom/+ | Sí | No | No | Sí |
| home/+/state | No | No | Sí | 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
docker exec broker mosquitto_sub -t 'home/+/temperature' -v -C 3 -W 10Se 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
docker exec broker mosquitto_sub -t 'home/kitchen/#' -v -C 2 -W 5Se 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
docker exec broker mosquitto_sub -t home/door/state -v -C 1 -W 5Se 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
docker exec broker mosquitto_sub -t home/livingroom/humidity -v -C 1 -W 5Se 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
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)