Skip to main content

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": ...}}


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/....../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/....../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).

1. Cơ chế Gửi Định kỳ (Heartbeat)

  • Thiết bị notice_device_esp32 sẽ triển khai một Timer nội bộ ( chạy RTOS)

  • Cứ sau khoảng thời gian (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.

2. Cài đặt Chu kỳ từ Server

  • Để thay đổi (3 phút 5 phút), Server sẽ PUBLISH xuống topic smart/notice_device_esp32/config/interval.

  • notice_device_esp32 SUBSCRIBE topic này, nhận giá trị mới (ví dụ: 180 giâ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).

  1. Thu thập: ESP32 sử dụng Digest Auth để lấy dữ liệu ảnh từ Camera, thường là định dạng JPEG.

  2. 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.

  3. Gửi: Thiết bị PUBLISH chuỗi Base64 lên topic smart/notice_device_esp32/data/camera.

  4. 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ị.
  5. 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).

  1. Gửi Định Kỳ (Thiết bị lên Server):

    • 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 topic smart/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.

  2. Cài đặt Chu kỳ từ Server (Server xuống Thiết bị):

    • 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/interval vớ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 T nộ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.