Giao thức cho thiết bị cảnh báo cơ bản
Cấu Trúc MQTT Topics (Topics Structure)
Cấu trúc topic dạng: base_topic/device_id/danh_muc/thong_tin.
Trong đó:
base_topic: Tiền tố chung cho tất cả các thiết bị (ví dụ:smarthome,industrial_control).device_id: Mã nhận dạng duy nhất của thiết bị ESP32 (ví dụ:esp32_001,gateway_A).
MQTT topics được thiết kế lại, sử dụng tên thiết bị cụ thể là notice_device_esp32, cùng với cấu trúc tổng thể và các cơ chế giao tiếp.
Chúng ta sẽ sử dụng cấu trúc topic cơ bản: smart/notice_device_esp32/danh_muc/thong_tin.
1. Cấu Trúc MQTT Topics cho thiết bị esp32_ID
A. Topics để Thiết bị Gửi Dữ Liệu Lên Server (PUBLISH)
Thiết bị esp32_ID sẽ gửi (Publish) dữ liệu lên các topic này.
| Mục đích | Topic (Ví dụ) | Nội dung Bản tin (Payload) | Ghi chú |
|---|---|---|---|
| 1) Lấy key từ Server | smart/connect | JSON: {"device_id": "esp32_ID"} | gửi thông tin thiết bị lên server để lấy key và connect server. Topic này dùng chung cho tất cả thiết bị. |
| 2) Disconnect server | smart/esp32_ID/disconnect | JSON: {"key": "..."} | Disconnect đến server |
| 3) Trạng thái Thiết bị | smart/esp32_ID/status/general | {"key": "...","fourG": true/false, "pin": 100, "rssi": 100, "wifi": true/false} | Trạng thái tổng quan của các đèn hiển thị (Power, 4G, WiFi, Data, sóng). |
| 4) Trạng thái Nút nhấn (Input) | smart/esp32_ID/input | {"uid": "...", "key": "...", "code":0/1/2/3} | Trạng thái nút nhấn D1. Tương tự cho D2, D3, D4, D5, D6. Ngoài ra, Dữ liệu hình ảnh được lấy qua Digest Auth gửi qua topic này. |
| 5) Gửi ảnh | smart/esp32_ID/input/camera | JSON IMAGE: {"uid": "...", "key": "...", "image": "..."} | Gửi dữ liệu ảnh, uid phải trùng với uid khi gửi trạng thái nút nhấn mới gửi. |
| 6) Trạng thái key | smart/esp32_ID/key/status | success:{"success": true, "data":{"key": "..."}}error:{"success": false, "data": {"key": "...","errorCode":..., "message": ...}} | |
| 7) Trạng thái camera | smart/esp32_ID/camera/status | success:{"success": true, "data":{"key": ...,"ip": ..., "port": ..., "uri": ..., "user": ..., "pass": ..., "code": 0/1/2/3}}error:{"success": false, "data": {"key": "...","errorCode":..., "message": ...}} | |
| 8) Trạng thái thông tin cập nhập số điện thoại | smart/esp32_ID/phones/status | success:{"success": true, "data":{"key": "...","phones":"..."}}error:{"success": false, "data": {"key": "...","errorCode":..., "message": ...}} | |
| 9) Trạng thái firmware | smart/esp32_ID/firmware/status | success:{"success": true, "data":{"key": "...","fw_version": "..."}}error:{"success": false, "data": {"key": "...","errorCode":..., "message": ...}} | |
| 10) Test trạng thái Nút nhấn | smart/esp32_ID/input/test | {"uid": "...", "key": "...", "code":0/1/2/3} |
B. Topics để Server Gửi Lệnh Xuống Thiết bị (SUBSCRIBE)
Thiết bị esp32_ID sẽ đăng ký nhận (Subscribe) các topic này.
| Mục đích | Topic (Ví dụ) | Nội dung Bản tin (Payload) | Ghi chú |
|---|---|---|---|
| 1) Lấy key | smart/esp32_ID/key | {"key":"...","name":"...","address":"..."} | Key để thiết bị giao tiếp với Server |
| 2) Điều khiển Output | smart/esp32_ID/control | OUTPUT:{"code": 0/1/2/3,"state": 0/1} | Lệnh điều khiển Output. Code là số thứ tự ngõ ra. |
| 3) Gửi lệnh restart | smart/esp32_ID/cmd/restart | {"key": ...,"state": 0/1} | Lệnh server yêu cầu thiết bị khởi động lại. |
| 4) Cấu hình camera | smart/esp32_ID/input/setting | {"key": ...,"ip": ..., "port": ..., "uri": ..., "user": ..., "pass": ..., "code": 0/1/2/3, "label":"..."} | Nhập 5 thông tin camera bao gồm ip, port, uri, user và password. Gán camera đó vào các input trên thiết bị qua biến code. |
| 5) Ping thiết bị | smart/esp32_ID/ping | {"key": "..."} | |
| 6) Thiết lập danh sách số điện thoại | smart/esp32_ID/phones | {"key":"...","phones":"sdt1,sdt2,sdt3,..."} | |
| 7) phản hồi nút nhấn | smart/esp32_ID/input/status | {"uid":"...","code":...,"status":true/false } | |
| 8) Thiết lập wifi | smart/esp32_ID/wifi | {"key":"...","ssid":"...","pass":"..."} | |
| 9) Thông báo firmware mới | smart/esp32_ID/firmware | {"key":"...","fw_version": "...", "fw_title":"..."} |
2. Các Cơ Chế Giao Tiếp (Phần 4 & 5)
Giao Tiếp Hai Chiều và Định Kỳ (Yêu cầu 5)
Giao tiếp hai chiều được thực hiện thông qua việc thiết lập các topic PUBLISH (cho trạng thái) và SUBSCRIBE (cho lệnh điều khiển).
- Thiết bị Gửi (Telemetry): ESP32 định kỳ hoặc khi có sự kiện (như nút nhấn thay đổi) sẽ PUBLISH lên các topic
.../status/...và.../input/.... - Server Gửi Lệnh (Command): Server muốn điều khiển hoặc cấu hình, sẽ PUBLISH xuống các topic
.../control/...và.../config/.... ESP32 đã SUBSCRIBE các topic này nên sẽ nhận được lệnh ngay lập tức (giao tiếp thời gian thực).
- Cơ chế Gửi Định kỳ (Heartbeat)
- Thiết bị
notice_device_esp32sẽ triển khai một Timer nội bộ ( chạy RTOS) - Cứ sau khoảng thời gian T (ví dụ: 3 phút hoặc 5 phút) thiết bị sẽ PUBLISH bản tin trạng thái tổng thể lên topic
smart/notice_device_esp32/status/general. - Đây là cơ chế quan trọng để Server biết thiết bị vẫn đang online (Heartbeat) và cập nhật tình trạng dữ liệu.
- Cài đặt Chu kỳ từ Server
- Để thay đổi T (3 phút ↔ 5 phút), Server sẽ PUBLISH xuống topic
smart/notice_device_esp32/config/interval. notice_device_esp32SUBSCRIBE topic này, nhận giá trị mới (ví dụ:180giây) và cập nhật Timer nội bộ.- Lưu ý: Cài đặt mặc định (ví dụ 300 giây) nên được lưu trữ trong Flash/EEPROM của ESP32 để duy trì qua các lần khởi động lại.
Truyền Dữ Liệu Hình Ảnh (Yêu cầu 4)
Việc truyền ảnh qua MQTT cần lưu ý đến kích thước payload tối đa của MQTT (thường giới hạn, ví dụ: 256MB, nhưng thực tế nên giữ dưới vài trăm KB).
- Thu thập: ESP32 sử dụng Digest Auth để lấy dữ liệu ảnh từ Camera, thường là định dạng JPEG.
- Mã hóa: Dữ liệu ảnh thô (byte array) được chuyển đổi sang chuỗi Base64. Điều này giúp bản tin MQTT payload chỉ chứa các ký tự hợp lệ và an toàn.
- Gửi: Thiết bị PUBLISH chuỗi Base64 lên topic
smart/notice_device_esp32/data/camera. - Xử lý: Server nhận chuỗi Base64, giải mã ngược lại thành dữ liệu ảnh và lưu trữ/hiển thị.
- Chất lượng dịch vụ (QoS): Nên dùng QoS 1 cho các bản tin hình ảnh quan trọng để đảm bảo server nhận được ảnh (ít nhất một lần).
Cơ Chế Gửi Dữ Liệu Định Kỳ và Cấu Hình Từ Server
Đây là cơ chế quan trọng cho việc giám sát trạng thái thiết bị (Keep-Alive/Heartbeat).
- Thiết bị ESP32 sử dụng một timer (bộ đếm thời gian) nội bộ.
- Cứ sau một khoảng thời gian
T(ví dụ: 3 phút hoặc 5 phút), thiết bị sẽ PUBLISH một bản tin trạng thái đầy đủ lên topicsmart/notice_device_esp32/status/device. - Đây là cơ chế "Heartbeat" giúp server luôn biết được thiết bị vẫn đang hoạt động và cập nhật trạng thái mới nhất.
- Ban đầu, ESP32 có thể cài đặt sẵn một chu kỳ mặc định (ví dụ: 300 giây).
- Server có thể gửi một lệnh PUBLISH xuống topic
smart/notice_device_esp32/config/intervalvới payload là{"interval_sec": 180}(180 giây = 3 phút). - ESP32 SUBSCRIBE topic này, nhận lệnh, và cập nhật giá trị biến
Tnội bộ của nó thành 180 giây. Kể từ đó, chu kỳ gửi dữ liệu mới là 3 phút.