← Quay lại Blog
otheriotmqttcommunication

MQTT Protocol: Giao tiếp giữa robot và cloud

MQTT Protocol cho robot và IoT — thiết lập broker, QoS levels, topic design và truyền telemetry từ robot lên cloud.

Nguyễn Anh Tuấn1 tháng 9, 20254 phút đọc
MQTT Protocol: Giao tiếp giữa robot và cloud

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.

Mạng kết nối IoT và giao tiếp giữa các thiết bị

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.

Server và hạ tầng mạng cho hệ thống MQTT broker

Bảo mật trong Production

  1. Luôn dùng TLS (port 8883) cho kết nối qua internet
  2. Certificate per robot: mỗi robot có client certificate riêng
  3. ACL (Access Control List): robot chỉ publish được topic của mình
  4. 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.

Bài viết liên quan

Bài viết liên quan

Triển khai ứng dụng IoT với Docker và Docker Compose
devopsdockeriot

Triển khai ứng dụng IoT với Docker và Docker Compose

Hướng dẫn triển khai ứng dụng IoT với Docker và Docker Compose trên edge devices — đóng gói, quản lý nhất quán và dễ bảo trì.

15/7/20254 phút đọc