Guides

What is MQTT Protocol?

0 MIN READ • Developer Relations Team on Sep 6, 2023
What is MQTT Protocol?

What is MQTT?

MQTT (Message Queuing Telemetry Transport) is a lightweight messaging protocol for real-time communication between devices. It follows a publish-subscribe pattern, where one or more publishers send messages to a central broker, and subscribers receive those messages from the broker. It is widely used in Internet of Things (IoT) applications due to its efficiency and simplicity.

How MQTT Works?

MQTT (Message Queuing Telemetry Transport) is a protocol that uses a publish/subscribe model, consisting of clients and a broker. Clients connect to the broker over a network, enabling them to publish messages to specific topics or subscribe to receive messages from those topics.

When a client publishes a message, it sends it to the broker, which then forwards the message to all subscribed clients. Topics are organized hierarchically, and clients can use wildcard characters to subscribe to multiple topics at once.

MQTT supports various Quality of Service (QoS) levels, which dictate how messages are delivered. For instance, QoS 0 delivers messages at most once, while QoS 1 ensures that messages are delivered at least once. Additionally, clients can specify a last will message that the broker will send if a client disconnects unexpectedly, notifying other clients of the disconnection.

The broker can retain the last message sent on a topic, allowing new clients to immediately receive the latest information upon subscribing. Once communication is complete, clients can disconnect from the broker. This efficient and lightweight messaging system is ideal for Internet of Things (IoT) applications, where devices may have limited resources and operate over unreliable networks.

The MQTT broker acts as the central server in the protocol, managing communication between clients. It can be self-hosted or cloud-based, with the choice of broker architecture depending on scalability needs. Brokers handle message retention, session security, and can optimize network traffic by isolating clients and routing messages efficiently.

MQTT can operate over various network protocols, including TCP/IP, WebSocket, TLS/SSL, and UDP. It is highly scalable and extensible, allowing for the addition of features and functionalities as needed.

What features does MQTT architecture offer?

MQTT offers several features that make it a popular choice for developers of real-time chat, Industrial IoT, and messaging apps, including:

  • Lightweight and efficient: MQTT is designed to be lightweight, making it suitable for use in constrained environments with limited bandwidth and processing power. Many MQTT client libraries can run on devices with as little as 2 KB of RAM.
  • pub/sub messaging pattern enabling scalable communication between multiple clients while reducing network traffic and minimizing data overhead.
  • Quality of Service (QoS) levels: which define the message delivery guarantee.
  • QoS -1 provides only once delivery. The client and broker take no additional steps to acknowledge delivery. This is also known as “fire and forget”.This only applies to messages sent by a client. Once messages are received at the broker, they are considered QoS 0
  • QoS 0 provides at least once delivery
  • QoS 1 The sender and receiver engage in a handshake to ensure only one copy of the message is received. This assures delivery and avoids multiple copies of the message being sent.

This flexibility allows developers to choose the appropriate level of reliability for their software.

  • Retained messages: MQTT allows for the retention of the last message published on a topic. This means that a new subscriber can receive the last known state of a topic immediately upon connection, ensuring that no important data is missed.
  • Message Filtering: MQTT supports flexible message filtering through topics. Clients can subscribe to specific topics of interest, allowing them to receive relevant messages while filtering out irrelevant ones. This reduces network congestion and improves scalability by minimizing the amount of data that needs to be transmitted and processed.
  • Persistent sessions: MQTT supports persistent sessions, which enable clients to maintain their subscriptions and queued messages even when disconnected. This feature ensures that clients can resume communication seamlessly upon reconnection.
  • Lightweight footprint: MQTT has a small code footprint, making it efficient in memory and processing power usage.
  • Security: MQTT supports TLS/SSL encryption, ensuring data is securely transmitted over the network. It also provides authentication mechanisms, such as username/password or client certificates, to verify the identity of clients and ensure that only authorized clients can access the MQTT broker.
  • Scalability: MQTT is designed to be highly scalable, allowing for seamless communication between thousands or even millions of devices.
  • Access Control: MQTT brokers often support access control mechanisms, allowing administrators to define and enforce fine-grained access policies. This ensures that only authorized clients can publish or subscribe to specific topics, protecting sensitive information and preventing unauthorized access.
  • Asynchronous Communication: MQTT supports asynchronous communication, allowing real-time updates without blocking or waiting for responses. This enables multiple clients to receive updates simultaneously.
  • Wide support: MQTT is widely supported by various programming languages and platforms, making it easy for developers to integrate it into their applications. On mobile platforms, MQTT can be integrated into Android applications using libraries like Eclipse Paho and Mosquitto, while CocoaMQTT serves iOS developers. Cloud Services like AWS IoT Core, Google Cloud IoT Core, and Microsoft Azure IoT Hub also support MQTT, enabling secure device connectivity and interaction. MQTT can be easily implemented for embedded systems on devices like Raspberry Pi and Arduino, allowing integration with various sensors and actuators.

