將接收到的 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 請求的響應狀態碼是否為
