本篇測評由電子工程世界的優(yōu)秀測評者“JerryZhen”提供。 本文將介紹基于米爾電子MYD-LT527開(kāi)發(fā)板的網(wǎng)關(guān)方案測試。
一、系統概述 基于米爾-全志 T527設計一個(gè)簡(jiǎn)易的物聯(lián)網(wǎng)網(wǎng)關(guān),該網(wǎng)關(guān)能夠管理多臺MQTT設備,通過(guò)MQTT協(xié)議對設備進(jìn)行讀寫(xiě)操作,同時(shí)提供HTTP接口,允許用戶(hù)通過(guò)HTTP協(xié)議與網(wǎng)關(guān)進(jìn)行交互,并對設備進(jìn)行讀寫(xiě)操作。 二、系統架構 三、組件設計 MQTT組件:
- 負責與MQTT broker建立連接。
- 訂閱設備主題,接收設備發(fā)送的消息。
發(fā)布消息到設備,實(shí)現遠程控制。
設備管理組件:
- 維護一個(gè)設備列表,記錄設備的唯一標識符(如設備ID)、MQTT主題、連接狀態(tài)等信息。
提供設備增刪改查的方法。
HTTP組件:
- 基于FastAPI定義HTTP接口。
- 接收用戶(hù)請求,調用MQTT組件和設備管理組件進(jìn)行相應操作。
返回操作結果給用戶(hù)。
四、接口設計 五、數據結構設計 設備信息:
- 設備ID (device_id):唯一標識設備的字符串。
- MQTT主題 (mqtt_topic):設備在MQTT broker上的主題。
- 連接狀態(tài) (connection_status):表示設備是否在線(xiàn)的布爾值。
其他設備屬性(如名稱(chēng)、描述等)。
設備數據:
六、安全性考慮 七、部署與擴展 八、實(shí)現步驟 該設計方案僅僅是概述,具體實(shí)現細節可能需要根據實(shí)際需求和項目環(huán)境進(jìn)行調整和優(yōu)化。在實(shí)際開(kāi)發(fā)中,還需要考慮異常處理、日志記錄、性能優(yōu)化等方面的問(wèn)題;谏鲜鲈O計方案,以下是一個(gè)簡(jiǎn)化版的參考代碼,展示了如何使用FastAPI和paho-mqtt庫來(lái)創(chuàng )建一個(gè)物聯(lián)網(wǎng)網(wǎng)關(guān)。需要注意,示例中不包含完整的錯誤處理、用戶(hù)認證和授權機制,這些在實(shí)際生產(chǎn)環(huán)境中都是必不可少的。依賴(lài)的主要庫版本: fastapi==0.108.0 paho-mqtt==1.6.1 網(wǎng)關(guān)模擬代碼gateway.py: - from fastapi import FastAPI, HTTPException, Body, status
- from paho.mqtt.client import Client as MQTTClient
- from typing import List, Dict, Any
- import asyncio
- import json
- app = FastAPI()
- mqtt_client = None
- device_data = {}
- subtopic="gateway/device/#"
- # MQTT回調函數
- def on_message(client, userdata, msg):
- payload = msg.payload.decode()
- topic = msg.topic
- device_id = topic.split('/')[-1]
- device_data[device_id] = payload
- print(f"Received message from {device_id}: {payload}")
-
- # MQTT連接和訂閱
- def mqtt_connect_and_subscribe(broker_url, broker_port):
- global mqtt_client
- mqtt_client = MQTTClient()
- mqtt_client.on_message = on_message
- mqtt_client.connect(broker_url, broker_port, 60)
- mqtt_client.subscribe(subtopic)
- mqtt_client.loop_start()
-
- # MQTT發(fā)布消息
- async def mqtt_publish(topic: str, message: str):
- if mqtt_client is not None and mqtt_client.is_connected():
- mqtt_client.publish(topic, message)
- else:
- print("MQTT client is not connected!")
-
- # 設備管理:添加設備
- @app.post("/devices/", status_code=status.HTTP_201_CREATED)
- async def add_device(device_id: str):
- device_data[device_id] = None
- return {"message": f"Device {device_id} added"}
-
- # 設備管理:獲取設備列表
- @app.get("/devices/")
- async def get_devices():
- return list(device_data.keys())
-
- # 設備管理:獲取設備數據
- @app.get("/devices/{device_id}/data")
- async def get_device_data(device_id: str):
- if device_id not in device_data:
- raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail=f"Device {device_id} not found")
- return device_data.get(device_id)
-
- # 設備管理:發(fā)送數據到設備
- @app.post("/devices/{device_id}/data")
- async def send_data_to_device(device_id: str, data: Dict[str, Any] = Body(...)):
- topic = f"devices/{device_id}"
- message = json.dumps(data)
- await mqtt_publish(topic, message)
- return {"message": f"Data sent to {device_id}"}
-
- # 設備控制:發(fā)送控制命令到設備
- @app.post("/devices/{device_id}/control")
- async def control_device(device_id: str, command: str):
- topic = f"devices/device/{device_id}"
- await mqtt_publish(topic, command)
- return {"message": f"Control command sent to {device_id}"}
-
- # FastAPI啟動(dòng)事件
- @app.on_event("startup")
- async def startup_event():
- mqtt_connect_and_subscribe("127.0.0.1", 1883)
-
- # FastAPI關(guān)閉事件
- @app.on_event("shutdown")
- async def shutdown_event():
- if mqtt_client is not None:
- mqtt_client.loop_stop()
- mqtt_client.disconnect()
-
- # 運行FastAPI應用
- if __name__ == "__main__":
- import uvicorn
- uvicorn.run(app, host="127.0.0.1", port=8000)
復制代碼
設備1模擬代碼 dev1.py: - import paho.mqtt.client as mqtt
- # 連接成功回調
- def on_connect(client, userdata, flags, rc):
- print('Connected with result code '+str(rc))
- client.subscribe('devices/1')
- # 消息接收回調
- def on_message(client, userdata, msg):
- print(msg.topic+" "+str(msg.payload))
- client.publish('gateway/device/1',payload=f'echo {msg.payload}',qos=0)
-
- client = mqtt.Client()
- # 指定回調函數
- client.on_connect = on_connect
- client.on_message = on_message
- # 建立連接
- client.connect('127.0.0.1', 1883)
- # 發(fā)布消息
- client.publish('gateway/device/1',payload='Hello, I am device',qos=0)
- client.loop_forever()
復制代碼
設備2模擬代碼 dev2.py - import paho.mqtt.client as mqtt
- # 連接成功回調
- def on_connect(client, userdata, flags, rc):
- print('Connected with result code '+str(rc))
- client.subscribe('devices/2')
- # 消息接收回調
- def on_message(client, userdata, msg):
- print(msg.topic+" "+str(msg.payload))
- client.publish('gateway/device/2',payload=f'echo {msg.payload}',qos=0)
- client = mqtt.Client()
- # 指定回調函數
- client.on_connect = on_connect
- client.on_message = on_message
- # 建立連接
- client.connect('127.0.0.1', 1883)
- # 發(fā)布消息
- client.publish('gateway/device/2',payload='Hello, I am device',qos=0)
- client.loop_forever()
復制代碼
運行網(wǎng)關(guān)代碼,打開(kāi)網(wǎng)頁(yè)得到api接口:
通過(guò)api分別添加設備1和設備2,
在另外兩個(gè)控制臺中分別運行模擬設備1和模擬設備2的代碼通過(guò)網(wǎng)頁(yè)API向設備1發(fā)送數據
通過(guò)網(wǎng)頁(yè)API獲得設備回復的數據,設備代碼中只是簡(jiǎn)單的把網(wǎng)關(guān)發(fā)過(guò)來(lái)的數據進(jìn)行回傳
我們在網(wǎng)關(guān)的后臺可以看到完整的數據流
至此一個(gè)簡(jiǎn)易的網(wǎng)關(guān)已經(jīng)實(shí)現了,接下來(lái)將會(huì )嘗試實(shí)現樓宇里的最常見(jiàn)的bacnet設備進(jìn)行通訊管理。
|