# 什么是规则引擎?

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


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://doc.yuncitys.com/shu-ju-chu-li-gui-ze-yin-qing/shen-me-shi-gui-ze-yin-qing.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
