2026-09 mqtt 實驗2
基於 MQTT 協定 與 發佈/訂閱 (Pub/Sub) 架構 的完整物聯網 (IoT) 監控與遠端控制系統。
本系統為一套基於 MQTT 協定 與 發佈/訂閱 (Pub/Sub) 架構 的完整物聯網 (IoT) 監控與遠端控制系統。系統主要包含硬體感知層、MQTT 通訊中繼層以及使用者控制層三大部分:
1. 硬體感知與執行層 (ESP32 在 Wokwi 模擬環境)
硬體架構:
GPIO 2:連接 LED 燈,作為控制致動器。
GPIO 4:連接 DHT22 溫濕度感測器,作為環境數據採集源。
資料採集與發佈:ESP32 每 2 秒採集一次環境溫濕度,並自動透過 MQTT 發行至
alex9ufo/2026/temp(溫度)與alex9ufo/2026/humi(濕度)主題。雙向控制與狀態回報:
訂閱
alex9ufo/2026/led接收控制命令(on、off、flash、timer(5Sec)),並即時切換 LED 狀態。執行命令後,向
alex9ufo/2026/ledstatus回報當前狀態(如on_led、off_led)。
握手確認 (Handshake ACK):訂閱
alex9ufo/2026/tempOK與alex9ufo/2026/humiOK主題。當收到 Python 端發出的確認訊號時,會在 Serial Monitor 印出temp_Rx_OK與humi_Rx_OK,確保資料傳輸品質。
2. MQTT 通訊中繼層 (Broker)
伺服器:採用 HiveMQ 公開測試伺服器 (
broker.hivemq.com:1883)。主題架構 (Topic Topology):
| 通訊方向 | 主題名稱 | 功能 / Payload 內容 |
| Python → ESP32 | alex9ufo/2026/led | 控制命令 (on, off, flash, timer(5Sec)) |
| ESP32 → Python | alex9ufo/2026/ledstatus | LED 狀態回報 (on_led, off_led, 等) |
| ESP32 → Python | alex9ufo/2026/temp | 實時溫度數值 (如 25.5) |
| ESP32 → Python | alex9ufo/2026/humi | 實時濕度數值 (如 60.0) |
| Python → ESP32 | alex9ufo/2026/tempOK | 溫度接收確認訊號 (OK) |
| Python → ESP32 | alex9ufo/2026/humiOK | 濕度接收確認訊號 (OK) |
3. 使用者控制層 (Python + Tkinter GUI)
圖形化監控介面:即時顯示目前 MQTT 連線狀態(綠色已連線/紅色斷線)、LED 實時狀態以及最新的環境溫濕度數值。
遠端按鈕控制:提供四個控制按鈕,使用者點擊即可發送對應命令控制 ESP32。
自動 ACK 回應:當收到 ESP32 發出的溫濕度數據並更新 UI 後,會自動發送
OK訊息至對應的tempOK與humiOK主題,完成閉環通訊驗證。
ESP32 程式碼整合了 Wi-Fi 連線、MQTT 雙向通訊、DHT22 溫濕度感測器讀取 以及 LED 多模式控制。
硬體與網路初始化
硬體腳位設定:GPIO 2 連接控制 LED,GPIO 4 連接 DHT22 溫濕度感測器。
Wi-Fi 連線:開機後自動連線至
Wokwi-GUEST虛擬熱點,並在 Serial Monitor 印出連線進度。MQTT Broker 連線:連接至 HiveMQ 公開伺服器(
broker.hivemq.com:1883),連線成功後自動訂閱三個主題:alex9ufo/2026/led(接收控制指令)alex9ufo/2026/tempOK(接收溫度確認訊號)alex9ufo/2026/humiOK(接收濕度確認訊號)
訊息接收與處理解析 (Callback) 收到訂閱主題的訊息時會執行對應邏輯:
確認訊號(ACK)處理:
收到
tempOK主題訊息:在 Serial Monitor 輸出temp_Rx_OK。收到
humiOK主題訊息:在 Serial Monitor 輸出humi_Rx_OK。
LED 控制指令處理(收到後同步向
alex9ufo/2026/ledstatus回報狀態):"on":點亮 LED,回傳"on_led"。"off":關閉 LED,回傳"off_led"。"flash":開啟閃爍模式,回傳"flash_led"。"timer(5Sec)":點亮 LED 並開始 5 秒倒數,回傳"timer(5Sec)_led"。
非阻塞式背景任務 (Loop)
利用 millis() 代替 delay(),確保 MQTT 能持續保持連線不中斷:
溫濕度採樣發行:每 2 秒自動讀取一次 DHT22 感測器:
將溫度數值發行至
alex9ufo/2026/temp。將濕度數值發行至
alex9ufo/2026/humi。於 Serial Monitor 印出實時數據。
FLASH 閃爍邏輯:每 500 毫秒翻轉一次 GPIO 2 電位。
TIMER 定時邏輯:滿 5 秒後自動關閉 LED,將模式切回
OFF並發行"off_led"狀態通知控制端。
這份 Python 程式碼使用 Tkinter 打造圖形介面 (GUI),並透過 paho-mqtt (Callback API v2) 實現與 ESP32 的雙向通訊及遠端控制。
MQTT 網路通訊管理
Broker 設定:連接至 HiveMQ 公開測試伺服器 (
broker.hivemq.com:1883)。連線與自動訂閱 (
on_connect):連線成功後,自動訂閱 ESP32 回傳的 3 個主題:alex9ufo/2026/ledstatus(LED 狀態)alex9ufo/2026/temp(溫度數據)alex9ufo/2026/humi(濕度數據)
連線狀態監控:即時監控連線與斷線事件,並在介面頂端動態更新狀態(藍/橘色「連線中」、綠色「已連線」、紅色「已斷線/連線失敗」)。
背景異步處理 (
loop_start):在獨立執行緒運行 MQTT 網路封包接收與發送,確保 Tkinter GUI 視窗畫面運作順暢不卡頓。
訊息接收與握手機制 (on_message)
當收到 ESP32 發佈的訊息時,會進行解析並處理:
LED 狀態更新:收到
ledstatus訊息時,即時更新介面上的LED 狀態:文字(如on_led、off_led)。溫濕度更新與握手確認 (ACK):
收到
temp數據:更新 GUI 的溫度顯示,並自動發行"OK"訊息至alex9ufo/2026/tempOK主題通知 ESP32。收到
humi數據:更新 GUI 的濕度顯示,並自動發行"OK"訊息至alex9ufo/2026/humiOK主題通知 ESP32。
GUI 控制介面與指令發送
按鈕事件觸發 (
send_cmd):提供 4 個按鈕控制遠端 ESP32 的 LED:ON (開啟):發送
"on"至alex9ufo/2026/ledOFF (關閉):發送
"off"至alex9ufo/2026/ledFLASH (閃爍):發送
"flash"至alex9ufo/2026/ledTimer (定時5秒):發送
"timer(5Sec)"至alex9ufo/2026/led


















