MQTT Encoding and Decoding
Jump to navigation
Jump to search
MQTT Encoding and Decoding
The MQTT protocol is very lightweight (does not use many bytes to get the message across).
Each MQTT packet consists of:
- Fixed header
- b7-4: MQTT Packet Typ, b3-0: Flags
- Remaining length - this one is a bit tricky and consumes between 1 and 4 bytes. Encoding is least significant bits first in b6-0 while b7 is a "continuation bit" ('1' meaning "another byte follows").
- Variable header (optional), depending on the package type
- Payload (optional), depending on the package type
Text is encoded in UTF-8 without a terminating "0" byte, after the number of bytes in the text encoded as two bytes, MSB first.
Type | Number | Direction | Flags | Variable Header | Payload | |
---|---|---|---|---|---|---|
Msg ID | ||||||
CONNECT | 1 | Device to Broker | 0 | - | "MQTT":String protocol level (4):byte connect flags:byte (b7: user, b6: password, b5: will retain, b4-3: will QoS, b2: will, b1: clean session) keep alive:word |
client ID:String will topic:String (if present) will payload:Array (if present) user name:String (if present) password:Array (if present) |
CONNACK | 2 | Broker to Device | 0 | - | connect acknowledge flags:byte (b0: session present) connect return code:byte (0: connection accepted, 1: unacceptable protocol version, 2: identifier rejected, 3: server unavailable, 4: bad user name or password, 5: not authorized) |
- |
PUBLISH | 3 | Both | b3: DUP, b2-1: QoS, b0: RETAIN | QoS > 0 ? y | topic name:String message ID:word |
payload:Array (optional) |
PUBACK | 4 | Both | 0 | y | message ID of PUBLISH packet:word | - |
PUBREC | 5 | Both | 0 | y | message ID of PUBLISH packet:word | - |
PUBREL | 6 | Both | 1 | y | message ID of PUBREC packet:word | - |
PUBCOMP | 7 | Both | 0 | y | message ID of PUBREL packet:word | - |
SUBSCRIBE | 8 | Device to Broker | 1 | y | message ID:word | topic filter:String requested QoS:byte (b1-0: QoS) (repeat sequence one or more times) |
SUBACK | 9 | Broker to Device | 0 | y | message ID of SUBSCRIBE packet:word | return code:byte (b7: failure, b1-0: maximum QoS) (repeat sequence one or more times) |
UNSUBSCRIBE | 10 | Device to Broker | 1 | y | message ID:word | topic filter:String (repeat sequence one or more times) |
UNSUBACK | 11 | Broker to Device | 0 | y | message ID of SUBSCRIBE packet:word | - |
PINGREQ | 12 | Device to Broker | 0 | - | - | |
PINGRESP | 13 | Broker to Device | 0 | - | - | |
DISCONNECT | 14 | Device to Broker | 0 | - | - |