將接收到的 MQTT 訊息通過 Web 請求傳遞出去
在這節課中,我們將學習如何在 Flask 應用中配置 MQTT 訂閱者,當接收到 MQTT 廣播消息時,將消息解析並通過 HTTP 請求(如 PUT 請求)傳遞給另一個 Web 服務端點。這種設計常用於物聯網(IoT)系統中,當設備發送數據到 MQTT Broker 時,應用可以接收並將數據轉發到後端服務進行進一步處理。
步驟 1:設置 on_message
回調函數來接收 MQTT 消息
我們首先需要設置 on_message
回調函數,以便在接收到來自訂閱主題的 MQTT 消息時觸發相應的處理邏輯。
@mqtt.on_message() def handle_mqtt_message(client, userdata, message): # 打印接收到的消息和主題 print("Received message '" + message.payload.decode() + "' on topic '" + message.topic + "'") # 解析 JSON 負載 parsedJson = json.loads(message.payload.decode()) # 設置 HTTP 請求的標頭和負載 headers = {'Content-Type': 'application/x-www-form-urlencoded;charset=utf-8'} payload = { 'device_id': str(parsedJson['device_id']), 'device_name': str(parsedJson['device_name']) } # 發送 PUT 請求到指定的 Web 服務端點 r = requests.put('http://127.0.0.1/wp-json/iot/v1/device', headers=headers, data=payload) # 打印請求的響應狀態碼 print(f'Request sent, response status: {r.status_code}')
解釋:
@mqtt.on_message()
:這個裝飾器用來將handle_mqtt_message
函數與 MQTT 消息的接收事件綁定。message.payload.decode()
:將收到的 MQTT 消息內容從二進制解碼為字符串。json.loads()
:將解碼後的字符串解析為 JSON 對象,以便於訪問其內容。headers
:設置 HTTP 請求的標頭,此處指定內容類型為application/x-www-form-urlencoded
,通常用於表單數據的傳輸。payload
:構建 HTTP 請求的數據負載,包含從 MQTT 消息中提取的device_id
和device_name
。requests.put()
:發送 HTTP PUT 請求,將數據傳遞給指定的 Web 服務端點(如 WordPress 的 REST API)。r.status_code
:打印 HTTP 請求的響應狀態碼,以便於檢查請求是否成功。
驟 2:運行 Flask 應用並測試功能
- 運行 Flask 應用:
- 在命令行中,導航到 Flask 應用的目錄,並運行以下命令來啟動應用:
python3 app.py
- 在命令行中,導航到 Flask 應用的目錄,並運行以下命令來啟動應用:
- 測試 MQTT 訂閱與 Web 請求:
- 使用 MQTT 客戶端工具(如 MQTTX)向
'YuanDevice/HK/respone/#'
主題發送 JSON 格式的消息,例如:{ "device_id": "12345", "device_name": "Temperature Sensor" }
- 應用應該會在控制台打印接收到的消息內容,並通過 PUT 請求將這些數據轉發到指定的 Web 服務端點。
- 使用 MQTT 客戶端工具(如 MQTTX)向
- 檢查響應:
- 查看 Flask 應用的控制台輸出,確認 HTTP 請求的響應狀態碼是否為
200
或其他成功的狀態碼,這意味著請求已成功處理。
- 查看 Flask 應用的控制台輸出,確認 HTTP 請求的響應狀態碼是否為