Introduction

This document will help you in developing MQTT Clients as per Oasis Standard of MQTT Protocol. The developed clients can be connected to the MQTTRoute which follows the OASIS standard MQTT v3.1.1

The MQTTRoute is a Client Broker publish/subscribe messaging transport protocol orient. It is a light weight protocol. This feature made MQTT suitable for Machine 2 Machine communication and Internet of Things where a small code footprint is required and network bandwidth is precious. The protocol runs over TCP/IP. The publish/subscribe message pattern provides one to many message distribution and decoupling of clients.

MQTT Packet Format

The Broker will respond to the following structured packet controls. The packet control consists of three parts in the following order.

  1. Fixed header – presents on all MQTT control packets
  2. Variable header – presents in some MQTT control packets
  3. Payload – presents in some MQTT control packets

1.Fixed Header


x is the bit value variation for each packet.
Example-connect packet

Bit

7 6 5 4 3 2 1 0

Byte 1

MQTT Control Packet type (1)

Reserved

0

0 0 1 0 0 0

0

Byte 2

Remaining length

Here,0001 will represent 1st packet type CONNECT
The fixed header contains two byte

  • 1st byte is splited into two as 4 bit unsigned, one is for control packet another one is for flag
  • 2nd byte is for remaining length

2.Variable Header


The Variable header must be defined inside the fixed header and payload. The content of a variable header will vary depend on the packet type. Common format of a packet identifier in most packet is

Bit

7 6 5 4 3 2 1 0

Byte 1

Packet Identifier MSB

Byte 2

Packet Identifier LSB

The following packets contains a Packet identifier

  • PUBLISH
  • PUBACK
  • PUBREC
  • PUBREL
  • PUBCOMP
  • SUBSCRIBE
  • SUBACK
  • UNSUBSCRIBE
  • UNSUBACK

3.Payload

The payload is the final part of a packet. It is the application message. The Control packets which contain a payload are

  • CONNECT
  • PUBLISH
  • SUBSCRIBE
  • SUBACK
  • UNSUBSCRIBE

CONNECT

After a connection establishment between a client and Broker the first packet must be CONNECT packet. The CONNECT packet must be sent only once over a network connection. The second CONNECT Packet sent from a Client will be ignored and disconnected.

Fixed Header

Bit 7 6 5 4 3 2 1 0
byte1 MQTT control packet type (1) Reserved
0 0 0 1 0 0 0 0
byte2… Remaining length

Variable header

The variable header has to contain four parts

  1. Protocol name bytes
  2. Protocol level
  3. Connect flags
  4. Keepalive

Protocol name bytes

description 7 6 5 4 3 2 1 0
Protocol Name
Byte 1 Length MSB (0) 0 0 0 0 0 0 0 0
Byte2 Length LSB (4) 0 0 0 0 0 1 0 0
Byte3 M 0 1 0 0 1 1 0 1
Byte4 Q 0 1 0 1 0 0 0 1
Byte5 T 0 1 0 1 0 1 0 0
Byte6 T 0 1 0 1 0 1 0 0

A incorrect protocol name will be disconnected by MQTTRoute

Protocol level

7 6 5 4 3 2 1 0
Protocol Level
Byte 7 Leve(4) 0 0 0 0 0 1 0 0

Protocol level for the MQTTRoute is 4, other values will lead to disconnection

Connect flags

Bit 7 6 5 4 3 2 1 0
User name flag Password flag Will retain Will qos Will flag cleansession reserved
Byte 8 x x x x x x x X

This field has to mention the presence or absence of data in a payload.

Keepalive

Bit 7 6 5 4 3 2 1 0
Byte 9 Keep Alive MSB
Byte 10 Keep Alive LSB

The client must send the control packets not exceeding the value of defined keepalive. The keep alive value will depend on client’s control packet duration of one transmission.

Payload

The payload contains the Client identifiers for the client eg:username,password. The client id must be unique to each client the Broker will respond to the unique client id for each client. Sending client id with empty field lead to rejection of the of the client. The following fields must be taken in the following order only Client Identifier, Will Topic, Will Message, User Name, Password. The above fields must be in string format. The packet which does not sent CONNECT packet after a reasonable time will be rejected by the Broker. After the above validation success the Broker will respond in 2 format

  1. Check whether the client is already present if present the Broker will respond with a disconnection.
  2. The Broker will send a CONNACK packet with zero value.

After a successfull CONNACK the Broker will do a keepalive monitoring.

CONNACK

The Broker will respond with a CONNACK for a successful connection. If a CONNACK packet is not received by a client within a reasonable time the client must close the connection the response time will depend on the infrastructure.

Fixed header

Bit

7

6 5 4 3 2 1

0

Byte1

MQTT Control Packet

Reserved

0

0 1 0 0 0 0

0

Byte2

Remaining Length

