Skip to main content

MQTT Protocol

MQTT (Message Queuing Telemetry Transport) is a lightweight publish-subscribe messaging protocol designed for constrained devices and low-bandwidth networks. It's ideal for IoT applications.

Overview​

MQTT provides:

  • Lightweight messaging
  • Publish-subscribe pattern
  • Quality of Service levels
  • Retained messages
  • Last Will and Testament
  • Low bandwidth requirements
  • Efficient for IoT

Architecture​

Components​

MQTT Broker Central message router:

  • Receives all messages
  • Filters messages by topic
  • Distributes to subscribers
  • Manages connections

MQTT Clients Publishers and subscribers:

  • Publish messages to topics
  • Subscribe to topics
  • Maintain connection to broker

Communication Flow​

Publisher → [Topic: sensors/temp] → Broker → Subscribers

Topics​

Topic Structure​

Topics are hierarchical paths:

home/livingroom/temperature
building1/floor2/room201/humidity
factory/line3/machine5/status

Use forward slashes (/) as separators.

Topic Hierarchy​

sensors/
├── temperature/
│ ├── indoor
│ └── outdoor
├── humidity/
└── pressure/

Topic Naming Best Practices​

Good:

device/001/temperature
site/warehouse/zone-a/motion
alert/critical/overheat

Avoid:

temp (too generic)
/sensor/ (leading/trailing slashes)
sensor temperature (spaces)

Wildcards​

Single-level (+) Matches one level:

sensors/+/temperature
Matches:
- sensors/room1/temperature
- sensors/room2/temperature
Does NOT match:
- sensors/room1/indoor/temperature

