TR50 命令聚合器

物和 TR50 类别的触发器动作将生成发送到 物联网设备管理门户 的 TR50 命令。启用 TR50 命令聚合器后,TR50 命令将在发送之前排队等待一段时间。这允许将多个 TR50 命令组合在一起,并作为一个消息包发送到 物联网设备管理门户。这种分组减少了消息传递开销。

满足选定的 Command Aggregator Interval (sec)(命令聚合器间隔(秒)时,将 TR50 命令放入队列,然后一起发送。此时间间隔是从第一个 TR50 命令添加到 TR50 命令聚合器队列开始计算的。时间间隔的范围是 1 到 300 秒。

TR50 命令聚合器的消息大小限制为 20,000 字节。如果队列中的 TR50 命令导致分组的消息大于此大小限制,则将创建多条消息 - 每一条都遵循大小限制。

TR50 命令聚合器还支持批处理。如果用于触发器动作的 TR50 命令具有相应的批处理命令,则单个 TR50 命令将转换为使用单个批处理命令。例如,通常使用 property.publish TR50 命令将 Publish Property(发布属性)动作发送到物联网设备管理门户。如果启用了 TR50 命令聚合器,则可以将多个 property.publish TR50 命令转换为单个 property.batch TR50 命令。

支持命令聚合的物动作

下表显示了触发器动作、用于将信息发送到 物联网设备管理门户 的 TR50 命令以及相应的 TR50 批处理命令(如果支持)之间的关系。

触发器动作 TR50 命令 TR50 批处理命令
添加物标签 thing.tag.add 不支持
绑定物 thing.bind 不支持
删除物标签 thing.tag.delete 不支持
发布告警 alarm.publish alarm.batch
发布位置 location.publish location.batch
发布日志 log.publish 不支持
发布属性 property.publish property.batch
设置物的静态属性 thing.attr.set 不支持
解除物绑定 thing.unbind 不支持
取消设置物的静态属性 thing.attr.unset 不支持

命令聚合

以下示例显示了触发器动作如何生成发送到 物联网设备管理门户 的 TR50 命令和消息包。

示例 1:将 Command Aggregator(命令聚合器)参数设置为 False 的发布告警动作。Alarm.publish 命令将立即发送到 物联网设备管理门户

{ "1": { "command": "alarm.publish", "params": { "key": "thing_1", "state": 4, "ts": "2015-12-08T15:08:41Z" } }

示例 2:执行将 Command Aggregator(命令聚合器)参数设置为 True 的发布日志动作,并在 TR50 Advanced Connection Management(TR50 高级连接管理)选项卡上启用 TR50 命令聚合器。
Log.publish 命令不会立即发送,而是会添加到 TR50 命令聚合器队列中,在该队列中它将等待命令聚合器间隔(秒)到期。

由于在命令聚合器间隔(秒)内执行了其他支持 TR50 命令聚合的动作,它们将被添加到 TR50 命令聚合器队列中。

在本例中,这些动作是发布日志动作、添加物标签动作,以及再一次的发布日志动作。

{ "1": { "command": "log.publish", "params": { "msg": "log message", "ts": "2016-06-22T17:47:08Z" } }, "2": { "command": "thing.tag.add", "params": { "tags": [ "tag1", "tag2" ], "thingKey": "test" } }, "3": { "command": "log.publish", "params": { "msg": "log message again", "ts": "2016-06-22T17:47:08Z" } } }

命令聚合器间隔(秒)到期后,这三个命令会分组并作为一个消息包以上述格式发送到 物联网设备管理门户
请注意,这三个触发器动作不必位于同一触发器中。TR50 命令聚合器及其用于保存 TR50 命令的队列适用于 TR50 连接。

示例 3:如果未启用 TR50 命令聚合,则在执行触发器动作时,将分别发送单个命令到 物联网设备管理门户
物联网设备管理门户 将以下列格式接收它们:

第 1 个包:

{ "1": { "command": "log.publish", "params": { "msg": "log message", "ts": "2016-06-22T17:47:08Z" } } }

第 2 个包:

{ "1": { "command": "thing.tag.add", "params": { "tags": [ "tag1", "tag2" ], "thingKey": "test" } } }

第 3 个包: 

{ "1": { "command": "log.publish", "params": { "msg": "log message again", "ts": "2016-06-22T17:47:08Z" } } }

命令聚合器大小限制

TR50 命令聚合器的消息最大大小限制为 20,000 字节。如果队列中的 TR50 命令导致分组的消息大于此大小限制,则将创建多条消息 - 每一条都遵循大小限制。

示例 4:如果大小限制为 400 字节,则从上面的示例 3 开始,发布日志动作以及随后的添加物标签动作将生成 358 字节大小的消息包。

当再次执行发布日志动作时,三个 TR50 命令的消息包总大小将为 521 字节,超过 400 字节的示例消息大小限制。当命令聚合器间隔(秒)到期时,TR50 命令聚合器将最终发送两个消息包。 

第 1 个包:

{ "1": { "command": "log.publish", "params": { "msg": "log message", "ts": "2016-06-22T17:47:08Z" } }, "2": { "command": "thing.tag.add", "params": { "tags": [ "tag1", "tag2" ], "thingKey": "test" } } }

第 2 个包: 

{ "1": { "command": "log.publish", "params": { "msg": "log message again", "ts": "2016-06-22T17:47:08Z" } } }

批处理

启用 TR50 命令聚合器后,TR50 命令将自动使用其相应的 TR50 批处理命令。与简单的命令聚合相比,将数据作为批处理命令发送可进一步减少消息传递的开销。

批处理 TR50 命令时,它将自动按时间戳顺序进行分组,并按物键值进行分组。  当项键值存在时,命令也将基于该键值进行分组。  例如,属性发布中的项键值是属性键值,而告警发布中的项键值是告警键值。  

示例 5:多个发布属性动作不会分组为单个 property.publish 命令,而是会转换为单个 property.batch 命令。具体来说,property.batch 命令将按物键值针对不同的属性键值和值进行批处理(或分组)。

{ "1": { "command": "property.batch", "params": { "data": [ { "corrId": "1", "key": "key1", "ts": "2008-03-18T10:00:00Z", "value": 335.17 }, { "corrId": "1", "key": "key2", "ts": "2008-03-18T10:00:00Z", "value": 135.17 } ], "thingKey": "thing" } } }

如果对同一个属性键值执行了多个发布属性动作,则 property.batch 命令将按物键值和属性键值针对不同的值进行批处理(或分组)。

{ "1": { "command": "property.batch", "params": { "data": [ { "corrId": "1", "ts": "2008-03-18T10:00:00Z", "value": 335.17 }, { "corrId": "1", "ts": "2008-03-18T10:00:00Z", "value": 135.17 } ], "thingKey": "thing" "key": "key2", } } }

TR50 命令聚合器错误处理

将 TR50 命令发送到 物联网设备管理门户 后,物联网设备管理门户 将为每个 TR50 命令发送回复。如果回复返回命令错误,则将写入异常日志条目,指示失败的项目、触发器和动作,以及失败的错误代码和错误消息。也可以在物联网设备管理门户API 日志(API 日志)中查看失败。

如果消息包中包含批处理命令,则将写入“异常日志”条目,指示失败的项目、触发器和动作,以及分组到批处理命令的每个 TR50 命令的失败错误代码和错误消息。但是,物联网设备管理门户 将报告整个批处理命令包失败,并且仅处理批处理命令包失败之前的数据,因此只有一部分批处理数据会被处理。也可以在物联网设备管理门户API 日志(API 日志)中查看失败。

示例 6:将 property.batch 发送到 物联网设备管理门户(请参见下文)。

{ "1": { "command": "property.batch", "params": { "data": [ { "corrId": "1", "ts": "2008-03-18T10:00:00Z", "value": 335.17, "key": "processed" }, { "corrId": "1", "ts": "2008-03-18T10:00:00Z", "value": 135.17, "key": "invalid.key" }, { "corrId": "1", "ts": "2008-03-18T10:00:00Z", "value": 135.17, "key": "failed_to_process" }, { "corrId": "1", "ts": "2008-03-18T10:00:00Z", "value": 135.17, "key": "failed_to_process" } ], "thingKey": "thing" } } }

整个批处理将失败,并显示错误消息:“Invalid key format for 'invalid.key': Key must only contain letters, numbers, '_' (underscore), and '-' (hyphen).”(“invalid.key”的键值格式无效:键值只能包含字母、数字、“_”(下划线)和“-”(连字符))。

但是,第一个键值将被处理。第二个键值将导致失败,而其余的批处理命令将不处理。