0

0 0 0 0 0 1

0

Remaining value is the length of variable header in CONNACK it has to be 2

Variable header

bit

7

6 5 4 3 2 1

0

Connect Acknowledgement flag

Reserved

sp

Byte 1

0

0 0 0 0 0 0

x

Connect Return code
Byte 2

x

x x x x x x

x

Byte1 is the connection acknowledge flags and bits 7 to 1 are reserved. And bit 0 is for session present(sp) flag -it indicates the presence of a clientid in Broker.

PINGRESP

It is the response for PINGREQ from MQTT Route to show that the Broker is alive.

Fixed header

Bit

7

6 5 4 3 2 1

0

Byte 1

MQTT Control Packet type (13)

Reserved

1

1 0 1 0 0 0

0

Byte 2

Remaining length(0)

0

0 0 0 0 0 0

0

It does not have variable header.

PUBLISH

The client which wants to sent a message to specified topic can use PUBLISH control packet and broker will forward this message to the clients who subscribed to that same topic.

Fixed header

Bit

7

6 5 4 3 2 1

0

byte1 MQTT control packet type (3) DUP QoS

Retain

0 0 1 1 x x x

x

byte2

Remaining length

Flag section

3.DUP flag-fresh publish has to be set as 0 and redelivery has to be set as 1.
2,1.QOS level-this flag represent the level of assurance for an application message delivery.
0-at most one delivery
1-at least one delivery
2-exactly one delivery
0.retain-retain flag set as 1 application message must be stored
retain flag set as 0 application message must not be stored.

Variable header

Bit

7

6 5 4 3 2 1

0

Byte 3

Topic Name Length(MSB)

Byte 4

Topic Name Length (LSB)

Byte 5…n

Topic name

Byte n+1

Message Id(MSB)

Byte n+2

Message Id (LSB)

It contains topic name, packet identifier

Topic name

Matching topic name only sent to subscriber. It has to be the first field of the PUBLISH packet and must be a string.

Packet Identifier

The packet identifier must be present in qos 1 and 2.

Payload

The payload contains the application message to be published after Byte n+2. The client can expect the following response after a PUBLISH
For QoS 0-none
For QoS 1-PUBACK packet
For QoS 2-PUBREC packet

SUBACK

The Broker will respond with a SUBACK for a Subscribe

Fixed Header

Bit

7

6 5 4 3 2 1

0

Byte 1

MQTT Control Packet type (9)

Reserved

1

0 0 1 0 0 0

0

Byte 2

Remaining length

Remaining length

It should have the length of variable header plus the length of the payload. SUBACK will be response to the SUBSCRIBE.

Variable header

Bit

7

6 5 4 3 2 1

0

Byte 1

Packet Identifier MSB

Byte 2

Packet Identifier LSB

Payload

bit

7

6 5 4 3 2 1

0

Return code

Byte 1

x

0 0 0 0 0 x

x

A matching return code for a subscribe will be sent by the Broker. The Client have to expect the following return codes.

Bit 7 Bit 1 Bit 0
QoS 0

0

0

0

QoS 1

0

0

1

QoS 2

0

0

2

For Failure

Not 0

Not 0

Not 0,1,2

UNSUBSCRIBE

The client has to sent this UNSUBSCRIBE packet when it want to UNSUBSCRIBE from a particular topic.

Bit

7

6 5 4 3 2 1

0

Byte 1

MQTT Control Packet type (10)

Reserved

1

0 1 0 0 0 1

0

Byte 2

Remaining length

Bits 3,2,1,0 of the fixed header must be 0,0,0,1. Otherwise the Broker will disconnect client. The remaining length has to be the length of variable header and the length of the payload.

Variable Header

Bit

7

6 5 4 3 2 1

0

Byte 1

Packet Identifier MSB

Byte 2

Packet Identifier LSB

Payload

Byte N…

Topic Name

The payload has to contain at least one topic name otherwise it will be discarded. The topic name must be a String. The unsubscribe must be done after the values on the buffer or the bending QoS 1 and QoS 2 messages has been sent.

UNSUBACK

The UNSUBACK is sent from Broker to show the response for an UNSUBSCRIBE.

Fixed Header

Bit

7

6 5 4 3 2 1

0

Byte 1 MQTT Control Packet type (11) Reserved

1

0 1 1 0 0 0

0

Byte 2

Remaining length(2)

0

0 0 0 0 0 1

0

Variable Header

The variable header will contains the Packet id of the UNSUBSCRIBE packet and returned from Broker for response of UNSUBSCRIBE.

Bit

7

6 5 4 3 2 1

0

Byte 1

Packet Identifier MSB

Byte 2

Packet Identifier LSB

DISCONNECT

Fixed Header

Bit

7

6 5 4 3 2 1

0

Byte 1

MQTT Control Packet type (14)