Multi-level (#) Matches multiple levels (must be last):

sensors/#
Matches:
- sensors/temperature
- sensors/room1/temperature
- sensors/room1/indoor/temperature

Examples:

home/+/temperature      # All room temperatures
home/+/+ # All metrics in all rooms
home/# # Everything under home
+/bedroom/temperature # Bedroom temp in all homes

Quality of Service (QoS)​

QoS 0: At Most Once​

Fire and forget:

  • No acknowledgment
  • Message may be lost
  • Fastest, lowest overhead
  • Best for frequent, non-critical data

Use for:

  • Sensor readings sent every second
  • Status updates
  • Non-critical telemetry

QoS 1: At Least Once​

Acknowledged delivery:

  • Sender receives PUBACK
  • Guaranteed delivery
  • Possible duplicates
  • Moderate overhead

Use for:

  • Important measurements
  • Commands
  • Alerts
  • State changes

QoS 2: Exactly Once​

Assured delivery:

  • Four-way handshake
  • No duplicates
  • Guaranteed once
  • Highest overhead

Use for:

  • Critical commands
  • Financial transactions
  • Safety-critical data

QoS Negotiation​

Actual QoS is minimum of:

  • Publisher QoS
  • Subscriber QoS

Example:

Publish with QoS 2
Subscribe with QoS 1
→ Messages delivered at QoS 1

Retained Messages​

Purpose​

Last published message saved by broker.

Behavior​

1. Publish with retain flag set
2. Broker stores message
3. New subscribers immediately receive it
4. Only one retained message per topic

Use Cases​

home/livingroom/temperature (retain)
→ New subscribers get current temp immediately

device/001/status (retain)
→ Shows last known device state

Clear Retained Message​

Publish empty message with retain flag.

Last Will and Testament (LWT)​

Purpose​

Message sent when client disconnects unexpectedly.

Configuration​

Set when connecting:

Will Topic: device/001/status
Will Message: "offline"
Will QoS: 1
Will Retain: true

Use Cases​

Device Status:

On Connect:
Publish: device/001/status = "online"

Will Message:
Topic: device/001/status
Message: "offline"

On Clean Disconnect:
Publish: device/001/status = "offline"

Heartbeat:

Will topic: alerts/timeout
Will message: "Device 001 connection lost"

Connection​

Connect Packet​

Client ID: device-001 (unique identifier)
Clean Session: true/false
Keep Alive: 60 (seconds)
Username: optional
Password: optional
Will Message: optional (LWT)

Clean Session​

True:

  • No session state persisted
  • Start fresh each connection
  • Subscriptions not remembered

False:

  • Session persists across disconnections
  • Subscriptions maintained
  • Queued messages delivered

Keep Alive​

Heartbeat interval:

Keep Alive: 60 seconds
- Client sends PINGREQ
- Broker responds PINGRESP
- Detects broken connections

Message Structure​

MQTT Packet​

Fixed Header:
- Packet Type (PUBLISH, SUBSCRIBE, etc.)
- Flags (DUP, QoS, RETAIN)
- Remaining Length

Variable Header:
- Topic Name
- Packet Identifier

Payload:
- Message content

Publish Message​

Topic: sensors/temperature
QoS: 1
Retain: false
Payload: {"value": 22.5, "unit": "C"}

MQTT over TCP vs WebSocket​

MQTT over TCP (Port 1883)​

Standard MQTT
Port: 1883 (unencrypted)
Port: 8883 (TLS/SSL)
Binary protocol
Most efficient

MQTT over WebSocket (Port 80/443)​

For browsers
Port: 80 (ws://)
Port: 443 (wss://)
Works through firewalls
Slightly more overhead

Security​

Authentication​

Username/Password:
- Simple authentication
- Sent in CONNECT packet

Certificate-Based:
- TLS client certificates
- Strong authentication
- No password needed

Encryption​

TLS/SSL:
- Encrypted connection
- Port 8883 (MQTT)
- Port 443 (WebSocket)
- Protects data in transit

Authorization​

Topic ACLs:
- Control publish permissions
- Control subscribe permissions
- Per-user or per-client

Example:

User: device001
Can publish: device001/#
Can subscribe: device001/commands/#

Mosquitto​

  • Open source
  • Lightweight
  • Easy to deploy
  • Good for development

HiveMQ​

  • Enterprise-grade
  • Highly scalable
  • Commercial support
  • Advanced features

EMQX​

  • Massively scalable
  • IoT-focused
  • Open source and commercial
  • High performance

Cloud Brokers​

  • AWS IoT Core
  • Azure IoT Hub
  • Google Cloud IoT
  • HiveMQ Cloud

Best Practices​

Topic Design​

  1. Use hierarchical structure
  2. Include device ID in topics
  3. Separate commands and status
  4. Use consistent naming

Example Structure:

devices/{device-id}/telemetry/{metric}
devices/{device-id}/status
devices/{device-id}/commands/{action}
alerts/{severity}/{type}

Message Design​

  1. Use JSON for structured data
  2. Keep messages small
  3. Include timestamps
  4. Version your message formats

Connection Management​

  1. Implement reconnection logic
  2. Use exponential backoff
  3. Handle CONNACK errors
  4. Monitor connection state

QoS Selection​

  1. Use QoS 0 for frequent data
  2. Use QoS 1 for important messages
  3. Avoid QoS 2 unless necessary
  4. Match QoS to importance

Retained Messages​

  1. Use for status and state
  2. Clear when no longer needed
  3. Don't retain large messages
  4. Consider TTL requirements

Common Patterns​

Command/Response​

Publisher:
devices/001/commands/restart

Device subscribes and executes:
On message received:
Execute command
Publish response to:
devices/001/responses/restart
Payload: {"status": "success"}

Request/Reply​

Request:
Topic: devices/001/requests
Payload: {"action": "get_status", "reply_to": "client/123/reply"}

Response:
Topic: client/123/reply
Payload: {"status": "online", "temp": 22.5}

Heartbeat​

Every 30 seconds:
Publish: devices/001/heartbeat
Payload: {"timestamp": "2023-10-09T12:00:00Z"}

Monitor:
Subscribe: devices/+/heartbeat
Alert if not received in 60 seconds

AppBlocks Implementation​

MQTT Feature​

Configure in MQTT feature:

  • Broker address
  • Port and security
  • Authentication
  • Keep alive
  • Clean session

Publish​

Use MQTT Publish block:

  • Set topic
  • Choose QoS
  • Set retain flag
  • Provide payload

Subscribe​

Use MQTT Subscribe block:

  • Subscribe to topic(s)
  • Use wildcards
  • Handle received messages

Connection Status​

Use On MQTT Connected block:

  • Detect connection
  • Detect disconnection
  • Handle reconnection

Troubleshooting​

Common MQTT issues:

Cannot connect:

  • Check broker address and port
  • Verify network connectivity
  • Check firewall rules
  • Validate credentials

Messages not received:

  • Verify subscription topic
  • Check QoS levels
  • Confirm broker connection
  • Test with MQTT client tool

Frequent disconnections:

  • Increase keep alive
  • Check network stability
  • Verify broker capacity
  • Monitor client errors

High latency:

  • Use QoS 0 for non-critical data
  • Check broker load
  • Verify network speed
  • Consider local broker

Testing Tools​

Mosquitto Clients​

# Subscribe
mosquitto_sub -h broker.example.com -t "sensors/#"

# Publish
mosquitto_pub -h broker.example.com -t "sensors/temp" -m "22.5"

MQTT.fx​

  • GUI client
  • Topic monitoring
  • Message publishing
  • Connection testing

MQTT Explorer​

  • Visual topic browser
  • Message history
  • Statistics
  • Easy to use

See Also​