# Filter

Filter节点用于邮件筛选和路由。

* 检查节点关系
* 检查存在字段
* 消息类型过滤
* 消息类型切换
* 发起者类型
* 发起者类型转换
* 脚本
* 交换
* GPS地理围栏过滤器
  * 从消息元数据中获取边界信息
  * 从节点配置中获取周边信息

### **检查节点关系**

![](https://3662671755-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Lv8u0uivkRn8UzKBg4R%2F-MK47a6ScagBwaBf1yC2%2F-MK496JpIB8_xUWr2PM9%2Fimage.png?alt=media\&token=9c999775-95c6-49d9-a479-a0eb0b1397af)

根据类型和方向检查从所选实体到消息发起者的关系。

![](https://3662671755-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Lv8u0uivkRn8UzKBg4R%2F-MK47a6ScagBwaBf1yC2%2F-MK49AAaF-qcdCskIikF%2Fimage.png?alt=media\&token=7957e8b0-affd-4e06-a434-b6f00e5b4aca)

如果存在关系-消息通过**True**链发送否则使用**False**链。

**注意:** 从Thingsboard 2.3版开始规则节点可以通过禁用规则节点配置进行根据方向和关系类型检查与特定实体或任何实体的关系是否存在：

![](https://3662671755-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Lv8u0uivkRn8UzKBg4R%2F-MK47a6ScagBwaBf1yC2%2F-MK49ZdiezOQLi2-NeKM%2Fimage.png?alt=media\&token=fd2001ef-0d09-4d71-9f38-c114088fedcd)

如果禁用复选框并且存在任何关系-消息通过**True**链发送否则使用**False**链。

### **1. 检查存在字段**

![](https://3662671755-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Lv8u0uivkRn8UzKBg4R%2F-MK47a6ScagBwaBf1yC2%2F-MK49aQxdAaq87BVDxcL%2Fimage.png?alt=media\&token=e59e9a29-9aa6-41dc-8cc7-5ef795c5bbbd)

检查入站的消息数据和元数据中所选键的是否存在。

如果选中复选框**Check that all selected keys are present**表示消息数据和元数据中的所有键是否存在，如果为**True**则通过此链发送消息否则使用**False**链。

如果未选中此复选框并且消息的数据或元数据中至少有一个键存在通过**True**链发送消息否则使用**False**链。

### **2. 消息类型过滤**

![](https://3662671755-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Lv8u0uivkRn8UzKBg4R%2F-MK47a6ScagBwaBf1yC2%2F-MK49fqKjJRQXCKSYTYE%2Fimage.png?alt=media\&token=78c4bd47-922a-41c8-8981-2fbf8aba9d49)

管理员为入站消息定义了一组允许的消息类型。

系统中有预定义的消息类型；例如：**Post Attributes**、**Post Telemetry**、**RPC Request**等。

![](https://3662671755-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Lv8u0uivkRn8UzKBg4R%2F-MK47a6ScagBwaBf1yC2%2F-MK49kV9HNc52LPrsX6r%2Fimage.png?alt=media\&token=3967ae75-60fc-43f2-99a6-d1fd72271107)

如果入站消息类型-通过**True**链发送消息否则使用**False**链。

### **3. 消息类型切换**

![](https://3662671755-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Lv8u0uivkRn8UzKBg4R%2F-MK47a6ScagBwaBf1yC2%2F-MK49lphJPHX-qmfkgOm%2Fimage.png?alt=media\&token=effaa853-5caf-403e-a69a-1f6e80c7f790)

根据消息类型路由入站的消息。

如果入站的消息具有已知的消息类型则将其发送到相应的链否则将消息发送到**Other**链。

如果使用自定义消息类型则可以通过消**Message Type Switch Node**的**Other**链将这些消息路由到配置了所需路由逻辑的**Switch Node**或**Message Type Filter Node**。

### **4. 发起者类型**

![](https://3662671755-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Lv8u0uivkRn8UzKBg4R%2F-MK47a6ScagBwaBf1yC2%2F-MK49o72-Ze08HRzuuAe%2Fimage.png?alt=media\&token=ed1efe86-1594-449e-bd66-82399a26430b)

管理员配置发起者实体类型过滤入站消息。

![](https://3662671755-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Lv8u0uivkRn8UzKBg4R%2F-MK47a6ScagBwaBf1yC2%2F-MK49q4m7cKkKrItJnLJ%2Fimage.png?alt=media\&token=3fe5f5a4-d0f9-4599-9a08-96dc4e6027df)

如果是预期的入站发起者类型-通过**True**链发送消息否则使用**False**链。

### **发起者类型转换**

![](https://3662671755-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Lv8u0uivkRn8UzKBg4R%2F-MK47a6ScagBwaBf1yC2%2F-MK49uDs99ScRiXvYXdG%2Fimage.png?alt=media\&token=5965c55e-7618-49a6-a3d5-e6b75defa630)

通过发起者实体类型路由入站消息。

### **脚本**

![](https://3662671755-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Lv8u0uivkRn8UzKBg4R%2F-MK47a6ScagBwaBf1yC2%2F-MK4A-42PltvhWoMph9Q%2Fimage.png?alt=media\&token=e1e7990f-3c00-41fd-b963-7c55297bcc7c)

使用配置的JavaScript条件传入的消息。

JavaScript函数接收3个输入参数：

· **msg** - 消息payload

· **metadata** - 消息metadata

· **msgType** - 消息类型

脚本应返回布尔值如果为**True**-通过**True**链发送消息否则使用**False**链。

![](https://3662671755-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Lv8u0uivkRn8UzKBg4R%2F-MK47a6ScagBwaBf1yC2%2F-MK4A0w_UFxQMt_3XcG5%2Fimage.png?alt=media\&token=b273f18d-3c89-46f1-8cc6-2571024bc2b5)

消息payload可以通过**msg**变量访问。例如**msg.temperature < 10;**\
可以通过**metadata**变量访问消息。例如**metadata.customerName === 'John';**\
可以通过**msgType**变量访问。例如**msgType === 'POST\_TELEMETRY\_REQUEST'**

完整脚本示例:

&#x20;&#x20;

```
if(msgType === 'POST_TELEMETRY_REQUEST') {
    if(metadata.deviceType === 'vehicle') {
        return msg.humidity > 50;
    } else if(metadata.deviceType === 'controller') {
        return msg.temperature > 20 && msg.humidity > 60;
    }
}

return false;
```

### **交换**

![](https://3662671755-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Lv8u0uivkRn8UzKBg4R%2F-MK47a6ScagBwaBf1yC2%2F-MK4AI3FSlGUXTvrDYQY%2Fimage.png?alt=media\&token=cfaba597-0808-49ad-acac-a1b64a60b91e)

根据入站消息路由到一个或多个输出链节点执行已配置的JavaScript函数。

JavaScript函数接收3个输入参数：

· **msg** - 消息payload

· **metadata** - 消息metadata

· **msgType** - 消息类型

该脚本应返回一个将消息路由到的**下一关系名称的数组**。

如果返回的数组为空-消息将不会路由到任何节点并被丢弃。

![](https://3662671755-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Lv8u0uivkRn8UzKBg4R%2F-MK47a6ScagBwaBf1yC2%2F-MK4AJpvW6D4bVkv_e6B%2Fimage.png?alt=media\&token=d0e77fa5-4bd6-4e93-8c41-a0b7e40a4668)

消息payload可以通过**msg**变量访问。例如**msg.temperature < 10;**\
可以通过**metadata**变量访问消息。例如**metadata.customerName === 'John';**\
可以通过**msgType**变量访问。例如**msgType === 'POST\_TELEMETRY\_REQUEST'**

完整脚本示例:

```
if (msgType === 'POST_TELEMETRY_REQUEST') {
    if (msg.temperature < 18) {
        return ['Low Temperature Telemetry'];
    } else {
        return ['Normal Temperature Telemetry'];
    }
} else if (msgType === 'POST_ATTRIBUTES_REQUEST') {
    if (msg.currentState === 'IDLE') {
        return ['Idle State', 'Update State Attribute'];
    } else if (msg.currentState === 'RUNNING') {
        return ['Running State', 'Update State Attribute'];
    } else {
        return ['Unknown State'];
    }
}
return [];
```

为了指定自定义关系名称，应选择自定义类型。这将允许输入自定义关系名称。定制关系名称不区分大小写。

![](https://3662671755-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Lv8u0uivkRn8UzKBg4R%2F-MK47a6ScagBwaBf1yC2%2F-MK4AQrBHb1uUI28NZSW%2Fimage.png?alt=media\&token=83301aad-0e5f-4e0c-b812-55422db393f9)

### &#x20;**GPS地理围栏过滤器**

![](https://3662671755-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Lv8u0uivkRn8UzKBg4R%2F-MK47a6ScagBwaBf1yC2%2F-MK4AUxQZ_hqBlKgI4wH%2Fimage.png?alt=media\&token=97a58703-18e9-4063-adf6-7ee2b8b88cd0)

通过参数过滤消息的传入基于GPS的从数据或元数据中提取纬度和经度并检查它们是否在配置的边界（地理围栏）内。

![](https://3662671755-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Lv8u0uivkRn8UzKBg4R%2F-MK47a6ScagBwaBf1yC2%2F-MK4AWKydoo-Mqfedfar%2Fimage.png?alt=media\&token=862def95-013b-42bb-ba5f-fce6178ad772)

默认情况下规则节点从消息元数据中获取外围信息如果未**Fetch perimeter information from message metadata**则应配置其他信息。

**从消息元数据中获取边界信息**

根据边界类型有两种区域定义选项:

·&#x20;

多边形（Polygon)

·&#x20;

入站消息的元数据必须包含具有名称**范围**和以下数据结构的密钥：

·&#x20;

**\[\[lat1,lon1],\[lat2,lon2], ... ,\[latN,lonN]]**

· 圈（Circle）

```
"centerLatitude": "value1", "centerLongitude": "value2", "range": "value3"

All values for these keys are in double-precision floating-point data type.

The "rangeUnit" key requires specific value from a list of METER, KILOMETER, FOOT, MILE, NAUTICAL_MILE (capital letters obligatory).
```

### **从节点配置中获取周边信息**

根据边界类型有两种区域定义选项：

· 多边形（Polygon)

![](https://3662671755-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Lv8u0uivkRn8UzKBg4R%2F-MK47a6ScagBwaBf1yC2%2F-MK4AfAiT1-vlO-FchFY%2Fimage.png?alt=media\&token=12cdf601-2155-42a8-9e66-5ee09aef4ab6)

· 圈（Circle）

![](https://3662671755-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Lv8u0uivkRn8UzKBg4R%2F-MK47a6ScagBwaBf1yC2%2F-MK4AhYkc3KNzZhXSjC9%2Fimage.png?alt=media\&token=37ebb7a3-836f-4f12-abb5-f0ffb3693448)

如果配置的纬度和经度在通过**True**链发送的配置的周界消息内部则使用**False**链。

在以下情况下将使用**故障**链：

传入消息在数据或元数据中没有配置的纬度或经度键。 缺少周界定义；
