> For the complete documentation index, see [llms.txt](https://doc.yuncitys.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://doc.yuncitys.com/shu-ju-chu-li-gui-ze-yin-qing/shen-me-shi-gui-ze-yin-qing.md).

# 什么是规则引擎?

规则引擎是基于事件开发的一个易于使用的工作流的框架；主要有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**.

![](/files/-MK46EkK9UKY_nCXDH-i)

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

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

![](/files/-MK46VwuP-vw4oM6EfNK)

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

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

![](/files/-MK46Zj_wNBgWD_ipW9F)

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

![](/files/-MK46ap3raWoDv_ufFCi)

![](/files/-MK46c0NAAv33XAgiTxA)

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

![](/files/-MK46eCehEooLuWDFDvZ)

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

![](/files/-MK46gFs7JCtdhwhI_2Z)

点击保存按钮应用更新。

**验证结果**

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

![](/files/-MK46sHxR6JnuzINcUCI)

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

![](/files/-MK47EFRzzGv3dLxwpwj)

提交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>

![](/files/-MK47O8w59IYWv1968Me)

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

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

![](/files/-MK47SLJmMRVnPAOH7Og)
