MQTT
MQTT (Message Queuing Telemetry Transport) — лёгкий pub/sub-протокол для IoT. IBM (1999), потом OASIS. Топики иерархичные, QoS-уровни, tiny binary header (2 байта минимум). Дефолт для миллиардов IoT-устройств.
Модель
[Publisher] → [Broker (Mosquitto/HiveMQ/EMQX)] → [Subscriber]
topic: sensors/room1/temperature
value: 22.5°C
Топики и wildcards
- Иерархия:
home/livingroom/temp +— один уровень:home/+/temp=home/kitchen/temp,home/bedroom/temp#— многоуровневый (только в конце):home/#
QoS levels
| QoS | Семантика |
|---|---|
| 0 | at most once (fire-and-forget) |
| 1 | at least once (может дублировать) |
| 2 | exactly once (4-way handshake) |
Пакет
| fixed header (2+ B) | variable header | payload |
Fixed header:
byte 1: message type (4 bit) + flags (4 bit)
byte 2+: remaining length (variable-length int)
Handshake CONNECT
C → B: CONNECT {
client_id: "sensor-42",
keep_alive: 60,
username, password,
will: {topic:"sensor/42/status", payload:"offline", retain:true}
}
B → C: CONNACK { return_code:0 }
C → B: SUBSCRIBE topic="cmd/sensor/42/#" qos=1
C → B: PUBLISH topic="sensor/42/temp" payload="22.5"
Last Will and Testament (LWT)
Если клиент отвалился без DISCONNECT, брокер публикует LWT-сообщение. Все subscribers мгновенно знают "устройство offline".
Retained message
publish("sensor/42/temp", "22.5", retain=true)
# новый subscriber на этот topic сразу получит последнее значение
Часто для "current state". Retained сохраняется на брокере.
MQTT 5.0
2019, OASIS. Новое: user properties, reason codes, shared subscriptions ($share/group/topic — распределение как Kafka), request/response через correlation-data, session/message expiry, auth flows.
MQTT over WebSocket / SSE / QUIC
- MQTT over WebSocket (port 8083/8884) — из браузера
- MQTT over QUIC (эксперимент EMQX)
- MQTT-SN — sensor networks, UDP-based, для ZigBee/LoRa gateways
Брокеры
- Mosquitto — reference, Eclipse
- EMQX — Erlang, миллион коннектов
- HiveMQ — enterprise
- VerneMQ, NanoMQ — edge
- AWS IoT Core, Azure IoT Hub, GCP Cloud IoT
Порты
- 1883 — plain MQTT
- 8883 — MQTTS (TLS)
- 8083/8884 — MQTT/WebSocket