MQTT là gì?
MQTT (Message Queuing Telemetry Transport) là giao thức truyền thông nhẹ, thiết kế cho các thiết bị có tài nguyên hạn chế và mạng không ổn định. Với overhead chỉ 2 bytes header, MQTT là lựa chọn hàng đầu cho giao tiếp giữa robot, sensor và cloud platform.
So với HTTP REST API (header hàng trăm bytes mỗi request), MQTT tiết kiệm băng thông đáng kể — yếu tố quyết định khi robot kết nối qua mạng 4G hoặc WiFi công nghiệp. Đây cũng là giao thức phổ biến khi triển khai ứng dụng IoT với Docker.
Kiến trúc Pub/Sub
MQTT sử dụng mô hình Publish/Subscribe với broker trung gian:
Robot A ──publish──→ ┌──────────┐ ──subscribe──→ Dashboard
Robot B ──publish──→ │ MQTT │ ──subscribe──→ Cloud DB
Robot C ──publish──→ │ Broker │ ──subscribe──→ Alert System
Dashboard ─publish─→ └──────────┘ ──subscribe──→ Robot A (commands)
Ưu điểm: robot không cần biết ai đang lắng nghe, broker lo việc phân phối message. Thêm subscriber mới không ảnh hưởng publisher.
Cài đặt Mosquitto Broker
# Cài đặt Mosquitto trên Ubuntu
sudo apt install -y mosquitto mosquitto-clients
# Cấu hình authentication
sudo nano /etc/mosquitto/conf.d/default.conf
# /etc/mosquitto/conf.d/default.conf
listener 1883
allow_anonymous false
password_file /etc/mosquitto/passwd
# TLS cho production
listener 8883
certfile /etc/mosquitto/certs/server.crt
keyfile /etc/mosquitto/certs/server.key
cafile /etc/mosquitto/certs/ca.crt
# Tạo user/password
sudo mosquitto_passwd -c /etc/mosquitto/passwd robot_user
sudo systemctl restart mosquitto
QoS Levels — Chọn đúng cho từng use case
| QoS | Đảm bảo | Use case |
|---|---|---|
| 0 — At most once | Có thể mất message | Sensor data tần suất cao (temperature mỗi giây) |
| 1 — At least once | Gửi ít nhất 1 lần, có thể trùng | Telemetry quan trọng (battery level, error logs) |
| 2 — Exactly once | Đúng 1 lần, chậm nhất | Lệnh điều khiển (start/stop, emergency stop) |
Nguyên tắc: Dùng QoS 0 cho data stream tần suất cao, QoS 1 cho telemetry, QoS 2 cho commands.
Topic Design cho Robot Fleet
Thiết kế topic structure rõ ràng là chìa khóa để hệ thống mở rộng được:
fleet/{fleet_id}/robot/{robot_id}/telemetry/battery
fleet/{fleet_id}/robot/{robot_id}/telemetry/position
fleet/{fleet_id}/robot/{robot_id}/telemetry/status
fleet/{fleet_id}/robot/{robot_id}/command/velocity
fleet/{fleet_id}/robot/{robot_id}/command/mission
fleet/{fleet_id}/robot/{robot_id}/alert/collision
fleet/{fleet_id}/robot/+/telemetry/# ← wildcard subscribe
Code Python cho Robot
import paho.mqtt.client as mqtt
import json
import time
class RobotMQTTClient:
def __init__(self, robot_id: str, broker: str, port: int = 1883):
self.robot_id = robot_id
self.client = mqtt.Client(client_id=f"robot-{robot_id}")
self.client.username_pw_set("robot_user", "secure_password")
self.client.on_connect = self._on_connect
self.client.on_message = self._on_message
self.client.will_set(
f"fleet/1/robot/{robot_id}/status",
payload=json.dumps({"status": "offline"}),
qos=1, retain=True
)
self.client.connect(broker, port)
def _on_connect(self, client, userdata, flags, rc):
# Subscribe to commands
client.subscribe(f"fleet/1/robot/{self.robot_id}/command/#", qos=2)
# Announce online
self.publish_status("online")
def _on_message(self, client, userdata, msg):
payload = json.loads(msg.payload)
if "velocity" in msg.topic:
self.handle_velocity(payload)
elif "mission" in msg.topic:
self.handle_mission(payload)
def publish_telemetry(self, battery: float, x: float, y: float):
payload = json.dumps({
"battery": battery, "position": {"x": x, "y": y},
"timestamp": time.time()
})
self.client.publish(
f"fleet/1/robot/{self.robot_id}/telemetry/position",
payload, qos=0
)
def publish_status(self, status: str):
self.client.publish(
f"fleet/1/robot/{self.robot_id}/status",
json.dumps({"status": status}), qos=1, retain=True
)
Last Will and Testament
MQTT hỗ trợ Last Will — message tự động gửi khi client mất kết nối đột ngột. Đây là cách phát hiện robot offline mà không cần heartbeat phức tạp (đã cấu hình trong code ở trên với will_set).
Retained Messages
Dùng retain=True cho status messages. Khi dashboard mới kết nối, nó nhận ngay trạng thái cuối cùng của mỗi robot mà không cần đợi robot gửi lại.
Bảo mật trong Production
- Luôn dùng TLS (port 8883) cho kết nối qua internet
- Certificate per robot: mỗi robot có client certificate riêng
- ACL (Access Control List): robot chỉ publish được topic của mình
- Bridge broker: edge broker trong nhà máy, bridge tới cloud broker
MQTT là xương sống của mọi hệ thống IoT và robot fleet hiện đại. Với thiết kế topic hợp lý và QoS phù hợp, bạn có thể xây dựng hệ thống giao tiếp tin cậy cho hàng trăm robot. Kết hợp với Kubernetes và K3s cho robot fleet, MQTT tạo nên hạ tầng hoàn chỉnh cho quản lý đội robot quy mô lớn.