建立Mqtt Publisher傳遞Restful API訊息
在這節課中,我們將學習如何配置 Flask 應用,使其能夠接收來自 Web 的 HTTP 請求,並根據請求內容將消息通過 MQTT 協議發佈到指定的主題。這種結合了 Web 和 MQTT 的架構非常適合用於物聯網(IoT)應用中,實現前端和設備間的通信。
步驟 1:定義處理 Web 請求的視圖類
首先,我們定義一個基於類的視圖 DeviceView
,用於處理來自 /device/
URL 的 POST 請求。在這個視圖中,我們將從請求中提取參數,並通過 MQTT 將消息發佈到特定的目標位置。
from flask import Flask, request, json from flask.views import MethodView from flask_mqtt import Mqtt app = Flask(__name__) # 配置 MQTT 參數 app.config['MQTT_BROKER_URL'] = 'broker.emqx.io' app.config['MQTT_BROKER_PORT'] = 1883 mqtt = Mqtt(app) class DeviceView(MethodView): def post(self): # 從請求中獲取 Deviceid 和 Command 參數 Deviceid = request.form.get('Deviceid') Command = request.form.get('Command') # 檢查參數是否齊全 if Deviceid is None or Command is None: response_data = { "code": 400, "message": "missing parameter", "data": "" } response = app.response_class( response=json.dumps(response_data), status=200, mimetype='application/json' ) return response else: # 構建 MQTT 消息負載並發佈到指定主題 payload = {'Command': int(Command)} mqtt.publish(f'YuanDevice/HK/request/{Deviceid}', json.dumps(payload)) # 返回成功的回應 response_data = { "code": 200, "message": "success", "data": "" } response = app.response_class( response=json.dumps(response_data), status=200, mimetype='application/json' ) return response
解釋:
request.form.get('Deviceid')
和request.form.get('Command')
用於從 POST 請求的表單數據中提取Deviceid
和Command
參數。- 如果缺少
Deviceid
或Command
,伺服器將返回一個400
狀態碼和錯誤信息,表示缺少參數。 - 如果參數齊全,則構建 MQTT 消息負載(
payload
),並通過mqtt.publish()
方法將消息發佈到指定的 MQTT 主題(例如:YuanDevice/HK/request/Deviceid
)。 - 最後,伺服器返回一個
200
狀態碼,表示請求處理成功。
步驟 2:設置 URL 路由
接下來,我們需要將 /device/
URL 路由映射到 DeviceView
類,這樣當用戶向該 URL 發送 POST 請求時,Flask 會調用相應的處理邏輯。
app.add_url_rule('/device/', view_func=DeviceView.as_view('device'))
- 解釋:
app.add_url_rule()
方法將/device/
路由與DeviceView
類綁定,指定view_func
為DeviceView.as_view('device')
,這樣每當訪問/device/
路由時,該類的post
方法就會被調用。
步驟 3:運行 Flask 應用並測試
- 運行 Flask 應用:
- 在命令行中,導航到 Flask 應用的目錄,並運行以下命令啟動應用:
python3 app.py
- 在命令行中,導航到 Flask 應用的目錄,並運行以下命令啟動應用:
- 測試 Web 請求與 MQTT 發佈:
- 使用 Postman 或其他 HTTP 客戶端工具,向
http://<你的IP地址>:<端口>/device/
發送一個 POST 請求,並包含Deviceid
和Command
參數。 - 應用將接收請求,檢查參數,並通過 MQTT 將消息發佈到指定的主題。如果參數齊全,您應該會收到一個 JSON 格式的成功回應。
- 使用 Postman 或其他 HTTP 客戶端工具,向