Diferència entre revisions de la pàgina «El protocol MQTT»

De binefa.com
Salta a la navegació Salta a la cerca
(Es crea la pàgina amb «= Què es MQTT? = center|Visió general del protocol MQTT MQTT es una manera de comunicar dispositius d'Internet de les Coses (IdC / IoT) en...».)
 
 
(Hi ha 7 revisions intermèdies del mateix usuari que no es mostren)
Línia 9: Línia 9:
  
 
= Paraules clau =
 
= Paraules clau =
Palabras clave en los sistemas de mensajería de intermediación:
+
Paraules clau als sistemes de missatgeria d'intermediació:
  
* Intermediario ('''broker''')
+
* Intermediari ('''broker''')
  
* Cliente ('''client''')
+
* Client ('''client''')
  
 
* Tema ('''topic''')
 
* Tema ('''topic''')
  
* Publicación ('''publish''')
+
* Publicació ('''publish''')
  
* Suscripción ('''subscribe''')
+
* Subscripció ('''subscribe''')
  
* Cancelación de suscripción ('''unsubscribe''')
+
* Cancel·lació de subscripció ('''unsubscribe''')
  
* Calidad del servicio ('''QoS''')
+
* Qualitat del servei ('''QoS''')
  
* Actividad ('''ping''')
+
* Activitat ('''ping''')
  
* Desconexión ('''disconnect''')
+
* Desconnexió ('''disconnect''')
  
== Intermediario ('''broker''') ==
+
== Intermediari ('''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'').
+
Accepta missatges dels clients i els tramet als clients interessats. Els missatges pertanyen a un tema (''topic''). A vegades se'ls anomena servidors (''servers'').
  
== Cliente ('''client''') ==
+
== Client ('''client''') ==
Dispositivo que publica un mensaje respecto a un tema, se subscribe a un tema o ambas cosas a la vez.
+
Dispositiu que publica un missatge respecto a un tema, se subscriu a un tema o ambdues coses al mateix temps.
  
 
== Tema ('''topic''') ==
 
== Tema ('''topic''') ==
Nombre (o lugar) del intermediario para un tipo de mensaje. Los clientes se subscriben y publican a un tema.
+
Nom (o lloc) de l'intermediari per a un tipus de missatge. Els clients se subscriuen i publiquen a un tema.
  
[[Image:MqttTopicBasics.png|center|Ejemplo de jerarquía de temas (de HiveMQ)]]
+
[[Image:MqttTopicBasics.png|center|Exemple de jerarquia de temes (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
 
[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''') ===
+
=== Filtres 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.
+
Comodins MQTT ('''MQTT Wildcards'''): Símbols predefinits que poden ser emprats como a filtre de temes per a subscriure's a múltiples temés de forma simultània.
  
* Signo más ('''+'''): Un '''comodín de un solo nivel''' que coincide con cualquier nombre para un nivel de tema específico.
+
* Signo més ('''+'''): Un '''comodí d'un solo nivell''' que coincideix amb qualsevol nom per a un nivell de tema específic.
  
[[Image:MqttTopicWildcardPlus.png|center|Ejemplo de comodín de un solo nivel (de HiveMQ)]]
+
[[Image:MqttTopicWildcardPlus.png|center|Exemple de comodí d'un solo nivell (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:
+
Qulasevol tema coincideix amb un tema amb un comodí d'un solo nivell si conté una cadena arbitrària en lloc del comodí. Por exemple, una subscripció a myhome/groundfloor/+/temperature pot produir els següents resultats:
  
[[Image:TopicWildcardPlusExample.png|center|Ejemplo de comodín de un solo nivel (de HiveMQ)]]
+
[[Image:TopicWildcardPlusExample.png|center|Exemple de comodí d'un sol nivell (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.
+
* Malla ('''#'''): Un '''comodí de diversos nivells''' que coincideix amb tots els temes que coincideixen amb els nivells de tema que s'especifiquen abans del símbol # en el filtro de temes.
  
[[Image:TopicWildcardHash.png|center|Ejemplo de comodín de varios niveles (de HiveMQ)]]
+
[[Image:TopicWildcardHash.png|center|Exemple de comodí de diversos nivells (de HiveMQ)]]
  
  
[[Image:TopicWildcardHashExample.png|center|Ejemplo de comodín de varios niveles (de HiveMQ)]]
+
[[Image:TopicWildcardHashExample.png|center|Exemple de comodí de diversos nivells (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.
+
* Dòlar ('''$'''):  Els temes que comencen amb el símbol $ són reservats per a les estadístiques internes del ''broker'' MQTT. Els clients no poden publicar missatges amb aquests temes. Pel moment, no existeix una estandarització oficial.
  
[https://www.hivemq.com/blog/mqtt-essentials-part-5-mqtt-topics-best-practices/ Fuente: Página de HiveMQ]
+
[https://www.hivemq.com/blog/mqtt-essentials-part-5-mqtt-topics-best-practices/ Font: Página de HiveMQ]
  
== Publicación ('''publish''') ==
+
== Publicació ('''publish''') ==
Un cliente envía un mensaje al intermediario usando el nombre de un tema.
+
Un client tramet un missatge a l'intermediari emprant el nom d'un tema.
  
== Suscripción ('''subscribe''') ==
+
== Subscripció ('''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.
+
Un client indica a l'intermediari quins són els seus temes d'interès. Una cop subscrit, l'intermediari tramet els missatges publicats sobre el tema d'interès. Un client es pot subscriure a diversos temes.
  
== Cancelación de suscripción ('''unsubscribe''') ==
+
== Cancel·lació de subscripció ('''unsubscribe''') ==
Un cliente informa al intermediario que quiere dejar de recibir mensajes sobre un tema determinado.
+
Un client informa a l'intermediari que vol deixar de rebre missatges sobre un tema determinat.
  
== Calidad del servicio ('''QoS''') ==
+
== Qualitat del servei ('''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 disposa d'un mecanisme de qualitat del servicio o QoS (''Quality of Service''), entès com la forma de gestionar la robustesa de la tramesa de missatges al client en cas d'errades (por exemple, de connectivitat).
  
MQTT tiene tres niveles QoS posibles:  
+
MQTT tres nivells QoS possibles:  
  
* '''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 missatge es tramet un sol cop. En caso d'errada pot ser que algun missatge no es lliuri.
  
* '''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 1 acknowledged (at least one)''': El missatge se tramet fins que es garanteix el lliurament. En caso d'errada, el subscriptor pot rebre alguns missatges repetits.
  
* '''QoS 2 assured (exactly one)''': Se garantiza que cada mensaje se entrega al suscriptor, y únicamente una vez.
+
* '''QoS 2 assured (exactly one)''': Es garanteix que cada missatge es lliura al subscriptor, i únicament un cop.
  
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.
+
L'ús d'un nivell o un altre depen de las característiques i necessitats de fiabilitat del sistema. Lògicament, un nivell de QoS superior requereix un major intercanvi de missatges de verificació amb el client i, per tant, més càrrega del sistema.
  
[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/ Font: Pàqina web de Luis Llamas]
  
== Actividad ('''ping''') ==
+
== Activitat ('''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.
+
Per a assegurar que la connexió és activa, els clientes trameten periòdicament un missatge PINGREQ que és contestat pel servidor amb un PINGRESP.
  
== Desconexión ('''disconnect''') ==
+
== Desconnexió ('''disconnect''') ==
El cliente se desconecta enviando un mensaje de DISCONNECT.
+
El client es desconnecta trametent un missatge de DISCONNECT.
  
= Analogía con el servicio postal =
+
= Analogia amb el servei 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.
+
Una oficina de correus envia i rep cartes. Els clients poden enviar una carta, rebre-la o ambdues coses alhora. Per trametre una carta només cal posar-hi un missatge dins del sobre, escriure-hi una adreça i lliurar-la al servei postal. Quan el servei postal rep la carta, l'encamina al receptor previst.
  
  
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
+
Això significa que un client pot trametre o rebre cartes. La clau de tot plegat és que les cartes passen per l'oficina de correus i l'oficina de correus ha de conèixer informació dels seus clients. El servei postal és un exemple de sistema de missatgeria per intermediació basada en un
clientes. El servicio postal es un ejemplo de sistema de mensajería por intermediación basada en un modelo ''hub and spoke''.
+
model ''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
+
A l'MQTT hi ha un intermediari i hi ha clients. En el símil, l'intermediari és l'oficina de correus, i en termes informàtics el servidor. Els clients poden publicar missatges o trametre cartes a l'oficina de correus. Altres clients poden subscriure-s'hi als temes, o rebre les cartes, des de l'oficina de correus. Els clients poden publicar i subscriure-s'hi.
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.
+
A l'MQTT hi ha un intermediari que comunica amb els clients. Hi ha temes que poden tenir subtemes. Quan els dispositius es connecten poden publicar informació sobre temes o subtemes i també s'hi poden subscriure per a rebre informació.
[[Image:AnalogiaServeiPostal.png|center|Analogía con el servicio postal]]
+
 
[https://www.baldengineer.com/mqtt-introduction.html Fuente: Página baldengineer.com]
+
[[Image:AnalogiaServeiPostal.png|center|Analogia amb el servei postal]]
 +
[https://www.baldengineer.com/mqtt-introduction.html Font: Pàgina baldengineer.com]
  
 
= MQTT vs HTTP (o REST) =
 
= 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 un munt de capçaleres. Una implementació de missatgeria intermediària pot ser petita. Por exemple, un paquet MQTT pot tenir tan sols 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.
+
HTTP requereix de múltiples accions POST per a distribuir un missatge a més d'un client. L'objectiu del sistema de missatgeria intermediària és que l'intermediari distribueixi el missatge, tan sols als clients interessats. La funcionalitat de l'MQTT es trametre d'un a molts.
= 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 =
+
= Exemple d'arquitectura publicació / subscripció 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:
+
[[Image:MqttPublishSubscribe.png|center|Exemple d'arquitectura publicació / subscripció MQTT a mqtt.org]]
 +
[https://mqtt.org/ Fuente: Pàgina de mqtt.org]
  
[[Image:MqttMessage.png|center|Mensaje MQTT]]
+
= Estructura d'un missatge MQTT =
 +
Un dels components més importants del protocol MQTT es la definició i tipologia dels missatges, ja que són una de las bases de l'agilitat en la que radica llur fortalesa. Cada missatge consta de 3 parts:
  
* '''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.
+
[[Image:MqttMessage.png|center|Missatge MQTT]]
  
* '''Cabecera variable'''. Opcional, contiene información adicional que es necesaria en ciertos mensajes o situaciones.
+
* '''Capçalera fixa'''. Ocupa de 2 a 5 bytes, obligatori. Consta d'un codi de control, que identifica el tipus de missatge tramès, i de la longitud del missatge. La longitud es codifica d'1 a 4 bytes, dels quals es fan servir els 7 primers bits, i l'últim és un bit de continuitat.
  
* '''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.
+
* '''Capçalera variable'''. Opcional, conté informació addicional que és necessària a certs missatges o situacions.
  
Los tipos de mensajes y códigos de control que se envían en el protocolo MQTT son los siguientes:
+
* '''Contingut(''payload'')'''. Es el contingut real del missatge. Pot tenir un màxim de 256 Mb malgrat que a implementacions reals el màximo acostuma a estar entre 2 i 4 kB.
 +
 
 +
Els tipus de missatges i codis de control que es trameten al protocol MQTT són els següents:
 
{| class="wikitable" style="margin:auto"
 
{| class="wikitable" style="margin:auto"
|+ Asignación de puertos para el curso 2022-2023
+
|+ Tipus de missatges i codis de control a MQTT
 
|-
 
|-
 
! Mensaje !! Código
 
! Mensaje !! Código
Línia 163: Línia 164:
 
|}
 
|}
  
[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/ Font: Pàqina web de Luis Llamas]
= Ejemplos en línea de uso de MQTT =
+
 
* Snap! y Qt/QML sobre WebAssembly
+
= Exemples en línia d'ús d'MQTT =
 +
* Snap! i 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 ekemplo Qt/QML con WebAssembly] ([https://www.binefa.cat/training/iot02/qt/wsMqtt03.zip Código fuente del ejemplo usando Qt/QML sobre WebAssembly])
+
[http://formacio.things.cat/snap8/snap.html#open:../codisSnap/esp32_DT_8.0.0.xml ESP32 en Snap! v8] interaccionant amb [http://formacio.things.cat/xtra/wsMqtt02/ un exemple Qt/QML en WebAssembly] ([https://www.binefa.cat/training/iot02/qt/wsMqtt03.zip Codi font de l'exemple emprant Qt/QML sobre WebAssembly])
  
* Wokwi y Qt/QML sobre WebAssembly
+
* Wokwi i Qt/QML sobre WebAssembly
  
[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]
+
[https://wokwi.com/projects/350955865540395602 ESP32 programat en MicroPython emprant MQTT] interaccionant amb [http://formacio.things.cat/xtra/wsMqtt02/ un exemple Qt/QML sobre WebAssembly]
  
 
= Referencias =
 
= Referencias =
Línia 178: Línia 180:
 
[https://mqtt.org/ MQTT: The Standard for IoT Messaging]
 
[https://mqtt.org/ MQTT: The Standard for IoT Messaging]
  
[https://www.binefa.cat/IoT/teoria/mqtt_00.pdf Introducció a MQTT] (''en catalán'')
+
[https://www.binefa.cat/IoT/teoria/mqtt_00.pdf Introducció a MQTT]  
  
 
[https://www.hivemq.com/mqtt-essentials/ MQTT Essentials] (de ''HiveMQ'')
 
[https://www.hivemq.com/mqtt-essentials/ MQTT Essentials] (de ''HiveMQ'')
Línia 184: Línia 186:
 
[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]
+
[https://mqtt.org/mqtt-specification/ Especificació oficial del protocol MQTT]

Revisió de 12:05, 10 oct 2023

Què es MQTT?

Visió general del protocol MQTT

MQTT es una manera de comunicar dispositius d'Internet de les Coses (IdC / IoT) entre sí. Es un protocol lleuger i molt versàtil que es pot fer servir a un Arduino, una Rasperry Pi, un PC multinúcli fins als serveis d'Amazon Web Services.

Quan es tracta de comunicar dispositius mitjançant TCP/IP hi ha un gran ventall de protocols. La clau és escollir el més adient. La comprensió del protocol ens permet escollir el que més ens convé. Probablement hi ha més opcions per a la missatgeria d'intermediació (brokering), però la majoría de dispositius d'IdC fan servir MQTT.

Un sistema de missatgeria d'intermediació (message brokering) és un protocol de publicació / suscripció basat en el model hub and spoke (model de transport aeri equivalent als radis d'una roda de bicicleta, tots els movimients dels radis tenen relació amb el centre).

Paraules clau

Paraules clau als sistemes de missatgeria d'intermediació:

  • Intermediari (broker)
  • Client (client)
  • Tema (topic)
  • Publicació (publish)
  • Subscripció (subscribe)
  • Cancel·lació de subscripció (unsubscribe)
  • Qualitat del servei (QoS)
  • Activitat (ping)
  • Desconnexió (disconnect)

Intermediari (broker)

Accepta missatges dels clients i els tramet als clients interessats. Els missatges pertanyen a un tema (topic). A vegades se'ls anomena servidors (servers).

Client (client)

Dispositiu que publica un missatge respecto a un tema, se subscriu a un tema o ambdues coses al mateix temps.

Tema (topic)

Nom (o lloc) de l'intermediari per a un tipus de missatge. Els clients se subscriuen i publiquen a un tema.

Exemple de jerarquia de temes (de HiveMQ)

Qué son y cómo usar los Topics en MQTT correctamente de Luis Llamas

Filtres de tema (topic wildcards)

Comodins MQTT (MQTT Wildcards): Símbols predefinits que poden ser emprats como a filtre de temes per a subscriure's a múltiples temés de forma simultània.

  • Signo més (+): Un comodí d'un solo nivell que coincideix amb qualsevol nom per a un nivell de tema específic.
Exemple de comodí d'un solo nivell (de HiveMQ)

Qulasevol tema coincideix amb un tema amb un comodí d'un solo nivell si conté una cadena arbitrària en lloc del comodí. Por exemple, una subscripció a myhome/groundfloor/+/temperature pot produir els següents resultats:

Exemple de comodí d'un sol nivell (de HiveMQ)
  • Malla (#): Un comodí de diversos nivells que coincideix amb tots els temes que coincideixen amb els nivells de tema que s'especifiquen abans del símbol # en el filtro de temes.
Exemple de comodí de diversos nivells (de HiveMQ)


Exemple de comodí de diversos nivells (de HiveMQ)
  • Dòlar ($): Els temes que comencen amb el símbol $ són reservats per a les estadístiques internes del broker MQTT. Els clients no poden publicar missatges amb aquests temes. Pel moment, no existeix una estandarització oficial.

Font: Página de HiveMQ

Publicació (publish)

Un client tramet un missatge a l'intermediari emprant el nom d'un tema.

Subscripció (subscribe)

Un client indica a l'intermediari quins són els seus temes d'interès. Una cop subscrit, l'intermediari tramet els missatges publicats sobre el tema d'interès. Un client es pot subscriure a diversos temes.

Cancel·lació de subscripció (unsubscribe)

Un client informa a l'intermediari que vol deixar de rebre missatges sobre un tema determinat.

Qualitat del servei (QoS)

MQTT disposa d'un mecanisme de qualitat del servicio o QoS (Quality of Service), entès com la forma de gestionar la robustesa de la tramesa de missatges al client en cas d'errades (por exemple, de connectivitat).

MQTT té tres nivells QoS possibles:

  • QoS 0 unacknowledged (at most one): El missatge es tramet un sol cop. En caso d'errada pot ser que algun missatge no es lliuri.
  • QoS 1 acknowledged (at least one): El missatge se tramet fins que es garanteix el lliurament. En caso d'errada, el subscriptor pot rebre alguns missatges repetits.
  • QoS 2 assured (exactly one): Es garanteix que cada missatge es lliura al subscriptor, i únicament un cop.

L'ús d'un nivell o un altre depen de las característiques i necessitats de fiabilitat del sistema. Lògicament, un nivell de QoS superior requereix un major intercanvi de missatges de verificació amb el client i, per tant, més càrrega del sistema.

Font: Pàqina web de Luis Llamas

Activitat (ping)

Per a assegurar que la connexió és activa, els clientes trameten periòdicament un missatge PINGREQ que és contestat pel servidor amb un PINGRESP.

Desconnexió (disconnect)

El client es desconnecta trametent un missatge de DISCONNECT.

Analogia amb el servei postal

Una oficina de correus envia i rep cartes. Els clients poden enviar una carta, rebre-la o ambdues coses alhora. Per trametre una carta només cal posar-hi un missatge dins del sobre, escriure-hi una adreça i lliurar-la al servei postal. Quan el servei postal rep la carta, l'encamina al receptor previst.


Això significa que un client pot trametre o rebre cartes. La clau de tot plegat és que les cartes passen per l'oficina de correus i l'oficina de correus ha de conèixer informació dels seus clients. El servei postal és un exemple de sistema de missatgeria per intermediació basada en un model hub and spoke.


A l'MQTT hi ha un intermediari i hi ha clients. En el símil, l'intermediari és l'oficina de correus, i en termes informàtics el servidor. Els clients poden publicar missatges o trametre cartes a l'oficina de correus. Altres clients poden subscriure-s'hi als temes, o rebre les cartes, des de l'oficina de correus. Els clients poden publicar i subscriure-s'hi.


A l'MQTT hi ha un intermediari que comunica amb els clients. Hi ha temes que poden tenir subtemes. Quan els dispositius es connecten poden publicar informació sobre temes o subtemes i també s'hi poden subscriure per a rebre informació.

Analogia amb el servei postal

Font: Pàgina baldengineer.com

MQTT vs HTTP (o REST)

HTTP té un munt de capçaleres. Una implementació de missatgeria intermediària pot ser petita. Por exemple, un paquet MQTT pot tenir tan sols 2 bytes.

HTTP requereix de múltiples accions POST per a distribuir un missatge a més d'un client. L'objectiu del sistema de missatgeria intermediària és que l'intermediari distribueixi el missatge, tan sols als clients interessats. La funcionalitat de l'MQTT es trametre d'un a molts.

Exemple d'arquitectura publicació / subscripció MQTT

Exemple d'arquitectura publicació / subscripció MQTT a mqtt.org

Fuente: Pàgina de mqtt.org

Estructura d'un missatge MQTT

Un dels components més importants del protocol MQTT es la definició i tipologia dels missatges, ja que són una de las bases de l'agilitat en la que radica llur fortalesa. Cada missatge consta de 3 parts:

Missatge MQTT
  • Capçalera fixa. Ocupa de 2 a 5 bytes, obligatori. Consta d'un codi de control, que identifica el tipus de missatge tramès, i de la longitud del missatge. La longitud es codifica d'1 a 4 bytes, dels quals es fan servir els 7 primers bits, i l'últim és un bit de continuitat.
  • Capçalera variable. Opcional, conté informació addicional que és necessària a certs missatges o situacions.
  • Contingut(payload). Es el contingut real del missatge. Pot tenir un màxim de 256 Mb malgrat que a implementacions reals el màximo acostuma a estar entre 2 i 4 kB.

Els tipus de missatges i codis de control que es trameten al protocol MQTT són els següents:

Tipus de missatges i codis de control a MQTT
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

Font: Pàqina web de Luis Llamas

Exemples en línia d'ús d'MQTT

  • Snap! i Qt/QML sobre WebAssembly

ESP32 en Snap! v8 interaccionant amb un exemple Qt/QML en WebAssembly (Codi font de l'exemple emprant Qt/QML sobre WebAssembly)

  • Wokwi i Qt/QML sobre WebAssembly

ESP32 programat en MicroPython emprant MQTT interaccionant amb un exemple Qt/QML sobre WebAssembly

Referencias

Protocolos de comunicación para IoT

MQTT: The Standard for IoT Messaging

Introducció a MQTT

MQTT Essentials (de HiveMQ)

Beginners Guide To The MQTT Protocol

Especificació oficial del protocol MQTT