17 ThingsBoard网关设备-子设备数据模型实战:核心价值+完整落地指南

news2026/5/21 9:07:23
ThingsBoard网关设备-子设备数据模型实战核心价值完整落地指南一、任务说明1.1 场景必要性在物联网IoT/工业物联网IIoT场景中「网关设备-子设备」层级数据模型是解决异构设备批量接入、统一管理、边缘自治的核心方案相比“所有设备平级接入”模式具备不可替代的价值协议适配子设备多为Modbus/OPC UA/BLE等非标准IoT协议设备网关作为“协议翻译官”将私有协议转换为ThingsBoard支持的MQTT/HTTP协议成本优化网关可批量管理子设备一次配置、复用策略减少云端连接数和带宽消耗断网时本地缓存数据避免丢失拓扑贴合匹配真实业务层级如「车间网关→产线传感器」便于故障定位和区域数据统计权限管控基于网关做权限隔离子设备自动继承网关权限避免越权访问。1.2 核心问题与解答核心问题详细解答子设备需要在平台上添加吗无需手动添加代码运行后平台会根据上报的子设备名称自动创建并归属到对应网关下可选手动添加若需提前配置子设备标签/告警规则可手动创建需保证设备名称与代码中一致。网关配置有何不同与普通设备唯一区别创建设备时需勾选「网关设备」选项其余配置如访问令牌、产品关联完全一致网关设备具备“代表子设备上报数据”的权限普通设备无此能力。子设备和网关之间如何查看从属关系看截图一图胜千言二、任务实施2.1 添加产品与普通产品添加流程完全一致仅需填写产品名称、描述、设备类型等基础信息无特殊配置。2.2 添加网关设备进入ThingsBoard「实体→设备」→「添加新设备」填写网关设备名称如modbus-gateway-01关键配置勾选「网关设备」选项保存后复制网关的「访问令牌」后续代码配置需用到。2.3 添加子设备自动添加推荐运行网关上报代码后平台会自动创建modbus-sensor-01、modbus-sensor-02两个子设备归属到上述网关下无需手动操作手动添加可选若需提前配置子设备属性/规则可手动新建设备名称需与代码中完全一致网关上报数据时会自动关联网友可自行测试该场景。2.4 添加设备到仪表盘进入仪表盘→点击右上角「编辑」铅笔图标新增/编辑部件在「数据」选项卡配置实体选择对应子设备如modbus-sensor-01数据键选择具体字段如temperature/humidity而非整个JSON对象保存后仪表盘将显示纯数值如23.7℃而非JSON字符串核心原则部件数据键需与代码上报的字段temperature/pressure一一对应否则无法正常显示。三、任务代码importjsonimporttimeimportrandomimportpaho.mqtt.clientasmqtt# 核心配置 TB_HOST192.168.111.53TB_PORT2883GATEWAY_TOKENHP7rwxQJHgVjrPRasWgi# # 子设备列表SUB_DEVICES[{name:modbus-sensor-01,type:温湿度传感器},{name:modbus-sensor-02,type:压力传感器},]# ThingsBoard网关上报子设备数据的固定MQTT主题TB_GATEWAY_TELEMETRY_TOPICv1/gateway/telemetry# 全局变量is_connectedFalseclient_idftb-gateway-{random.randint(1000,9999)}# 固定client_id方便日志追踪defon_connect(client,userdata,flags,rc):MQTT连接回调打印详细连接信息globalis_connected# 错误码对应说明rc_desc{0:连接成功,1:协议版本错误,2:无效的客户端ID,3:服务器不可用,4:用户名/密码错误,5:未授权令牌错误,6-255:保留错误码,}connect_descrc_desc.get(rc,f未知错误码{rc})# 打印详细连接日志print(f\n{*50}MQTT 连接信息{*50})print(f 客户端ID{client_id})print(f 连接地址{TB_HOST}:{TB_PORT})print(f 网关令牌{GATEWAY_TOKEN[:8]}...完整{GATEWAY_TOKEN})print(f 连接结果错误码{rc}描述{connect_desc})ifrc0:is_connectedTrueprint(f✅ 网关已成功连接ThingsBoard MQTT服务器)else:is_connectedFalseprint(f❌ 连接失败错误码{rc}→{connect_desc})print(f{*110}\n)defon_publish(client,userdata,mid):MQTT发布成功回调打印消息IDprint(f 消息发布成功MQTT消息ID{mid})defgenerate_sub_device_data(device_type):生成子设备数据打印数据生成日志if温湿度indevice_type:data{temperature:round(random.uniform(20.0,35.0),1),humidity:round(random.uniform(40.0,80.0),1),}elif压力indevice_type:data{pressure:round(random.uniform(0.5,3.0),2)}else:data{value:random.randint(0,100)}print(f\n 生成子设备数据类型{device_type}→ 数据{data})returndatadefpublish_sub_device_data(client):构造并上报子设备数据打印全量发布日志ifnotis_connected:print(f\n⚠️ 网关尚未连接is_connected{is_connected}跳过本次上报)return# 构造上报数据telemetry_data{}fordeviceinSUB_DEVICES:device_namedevice[name]device_typedevice[type]telemetry_data[device_name][generate_sub_device_data(device_type)]# 转换为JSON字符串格式化输出方便查看payloadjson.dumps(telemetry_data,ensure_asciiFalse,indent2)# 打印发布前的详细信息print(f\n{*50}准备发布消息{*50})print(f 发布主题{TB_GATEWAY_TELEMETRY_TOPIC})print(f 消息内容格式化\n{payload})print(f 消息内容原始{json.dumps(telemetry_data,ensure_asciiFalse)})print(f 消息长度{len(payload)}字节)# 发布消息resultclient.publish(topicTB_GATEWAY_TELEMETRY_TOPIC,payloadpayload,qos1,# QoS1确保至少送达一次)# 解析发布结果publish_rc_desc{0:发布成功,1:超出消息长度限制,2:客户端未连接,3:无效的主题,4:消息被服务器拒绝,5:未知错误,}publish_descpublish_rc_desc.get(result.rc,f未知错误码{result.rc})# 打印发布结果print(f\n 发布结果)print(f - 返回码(rc){result.rc}→{publish_desc})print(f - 消息ID(mid){result.midifresult.rc0else无})print(f - QoS级别{1})print(f{*110}\n)ifresult.rc!0:print(f❌ 上报失败错误码{result.rc}→{publish_desc})else:print(f✅ 上报成功消息ID{result.mid})defmain():globalis_connected# 打印启动信息print(f\n{*60}网关脚本启动{*60})print(f 启动时间{time.strftime(%Y-%m-%d %H:%M:%S,time.localtime())})print(f 配置信息TB_HOST{TB_HOST}, TB_PORT{TB_PORT}, CLIENT_ID{client_id})print(f{*120}\n)# 创建MQTT客户端clientmqtt.Client(client_idclient_id,clean_sessionFalse)# 注册回调函数client.on_connecton_connect client.on_publishon_publish# 设置认证client.username_pw_set(usernameGATEWAY_TOKEN,password)# 打印连接前信息print(f 正在尝试连接 MQTT 服务器{TB_HOST}:{TB_PORT})# 连接MQTT服务器try:connect_resultclient.connect(TB_HOST,TB_PORT,keepalive60)print(f connect() 函数返回值{connect_result}0成功非0失败)exceptExceptionase:print(f\n❌ 连接MQTT服务器时抛出异常)print(f - 异常类型{type(e).__name__})print(f - 异常信息{str(e)})print(f 检查1.TB服务器IP是否正确 2.服务器{TB_PORT}端口是否开放 3.网关令牌是否正确)return# 启动MQTT循环非阻塞client.loop_start()print(f\n MQTT循环已启动loop_start()等待1秒确保连接完成...)time.sleep(1)# 等待连接回调执行# 循环上报数据try:print(f\n 开始循环上报子设备数据每5秒一次按CtrlC停止...\n)count0whileTrue:count1print(f\n{#*20}第{count}次上报{#*20})publish_sub_device_data(client)time.sleep(5)exceptKeyboardInterrupt:print(f\n\n 用户按下CtrlC终止程序)exceptExceptionase:print(f\n\n❌ 运行时抛出未捕获异常)print(f - 异常类型{type(e).__name__})print(f - 异常信息{str(e)})finally:print(f\n{*50}清理资源{*50})print(f 停止MQTT循环loop_stop())client.loop_stop()print(f 断开MQTT连接disconnect())client.disconnect()print(f✅ 网关已断开连接程序正常退出)print(f{*110}\n)if__name____main__:main()3.1 代码关键说明1主题规范网关上报子设备数据的固定主题v1/gateway/telemetryThingsBoard官方约定不可修改普通设备上报主题为v1/devices/me/telemetry与网关主题严格区分平台通过主题识别数据归属类型。2数据格式核心格式{子设备名称: [{字段1: 值1, 字段2: 值2}]}列表[]的作用支持批量上报同一子设备的多条历史数据如断网缓存数据单条数据也需保留列表格式错误示例{子设备名称: {字段: 值}}无列表、{子设备名称: [{values: {字段: 值}}]}多余嵌套均会导致平台解析异常。四、任务测试4.1 测试效果截图4.2 关键日志输出 准备发布消息 发布主题v1/gateway/telemetry 消息内容格式化 { modbus-sensor-01: [ { temperature: 23.7, humidity: 69.8 } ], modbus-sensor-02: [ { pressure: 1.03 } ] } 消息内容原始{modbus-sensor-01: [{temperature: 23.7, humidity: 69.8}], modbus-sensor-02: [{pressure: 1.03}]} 消息长度157 字节 发布结果 - 返回码(rc)0 → 发布成功 - 消息ID(mid)145 - QoS级别1 ✅ 上报成功消息ID145 消息发布成功MQTT消息ID1454.3 查看设备从属关系只有代码运行之后才能生成子设备因此运行代码之后就能看从属关系了注意方向否则可能看不到结果查看网关的属性可以看到关联的2个子设备查看自设备属性可以看到父设备4.4 测试验证要点连接验证日志显示「✅ 网关已成功连接ThingsBoard MQTT服务器」无连接异常发布验证「返回码(rc)0」说明数据成功发布到平台设备验证平台「设备列表」自动出现modbus-sensor-01/modbus-sensor-02归属到对应网关数据验证子设备「最新遥测数据」显示temperature/humidity/pressure字段及对应数值仪表盘正常展示纯数值。五、任务总结掌握ThingsBoard「网关-子设备」数据模型的核心价值理解其在物联网场景中的必要性完成网关设备创建、子设备自动上报、仪表盘配置全流程落地实现基于MQTT协议的网关批量上报子设备数据代码内置详细日志便于问题排查。「网关-子设备」数据模型是ThingsBoard适配工业物联网场景的核心设计通过本实战可快速落地设备批量接入与统一管理。核心要点网关需勾选「网关设备」属性、上报主题固定为v1/gateway/telemetry、数据格式为扁平键值对列表包裹。掌握该模型后可轻松应对异构设备接入、批量管理等实际业务需求。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2631034.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…