Diferència entre revisions de la pàgina «El protocol MQTT»
m (→Referencias) |
|||
(Hi ha una revisió intermèdia del mateix usuari que no es mostren) | |||
Línia 166: | Línia 166: | ||
[https://www.luisllamas.es/que-es-mqtt-su-importancia-como-protocolo-iot/ Font: 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] | ||
− | = | + | = Exemples en línia d'ús d'MQTT = |
− | * Snap! | + | * 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] | + | [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 | + | * Wokwi i Qt/QML sobre WebAssembly |
− | [https://wokwi.com/projects/350955865540395602 ESP32 | + | [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 180: | 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] | + | [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 186: | 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/ | + | [https://mqtt.org/mqtt-specification/ Especificació oficial del protocol MQTT] |
Revisió de 12:05, 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.
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ó.
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
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:
- 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:
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
MQTT Essentials (de HiveMQ)