通过物联网管理多台MQTT设备-基于米尔T527开发板

米尔电子嵌入式 2024-05-10 08:01

本篇测评由电子工程世界的优秀测评者“JerryZhen”提供。


本文将介绍基于米尔电子MYD-LT527开发板的网关方案测试。

一、系统概述

基于米尔-全志 T527设计一个简易的物联网网关,该网关能够管理多台MQTT设备,通过MQTT协议对设备进行读写操作,同时提供HTTP接口,允许用户通过HTTP协议与网关进行交互,并对设备进行读写操作。

二、系统架构

  1. 网关服务:基于FastAPI框架构建的Web服务,提供HTTP接口。
  2. MQTT客户端:负责与MQTT设备通信,管理设备连接、消息发布和订阅。
  3. 设备管理:维护一个设备列表,记录设备的基本信息和状态。
  4. 数据存储:使用内存或数据库存储设备数据,确保数据持久化。

三、组件设计

  1. MQTT组件

  • 负责与MQTT broker建立连接。
  • 订阅设备主题,接收设备发送的消息。
  • 发布消息到设备,实现远程控制。

  • 设备管理组件

    • 维护一个设备列表,记录设备的唯一标识符(如设备ID)、MQTT主题、连接状态等信息。
    • 提供设备增删改查的方法。

  • HTTP组件

    • 基于FastAPI定义HTTP接口。
    • 接收用户请求,调用MQTT组件和设备管理组件进行相应操作。
    • 返回操作结果给用户。

    四、接口设计

    1. 设备列表

    • 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:发送控制命令到指定设备。

    五、数据结构设计

    1. 设备信息

    • 设备ID (device_id):唯一标识设备的字符串。
    • MQTT主题 (mqtt_topic):设备在MQTT broker上的主题。
    • 连接状态 (connection_status):表示设备是否在线的布尔值。
    • 其他设备属性(如名称、描述等)。

  • 设备数据

    • 设备ID (device_id):关联设备信息的设备ID。
    • 时间戳 (timestamp):数据发送或接收的时间。
    • 数据内容 (data):设备发送或接收的具体数据,可以是JSON格式或其他格式。

    六、安全性考虑

    • 使用HTTPS协议提供安全的HTTP通信。
    • 实现用户认证和授权机制,确保只有授权用户可以访问和操作设备。
    • 对于敏感操作(如删除设备),要求用户进行二次确认或提供额外的安全措施。

    七、部署与扩展

    • 使用Docker容器化部署网关服务,便于管理和扩展。
    • 根据需要,可以水平扩展网关实例以处理更多的设备连接和请求。

    八、实现步骤

    1. 安装所需的Python库:fastapi, uvicorn, paho-mqtt等。
    2. 创建FastAPI应用并定义路由。
    3. 实现MQTT组件,包括与MQTT broker的连接、订阅、发布等功能。
    4. 实现设备管理组件,维护设备列表并提供增删改查的方法。
    5. 实现HTTP组件,调用MQTT组件和设备管理组件处理用户请求。
    6. 编写测试代码,验证网关的各项功能是否正常工作。
    7. 部署网关服务并监控其运行状态。

    该设计方案仅仅是概述,具体实现细节可能需要根据实际需求和项目环境进行调整和优化。在实际开发中,还需要考虑异常处理、日志记录、性能优化等方面的问题。基于上述设计方案,以下是一个简化版的参考代码,展示了如何使用FastAPI和paho-mqtt库来创建一个物联网网关。需要注意,示例中不包含完整的错误处理、用户认证和授权机制,这些在实际生产环境中都是必不可少的。依赖的主要库版本:

    fastapi==0.108.0

    paho-mqtt==1.6.1

     

    网关模拟代码gateway.py:

    from fastapi import FastAPI, HTTPException, Body, status  from paho.mqtt.client import Client as MQTTClientfrom 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发布消息 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) # 设备管理:发送数据到设备 @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}"} # 设备控制:发送控制命令到设备 @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启动事件 @app.on_event("startup") async def startup_event(): mqtt_connect_and_subscribe("127.0.0.1", 1883) # FastAPI关闭事件 @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_connectclient.on_message = on_message
    # 建立连接client.connect('127.0.0.1', 1883)# 发布消息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_connectclient.on_message = on_message# 建立连接client.connect('127.0.0.1', 1883)# 发布消息client.publish('gateway/device/2',payload='Hello, I am device',qos=0)client.loop_forever()
     
    运行网关代码,打开网页得到api接口:
     
     通过api分别添加设备1和设备2,
     
    在另外两个控制台中分别运行模拟设备1和模拟设备2的代码
    通过网页API向设备1发送数据
     
    通过网页API获得设备回复的数据,设备代码中只是简单的把网关发过来的数据进行回传
     
    我们在网关的后台可以看到完整的数据流
     
    至此一个简易的网关已经实现了,接下来将会尝试实现楼宇里的最常见的bacnet设备进行通讯管理。


    米粉派T527的7折活动还在进行中,抢购链接:
    https://detail.tmall.com/item.htm?id=758523182967

    米尔电子最新“明星产品”速报



     米尔电子 
    领先的嵌入式处理器模块厂商
    关注“米尔MYiR”公众号
    不定期分享产品资料及干货
    第一时间发布米尔最新资讯

      

    长按二维码 关注我们


    想要了解更多信息,欢迎联系我们

    深圳总部电话:
    0755-25622735 17324413392
    地址:深圳坂田云里智能园2栋6楼
    上海办事处电话:
    021-62087019 17324413392
    北京办事处电话:
    010-84675491 13316862895
    技术支持电话:
    027-59621648
    邮箱:support.cn@myirtech.com

    米尔电子嵌入式 米尔-领先的嵌入式处理器模组厂商,专业为您提供CPU模组,NXP、ST、全志、XILINX等核心板开
    评论
    • 大模型的赋能是指利用大型机器学习模型(如深度学习模型)来增强或改进各种应用和服务。这种技术在许多领域都显示出了巨大的潜力,包括但不限于以下几个方面: 1. 企业服务:大模型可以用于构建智能客服系统、知识库问答系统等,提升企业的服务质量和运营效率。 2. 教育服务:在教育领域,大模型被应用于个性化学习、智能辅导、作业批改等,帮助教师减轻工作负担,提高教学质量。 3. 工业智能化:大模型有助于解决工业领域的复杂性和不确定性问题,尽管在认知能力方面尚未完全具备专家级的复杂决策能力。 4. 消费
      丙丁先生 2025-01-07 09:25 74浏览
    • 在智能家居领域中,Wi-Fi、蓝牙、Zigbee、Thread与Z-Wave等无线通信协议是构建短距物联局域网的关键手段,它们常在实际应用中交叉运用,以满足智能家居生态系统多样化的功能需求。然而,这些协议之间并未遵循统一的互通标准,缺乏直接的互操作性,在进行组网时需要引入额外的网关作为“翻译桥梁”,极大地增加了系统的复杂性。 同时,Apple HomeKit、SamSung SmartThings、Amazon Alexa、Google Home等主流智能家居平台为了提升市占率与消费者
      华普微HOPERF 2025-01-06 17:23 138浏览
    • PLC组态方式主要有三种,每种都有其独特的特点和适用场景。下面来简单说说: 1. 硬件组态   定义:硬件组态指的是选择适合的PLC型号、I/O模块、通信模块等硬件组件,并按照实际需求进行连接和配置。    灵活性:这种方式允许用户根据项目需求自由搭配硬件组件,具有较高的灵活性。    成本:可能需要额外的硬件购买成本,适用于对系统性能和扩展性有较高要求的场合。 2. 软件组态   定义:软件组态主要是通过PLC
      丙丁先生 2025-01-06 09:23 82浏览
    • By Toradex 秦海1). 简介嵌入式平台设备基于Yocto Linux 在开发后期量产前期,为了安全以及提高启动速度等考虑,希望将 ARM 处理器平台的 Debug Console 输出关闭,本文就基于 NXP i.MX8MP ARM 处理器平台来演示相关流程。 本文所示例的平台来自于 Toradex Verdin i.MX8MP 嵌入式平台。  2. 准备a). Verdin i.MX8MP ARM核心版配合Dahlia载板并
      hai.qin_651820742 2025-01-07 14:52 32浏览
    • 每日可见的315MHz和433MHz遥控模块,你能分清楚吗?众所周知,一套遥控设备主要由发射部分和接收部分组成,发射器可以将控制者的控制按键经过编码,调制到射频信号上面,然后经天线发射出无线信号。而接收器是将天线接收到的无线信号进行解码,从而得到与控制按键相对应的信号,然后再去控制相应的设备工作。当前,常见的遥控设备主要分为红外遥控与无线电遥控两大类,其主要区别为所采用的载波频率及其应用场景不一致。红外遥控设备所采用的射频信号频率一般为38kHz,通常应用在电视、投影仪等设备中;而无线电遥控设备
      华普微HOPERF 2025-01-06 15:29 120浏览
    • 彼得·德鲁克被誉为“现代管理学之父”,他的管理思想影响了无数企业和管理者。然而,关于他的书籍分类,一种流行的说法令人感到困惑:德鲁克一生写了39本书,其中15本是关于管理的,而其中“专门写工商企业或为企业管理者写的”只有两本——《为成果而管理》和《创新与企业家精神》。这样的表述广为流传,但深入探讨后却发现并不完全准确。让我们一起重新审视这一说法,解析其中的矛盾与根源,进而重新认识德鲁克的管理思想及其著作的真正价值。从《创新与企业家精神》看德鲁克的视角《创新与企业家精神》通常被认为是一本专为企业管
      优思学院 2025-01-06 12:03 110浏览
    • 根据Global Info Research项目团队最新调研,预计2030年全球封闭式电机产值达到1425百万美元,2024-2030年期间年复合增长率CAGR为3.4%。 封闭式电机是一种电动机,其外壳设计为密闭结构,通常用于要求较高的防护等级的应用场合。封闭式电机可以有效防止外部灰尘、水分和其他污染物进入内部,从而保护电机的内部组件,延长其使用寿命。 环洋市场咨询机构出版的调研分析报告【全球封闭式电机行业总体规模、主要厂商及IPO上市调研报告,2025-2031】研究全球封闭式电机总体规
      GIRtina 2025-01-06 11:10 102浏览
    • 这篇内容主要讨论三个基本问题,硅电容是什么,为什么要使用硅电容,如何正确使用硅电容?1.  硅电容是什么首先我们需要了解电容是什么?物理学上电容的概念指的是给定电位差下自由电荷的储藏量,记为C,单位是F,指的是容纳电荷的能力,C=εS/d=ε0εrS/4πkd(真空)=Q/U。百度百科上电容器的概念指的是两个相互靠近的导体,中间夹一层不导电的绝缘介质。通过观察电容本身的定义公式中可以看到,在各个变量中比较能够改变的就是εr,S和d,也就是介质的介电常数,金属板有效相对面积以及距离。当前
      知白 2025-01-06 12:04 160浏览
    • 本文介绍Linux系统更换开机logo方法教程,通用RK3566、RK3568、RK3588、RK3576等开发板,触觉智能RK3562开发板演示,搭载4核A53处理器,主频高达2.0GHz;内置独立1Tops算力NPU,可应用于物联网网关、平板电脑、智能家居、教育电子、工业显示与控制等行业。制作图片开机logo图片制作注意事项(1)图片必须为bmp格式;(2)图片大小不能大于4MB;(3)BMP位深最大是32,建议设置为8;(4)图片名称为logo.bmp和logo_kernel.bmp;开机
      Industio_触觉智能 2025-01-06 10:43 87浏览
    • 村田是目前全球量产硅电容的领先企业,其在2016年收购了法国IPDiA头部硅电容器公司,并于2023年6月宣布投资约100亿日元将硅电容产能提升两倍。以下内容主要来自村田官网信息整理,村田高密度硅电容器采用半导体MOS工艺开发,并使用3D结构来大幅增加电极表面,因此在给定的占位面积内增加了静电容量。村田的硅技术以嵌入非结晶基板的单片结构为基础(单层MIM和多层MIM—MIM是指金属 / 绝缘体/ 金属) 村田硅电容采用先进3D拓扑结构在100um内,使开发的有效静电容量面积相当于80个
      知白 2025-01-07 15:02 54浏览
    • 根据环洋市场咨询(Global Info Research)项目团队最新调研,预计2030年全球无人机锂电池产值达到2457百万美元,2024-2030年期间年复合增长率CAGR为9.6%。 无人机锂电池是无人机动力系统中存储并释放能量的部分。无人机使用的动力电池,大多数是锂聚合物电池,相较其他电池,锂聚合物电池具有较高的能量密度,较长寿命,同时也具有良好的放电特性和安全性。 全球无人机锂电池核心厂商有宁德新能源科技、欣旺达、鹏辉能源、深圳格瑞普和EaglePicher等,前五大厂商占有全球
      GIRtina 2025-01-07 11:02 58浏览
    我要评论
    0
    点击右上角,分享到朋友圈 我知道啦
    请使用浏览器分享功能 我知道啦