<var id="fnfpo"><source id="fnfpo"></source></var>
<rp id="fnfpo"></rp>

<em id="fnfpo"><object id="fnfpo"><input id="fnfpo"></input></object></em>
<em id="fnfpo"><acronym id="fnfpo"></acronym></em>
  • <th id="fnfpo"><track id="fnfpo"></track></th>
  • <progress id="fnfpo"><track id="fnfpo"></track></progress>
  • <tbody id="fnfpo"><pre id="fnfpo"></pre></tbody>

  • 通過物聯網管理多臺MQTT設備-基于米爾T527開發板

    發布時間:2024-5-11 18:08    發布者:swiftman
    關鍵詞: 全志 , T527 , 開發板 , 嵌入式 , 物聯網
    本篇測評由電子工程世界的優秀測評者“JerryZhen”提供。
    本文將介紹基于米爾電子MYD-LT527開發板的網關方案測試。
    一、系統概述
    基于米爾-全志 T527設計一個簡易的物聯網網關,該網關能夠管理多臺MQTT設備,通過MQTT協議對設備進行讀寫操作,同時提供HTTP接口,允許用戶通過HTTP協議與網關進行交互,并對設備進行讀寫操作。
    二、系統架構
    • 網關服務:基于FastAPI框架構建的Web服務,提供HTTP接口。
    • MQTT客戶端:負責與MQTT設備通信,管理設備連接、消息發布和訂閱。
    • 設備管理:維護一個設備列表,記錄設備的基本信息和狀態。
    • 數據存儲:使用內存或數據庫存儲設備數據,確保數據持久化。

    三、組件設計
    • MQTT組件:

      • 負責與MQTT broker建立連接。
      • 訂閱設備主題,接收設備發送的消息。
      • 發布消息到設備,實現遠程控制。

    • 設備管理組件:

      • 維護一個設備列表,記錄設備的唯一標識符(如設備ID)、MQTT主題、連接狀態等信息。
      • 提供設備增刪改查的方法。

    • HTTP組件:

      • 基于FastAPI定義HTTP接口。
      • 接收用戶請求,調用MQTT組件和設備管理組件進行相應操作。
      • 返回操作結果給用戶。

    四、接口設計
    • 設備列表:

      • GET /devices:返回所有設備的列表。
      • POST /devices:添加新設備到網關。
      • DELETE /devices/{device_id}:從網關中刪除指定設備。

    • 設備詳情:

      • GET /devices/{device_id}:返回指定設備的詳細信息。

    • 設備數據:

      • GET /devices/{device_id}/data:獲取指定設備的最新數據。
      • POST /devices/{device_id}/data:發送數據到指定設備。

    • 設備控制:

      • POST /devices/{device_id}/control:發送控制命令到指定設備。

    五、數據結構設計
    • 設備信息:

      • 設備ID (device_id):唯一標識設備的字符串。
      • MQTT主題 (mqtt_topic):設備在MQTT broker上的主題。
      • 連接狀態 (connection_status):表示設備是否在線的布爾值。
      • 其他設備屬性(如名稱、描述等)。

    • 設備數據:

      • 設備ID (device_id):關聯設備信息的設備ID。
      • 時間戳 (timestamp):數據發送或接收的時間。
      • 數據內容 (data):設備發送或接收的具體數據,可以是JSON格式或其他格式。

    六、安全性考慮
    • 使用HTTPS協議提供安全的HTTP通信。
    • 實現用戶認證和授權機制,確保只有授權用戶可以訪問和操作設備。
    • 對于敏感操作(如刪除設備),要求用戶進行二次確認或提供額外的安全措施。

    七、部署與擴展
    • 使用Docker容器化部署網關服務,便于管理和擴展。
    • 根據需要,可以水平擴展網關實例以處理更多的設備連接和請求。

    八、實現步驟
    • 安裝所需的Python庫:fastapi, uvicorn, paho-mqtt等。
    • 創建FastAPI應用并定義路由。
    • 實現MQTT組件,包括與MQTT broker的連接、訂閱、發布等功能。
    • 實現設備管理組件,維護設備列表并提供增刪改查的方法。
    • 實現HTTP組件,調用MQTT組件和設備管理組件處理用戶請求。
    • 編寫測試代碼,驗證網關的各項功能是否正常工作。
    • 部署網關服務并監控其運行狀態。

    該設計方案僅僅是概述,具體實現細節可能需要根據實際需求和項目環境進行調整和優化。在實際開發中,還需要考慮異常處理、日志記錄、性能優化等方面的問題;谏鲜鲈O計方案,以下是一個簡化版的參考代碼,展示了如何使用FastAPI和paho-mqtt庫來創建一個物聯網網關。需要注意,示例中不包含完整的錯誤處理、用戶認證和授權機制,這些在實際生產環境中都是必不可少的。依賴的主要庫版本:
    fastapi==0.108.0
    paho-mqtt==1.6.1
    網關模擬代碼gateway.py:
    1. from fastapi import FastAPI, HTTPException, Body, status
    2. from paho.mqtt.client import Client as MQTTClient
    3. from typing import List, Dict, Any
    4. import asyncio
    5. import json

    6. app = FastAPI()
    7. mqtt_client = None
    8. device_data = {}  

    9. subtopic="gateway/device/#"

    10. # MQTT回調函數
    11. def on_message(client, userdata, msg):
    12.      payload = msg.payload.decode()
    13.      topic = msg.topic
    14.      device_id = topic.split('/')[-1]
    15.      device_data[device_id] = payload
    16.      print(f"Received message from {device_id}: {payload}")  
    17.      
    18. # MQTT連接和訂閱
    19. def mqtt_connect_and_subscribe(broker_url, broker_port):
    20.       global mqtt_client
    21.       mqtt_client = MQTTClient()
    22.       mqtt_client.on_message = on_message
    23.       mqtt_client.connect(broker_url, broker_port, 60)
    24.       mqtt_client.subscribe(subtopic)
    25.       mqtt_client.loop_start()
    26.       
    27. # MQTT發布消息
    28. async def mqtt_publish(topic: str, message: str):
    29.       if mqtt_client is not None and mqtt_client.is_connected():
    30.          mqtt_client.publish(topic, message)
    31.       else:
    32.          print("MQTT client is not connected!")
    33.          
    34. # 設備管理:添加設備
    35. @app.post("/devices/", status_code=status.HTTP_201_CREATED)
    36. async def add_device(device_id: str):
    37.       device_data[device_id] = None
    38.       return {"message": f"Device {device_id} added"}
    39.       
    40. # 設備管理:獲取設備列表
    41. @app.get("/devices/")
    42. async def get_devices():
    43.      return list(device_data.keys())
    44.      
    45. # 設備管理:獲取設備數據
    46. @app.get("/devices/{device_id}/data")
    47. async def get_device_data(device_id: str):
    48.       if device_id not in device_data:
    49.           raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail=f"Device {device_id} not found")
    50.       return device_data.get(device_id)
    51.       
    52. # 設備管理:發送數據到設備
    53. @app.post("/devices/{device_id}/data")
    54. async def send_data_to_device(device_id: str, data: Dict[str, Any] = Body(...)):
    55.       topic = f"devices/{device_id}"
    56.       message = json.dumps(data)
    57.       await mqtt_publish(topic, message)
    58.       return {"message": f"Data sent to {device_id}"}
    59.       
    60. # 設備控制:發送控制命令到設備
    61. @app.post("/devices/{device_id}/control")
    62. async def control_device(device_id: str, command: str):
    63.       topic = f"devices/device/{device_id}"
    64.       await mqtt_publish(topic, command)
    65.       return {"message": f"Control command sent to {device_id}"}
    66.       
    67. # FastAPI啟動事件
    68. @app.on_event("startup")
    69. async def startup_event():
    70.       mqtt_connect_and_subscribe("127.0.0.1", 1883)
    71.       
    72. # FastAPI關閉事件
    73. @app.on_event("shutdown")
    74. async def shutdown_event():
    75.       if mqtt_client is not None:
    76.          mqtt_client.loop_stop()
    77.          mqtt_client.disconnect()
    78.       
    79. # 運行FastAPI應用
    80. if __name__ == "__main__":
    81.       import uvicorn
    82.       uvicorn.run(app, host="127.0.0.1", port=8000)
    復制代碼

    設備1模擬代碼 dev1.py:
    1. import paho.mqtt.client as mqtt

    2. # 連接成功回調
    3. def on_connect(client, userdata, flags, rc):
    4.     print('Connected with result code '+str(rc))
    5.     client.subscribe('devices/1')

    6. # 消息接收回調
    7. def on_message(client, userdata, msg):
    8.     print(msg.topic+" "+str(msg.payload))
    9.     client.publish('gateway/device/1',payload=f'echo {msg.payload}',qos=0)
    10.    
    11. client = mqtt.Client()

    12. # 指定回調函數
    13. client.on_connect = on_connect
    14. client.on_message = on_message

    15. # 建立連接
    16. client.connect('127.0.0.1', 1883)
    17. # 發布消息
    18. client.publish('gateway/device/1',payload='Hello, I am device',qos=0)

    19. client.loop_forever()
    復制代碼

    設備2模擬代碼 dev2.py
    1. import paho.mqtt.client as mqtt

    2. # 連接成功回調
    3. def on_connect(client, userdata, flags, rc):
    4.     print('Connected with result code '+str(rc))
    5.     client.subscribe('devices/2')

    6. # 消息接收回調
    7. def on_message(client, userdata, msg):
    8.     print(msg.topic+" "+str(msg.payload))
    9.     client.publish('gateway/device/2',payload=f'echo {msg.payload}',qos=0)

    10. client = mqtt.Client()

    11. # 指定回調函數
    12. client.on_connect = on_connect
    13. client.on_message = on_message

    14. # 建立連接
    15. client.connect('127.0.0.1', 1883)
    16. # 發布消息
    17. client.publish('gateway/device/2',payload='Hello, I am device',qos=0)

    18. client.loop_forever()
    復制代碼

    運行網關代碼,打開網頁得到api接口: 通過api分別添加設備1和設備2, 在另外兩個控制臺中分別運行模擬設備1和模擬設備2的代碼通過網頁API向設備1發送數據 通過網頁API獲得設備回復的數據,設備代碼中只是簡單的把網關發過來的數據進行回傳 我們在網關的后臺可以看到完整的數據流 至此一個簡易的網關已經實現了,接下來將會嘗試實現樓宇里的最常見的bacnet設備進行通訊管理。
    本文地址:http://www.portaltwn.com/thread-856853-1-1.html     【打印本頁】

    本站部分文章為轉載或網友發布,目的在于傳遞和分享信息,并不代表本網贊同其觀點和對其真實性負責;文章版權歸原作者及原出處所有,如涉及作品內容、版權和其它問題,我們將根據著作權人的要求,第一時間更正或刪除。
    您需要登錄后才可以發表評論 登錄 | 立即注冊

    廠商推薦

    • Microchip視頻專區
    • Dev Tool Bits——使用MPLAB® Discover瀏覽資源
    • Dev Tool Bits——使用條件軟件斷點宏來節省時間和空間
    • Dev Tool Bits——使用DVRT協議查看項目中的數據
    • Dev Tool Bits——使用MPLAB® Data Visualizer進行功率監視
    • 貿澤電子(Mouser)專區

    相關視頻

    關于我們  -  服務條款  -  使用指南  -  站點地圖  -  友情鏈接  -  聯系我們
    電子工程網 © 版權所有   京ICP備16069177號 | 京公網安備11010502021702
    快速回復 返回頂部 返回列表
    精品一区二区三区自拍图片区_国产成人亚洲精品_亚洲Va欧美va国产综合888_久久亚洲国产精品五月天婷