跳轉到

MQTT Topic 結構

MQTT 是一種廣泛應用於物聯網的輕量級通訊協議,主要透過訂閱與發布的方式在不同設備間交換數據。在 MQTT 通訊中,"Topic" 扮演了核心角色,用於對消息進行分類和分發。以下將介紹如何設計和應用 MQTT 的 Topic 結構,以提升設備之間的數據傳遞效率與可靠性。

什麼是 MQTT Topic?

在 MQTT 中,Topic 是一個分層的字串路徑,用於標示消息的類型與分類。每當某個設備要接收或發布消息時,都需要指定相應的 Topic,讓消息可以準確地到達目的地或被特定設備接收。Topic 的層級以斜線 (/) 來分隔。

本設備中的 MQTT Topic 設計

在本 RS232 伺服器中,我們使用多個不同的 Topic 來實現數據的接收、命令的傳遞、狀態的更新等,這些 Topic 的設計確保了不同類型數據的可靠傳遞,並且使得管理與維護更加便利。以下是設備中常見的幾個 MQTT Topic:

  1. 命令接收 (Command Topic)

    • Topic 路徑: {profile.mqtt_topic}/{wifi_mac}/cmd
    • 用途: 用於接收外部設備下達的控制命令。例如,遠端設備可以透過這個 Topic 向本裝置發送如 "ota" 或 "pull" 等指令。
  2. 數據接收 (RX Topic)

    • COM 1 Topic 路徑: {profile.mqtt_topic}/{wifi_mac}/rx1
    • COM 2 Topic 路徑: {profile.mqtt_topic}/{wifi_mac}/rx2
    • 用途: 這個 Topic 用於接收來自其他設備的數據,主要用於串口數據的接收與處理。當外部設備需要發送訊息到本裝置時,會將消息發布到這個 Topic 上。
  3. 數據發送 (TX Topic)

    • COM 1 Topic 路徑: {profile.mqtt_topic}/{wifi_mac}/tx1
    • COM 2 Topic 路徑: {profile.mqtt_topic}/{wifi_mac}/tx2
    • 用途: 這個 Topic 用於將處理過的數據或狀態訊息發布出去,其他設備可以透過訂閱這個 Topic 來獲取設備狀態或者接收轉發的數據。例如,UART 接收到的數據會經過處理後發布到這個 Topic 上,供其他設備使用。
  4. 設備心跳訊息 (Heartbeat Topic)

    • Topic 路徑: {profile.mqtt_topic}/heartbeat
    • 用途: 用於定期發送設備的心跳訊息,以確認設備當前是否正常運作並在線上。這對於遠端監控和管理來說非常重要,可以用來即時掌握設備的運行狀態。
  5. 版本資訊發布 (Version Topic)

    • Topic 路徑: {profile.mqtt_topic}/{wifi_mac}/version
    • 用途: 用於發布設備的軟體版本資訊,方便管理者了解當前設備的版本狀態,確保所有設備的軟體版本一致,以利於維護和更新。

MQTT Topic 的設計原則

  1. 層級分明

使用層級分隔符號 (/) 來對不同的數據類型和設備進行分隔。這樣的設計使得每個設備或功能模組有清晰的數據路徑,例如 {wifi_mac}/cmd 用於特定設備的命令接收,能夠有效避免混亂。

  1. 可讀性高

Topic 名稱應具備描述性,便於理解。例如,cmd 代表命令類型,heartbeat 代表心跳訊息,讓管理者能夠一眼理解該 Topic 的用途。

  1. 可擴充性

Topic 的設計應具備擴充性,便於日後添加新功能或設備。透過使用通用的前綴與結構,未來可以更輕鬆地在現有基礎上進行擴充。

MQTT Topic 在設備中的應用場景

當設備連接到 MQTT 伺服器並成功建立連線後,會根據不同的用途訂閱特定的 Topic。例如,在 mqtt_event_handler 中,當 MQTT 成功連線 (MQTT_EVENT_CONNECTED) 時,設備會訂閱 cmdrx 兩個主要的 Topic,確保外部設備能夠下達控制命令並向設備傳送數據。

這種基於 Topic 的消息分發機制,可以讓管理者靈活地控制設備的行為,並且能夠即時獲取設備的運行狀態和數據傳輸,提升設備的管理效率和可操作性,更可以達到自動化管理的目的。