Reserved

1

1 1 0 0 0 0

0

Byte 2

Remaining length(0)

0

0 0 0 0 0 0

0

There is no variable header and payload for Disconnect. The DISCONNECT packet is the final control packet to be sent from client. The Broker will validate the reserved bits for 0 if not the client will be disconnected. After DISCONNECT packet the client must close the network connection and must not send any control packets.

PUBREL

It is the acknowledgment packet to the PUBREC

Fixed header

Bit

7

6 5 4 3 2 1

0

Byte 1

MQTT Control Packet type (6)

Reserved

0

1 1 0 0 0 1

0

Byte 2

Remaining length(2)

0

0 0 0 0 0 1

0

The bits in fixed header 3,2,1,0 are to be set as 0,0,1,0 respectively otherwise the connection will be closed.

Variable header

Bit

7

6 5 4 3 2 1

0

Byte 1

Packet Identifier MSB

Byte 2

Packet Identifier LSB

Contains the packet identifier for which the PUBLISH acknowledged.

MQTT Packet Types

The MQTT Control packet consist of 14 packets

  1. CONNECT – Client requests a connection to a Broker
  2. CONNACK – Acknowledge connection request
  3. PUBLISH – Publish message
  4. PUBACK – Publish acknowledgement
  5. PUBREC – Publish received(QoS 2 publish received)
  6. PUBREL – Publish release(QoS 2 publish received)
  7. PUBCOMP – Publish complete
  8. SUBSCRIBE – Subscribes to a topic
  9. SUBACK – Subscribe acknowledgment
  10. UNSUBSCRIBE – Unsubscribe from a topic
  11. UNSUBACK – Unsubscribe acknowledgement
  12. PINGREQ – PING request
  13. PINGRESP – PING response
  14. DISCONNECT – Disconnect notification

PUBACK

The PUBACK is a response to a publish.

Fixed header

Bit

7

6 5 4 3 2 1

0

Byte1

MQTT Control Packet(4)

Reserved

0

1 0 0 0 0 0

0

Byte2

Remaining Length

0

0 0 0 0 0 1

0

The remaining length of fixed header will represent the length of the variable header.

Variable Header

Bit

7

6 5 4 3 2 1

0

Byte 1

Packet Identifier MSB

Byte 2

Packet Identifier LSB

This contains the packet identifier from PUBLISH for which it is acknowledging.

PUBREC

It is the response of PUBLISH in QoS 2

Fixed header

Bit

7

6 5 4 3 2 1

0

Byte 1

MQTT Control Packet type (5)

Reserved

0

1 0 1 0 0 0

0

Byte 2

Remaining length(2)

0

0 0 0 0 0 1

0

Variable header

Bit

7 6 5 4 3 2 1

0

Byte 1

Packet Identifier MSB

Byte 2

Packet Identifier LSB

PUBCOMP

It is the response to the PUBREL in QoS 2.

Fixed header

Bit

7

6 5 4 3 2 1

0

Byte 1

MQTT Control Packet type (7)

Reserved

0

1 1 1 0 0 0

0

Byte 2

Remaining length(2)

0

0 0 0 0 0 1

0

Variable header

Bit 7 6 5 4 3 2 1 0
Byte 1 Packet Identifier MSB
Byte 2 Packet Identifier LSB

SUBSCRIBE

The client has to send a SUBSCRIBE packet for subscriptions. The Broker will respond with the PUBLISH packet with its payload.

Fixed header

Bit

7

6 5 4 3 2 1

0

Byte 1

MQTT Control Packet type (5)

Reserved

1

0 0 0 0 0 1

0

Byte 2

Remaining length

Bits 3,2,1,0 has to be set as 0,0,1,0. It contain the topic to which the client subscribing. The topic must be string.

Variable header

Bit

7

6 5 4 3 2 1

0

Byte 1

Packet Identifier MSB

Byte 2

Packet Identifier LSB

Payload

Description

7

6 5 4 3 2 1

0

Topic filter
Byte1

Length MSB

Byte2

Length LSB

Byte3…N

Topic filter

Requested QoS

Reserved

QoS
Byte N+1

0

0 0 0 0 0 x

x

The Payload has to mention at least one topic/QoS mention other wise it will be discarded. The subscriber with no payload is violation of structure and will be discarded. The topic Name must be string. If any field in reserved field is non-zero or the qos is not 0,1,2 the client will be discarded.

PINGREQ

The client must send a PINGREQ to Broker to say it is alive on the network when it does not send any control packets and have to make a routine check to indicate it’s alive.

Bit

7

6 5 4 3 2 1

0

Byte 1

MQTT Control Packet type (12)

Reserved

1

1 0 0 0 0 0

0

Byte 2

Remaining length(0)

0

0 0 0 0 0 0

0

It should not have variable header and payload.