What are the disadvantages of using MQTT?

Limited message size: MQTT has a limitation on the size of messages it can handle, typically ranging from 256KB to 256MB, depending on the implementation. This can be a drawback for applications that require transmitting large data payloads.

Lack of built-in security: While MQTT itself doesn’t provide built-in security mechanisms, it can be used securely over a TLS/SSL connection. However, implementing security features such as authentication and encryption requires additional configuration and setup.

Complexity: MQTT can be complex to set up and configure, especially for developers new to the protocol. It requires understanding topics, message queues, and subscribing and publishing to topics. This learning curve may add complexity to the development process.

Lack of built-in persistence: MQTT does not provide built-in persistence, meaning messages are not stored in the broker if a client is offline. This can be a limitation for applications that require message persistence or delivery to offline clients.

Limited support for complex scenarios: MQTT is primarily designed for lightweight and simple messaging scenarios. It may not be the best choice for complex scenarios that require advanced features such as request/response communication or complex message routing.

Setting up an MQTT infrastructure

There are several tools available to help with setting up an MQTT infrastructure. Here are a few popular options:

MQTT Broker: The core component of an MQTT infrastructure handles and maintains the state of client connections (connection management). Several open-source brokers are available, such as Mosquitto, HiveMQ, and EMQ X. These brokers provide the necessary functionality to manage MQTT connections, handle message routing, and ensure reliable delivery.

MQTT Client Libraries: allow developers to connect their applications to an MQTT broker. These libraries provide the necessary API to send and receive MQTT messages. Most programming languages have MQTT client libraries, including popular ones like Paho MQTT for Java, MQTT.js for JavaScript, and Eclipse Mosquitto for C/C++.

MQTT Testing Tools: To ensure the reliability and scalability of your MQTT infrastructure, it's important to conduct thorough testing. MQTT testing tools like MQTT.fx, MQTTBox, and HiveMQ's MQTT CLI can help you simulate different scenarios, test message handling, and monitor MQTT traffic.

MQTT Dashboard: A dashboard can provide real-time monitoring and visualization of your MQTT infrastructure. Tools like Grafana, InfluxDB, and Node-RED can help you build interactive dashboards to monitor MQTT topics, track message rates, and analyze performance metrics.

MQTT Cloud Services: If you prefer a managed solution, several cloud providers offer MQTT as a service. These services handle the infrastructure setup, scaling, and management for you. Examples include Amazon IoT Core, Google Cloud IoT Core, and Microsoft Azure IoT Hub.

The Evolution of MQTT

MQTT has several versions developed to enhance its functionality and address various requirements. The different versions of MQTT are as follows:

  • MQTT v3.1: The most widely used version of MQTT providing Quality of Service (QoS) levels, retained messages, and session management.
  • MQTT v3.1.1: This version is an updated version of MQTT v3.1 and includes some improvements and bug fixes. It clarifies certain protocol aspects and adds enhanced authentication and authorization mechanisms.
  • MQTT-SN (MQTT for Sensor Networks): MQTT-SN is a variation of MQTT designed for sensor networks, where devices may have limited processing power and memory. It provides a lightweight protocol for efficient communication between sensors and gateways.
  • MQTT v5.0: MQTT v5.0 is the latest version of MQTT, released in 2019. It introduces several new features and enhancements to the protocol, including extended authentication mechanisms, support for shared subscriptions, message properties, and improved error handling. MQTT v5.0 offers more flexibility and functionality compared to previous versions.

Developers should consider their applications' specific requirements and capabilities when choosing the MQTT version. MQTT v3.1 and v3.1.1 are widely supported and used, making them a good choice for most applications. However, MQTT-SN may be better if working with resource-constrained devices or sensor networks. For developers who want to take advantage of the latest features and enhancements, MQTT v5.0 is the recommended choice.