Diferència entre revisions de la pàgina «El protocol MQTT»
(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...».) |
m (→Paraules clau) |
||
Línia 9: | Línia 9: | ||
= Paraules clau = | = Paraules clau = | ||
− | + | Paraules clau als sistemes de missatgeria d'intermediació: | |
− | * | + | * Intermediari ('''broker''') |
− | * | + | * Client ('''client''') |
* Tema ('''topic''') | * 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''') == | == Tema ('''topic''') == | ||
− | + | 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| | + | [[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 | ||
− | === | + | === 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 | + | * 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| | + | [[Image:MqttTopicWildcardPlus.png|center|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: | |
− | [[Image:TopicWildcardPlusExample.png|center| | + | [[Image:TopicWildcardPlusExample.png|center|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. |
− | [[Image:TopicWildcardHash.png|center| | + | [[Image:TopicWildcardHash.png|center|Exemple de comodí de diversos nivells (de HiveMQ)]] |
− | [[Image:TopicWildcardHashExample.png|center| | + | [[Image:TopicWildcardHashExample.png|center|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. |
− | [https://www.hivemq.com/blog/mqtt-essentials-part-5-mqtt-topics-best-practices/ | + | [https://www.hivemq.com/blog/mqtt-essentials-part-5-mqtt-topics-best-practices/ Font: Página de HiveMQ] |
− | == | + | == Publicació ('''publish''') == |
− | Un | + | Un client tramet un missatge a l'intermediari emprant el nom d'un tema. |
− | == | + | == Subscripció ('''subscribe''') == |
− | Un | + | 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 | + | Un client informa a l'intermediari que vol deixar de rebre missatges sobre un tema determinat. |
− | == | + | == Qualitat del servei ('''QoS''') == |
− | MQTT | + | 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 | + | MQTT té tres nivells QoS possibles: |
− | * '''QoS 0 unacknowledged (at most one)''': El | + | * '''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 | + | * '''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)''': | + | * '''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. | |
− | [https://www.luisllamas.es/que-es-mqtt-su-importancia-como-protocolo-iot/ | + | [https://www.luisllamas.es/que-es-mqtt-su-importancia-como-protocolo-iot/ 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 | + | El client es desconnecta trametent un missatge de DISCONNECT. |
= Analogía con el servicio postal = | = Analogía con el servicio postal = |
Revisió del 11:48, 10 oct 2023
Contingut
Què es 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.
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.
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:
- 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.
- 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.
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.
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
- Snap! y Qt/QML sobre WebAssembly
ESP32 en Snap! v8 interaccionando con un ekemplo Qt/QML con WebAssembly (Código fuente del ejemplo usando Qt/QML sobre WebAssembly)
- Wokwi y Qt/QML sobre WebAssembly
ESP32 programado en MicroPython usando MQTT interaccionando con un ejemplo Qt/QML sobre WebAssembly
Referencias
Protocolos de comunicación para IoT
MQTT: The Standard for IoT Messaging
Introducció a MQTT (en catalán)
MQTT Essentials (de HiveMQ)