一、概述
例如从 Topic 为智能网关全部设备的物模型属性上报 Topic 中提取 JSON 消息的action、targetDevice和count三个字段,再通过count<3条件过滤数据,得到处理后的结果用于后续转发。示例表达的规则如下:
二、行为 Action
当从 Topic 提取到了感兴趣的字段后,就要考虑对其进行一些操作。例如,转发或者存储等。目前支持的操作有:
·数据转发到另一 Topic。
·数据转发到第三方服务(Forward)。
·数据转发到消息队列(CKafka)。
·数据转发到云数据库(MySQL)。
·数据转发到时序数据库(CTSDB)。
·数据转发到分布式数据库 TDSQL-MySQL。
·数据转发到云开发(CloudBase)。
在触发转发行为时,规则引擎会对设备上报的 payload, 进行 JSON 封装。格式示例如下。
三、转发到 CKafka 的 JSON 示例
{ "MsgType": "Publish", "Topic": "AD4GVS5549/device/data", "Seq": 13107192, "PayloadLen": 17, "Payload": "dGhpcyBpcyBhIGV4YW1wbGU=", "ProductId": "AD4GVS5549", "DeviceName": "device", "Time": "2018-08-14 15:12:05"}
四、转发到第三方服务(http forward)的 JSON 示例
{ "devicename": "device", "payload": { "params": { "power_switch": 1, "color": 1, "brightness": 32 } }, "productid": "AD4GVS5549", "seq": 2, "timestamp": 1587109346, "topic": "AD4GVS5549/device/data"}
五、转发到 MySQL 的 JSON 示例
{ "method":"report", "clientToken":"123", "params":{ "power_switch":1, "brightness":11, "scene":3 }}
六、参数说明
| 字段 | 描述 |
| MsgType | Publish:配置消息队列转发。Forward:命中规则引擎转发。StatusChange:状态变化。 |
| PayloadLen | 设备上报消息 payload 的长度,单位为字节数。 |
| Payload | 原始消息的 payload,默认会对内容使用 Base64 编码。 |
| Event | 仅 StatusChange 类型消息有,目前取值为 Online 和 Offline,代表上线和下线操作。 |
| DeviceName | 设备在物联网开发平台中定义的设备名称。 |
| Time | 转发行为触发的时间戳。 |
| seq | 内部自增的唯一消息标识符,int 类型。 |
| timestamp | 该转发行为触发时的 Unix 时间戳。 |
七、字段的定义
·字段中仅支持' * '、','、'.'、空格、字母和数字,不为空,最多不超过300个字符。
·字段表示的是 JSON 中的键值 Key,若数据格式为二进制时不可使用字段筛选,可使用' * '将所有二进制数据进行转发。
·上报的 JSON 数据格式,可以是嵌套的 JSON。例如:{"device_status":{"switch":"on"}},可以通过 device_status.switch 来获取到 switch 的值。
·暂不支持子 SQL 和 JSON 数组。
八、Topic 通配符的定义
如果想要监听多个 Topic,可以使用#和+通配符来定义多个 Topic。
·#代表0个或多个任意 Topic 段,只能放在 Topic 的最后。
·+代表1个任意 Topic 段,可以放在 Topic 的中间。
例如, house_monitor/+/get:
·可监听house_monitor/thermometer/get和house_monitor/door/get等 Topic。
·但不可监听house_monitor/door/switch/get,因为+只能代表1个 Topic 段。
例如, house_monitor/#:
·可监听house_monitor/thermometer和house_monitor/door/switch/get等 Topic。
·但house/#/get是非法的,因为#只能放在 Topic 结尾。
九、条件的定义
[条件]表达式用于过滤 Topic 中的消息,只有当消息满足[条件]表达式时,才会被提取并进行后续的处理,支持的表达式见下表:
| 操作符 | 说明 | 示例 |
| = | 相等 | color = 'red' |
| <> | 不等于 | color <> 'red' |
| AND | 逻辑与 | color = 'red' AND siren = 'on' |
| OR | 逻辑或 | color = 'red' OR siren = 'on' |
| ( ) | 括号代表一个整体 | color = 'red' AND (siren = 'on' OR siren ='isTest') |
| + | 算术加法 | age = 4 + 5 |
| – | 算术减 | age = 5 – 4 |
| / | 除 | age = 20 / 4 |
| * | 乘 | age = 5 * 4 |
| % | 取余数 | age = 0 % 6 |
| < | 小于 | 5 < 6 |
| <= | 小于或等于 | 5 <= 6 |
| > | 大于 | 6 > 5 |
| >= | 大于或等于 | 6 >= 5 |