MQTT Encoding and Decoding
Jump to navigation
Jump to search
MQTT Encoding and Decoding
The MQTT protocol is very lightweight. It does not use many bytes to get the message across, and the handshake (sequence of messages) is pretty simple (with user-choosable options ranging from "primitive" to "modestly sophisticated").
Each MQTT packet consists of:
- Fixed header
- packet type:byte, consisting of the actual MQTT packet type in the higher nibble and some flags in the lower nibble
- b7-4: MQTT packet type
- b3: DUP flag (PUBLISH only)
- b2-1: QoS (PUBLISH only)
- b0: RETAIN flag (PUBLISH only)
- 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"). This mechanism ensures that short messages stay short by using the fewest number of bytes needed to encode the length.
- packet type:byte, consisting of the actual MQTT packet type in the higher nibble and some flags in the lower nibble
- Variable header (optional), depending on the package type
- Payload (optional), depending on the package type
Type "Array" is binary data, after the number of bytes in the array encoded as two bytes, MSB first.
Type "String" is like "Array", with the text encoded in UTF-8 without a terminating "0" byte.
Packet Type | Direction | Fixed Header | Variable Header | Payload | ||
---|---|---|---|---|---|---|
Packet Type | Flags | Msg ID? | Content | |||
CONNECT | Device to Broker | 1 | 0 | - |
|
|
CONNACK | Broker to Device | 2 | 0 | - |
|
- |
PUBLISH | Both | 3 |
|
QoS > 0 ? y |
|
payload:Array (optional) |
PUBACK | Both | 4 | 0 | y |
|
- |
PUBREC | Both | 5 | 0 | y |
|
- |
PUBREL | Both | 6 | 1 (you may read this as "fixed QoS of 1") | y |
|
- |
PUBCOMP | Both | 7 | 0 | y |
|
- |
SUBSCRIBE | Device to Broker | 8 | 1 (you may read this as "fixed QoS of 1") | y |
|
repeat sequence one or more times |
SUBACK | Broker to Device | 9 | 0 | y |
|
repeat sequence one or more times |
UNSUBSCRIBE | Device to Broker | 10 | 1 (you may read this as "fixed QoS of 1") | y |
|
repeat sequence one or more times |
UNSUBACK | Broker to Device | 11 | 0 | y |
|
- |
PINGREQ | Device to Broker | 12 | 0 | - | - | |
PINGRESP | Broker to Device | 13 | 0 | - | - | |
DISCONNECT | Device to Broker | 14 | 0 | - | - |