TB-Gateway遥测数据被拆分,如何阻止拆分并聚合触发规则链?
解决TB网关MQTT遥测数据拆分问题
一、阻止数据拆分
- 检查
tb-gateway.yaml配置- 确认
maxPayloadSizeBytes值足够覆盖完整Payload(你的数据远小于1024,该值无问题),重点查找MQTT连接器配置中的sendDataPerKey项,将其设置为false——此选项默认可能为true,会自动把JSON中的每个键值对拆成单独消息发送。 - 确保网关配置中没有其他强制拆分Payload的参数,比如
splitLargeMessages相关开关,若存在则关闭。
- 确认
- 验证MQTT客户端发送逻辑
- 确保客户端发送的是完整的单一JSON字符串,不要分批次发送Payload片段。
- 检查客户端的MQTT参数,比如
max_message_size是否限制了单条消息大小,需设置为不小于你的Payload大小。
二、聚合拆分后的遥测数据
如果已经产生拆分消息,可通过规则链实现数据聚合:
1. 添加聚合脚本节点
在规则链中插入Script节点,编写如下脚本(基于guid作为唯一标识聚合数据):
// 提取消息中的唯一标识guid var guid = msg.guid; if (!guid) { return {msg: msg, metadata: metadata, msgType: msgType}; } // 定义缓存键,用于存储未完成的聚合数据 var cacheKey = "telemetry_agg_" + guid; var existingData = Thingsboard.cache().get(cacheKey); if (existingData) { // 合并已有数据与当前消息 Object.assign(existingData, msg); // 检查是否集齐所有必填字段 var requiredFields = ["timestamp", "camera", "alert", "guid", "highTemp", "temperature", "bottomRightX", "mask", "imgPath", "timeSent"]; var isComplete = requiredFields.every(field => existingData.hasOwnProperty(field)); if (isComplete) { // 聚合完成,清除缓存并发送完整数据到下一个节点 Thingsboard.cache().remove(cacheKey); return {msg: existingData, metadata: metadata, msgType: msgType}; } else { // 更新缓存,不转发消息 Thingsboard.cache().put(cacheKey, existingData, 300000); // 设置5分钟过期时间 return null; } } else { // 首次收到该guid的数据,存入缓存 Thingsboard.cache().put(cacheKey, msg, 300000); return null; }
2. 配置规则链流转
- 将所有拆分后的遥测消息路由到这个脚本节点,聚合完成的完整数据会自动转发到原有规则链的处理节点。
- 可添加
Timer节点配合处理超时场景:如果缓存中的数据超过5分钟仍未聚合完成,触发告警或直接丢弃,避免缓存堆积。
内容的提问来源于stack exchange,提问作者user1900266
相关产品推荐
相关产品推荐

