# 什么是规则引擎?

规则引擎是基于事件开发的一个易于使用的工作流的框架；主要有3个组成部分:

* **Message** - 事件接收；它可以来自设备、设备生命周期事件、REST API事件、RPC请求等传入的数据。
* **Rule Node** - 消息处理;对接收的数据进行过滤、转换或者执行。
* **Rule Chain** - 关联消息；接收上一节点的出站消息将其发送至下一个节点。

### 典型实例 <a href="#dian-xing-shi-li" id="dian-xing-shi-li"></a>

数据规则引擎是一个高度可定制的框架用于复杂事件的处理。以下是一些可以通过云平台规则链配置的常见用例：

* 在保存到数据库之前对接收的遥测数据或属性进行验证和修改。
* 将遥测或属性从设备复制到相关资产以便可以汇总遥测。例如：可以将多个设备中的数据汇总到相关资产中。
* 根据定义的条件对alarms进行创建、更新、清除。
* 根据设备生命周期事件触发操作。例如：如果设备处于在线/离线状态，则创建警告。
* 加载所需的其他处理数据。例如：在客户设备或租户属性中定义的设备的playload温度阈值。
* 调用外部系统的REST API。
* 发生复杂事件时发送电子邮件并使用“电子邮件模板”中其他实体的属性。
* 在事件处理期间要考虑用户的偏好。
* 根据定义的条件进行RPC调用。
* 集成第三方消息队列例如：Kafka，Spark，AWS等。

### Hello World 实例 <a href="#helloworld-shi-li" id="helloworld-shi-li"></a>

你可以使用云平台将DHT22温度传感器采集的-40°C至+ 80°C温度值进行收集。

在此教程中我们将配置在云平台规则引擎来存储-40至80°C范围内的所有温度，并将所有数据记录到系统日志中。

**添加温度并验节点**

进入平台中**规则链库存**转到**Root Rule Chain**.

![](https://3662671755-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Lv8u0uivkRn8UzKBg4R%2F-MK44nav_07iFVyw3SRE%2F-MK46EkK9UKY_nCXDH-i%2Fimage.png?alt=media\&token=ace6c71c-b03f-448c-a25d-f9949c75ef8a)

拖动**Script Filter** 规则节点放入链中并配置如下脚本:

```
return typeof msg.temperature === 'undefined' 
        || (msg.temperature >= -40 && msg.temperature <= 80);
```

![](https://3662671755-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Lv8u0uivkRn8UzKBg4R%2F-MK44nav_07iFVyw3SRE%2F-MK46VwuP-vw4oM6EfNK%2Fimage.png?alt=media\&token=a8ad8abd-291d-443f-9c5a-82ca8680f0a2)

如果未定义温度属性或温度有效则脚本将返回**True**，否则将返回**False**。如果脚本返回**True**则传入消息将被关联到与**True**关系连接的下一个节点。

我们希望所有的**telemetry requests**都通过此脚本进行验证. 删除**Message Type Switch**节点和**Save Telemetry**节点之间的**Post Telemetry**关系节点。<br>

![](https://3662671755-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Lv8u0uivkRn8UzKBg4R%2F-MK44nav_07iFVyw3SRE%2F-MK46Zj_wNBgWD_ipW9F%2Fimage.png?alt=media\&token=06aa1031-555e-4338-ba6a-082f6bd03956)

将**Message Type Switch**节点和将**Script Filter**使用**Post Telemetry**进行连接:<br>

![](https://3662671755-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Lv8u0uivkRn8UzKBg4R%2F-MK44nav_07iFVyw3SRE%2F-MK46ap3raWoDv_ufFCi%2Fimage.png?alt=media\&token=1e3d1a0c-5725-46a6-931f-894be2631dd3)

![](https://3662671755-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Lv8u0uivkRn8UzKBg4R%2F-MK44nav_07iFVyw3SRE%2F-MK46c0NAAv33XAgiTxA%2Fimage.png?alt=media\&token=c55834b1-c795-4287-aa93-b8d3768dd6eb)

将**Script Filter**节点与**Save Telemetry**节点使用关系**True**进行连接：<br>

![](https://3662671755-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Lv8u0uivkRn8UzKBg4R%2F-MK44nav_07iFVyw3SRE%2F-MK46eCehEooLuWDFDvZ%2Fimage.png?alt=media\&token=fca8276e-938b-4214-85fd-ef77a9a5c07d)

将**Script Filter**节点与**Log Other**节点使用关系**False**进行连接这样无效数据将被记录在系统日志中：<br>

![](https://3662671755-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Lv8u0uivkRn8UzKBg4R%2F-MK44nav_07iFVyw3SRE%2F-MK46gFs7JCtdhwhI_2Z%2Fimage.png?alt=media\&token=a9612231-29db-47a5-931d-df84c3c75c7a)

点击保存按钮应用更新。

**验证结果**

创建设备并将遥测数据上接入上传到DDA-IOT云平台，点击**Devices**并创建新的设备：<br>

![](https://3662671755-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Lv8u0uivkRn8UzKBg4R%2F-MK44nav_07iFVyw3SRE%2F-MK46sHxR6JnuzINcUCI%2Fimage.png?alt=media\&token=313171be-bebe-4266-b352-a096b11fe0ef)

可以使用设备令牌进行Rest API提交遥测数据提交：

![](https://3662671755-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Lv8u0uivkRn8UzKBg4R%2F-MK47-TDVAlloBSMK8gB%2F-MK47EFRzzGv3dLxwpwj%2Fimage.png?alt=media\&token=bc39c509-dc83-46d2-8a21-b9665802636e)

提交temperature = 99的值，可以进行**Latest Telemetry**中查看，发现并未加成功：<br>

```
curl -v -X POST -d '{"temperature":99}' http://localhost:8080/api/v1/$ACCESS_TOKEN/telemetry --header "Content-Type:application/json"
```

**\*替换掉$ACCESS\_TOKEN为实际设备的Token**<br>

![](https://3662671755-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Lv8u0uivkRn8UzKBg4R%2F-MK47-TDVAlloBSMK8gB%2F-MK47O8w59IYWv1968Me%2Fimage.png?alt=media\&token=e4df8e51-d9a1-4542-9338-f7a5208fba92)

提交temperature = 24可以看见遥测数据保存成功

```
curl -v -X POST -d '{"temperature":24}' http://localhost:8080/api/v1/$ACCESS_TOKEN/telemetry --header "Content-Type:application/json"
```

![](https://3662671755-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Lv8u0uivkRn8UzKBg4R%2F-MK47-TDVAlloBSMK8gB%2F-MK47SLJmMRVnPAOH7Og%2Fimage.png?alt=media\&token=fb4b2413-cb2f-4b9e-a6d2-99f464dc2f35)
