Skip to content

8. Structura unui pachet MQTT

Bogdan Gabriel Apetrei edited this page Nov 5, 2021 · 11 revisions

Structura unui pachet implica 3 parti:

  • Fixed Header
  • Variable Header
  • Payload

Fixed Header:

Control packet types:

CONNECT-Clientul cere să se conecteze la un server

După ce o conexiune s-a stabilit între client și server. primul pachet trimis de client va fi un pachet de tip CONNECT. Clientul poate trimite doar un singur pachet CONNECT per conexiune. În caz contrar, daca clientul trimite mai mult de un pachet de acel tip, server-ul o va procesa ca pe violare de protocol, deconectând clientul. Pachetul conține un header format din 4 câmpuri: Protocol Name, Protocol Level, Connect Flags, Keep Alive.

Protocol Name- conține un string care reprezintă numele protocolului: "MQTT"

În cazul în care numele este incorect, server-ul poate deconecta clientul sau poate continua procesarea pachetului.

Protocol Level- nivelul protocolului folosit de client

Server-ul trebuie să răspundă pachetului CONNECT cu un CONNACK, iar apoi să deconecteze clientul în cazul în care nivelul nu este suportat de către server.

Connect Flags- parametri de comportament pentru conexiunea MQTT

Flag-urile sunt: User Name Flag, Password Flag, Will Retain, Will QoS, Will Flag, Clean Session și bitul rezervat. Dacă cel din urmă nu este egal cu 0, clientul va fi deconectat.

  • Clean Session- specifică cum va fi manevrată sesiunea curentă.
  • Will Flag- în funcție de valoarea lui se decide dacă se stochează pe server un "Will Message"
  • Will QoS- specifică nivelul QoS folosit când se publică "Will Message".
  • User Name Flag- prezența unui user name.
  • Password Flag- prezența unei parole.
  • Keep Alive- este un inverval de timp care exprimă cât timp poate trece între trimiterea unor Control Packets. Dacă server-ul nu primește un pachet în 1.5*Keep Alive period, îl va deconecta pe client.

CONNACK- se ia la cunoștință cererea de conectare

Este un pachet trimis de server ca răspuns la un pachet CONNECT primit de la client. Acest pachet CONNACK trebuie să fie primul pe care clientul îl va primi de la server, iar în caz contrar, clientul ar trebui să se deconecteze. Tot in acest pachet, clientul primeste capabilitatile serverului ( Maximul QoS, Timpul de expirare a unei sesiuni, Valoarea de primire maxima, Retain Available, Marimea maxima a unui pachet, User Property, Wildcard Subscription Available, ect). In cazul unei incompatibilitati, sau respingere a datelor de securitate, serverul este liber sa abordeze contectiunea, folosind diverse flag-uri de eroare.

PUBLISH

Un pachet PUBLISH este trimis de client către server sau invers pentru a transporta un mesaj.

PUBACK, PUBREC, PUBREL, PUBCOMP

Un pachet PUBACK este un răspuns către un pachet PUBLISH cu un nivel QoS egal cu 1. Un pachet PUBREC este un răspuns către un pachet PUBLISH cu un nivel QoS egal cu 2. Un pachet PUBREL este un răspuns către un pachet PUBREC. Un pachet PUBCOMP este un răspuns către un pachet PUBREL.

  • DUP Flag - Indica daca serverul sau clientul a mai incercat sau nu sa trimita pachetul respectiv. DUP trebuie sa fie setat pe 0 pentru pachete de QoS0. Flag-ul dup nu este propagat de la un nod la altul, ci este setat in fiecare situatie particulara.

SUBSCRIBE- abonarea la topic

Un pachet SUBSCRIBE este un pachet trimis de client către server pentru a crea un Subscription. Fiecare Subscription înregistrează interesele clientului pe mai multe Topics.

SUBACK- înștiințarea abonării

Un pachet SUBACK este trimis de server către client pentru a confirma cererea și pentru a procesa un pachet SUBSCRIBE.

UNSUBSCRIBE- dezabonarea de la topics

Un pachet UNSUBSCRIBE este trimis de client către server pentru a se dezabona de la topics.

UNSUBACK- înștiințarea dezabonării

Un pachet UNSUBACK este trimis de server către client pentru a confirma cererea unui pachet UNSUBSCRIBE.

PINGREQ- cererea PING

Un pachet PINGREQ este trimis de client către server pentru a indica server-ului că are un client care nu primește feedback, pentru a cere server-ului un răspuns cum că mai este activ sau pentru a testa conexiunea.

PINGRESP- răspunsul la PING

Un pachet PINGRESP este trimis de server către client ca răspuns pentru un pachet PINGREQ, ceea ce indică că server-ul este încă activ.

DISCONNECT- notificarea de deconectare

Un pachet DISCONNECT este pachetul final de control trimis de client către server pentru a indica deconectarea clientului.