You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 06:15:29