MQTT trong AWS IoT Core hoạt động như thế nào?
Tổng quan về MQTT
MQTT (Message Queuing Telemetry Transport) là một giao thức truyền thông nhẹ dựa trên mô hình publish/subscribe, được thiết kế tối ưu cho thiết bị IoT có tài nguyên hạn chế và mạng không ổn định.
Cách hoạt động MQTT trong AWS IoT Core
1. Thiết bị MQTT client kết nối với AWS IoT Core
-
Sử dụng giao thức MQTT hoặc MQTT over WebSocket.
-
Kết nối đến endpoint của AWS IoT:
<prefix>.iot.<region>.amazonaws.com
Ví dụ:
a3r7dkwb23dp1u-ats.iot.ap-southeast-1.amazonaws.com
2. Chứng thực và phân quyền
-
Thiết bị dùng X.509 certificate hoặc AWS Cognito Identity.
-
AWS IoT kiểm tra IAM policy hoặc IoT policy để cho phép:
- Connect
- Publish
- Subscribe
- Receive
3. Gửi và nhận dữ liệu qua topic
-
MQTT client publish vào một topic, ví dụ:
sensors/temperature/device123
-
MQTT client khác subscribe topic này để nhận dữ liệu.
-
AWS IoT có thể dùng wildcard:
sensors/+/device123 sensors/# (subscribe toàn bộ)
4. Luồng dữ liệu
-
Thiết bị gửi dữ liệu (
publish
) ➜ AWS IoT Core nhận ➜ chuyển tiếp đến:- Thiết bị khác (subscribed)
- AWS Lambda
- Kinesis, S3, DynamoDB, SNS, SQS
- Amazon IoT Rules Engine xử lý
Các thành phần chính
Thành phần | Vai trò |
---|---|
MQTT Broker | Do AWS IoT quản lý, xử lý publish/subscribe |
IoT Rules Engine | Xử lý dữ liệu gửi đến, định tuyến hoặc trigger service khác |
Thing Registry | Đăng ký thông tin thiết bị |
Certificates | Chứng thực thiết bị |
Policies | Kiểm soát truy cập |
Ví dụ: Publish dữ liệu cảm biến nhiệt độ
Thiết bị gửi dữ liệu:
import paho.mqtt.client as mqtt
import ssl
import json client = mqtt.Client()
client.tls_set(ca_certs="AmazonRootCA1.pem", certfile="device-certificate.pem.crt", keyfile="private.pem.key", tls_version=ssl.PROTOCOL_TLSv1_2) client.connect("your-iot-endpoint.iot.ap-southeast-1.amazonaws.com", 8883) payload = json.dumps({ "temperature": 27.5 })
client.publish("sensors/temp/device123", payload)
AWS IoT Rule để lưu vào DynamoDB:
SELECT temperature FROM 'sensors/temp/+'
Lưu ý khi thiết kế MQTT với AWS IoT
- Giới hạn topic name: ≤ 256 ký tự
- QoS: AWS hỗ trợ QoS 0 và 1
- Không hỗ trợ retained messages
- Không hỗ trợ will messages
Input:
Client_ID
: mã định danh thiết bịCertificate
,Private_Key
: dùng để xác thực TLSTopic
: kênh truyền tin, ví dụ"sensor/temperature/device123"
Payload
: dữ liệu gửi, ví dụ{ "temp": 28.5 }
MQTT_Broker
: endpoint của AWS IoT Core
Thuật toán:
BEGIN 1. [Khởi tạo kết nối] a. Client tạo phiên làm việc MQTT b. Thiết lập kết nối TLS với MQTT_Broker (AWS IoT Endpoint) - Dùng Certificate, Private_Key, AmazonRootCA c. Gửi yêu cầu CONNECT đến MQTT_Broker với Client_ID 2. [Xác thực & Ủy quyền] a. MQTT_Broker (AWS IoT) xác thực certificate (X.509) b. Kiểm tra policy có cho phép hành động CONNECT không c. Nếu không hợp lệ, từ chối kết nối → STOP 3. [Giao tiếp dữ liệu] LOOP trong thời gian kết nối còn sống: a. Nếu client muốn gửi dữ liệu: - Gửi PUBLISH(topic, payload) - Broker kiểm tra policy: có được PUBLISH vào topic không? - Nếu OK: i. Lưu message vào queue của các client đã SUBSCRIBE topic đó ii. Forward đến các client subscribe b. Nếu client muốn nhận dữ liệu: - Gửi SUBSCRIBE(topic_filter) - Broker kiểm tra policy có cho phép SUBSCRIBE không - Nếu OK: gán client này vào danh sách listener của topic c. Broker thực hiện gửi message (QoS 0 hoặc 1): - Nếu QoS 1: yêu cầu ACK từ client 4. [Ngắt kết nối] a. Nếu client gửi DISCONNECT hoặc timeout - Broker hủy phiên kết nối - Xóa hàng đợi client khỏi topic list END
✅ Ví dụ cụ thể hóa thuật toán
Giả sử:
Client_ID
:device123
Topic
:"sensors/temp/device123"
Payload
:{ "temp": 30 }
Thì tiến trình như sau:
device123 → CONNECT → AWS IoT Core
AWS IoT Core → kiểm tra certificate + policy
device123 → PUBLISH("sensors/temp/device123", {temp:30})
AWS IoT Core → xác thực → forward đến mọi subscriber topic này
Subscriber → nhận payload
Chúng ta đã có những hình dùng sơ về thuật toán, hy vọng sẽ làm rõ hơn trong các bài viết sau nhé