Diferència entre revisions de la pàgina «El protocolo MQTT»
(Hi ha 23 revisions intermèdies del mateix usuari que no es mostren) | |||
Línia 1: | Línia 1: | ||
= ¿Qué es MQTT? = | = ¿Qué es MQTT? = | ||
+ | [[Image:IntroMqtt00.jpg|center|Visión general del protocolo MQTT]] | ||
+ | |||
MQTT es una manera de comunicar dispositivos de Internet de las Cosas (IdC / IoT) entre sí. Es un protocolo ligero y muy versátil que se puede usar desde un Arduino, una Rasperry Pi, un PC multinúcleo hasta los servicios de Amazon Web Services. | MQTT es una manera de comunicar dispositivos de Internet de las Cosas (IdC / IoT) entre sí. Es un protocolo ligero y muy versátil que se puede usar desde un Arduino, una Rasperry Pi, un PC multinúcleo hasta los servicios de Amazon Web Services. | ||
Línia 22: | Línia 24: | ||
* Calidad del servicio ('''QoS''') | * Calidad del servicio ('''QoS''') | ||
+ | |||
+ | * Actividad ('''ping''') | ||
+ | |||
+ | * Desconexión ('''disconnect''') | ||
== Intermediario ('''broker''') == | == Intermediario ('''broker''') == | ||
Línia 31: | Línia 37: | ||
== Tema ('''topic''') == | == Tema ('''topic''') == | ||
Nombre (o lugar) del intermediario para un tipo de mensaje. Los clientes se subscriben y publican a un tema. | Nombre (o lugar) del intermediario para un tipo de mensaje. Los clientes se subscriben y publican a un tema. | ||
+ | |||
+ | [[Image:MqttTopicBasics.png|center|Ejemplo de jerarquía de temas (de HiveMQ)]] | ||
+ | |||
+ | [https://www.luisllamas.es/que-son-y-como-usar-los-topics-en-mqtt-correctamente/ Qué son y cómo usar los Topics en MQTT correctamente] de Luis Llamas | ||
+ | === Filtros de tema ('''topic wildcards''') === | ||
+ | Comodines MQTT ('''MQTT Wildcards'''): Símbolos predefinidos que pueden ser usados como filtro de temas para suscribirse a múltiples temas de forma simultánea. | ||
+ | |||
+ | * Signo más ('''+'''): Un '''comodín de un solo nivel''' que coincide con cualquier nombre para un nivel de tema específico. | ||
+ | |||
+ | [[Image:MqttTopicWildcardPlus.png|center|Ejemplo de comodín de un solo nivel (de HiveMQ)]] | ||
+ | |||
+ | Cualquier tema coincide con un tema con un comodín de un solo nivel si contiene una cadena arbitraria en lugar del comodín. Por ejemplo, una suscripción a myhome/groundfloor/+/temperature puede producir los siguientes resultados: | ||
+ | |||
+ | [[Image:TopicWildcardPlusExample.png|center|Ejemplo de comodín de un solo nivel (de HiveMQ)]] | ||
+ | |||
+ | * Almohadilla ('''#'''): Un '''comodín de varios niveles''' que coincide con todos los temas que coinciden con los niveles de tema que se especifican delante del símbolo # en el filtro de temas. | ||
+ | |||
+ | [[Image:TopicWildcardHash.png|center|Ejemplo de comodín de varios niveles (de HiveMQ)]] | ||
+ | |||
+ | |||
+ | [[Image:TopicWildcardHashExample.png|center|Ejemplo de comodín de varios niveles (de HiveMQ)]] | ||
+ | |||
+ | * Dólar ('''$'''): Los temas que comienzan con el símbolo $ están reservados para las estadísticas internas del ''broker'' MQTT. Los clientes no pueden publicar mensajes con estos temas. Por el momento, no existe una estandarización oficial. | ||
+ | |||
+ | [https://www.hivemq.com/blog/mqtt-essentials-part-5-mqtt-topics-best-practices/ Fuente: Página de HiveMQ] | ||
== Publicación ('''publish''') == | == Publicación ('''publish''') == | ||
Línia 48: | Línia 79: | ||
* '''QoS 0 unacknowledged (at most one)''': El mensaje se envía una única vez. En caso de fallo puede que alguno no se entregue. | * '''QoS 0 unacknowledged (at most one)''': El mensaje se envía una única vez. En caso de fallo puede que alguno no se entregue. | ||
− | * '''QoS 1 acknowledged (at least one)''': El mensaje se envía hasta que se garantiza la entrega. En caso de fallo, el suscriptor puede recibir | + | * '''QoS 1 acknowledged (at least one)''': El mensaje se envía hasta que se garantiza la entrega. En caso de fallo, el suscriptor puede recibir algunos mensajes repetidos. |
* '''QoS 2 assured (exactly one)''': Se garantiza que cada mensaje se entrega al suscriptor, y únicamente una vez. | * '''QoS 2 assured (exactly one)''': Se garantiza que cada mensaje se entrega al suscriptor, y únicamente una vez. | ||
Línia 55: | Línia 86: | ||
[https://www.luisllamas.es/que-es-mqtt-su-importancia-como-protocolo-iot/ Fuente: Páqina web de Luis Llamas] | [https://www.luisllamas.es/que-es-mqtt-su-importancia-como-protocolo-iot/ Fuente: Páqina web de Luis Llamas] | ||
+ | |||
+ | == Actividad ('''ping''') == | ||
+ | Para asegurar que la conexión está activa, los clientes mandan periódicamente un mensaje PINGREQ que es respondido por el servidor con un PINGRESP. | ||
+ | |||
+ | == Desconexión ('''disconnect''') == | ||
+ | El cliente se desconecta enviando un mensaje de DISCONNECT. | ||
= Analogía con el servicio postal = | = Analogía con el servicio postal = | ||
Línia 70: | Línia 107: | ||
En el MQTT hay un intermediario que comunica con los clientes. Hay temas que pueden tener subtemas. Cuando los dispositivos se conectan pueden publicar información sobre temas o subtemas y también se pueden subscribir para recibir información. | En el MQTT hay un intermediario que comunica con los clientes. Hay temas que pueden tener subtemas. Cuando los dispositivos se conectan pueden publicar información sobre temas o subtemas y también se pueden subscribir para recibir información. | ||
[[Image:AnalogiaServeiPostal.png|center|Analogía con el servicio postal]] | [[Image:AnalogiaServeiPostal.png|center|Analogía con el servicio postal]] | ||
+ | [https://www.baldengineer.com/mqtt-introduction.html Fuente: Página baldengineer.com] | ||
= MQTT vs HTTP (o REST) = | = MQTT vs HTTP (o REST) = | ||
Línia 75: | Línia 113: | ||
HTTP requiere de múltiples acciones POST para distribuir un mensaje a mas de un cliente. El objetivo del sistema de mensajería intermediaria es que el intermediario distribuya el mensaje, tan solo a los clientes interesados. La funcionalidad del MQTT es enviar de uno a muchos. | HTTP requiere de múltiples acciones POST para distribuir un mensaje a mas de un cliente. El objetivo del sistema de mensajería intermediaria es que el intermediario distribuya el mensaje, tan solo a los clientes interesados. La funcionalidad del MQTT es enviar de uno a muchos. | ||
+ | = Ejemplo de arquitectura publicación / subscripción MQTT = | ||
+ | [[Image:MqttPublishSubscribe.png|center|Ejemplo de arquitectura publicación / subscripción MQTT en mqtt.org]] | ||
+ | [https://mqtt.org/ Fuente: Página de mqtt.org] | ||
+ | |||
= Estructura de un mensaje MQTT = | = Estructura de un mensaje MQTT = | ||
Uno de los componentes más importantes del protocolo MQTT es la definición y tipología de los mensajes, ya que son una de las bases de la agilidad en la que radica su fortaleza. Cada mensaje consta de 3 partes: | Uno de los componentes más importantes del protocolo MQTT es la definición y tipología de los mensajes, ya que son una de las bases de la agilidad en la que radica su fortaleza. Cada mensaje consta de 3 partes: | ||
+ | |||
+ | [[Image:MqttMessage.png|center|Mensaje MQTT]] | ||
* '''Cabecera fija'''. Ocupa 2 a 5 bytes, obligatorio. Consta de un código de control, que identifica el tipo de mensaje enviado, y de la longitud del mensaje. La longitud se codifica en 1 a 4 bytes, de los cuales se emplean los 7 primeros bits, y el último es un bit de continuidad. | * '''Cabecera fija'''. Ocupa 2 a 5 bytes, obligatorio. Consta de un código de control, que identifica el tipo de mensaje enviado, y de la longitud del mensaje. La longitud se codifica en 1 a 4 bytes, de los cuales se emplean los 7 primeros bits, y el último es un bit de continuidad. | ||
Línia 85: | Línia 129: | ||
Los tipos de mensajes y códigos de control que se envían en el protocolo MQTT son los siguientes: | Los tipos de mensajes y códigos de control que se envían en el protocolo MQTT son los siguientes: | ||
+ | {| class="wikitable" style="margin:auto" | ||
+ | |+ Asignación de puertos para el curso 2022-2023 | ||
+ | |- | ||
+ | ! Mensaje !! Código | ||
+ | |- | ||
+ | | CONNECT || 0x10 | ||
+ | |- | ||
+ | | CONNACK || 0x20 | ||
+ | |- | ||
+ | | PUBLISH || 0x30 | ||
+ | |- | ||
+ | | PUBACK || 0x40 | ||
+ | |- | ||
+ | | PUBREC || 0x50 | ||
+ | |- | ||
+ | | PUBREL || 0x60 | ||
+ | |- | ||
+ | | PUBCOMP || 0x70 | ||
+ | |- | ||
+ | | SUBSCRIBE || 0x80 | ||
+ | |- | ||
+ | | SUBACK || 0x90 | ||
+ | |- | ||
+ | | UNSUBSCRIBE || 0xA0 | ||
+ | |- | ||
+ | | UNSUBACK || 0xB0 | ||
+ | |- | ||
+ | | PINGREQ || 0xC0 | ||
+ | |- | ||
+ | | PINGRESP || 0xD0 | ||
+ | |- | ||
+ | | DISCONNECT || 0xE0 | ||
+ | |} | ||
+ | |||
+ | [https://www.luisllamas.es/que-es-mqtt-su-importancia-como-protocolo-iot/ Fuente: Páqina web de Luis Llamas] | ||
+ | = Ejemplos en línea de uso de MQTT = | ||
+ | [https://wokwi.com/projects/395171178315723777 ESP32 programado en MicroPython usando MQTT] en Wokwi interaccionando con [https://snap.binefa.cat/snap.html#open:https://raw.githubusercontent.com/jordibinefa/IoT-02/master/codes/snap/esp32Mqtt00.xml un ESP32 en Snap!]<!-- [https://snap.berkeley.edu/snap/snap.html#open:https://raw.githubusercontent.com/jordibinefa/IoT-02/master/codes/snap/esp32Mqtt00.xml un ESP32 en Snap!] | ||
+ | * Snap! y Qt/QML sobre WebAssembly | ||
+ | |||
+ | [http://formacio.things.cat/snap8/snap.html#open:../codisSnap/esp32_DT_8.0.0.xml ESP32 en Snap! v8] interaccionando con [http://formacio.things.cat/xtra/wsMqtt02/ un ejemplo Qt/QML con WebAssembly] ([https://www.binefa.cat/training/iot02/qt/wsMqtt03.zip Código fuente del ejemplo usando Qt/QML sobre WebAssembly]) | ||
+ | * Wokwi y Qt/QML sobre WebAssembly | ||
− | [https:// | + | [https://wokwi.com/projects/350955865540395602 ESP32 programado en MicroPython usando MQTT] interaccionando con [http://formacio.things.cat/xtra/wsMqtt02/ un ejemplo Qt/QML sobre WebAssembly] --> |
= Referencias = | = Referencias = | ||
Línia 99: | Línia 184: | ||
[http://www.steves-internet-guide.com/mqtt/ Beginners Guide To The MQTT Protocol] | [http://www.steves-internet-guide.com/mqtt/ Beginners Guide To The MQTT Protocol] | ||
+ | |||
+ | [https://mqtt.org/mqtt-specification/ Especificación oficial del protocolo MQTT] |
Revisió de 20:52, 14 abr 2024
Contingut
¿Qué es MQTT?
MQTT es una manera de comunicar dispositivos de Internet de las Cosas (IdC / IoT) entre sí. Es un protocolo ligero y muy versátil que se puede usar desde un Arduino, una Rasperry Pi, un PC multinúcleo hasta los servicios de Amazon Web Services.
Cuando se trata de comunicar dispositivos mediante TCP/IP hay un gran abanico de protocolos. La clave está en escoger el más adecuado. La comprensión del protocolo nos permite escoger el que más nos conviene. Probablemente hay más opciones para la mensajería de intermediación (brokering), pero la mayoría de dispositivos de IdC usan MQTT.
Un sistema de mensajería de intermediación (message brokering) es un protocolo de publicación / suscripción basado en el modelo hub and spoke (modelo de transporte aéreo equivalente a los radios de una rueda de bicicleta, todos los movimientos de los radios tienen relación con el centro).
Palabras clave
Palabras clave en los sistemas de mensajería de intermediación:
- Intermediario (broker)
- Cliente (client)
- Tema (topic)
- Publicación (publish)
- Suscripción (subscribe)
- Cancelación de suscripción (unsubscribe)
- Calidad del servicio (QoS)
- Actividad (ping)
- Desconexión (disconnect)
Intermediario (broker)
Acepta mensajes de los clientes y los envía a los clientes interesados. Los mensajes pertenecen a un tema (topic). A veces se los denomina servidores (servers).
Cliente (client)
Dispositivo que publica un mensaje respecto a un tema, se subscribe a un tema o ambas cosas a la vez.
Tema (topic)
Nombre (o lugar) del intermediario para un tipo de mensaje. Los clientes se subscriben y publican a un tema.
Qué son y cómo usar los Topics en MQTT correctamente de Luis Llamas
Filtros de tema (topic wildcards)
Comodines MQTT (MQTT Wildcards): Símbolos predefinidos que pueden ser usados como filtro de temas para suscribirse a múltiples temas de forma simultánea.
- Signo más (+): Un comodín de un solo nivel que coincide con cualquier nombre para un nivel de tema específico.
Cualquier tema coincide con un tema con un comodín de un solo nivel si contiene una cadena arbitraria en lugar del comodín. Por ejemplo, una suscripción a myhome/groundfloor/+/temperature puede producir los siguientes resultados:
- Almohadilla (#): Un comodín de varios niveles que coincide con todos los temas que coinciden con los niveles de tema que se especifican delante del símbolo # en el filtro de temas.
- Dólar ($): Los temas que comienzan con el símbolo $ están reservados para las estadísticas internas del broker MQTT. Los clientes no pueden publicar mensajes con estos temas. Por el momento, no existe una estandarización oficial.
Publicación (publish)
Un cliente envía un mensaje al intermediario usando el nombre de un tema.
Suscripción (subscribe)
Un cliente indica al intermediario cuales son sus temas de interés. Una vez subscrito, el intermediario envía los mensajes publicados sobre el tema de interés. Un cliente se puede subscribir a varios temas.
Cancelación de suscripción (unsubscribe)
Un cliente informa al intermediario que quiere dejar de recibir mensajes sobre un tema determinado.
Calidad del servicio (QoS)
MQTT dispone de un mecanismo de calidad del servicio o QoS, entendido como la forma de gestionar la robustez del envío de mensajes al cliente ante fallos (por ejemplo, de conectividad).
MQTT tiene tres niveles QoS posibles:
- QoS 0 unacknowledged (at most one): El mensaje se envía una única vez. En caso de fallo puede que alguno no se entregue.
- QoS 1 acknowledged (at least one): El mensaje se envía hasta que se garantiza la entrega. En caso de fallo, el suscriptor puede recibir algunos mensajes repetidos.
- QoS 2 assured (exactly one): Se garantiza que cada mensaje se entrega al suscriptor, y únicamente una vez.
Usar un nivel u otro depende de las características y necesidades de fiabilidad de nuestro sistema. Lógicamente, un nivel de QoS superior requiere un mayor intercambio mayor de mensajes de verificación con el cliente y, por tanto, mayor carga al sistema.
Fuente: Páqina web de Luis Llamas
Actividad (ping)
Para asegurar que la conexión está activa, los clientes mandan periódicamente un mensaje PINGREQ que es respondido por el servidor con un PINGRESP.
Desconexión (disconnect)
El cliente se desconecta enviando un mensaje de DISCONNECT.
Analogía con el servicio postal
Una oficina de correos envía y recibe cartas. Los clientes pueden enviar una carta, recibirla o ambas cosas a la vez. Para enviar una carta solo hay que poner un mensaje dentro del sobre, escribir una dirección y enviarla al servicio postal. Cuando el servicio postal recibe la carta, lo encamina al receptor previsto.
Esto significa que un cliente puede enviar o recibir cartas. La clave de todo es que las cartas pasan por la oficina de correos y la oficina de correos tiene que conocer información de sus
clientes. El servicio postal es un ejemplo de sistema de mensajería por intermediación basada en un modelo hub and spoke.
En el MQTT hay un intermediario y hay clientes. En el símil, el intermediario es la oficina de correos, y en términos informáticos el servidor. Los clientes pueden publicar mensajes o
enviar cartas a la oficina de correos. Otros clientes pueden subscribirse a los temas, o recibir las cartas, desde la oficina de correos. Los clientes pueden publicar y subscribirse.
En el MQTT hay un intermediario que comunica con los clientes. Hay temas que pueden tener subtemas. Cuando los dispositivos se conectan pueden publicar información sobre temas o subtemas y también se pueden subscribir para recibir información.
Fuente: Página baldengineer.com
MQTT vs HTTP (o REST)
HTTP tiene un montón de cabeceras. Una implementación de mensajería intermediaria puede ser pequeña. Por ejemplo, un paquete MQTT puede tener tan solo 2 bytes.
HTTP requiere de múltiples acciones POST para distribuir un mensaje a mas de un cliente. El objetivo del sistema de mensajería intermediaria es que el intermediario distribuya el mensaje, tan solo a los clientes interesados. La funcionalidad del MQTT es enviar de uno a muchos.
Ejemplo de arquitectura publicación / subscripción MQTT
Estructura de un mensaje MQTT
Uno de los componentes más importantes del protocolo MQTT es la definición y tipología de los mensajes, ya que son una de las bases de la agilidad en la que radica su fortaleza. Cada mensaje consta de 3 partes:
- Cabecera fija. Ocupa 2 a 5 bytes, obligatorio. Consta de un código de control, que identifica el tipo de mensaje enviado, y de la longitud del mensaje. La longitud se codifica en 1 a 4 bytes, de los cuales se emplean los 7 primeros bits, y el último es un bit de continuidad.
- Cabecera variable. Opcional, contiene información adicional que es necesaria en ciertos mensajes o situaciones.
- Contenido(payload). Es el contenido real del mensaje. Puede tener un máximo de 256 Mb aunque en implementaciones reales el máximo es de 2 a 4 kB.
Los tipos de mensajes y códigos de control que se envían en el protocolo MQTT son los siguientes:
Mensaje | Código |
---|---|
CONNECT | 0x10 |
CONNACK | 0x20 |
PUBLISH | 0x30 |
PUBACK | 0x40 |
PUBREC | 0x50 |
PUBREL | 0x60 |
PUBCOMP | 0x70 |
SUBSCRIBE | 0x80 |
SUBACK | 0x90 |
UNSUBSCRIBE | 0xA0 |
UNSUBACK | 0xB0 |
PINGREQ | 0xC0 |
PINGRESP | 0xD0 |
DISCONNECT | 0xE0 |
Fuente: Páqina web de Luis Llamas
Ejemplos en línea de uso de MQTT
ESP32 programado en MicroPython usando MQTT en Wokwi interaccionando con un ESP32 en Snap!
Referencias
Protocolos de comunicación para IoT
MQTT: The Standard for IoT Messaging
Introducció a MQTT (en catalán)
MQTT Essentials (de HiveMQ)