# 背景介绍

各类IoT产品和解决方案的飞速发展，为市场提供了新的机遇，从而根本上转变了竞争激烈的的商业环境。越来越多的企业已经通过物联技术实现产品升级甚至企业转型，从而在大趋势中牢牢占据领先位置。 虽然价值显而易见，但挑战严峻，尤其是在技术层面：

* 技术链条长，意味着研发团队规模不小，且包含各技术领域人才，然而IoT领域人才稀缺；
* 技术稳定期长，需要大量的实战经验解决可能存在的各种难题；
* 海量连接和数据存储及处理该如何解决？如城域级别的物联网项目可能要求支撑百万级的并发连接量或十万级的QPS；
* IoT场景未知、多样、复杂，如何快速应对？如在园区场景中，可能会涉及到几百种不同型号的设备以及若干复杂的跨子系统联动需求；
* 数据安全性如何保障？传统物联系统仅依靠对比IMEI等基础的鉴权机制，以及孱弱的防攻击能力，可能会导致巨大风险；
* 不同项目中对部署方式有不同的要求，如公有云部署、私有云部署甚至直接部署在物理机上；
* ……

本质上，企业需要一个性能稳定、扩展灵活且轻量化的系统，能够针对不同的业务形态，将设备和业务的解耦，进而实现各种复杂的场景和业务流程。正是在这一背景下，IoT 应运而生。


# 平台介绍

Yun-IOT云平台 **简称：IoT**


# 产品架构

IoT 是一款物联网云操作系统，为万物互联提供可靠安全稳定的终端接入、协议适配、消息路由、数据存储和分析、应用使能等核心功能。其 ***功能架构*** 如下：

![ ](https://hy.hekr.me/iot-docs-test/web/images/%E5%B9%B3%E5%8F%B0%E7%AE%80%E4%BB%8B/%E5%9F%BA%E7%A1%80%E6%9E%B6%E6%9E%84.png)

上图中各层服务负责的功能分别如下：

* 连接服务：提供设备联网功能，支持设备通过各种无线或有线的通信方式接入网络，并支持各种网络传输协议；
* 设备服务：提供设备基础管理功能，包括设备的鉴权管理、数据协议解析、消息路由、设备影子数据及元数据管理功能；
* 数据服务：提供设备数据的基本管理功能，包括设备的上下行日志存储，以及一些数据指标的聚合分析，如平均值、最大、最小值等；
* 使能服务：提供应用使能服务，主要是为上层或第三方应用提供按规则和条件进行数据订阅和数据转发的服务。包括应用注册、规则引擎、数据流转服务；
* 其他：包括基础的安全服务、控制台和监控服务。安全服务提供基本物联网安全机制；可视化控制台提供IoT 与客户交互的界面；可视化监控提供服务可用性及风险监控能力。

IoT 在物联网应用中常处于如下图所示位置：

![ ](https://hy.hekr.me/iot-docs-test/web/images/%E5%B9%B3%E5%8F%B0%E7%AE%80%E4%BB%8B/%E8%AE%BE%E5%A4%87%E6%8E%A5%E5%85%A5%E6%8B%93%E6%89%91.png)

IoT OS本质上是一系列物联网微服务的集合，采用分布式架构，应用程序和服务组件均不存在单点风险。其 ***技术架构*** 如下：

![](/files/-MPgUIOrfXGoZkXobaCQ)


# 产品特点

### **1. 高性能**

单集群可支持百万级设备连接和十万级QPS请求，具有毫秒级延迟，可支撑超大规模物联网设备接入需求。

### **2. 电信级高可靠**

采用大规模分布式、高可用、高可靠集群，并提供多重安全机制。

### **3. 多协议支持**

支持主流物联网协议，包括MQTT、CoAP和HTTP等，并配套Yun网关接入。同时，还提供sdk方便快速接入解析数据。

### **4. 网络透明**

支持Yun通讯终端和各种蜂窝网络(2G、3G、4G/NB-IoT) 、有线网络和无线网络，亦能支持5G中的mMTC（海量物联）和uRLLC（高可靠低时延）两大场景。

### **5. 数据持久化和实时分析**

内置高性能分布式时序数据库，支持海量数据的持久化和实时分析，也支持与用户提供的数据库、大数据平台或消息列对接，方便用户对数据进行存储与消费。

### **6. 规则引擎**

提供基于可在线编辑拖拽的链式规则引擎，支持用户设置复杂规则实时过滤海量数据，减少应用侧压力，使客户聚焦业务开发。

### **7. 可伸缩**

基于良好的架构设计，具备强大的可伸缩能力。根据业务压力，既能以数百台规模的超大集群形式运行，也可以在超小配置上运行，并支持以公有云、私有云、物理机及Docker容器和K8S等方式进行灵活部署，因此能非常好地适应端-边-云体系。

Yun-IOT云平台具备以上诸多特点，因此特别适合在以下场景中使用：

* 应用中有大规模感知设备接入，设备量可能是百万级，请求量和数据存储需求巨大；
* 应用中的感知设备多元异构，通信方式、传输协议、业务数据等复杂多样；
* 处于架构优化的目的，需要将感知层与应用层解耦，实现与复杂应用系统的快速对接；
* 需要构建统一的PaaS级平台，实现标准规范的接入及应用开发；
* 需要构建端-边-云体系，实现跨区域统一化管理；

目前被广泛应用于智慧停车、智慧城市、智慧用电、智慧路灯等领域。


# 产品优势

IoT 的方案相较于传统开发平台有着下表所列的优势。

| 设备接入 | 需要搭建基础设施，联合嵌入式开发人员与云端开发人员共同开发。开发工作量大、效率低。              | 提供设备端SDK，快速连接设备上云，效率高。同时支持全球设备接入、异构网络设备接入、多环境下设备接入和多协议设备接入。 |
| ---- | ------------------------------------------------------ | ----------------------------------------------------------- |
| 性能   | 自行实现扩展性架构，极难做到从设备粒度调度服务器、负载均衡等基础设施。                    | 具有百万级设备的长连接能力、百万级并发处理能力，架构支撑水平性扩展。                          |
| 安全   | 需要额外开发、部署各种安全措施，保障设备数据安全是个极大挑战。                        | 提供多重防护，保障设备数据安全。设备认证保障设备安全与唯一性。传输加密保障数据不被篡改。                |
| 简单易用 | 需要购买服务器搭建负载均衡分布式架构，需要花费大量人力物力开发"接入 + 计算 + 存储"一整套物联网系统。 | 一站式设备管理，实时监控设备运行状态。快速、灵活、简便的搭建复杂物联网应用。                      |


# 设备和应用接入

IoT 的南向能力体现在各类多元异构设备的接入，北向能力则体现在对各种业务系统、应用场景的支撑能力。

![ ](https://hy.hekr.me/iot-docs-test/web/images/%E5%B9%B3%E5%8F%B0%E7%AE%80%E4%BB%8B/%E8%AE%BE%E5%A4%87%E6%8E%A5%E5%85%A5.jpg)

用户只需登录WEB UI，基于其提供的一站式接入能力，编写少量代码，即可快速实现设备上云和应用开发。

![](/files/-MPOGTYCLcdKrZxhqpyu)


# 部分应用案例

### [**智慧停车**](http://cloud.dda-iot.com/dashboard/b33bdd60-daa7-11ea-a0d5-dfd78013af2c?publicId=b833e890-d795-11ea-ad00-03fbf682b187)

泊位信息,有无车状态,车辆泊位时间,目标区域车辆流动统计

### [**智慧路灯**](http://cloud.dda-iot.com/dashboard/ef7cdc10-c8d8-11ea-8a93-8d0a2dc2249d?publicId=a807f070-afb7-11ea-b11d-4d9bb7754481)

路灯的开关控制,调光控制,各种用电参数采集

### [**城市管理**](http://cloud.dda-iot.com/dashboard/d7fb4250-db86-11ea-a0d5-dfd78013af2c?publicId=79d51f20-d57d-11ea-ad00-03fbf682b187)

城市空气温湿度,噪音,污水水位,土壤水分,温度,电导率,盐分,氮磷钾,PH值

### [**生态红外监测**](http://cloud.dda-iot.com/dashboard/5f97f960-dbaa-11ea-a0d5-dfd78013af2c?publicId=79d51f20-d57d-11ea-ad00-03fbf682b187)

土壤氮磷钾,温湿度盐分电导率,PM1,PM2.5,PM10

### [**智慧餐厅**](http://cloud.dda-iot.com/dashboard/36288ad0-dad4-11ea-a0d5-dfd78013af2c?publicId=8333b770-ebea-11e9-8d06-e7bb69d12905)

安全用电监测,火灾报警,噪音,空气温湿度

### [**城市安全管理 地下室监测**](http://cloud.dda-iot.com/dashboard/a1192090-0c69-11eb-8da4-4537a057f927?publicId=79d51f20-d57d-11ea-ad00-03fbf682b187)

气体浓度分析,VOC，硫化氢等气体监测

### [**城市安全管理 房屋监测**](http://cloud.dda-iot.com/dashboard/0eed7bc0-0c6f-11eb-bfc3-f124891cf0f5?publicId=79d51f20-d57d-11ea-ad00-03fbf682b187)

目标结构物的倾斜角度,目标结构物的裂缝值


# 名词解释

本节主要介绍IoT 中相关的名词解释。

| 名词     | 解释                                                                                                     |
| ------ | ------------------------------------------------------------------------------------------------------ |
| 访问令牌   | 物联网平台为每个设备颁发的全局唯一的访问令牌，在设备与平台建议连接访问时需要传递使用，设备秘钥，用于设备注册，该参数很重要，需要您保管好，不能泄露。                             |
| 设备     | 归属于某个产品下的具体设备。拥有唯一的DeviceId。设备可以直接连接物联网平台，也可以作为子设备通过网关连接物联网平台。                                         |
| 设备类型   | 不同终端业务类别的区分编码。                                                                                         |
| 网关     | 能够直接连接物联网平台的设备，且具有子设备管理功能，能够代理子设备连接云端。                                                                 |
| 终端子设备  | 本质上也是设备。终端子设备不能直接连接物联网平台，只能通过网关连接。                                                                     |
| 中继设备   | 无法直接连接物联网平台的设备，但拥有子设备管理功能，只能通过网关连接。                                                                    |
| 普通设备   | 本质上也是设备。可以直接连接物联网平台，且不能挂载子设备。                                                                          |
| 发布     | 操作Topic的权限类型，对应的英文名称为Pub。可以往此类Topic中发布消息。                                                              |
| 订阅     | 操作Topic的权限类型，对应的英文名称为Sub。可以从此类Topic中订阅消息。                                                              |
| 数据解析脚本 | 对采用自定义数据格式的设备，通过编写数据解析脚本，可以将设备上报的数据，转换为服务端支持的 YunJSON数据格式。另一方面解析脚本可以将服务端下发的DDA  JSON格式数据，转换为设备支持的数据格式。 |
| 上下行数据  | 设备和服务端通信的所有数据，包括原始数据、编解码数据、服务端响应数据。                                                                    |
| 规则引擎   | 通过创建、配置规则，以实现数据流转与处理。                                                                                  |
| 服务端订阅  | 一种快捷的消息流转订阅模式，可选择数据上报通知、数据变化通知、控制响应通知、设备上下线通知。                                                         |
| 设备UUID | 物联网平台颁发的产品唯一标识码。                                                                                       |
| Topic  | 每个设备唯一，是发布（Pub）/订阅（Sub）消息的传输中介。可以向Topic发布或者订阅消息。                                                       |


# 特色


# 特点

集成物联网行业主流标准协议MQTT、CoAP和HTTP对智能设备实现设备连接、设备管理、数据收集、处理和可视化的物联网云平台。

DDA-IOT云平台可用于:

* 管理设备，资产和客户并定义他们之间的关系。
* 基于设备和资产收集数据并进行可视化。
* 采集遥测数据并进行相关的事件处理进行警报响应。
* 基于远程RPC调用进行设备控制。
* 基于生命周期事件、REST API事件、RPC请求构建工作流。
* 基于动态设计和响应仪表板向你的客户提供设备或资产的遥测数据。
* 基于规则链自定义特定功能。
* 发布设备数据至第三方系统。
* 更多…

DDA-IOT云平台设计为:

* 可扩展: 使用领先开源技术构建的可水平扩展平台。
* 容错：无单点故障，集群中的每个节点都是相同的。
* 性能卓越：单个服务器节点可以根据用例处理几十甚至数十万个设备。ThingsBoard集群可以处理数百万台设备。
* 灵活：开发新功能可以方便的使用自定义部件、规则引擎等。
* 持久：数据永久保存

### 双向通信上下行处理流程

![](/files/-MK3bDkb7iZnZe68mlxR)

### &#xD; **数据规则引擎处理流程**

![](/files/-MK3pDj891misxKN4asj)

平台的性能利用了以下几个主要框架：

1．用于物联网设备的高性能MQTT服务器/代理的[Netty](http://netty.io/)。

2．[Akka](http://akka.io/)为高性能的actor系统来协调数百万设备之间的消息。

3．[Cassandra](http://cassandra.apache.org/)提供可扩展的高性能NoSQL DB来存储来自设备的时间序列数据。

4．我们还使用[Zookeeper](https://zookeeper.apache.org/)进行协调，并在集群模式下使用[gRPC](http://www.grpc.io/)。

物联网设备通过MQTT连接到本平台服务器，并发布带有JSON负载的“发布”命令。单个发布消息的大小大约为100个字节。 [MQTT](http://mqtt.org/)是轻量级发布/订阅消息传递协议，与HTTP请求/响应协议相比具有许多优点。

平台可以横向扩展。群集中的每个服务器节点都是唯一的。可伸缩性是使用集群节点之间的[一致哈希](https://dzone.com/articles/simple-magic-consistent)负载均衡算法实现的。实际性能取决于连接设备的使用情况。例如，小型商品硬件集群可以支持通过MQTT连接的数百万设备。

### 数据采集性能

平台的一个关键特性是数据收集，这是一个关键特性，必须在高负载下可靠工作，现阶段可以确保服务器的单个实例每秒能够持续处理超过**20,000**个设备和**30,000**个以上的 MQTT发布消息，总之，每个消息发布的消息总量大约为**200**万条/分钟。

### 安全性

#### 传输加密

作为系统管理员，可以将平台配置为使用HTTP（s）和MQTT传输的安全套接字层。CoAP的DTLS尚未得到支持。

#### 设备认证

平台旨在支持许多类型的设备凭证。当前版本为所有协议提供对基于令牌的凭证的 支持，并支持MQTT协议的基于X.509证书的凭证。


# 系统角色

### **系统管理员**

系统管理员能够创建**仪表组件**,**系统设置**,**业务租户**，还可以通过业务租户详细信息中的“**管理租户管理员**”按钮为每个**业务租户**创建具有**租户管理员角色**的多个账号。

### **业务租户**

支持多**业务租户**管理，不同行业应用场景的应用系统，以系统为单位创建不同业务租户，每个业务租户下可以创建拥有多个**租户管理员**以及数百万客户和设备。

### **租户管理员**

**租户管理员可以执行以下操作：**

1．配置和管理设备。

2．提供和管理场地设施。

3．创建和管理客户。

4．创建和管理可视仪表板。

5．配置数据规则。

6．使用仪表组件添加或修改默认小部件。

### &#x20;**租户端客户**

**普通用户可以操作：**

1．查看场景设施。

2．查看设备。

3．查看可视仪表。


# 实体和关系

### 实体概述

平台提供了用户界面和REST API，方便在IoT应用程序中配置和管理多种实体类型及其关系。支持的实体如下:

* **业务租户** - 可以将租户视为单独的业务实体：拥有或生产设备和资产的个人或组织; 租户可能有多个租户管理员用户和数百万的客户。例如：盛路或炎鑫；管理员用户和数百万个客户；
* **客户** - 客户也是独立的业务实体：购买或使用业务租户设备和/或场地设施的个人或组织; 客户可能拥有多个用户和数百万设备和/或场地设施。例如：北京停车单位；&#x20;
* **用户** - 用户能够浏览仪表板和管理实体；
* **设备** - 可以通过RPC命令处理Iot设备中的对象遥测数据。例如sensors（传感器）, actuators（执行器）, switches（开关）；
* **场地设施** - 与其他设备和资产相关的抽象物联网实体。例如车间，停车场，车辆；
* **警报** - 提示Device和Assets以及Entity发生的事件；
* **面板** - 通过Dashboards查看数据以及控制指定设备；
* **规则节点** - 通过消怎处理实体生命周期事件的单元；
* **规则链** - 规则节点的逻辑单元；

实体支持如下:

* **属性** - 与实体相关联的静态和半静态键值对。例如序列号，型号，固件版本；
* **遥测数据** - 可用于存储，查询和可视化的时间序列数据点。例如温度，湿度，电池电量;
* **关系** - 与其他实体的定向连接。例如包含，管理，拥有，生产。

此外，Device和Assets也具有一种类型。这允许区分它们并以不同方式处理与他们相关的数据。

本指南概述了上面列出的功能，一些有用的链接，以获取更多详细信息以及其用法的真实示例。

### 应用场景 <a href="#ying-yong-chang-jing" id="ying-yong-chang-jing"></a>

理解IOT平台各种概念的最简单方法是实现您的第一个IOT应用程序。

假设我们要构建一个应用程序，该应用程序从土壤湿度和温度传感器收集数据，在仪表板上可视化该数据，检测问题，发出警报并控制灌溉。

我们还假设我们想用数百个传感器支持多个领域。字段也可以分组到地理区域。

我们认为应该遵循以下逻辑步骤来构建这样的应用程序：

#### 步骤1: 实体和关系 <a href="#bu-zhou-1-shi-ti-he-guan-xi" id="bu-zhou-1-shi-ti-he-guan-xi"></a>

我们可以按图中的层次关系在平台中进行设置:

![](/files/-MK4GnAFmZujfw2eSoBI)


# 设备属性

平台能够为您的实体分配自定义属性并进行管理属性是一种key-value格式,由于key-value的灵活性可以与IoT设备无缝。

### 属性类型 <a href="#shu-xing-lei-xing" id="shu-xing-lei-xing"></a>

属性主要分为三种:

* **服务端属性** - 由服务器管理和维护。
  1. 在平台中使用Rules涉及某些机密数据对设备应用程序不可见。
  2. 在平台中使用Rules使用某些机密数据但设备不会使用。
  3. 在平台中任何实体都支持服务器端属性(如：Device,Asset,Customer,Tenant,Rules)。

* **客户端属性** - 查看设备特定的属性

* **共享属性** - 查看设备特定的属性

### 设备特定属性类型 <a href="#she-bei-te-ding-shu-xing-lei-xing" id="she-bei-te-ding-shu-xing-lei-xing"></a>

所有属性可以在规则引擎组件中使用；例如：(filters,processors,actions) 本指南概述了上面列出的功能以及相关链接，可以获取更多信息。

设备特定属性可分为两种:

* **客户端属性** - 属性由设备应用程序管理和维护。 例如：当前软件的固件版本，硬件规格等。
* &#x20;**共享属性** - 属性由服务器端应用程序管理和维护。 对设备是可见。（例如客户订阅，软件版本）


# 遥测数据

平台提供与遥测数据操作相关的API：

* **采集** 使用MQTT, CoAP或者HTTP协议采集设备数据。
* **存储** 在Cassandra（高效、可扩展、能容错的NoSQL数据库）中存储时序数据。
* **查询** 查询最新时序数据值，或查询特定时间段内的所有数据。
* **订阅** 使用websockets订阅数据更新(用于可视化或实时分析)。
* **可视化** 使用可配置和可配置的小部件以及仪表盘可视化时序数据。
* **过滤和分析** 使用灵活的规则引擎过滤和分析数据(/docs/user-guide/rule-engine/)。
* **事件警报** 根据采集的数据触发事件警报。
* **数据传输** 过规则引擎节点实现与外部数据交互（例如Kafka或RabbitMQ规则节点）。

本指南概述了上面列出的功能以及相关链接，可以获取更多信息。

![](/files/-MK4G7LavPBYjo_YZHbK)

### 设备遥测上传API <a href="#she-bei-yao-ce-shang-chuan-api" id="she-bei-yao-ce-shang-chuan-api"></a>

平台提供了上传Timeseries的key-value格式API。

key-value的灵活性可以与IoT设备无缝。

遥测上传API基于特定的网络协议。您可以在相应的参考页面中查看API和示例：

查看[**MQTT**](/xie-yi-jie-kou/mqtt-1)**协议**


# 设备警报

DDA-IOT云平台能够创建和管理应用中实体（devices, assets, customers）相关的alarm功能。

### Alarm生命周期

alarm在应用程中是一个具有有生命周期功能，可以清除和确认应用中的每一个alarm。默认情况下alarm是处于活动和待确认状态。

### Alarm的创建，类型和传播

alarm发起者应负责触发警报的相关实体。默认情况下，警报会传播到所有相关实体（仅父级关系）。通过创建时间，创建者和类型来标识alarm。同一类型和不能有两个活动的alarm。

### Alarm级别

alarm支持级别如下：危急（CRITICAL）, 重要（MAJOR）, 次要（MINOR）, 警告（WARNING,） 不确定（INDETERMINATE）

### Alarm更新

alarm实体可以通过外部应用程序或ThingsBoard规则进行更新。警报会同时跟踪清除和确认时间以及最新更改作为结束时间。

### Alarm REST API

平台提供REST API来管理和查询alarm。 有关更多详细信息，请参见演示环境 Alarm REST API和常规REST API文档。

### Alarm规则

通过平台规则引擎可以创建，更新和清除警报。

你可以通过以下链接了解更多Alarms相关信息:


# 物联网设备接入

物联网设备接入提供安全可靠的设备连接通信能力，通用的物联网传输协议，帮助用户将海量设备数据采集上IOT云，并且云端可以通过调用API，下发数据给设备，实现远程控制海量设备的目的。

### **设备多协议接入**

支持提供多种协议接入，例如MQTT、CoAP、HTTP、OPC-UA等，这样既能满足设备需要长连接保证实时性的需求，也能满足设备需要短连接降低功耗的需求。

### &#x20;**设备接入认证**

提供一机一密的设备认证机制，降低设备被攻破的安全风险，密钥的算法类型支持Access token和X509Certificates可配。

### &#x20;**安全传输**

支持MQTT(SSL)和HTTP(S)，支持单向和双向SSL标准的数据传输通道，保证数据的机密性和完整性。

### **双向通信**

提供设备与IOT云端的上下行通道，能够稳定可靠的支撑设备上报与指令下发设备的场景。

### **速率控制**

黑/白名配置，针对同一台设备秒极流控。


# 设备连接状态

### 功能概述 <a href="#gong-neng-gai-shu" id="gong-neng-gai-shu"></a>

平台设备状态服务负责监视设备连接状态并触发推送到**规则引擎的**的设备连接事件。平台开发者可以对相关事件出相关处理。

支持事件如下:

* **Connect event** - 设备连接到平台时触发。基于MQTT的会话传输和HTTP请求传输同时连接事件将在每一个HTTP请求上触发。
* **Disconnect event** - 设备与平台断开连接时触发。基于MQTT的会话传输和HTTP请求传输同时连接事件将在每一个HTTP请求上触发。
* **Activity event** - 通过属性(attribute update)或者rpc命令推送遥测数据。
* **Inactivity event** - 当设备指定时间内不活动时触发。请注意即使没有从设备断开连接事件也可能触发此事件。通常表示一段时间没有触发任何活动事件。
* 设备状态服务负责维护以下**服务端属性**属性:
* **active** - 表示当前设备状态为true或false;
* **lastConnectTime** - 表示设备最后一次连接到平台的时间，自1970年1月1日格林威治标准时间00:00:00以来的毫秒数
* **lastDisconnectTime** - 表示设备与平台断开连接的最后时间，自1970年1月1日格林威治标准时间00:00:00以来的毫秒数
* **lastActivityTime** - 表示设备上次推送遥测属性更新或rpc命令的时间，自1970年1月1日格林威治标准时间00:00:00以来的毫秒数
* **inactivityAlarmTime** - 表示上一次触发不活动事件的时间，自1970年1月1日格林尼治标准时间00:00:00以来的毫秒数

### 系统配置 <a href="#pei-zhi" id="pei-zhi"></a>

设备状态服务将全局配置参数用于不活动超时参数(state.defaultInactivityTimeoutInSec)在**iot.yml**中定义默认为10秒。

用户可以通过设置服务器端属性”inactivityTimeout”来覆盖单个设备的此参数（值以毫秒为单位）。

设备状态服务使用全局配置参数来检测不活动事件,参数(state.defaultStateCheckIntervalInSec)在**iot.yml**中定义默认为10秒。


# 物联网设备管理

物联网设备管理提供方便快捷的设备管理与监控能力，数据的采集管理，并可以自定义设备的属性、事件、告警条件，对设备进行远程调试、远程监控、远程维护等操作。

### **设备编解码配置**

设备上报数据时，如果“数据格式”为“二进制码流”，则该产品下需要进行编解码配置。

以NB-IoT场景为例，NB-IoT设备和物联网平台之间采用CoAP协议通讯，CoAP消息的payload为应用层数据，应用层数据的格式由设备自行定义。由于NB-IoT设备一般对省电要求较高，所以应用层数据一般不采用流行的JSON格式，而是采用二进制格式。但是，物联网平台与应用侧使用JSON格式进行通信。因此，开发者需要开发编码插件，供物联网平台调用，以完成二进制格式和JSON格式的转换。

### &#x20;**设备生命周期监控**

设备的网关的注册在线状态，连接时间，活动时间，活动中报警时间，超时时间，断开时间。

### **设备分配分组**

可以将设备分配或取消分配给特定的用户，也可以为设备创建分组，基于不同行业类型的传感归类并分组搜索或者管理您的海量设备。

### **设备关系拓扑**

您可以让子设备通过网关接入平台，并且可以基于设备的级联关系管理设备，例如，业务租户>场地设施>网关>中继>地磁。

### **设备数据采集(遥测数据采集)**

使用MQTT，CoAP，HTTP协议接入到平台并设备收集数据，将数据存储在时间序列型Cassandra中（高效的，可扩展的和容错的NoSQL数据库）或关系结构型MySql数据库中，数据包括遥测传感数据，和设备属性数据两种类型，同时您可以随时查询设备历史数据。

### **遥测数据的使用范围**

1．查询最近的设备采集数据值或指定时间间隔内的所有数据。

2．使用websockets订阅数据更新（用于可视化或实时分析）。

3．使用可配置和高度可定制的**仪表组件**用来渲染并保存到数据**仪表功能**来可视化设备采集的数据。

4．使用灵活的**规则引擎**过滤和分析数据，生成警报，或将数据转发推送到外部系统（例如第三方业务系统或MQTT，Kafka或RabbitMQ消息中间件）。

### **设备添加删除**

支持手动注册新设备或对无效或可疑设备进行远程禁用或者删除，避免可疑设备造成不必要的损失。

### **设备令牌管理(访问令牌)**

设备令牌用于和网关协议连接认证用，租户管理员能够管理设备令牌。支持基于访问access\_token令牌和X.509证书的凭据。（也可修改默认生成的access\_token值，用设备SN或其它做为令牌）

### **设备远程管理**

提供远程控制、远程读取、远程调试、远程升级、远程配置设备的能力，不需要连接设备串口，即可管理设备。

### **设备日志**

提供设备全链路日志监控，设备操作记录，实时知晓设备当前状态，监控设备并排除问题。

### &#x20;**告警管理**

提供创建和管理与租户，场地设施，设备有关的告警能力。允许实时警报监控和警报传播到相关实体层次结构。

### **告警生命周期**

警报有一个生命周期，每个警报都可以清除并确认。默认情况下，警报不处于活动和未确认状态。

### &#x20;**告警发起者/类型和传播**

报警发起者是负责触发报警的对象。默认情况下，警报会传播到所有相关实体（仅限父关系）。警报通过开始时间，发起人和类型来识别，同一类型和发起人不能有两个活动的警报。

### **告警严重性**

支持以下警报级别之一：关键，主要，次要，警告，不确定。

### **告警更新**

警报对象可能由外部应用程序或平台规则更新。警报会记录清楚和确认时间以及最后更改的结束时间。

### **报警REST API**

平台提供REST API来管理和查询警报。有关更多详细信息，请参阅演示环境Alarm REST API和常规[REST API文档](http://cloud.dda-iot.com/swagger-ui.html)。

### &#x20;**警报规则**

使用平台规则引擎可以根据业务规则配置需要的警报条件。


# 系统水平可伸缩性

满足在集群模式下动态添加新服务节点，更新或升级程序不影响线上服务正常运行。


# 系统容错

支持MQTT和HTTP协议的传输加密，支持设备认证和设备凭证管理。

提供了通过SSL运行MQTT服务器的功能，支持单向和双向SSL。要启用SSL，需要获取有效或生成自签名SSL证书并将其添加到密钥库。一旦添加，将需要在iot.yml文件中指定密钥库信息。请参阅关于如何生成SSL证书并在下面的平台安装中使用它的说明。如果已经拥有证书，则可以跳过证书生成步骤。


# 平台入驻


# 注册登录

`暂时未对外开放注册，需要联系管理员开通`

注册登录功能是IoT平台进行设备接入相关操作必须步骤。

### 用户注册 <a href="#yong-hu-zhu-ce" id="yong-hu-zhu-ce"></a>

在登录页面点击“点击注册”按钮，跳转至注册页面。用户选择用户类型（个人注册或企业注册），依次输入用户名、密码、确认密码和验证码。点击“立即注册”按钮可完成注册流程。

**【说明】**

```
  1. 用户名为邮箱格式，例如：xxx@Yun-iot.com；
  2. 密码校验格式为：8-20 个字符，需同时包含数字、字母、特殊符号（!@#$%^&*()等非空格），重复密码必须和第一次输入的密码保持一致；
  3. 注册成功后，用户类型不可修改。
```

### 用户登录 <a href="#yong-hu-deng-lu" id="yong-hu-deng-lu"></a>

用户在IoT 登录页面中输入由平台方提供的登录账号及密码，进行登录。

### 服务地址

### &#x20;<a href="#yong-hu-deng-lu" id="yong-hu-deng-lu"></a>


# 快速入门


# 业务使用全流程

### 开发流程

![](/files/-MPc9dBlz5kFC1c3r9c8)

### **1. 用户注册登录**

* 平台注册（[联系我们](https://www.yuncitys.com)）

若IoT 运行在多租户模式下，用户需要先在平台注册并且实名认证之后才能进行产品开发操作； 若IoT 作为某项目开发中的基础组件，请直接使用sysadmin账户，忽略此步骤。

### **2. 设备创建**

* [创建网关](/she-bei-jie-ru/chuang-jian-she-bei)

用户创建网关设备接入使用。

### **3.** [**工具模拟**](/kuai-su-ru-men/shi-yong-mo-ni-qi-ti-yan-quan-liu-cheng)**或接入真实**Yun**网关**

使用平台分配的网关KEY密钥，用[mqtt.fx](http://www.jensd.de/apps/mqttfx/1.7.0/mqttfx-1.7.0-windows-x64.exe)工具，用获取的网关"[**复制访问令牌**](/she-bei-jie-ru/chuang-jian-she-bei#huo-qu-fang-wen-ling-pai)"与IOT平台进行注册连接，并模拟数据进行MQTT通讯接入平台，实现在线调试;

也可以用真实的Yun网关，确定网关上电入网后，自动与IOT平台进行基于MQTT协议的连接。

### **4. 配置规则引擎**

如需要对数据进行特殊处理可配置用户[规则引擎](/shu-ju-chu-li-gui-ze-yin-qing)，默认直接使用预设好的系统规则。

![](https://gblobscdn.gitbook.com/assets%2F-Lv8u0uivkRn8UzKBg4R%2F-MPgBhOoF_M0UDwHbimz%2F-MPgCFVq6SBwdWWMtQT-%2Fimage.png?alt=media\&token=1f10a8ba-c4b9-4706-ae44-9a916ab22805)

### **6. 应用接入**

通过IoT 提供的规则引擎功能，用消息推送节点服务，北向应用进行开发接入。


# 使用模拟器体验全流程

本文通过使用MQTT.fx工具模拟器来模拟一个MQTT协议的网关设备，然后与数据平台进行访问，快速完成设备接入的流程，以方便用户快速熟悉平台各个功能的大致使用。

### 前提条件 <a href="#qian-ti-tiao-jian" id="qian-ti-tiao-jian"></a>

* 完成平台用户注册
* 在平台[创建设备](/she-bei-jie-ru/chuang-jian-she-bei)
* 从互联网下载好[MQTT.fx](http://www.jensd.de/apps/mqttfx/1.7.0/mqttfx-1.7.0-windows-x64.exe)客户端工具

### 安装软件

![成功后在自己的安装目录找到如下图标进行启动](/files/-MPcMWkn14Z17bqNeRv-)

### 启动打开后效果

![](/files/-MPcONwSdSP03IkJ3pUb)

### 弹出如下配置窗口

| 参数             | 说明                                   |
| -------------- | ------------------------------------ |
| Profile Name   | 输入您的自定义名称。                           |
| Profile Type   | 选择为MQTT Broker。                      |
| Broker Address | 接入地址：**47.106.149.52**。              |
| Broker Port    | 设置为1883。                             |
| Client ID      | 填写mqttClientId，用于MQTT的底层协议报文，保证唯一。   |
| General        | General栏目下的设置项可保持系统默认，也可以根据您的具体需求设置。 |

![](/files/-MPcMJ2BSwBrTCf4mmkE)

### 配置MQTT连接

Broker Address（MQTT代理服务地址）: **47.106.149.52** （DDA-IOT云平台v3.0服务地址）

Broker Port (MQTT代理服务端口)：**1883**

User Name(MQTT客户端，即网关与后台的MQTT服务器进行连接的令牌)：格式为网关的SN，也可通过"[**创建设备后复制访问令牌**](/she-bei-jie-ru/chuang-jian-she-bei#huo-qu-fang-wen-ling-pai)"进行获取。

![](/files/-MPcO1kYZObnJAMmnePD)

![](/files/-MPcOyzuebL37Xj_rcKY)

### 连接成功

![](/files/-MPcSiI1zRZ7BSotuv2H)

### 推送数据

我们可以开始简单用MQTT.fx工具模拟网关的MQTT协议向服务器发送一个终端遥测数据

**topic:**&#x20;

```
v1/gateway/telemetry
```

**payload:**

```
{
	"WG12345678": [{
		"ts": "1609144280398",
		"values": {
			"H": "60",
			"mode": "2",
			"NET4GSTA": "1,0",
			"mT": "3,0,2",
			"mFifo": "5528,5528,113,113",
			"DDA": "1",
			"boxSta": "0",
			"TH": "31.21,35.8",
			"NR": "42651,52212",
			"Lat": "-0.000000",
			"Lon": "-0.000000",
			"SDR": 1
		}
	}]
}
```

在上面的示例中我们"ts":"1609144280398"，是具有毫秒精度的[Unix时间戳](https://en.wikipedia.org/wiki/Unix_time)。例如：值’1609140420031’转换后是’2020-12-28 16:31:20’。

![](/files/-MPcV1m5Ktrz8RHnaO4h)

### 数据推送成功

以下为最终效果，通过模拟工具与后台进行连接并通过MQTT协议作数据推送

![](/files/-MPcVRKv2LFm3508UjGJ)

需要模拟更多其它数据内容请[参考应用开发者指南及协议API](/xie-yi-jie-kou)文档。


# 设备接入


# 创建设备

创建设备时，需要选择设备类型。平台目前支持三大类节点类型：设备、网关、中继。其中设备包括不同设备类型的传感器设备。

| 名称    | 解释                                                  |
| ----- | --------------------------------------------------- |
| 设备    | 指不能挂载子设备的设备。设备可以直连物联网平台，也可以作为网关的子设备，由网关代理连接物联网平台。   |
| 普通设备  | 不能挂载子设备，可以直接连接物联网平台。                                |
| 终端子设备 | 作为网关的子设备，由网关代理连接物联网平台。                              |
| 中继    | 可以挂载子设备，但必须由网关代理连接物联网平台，类似于主机设备。                    |
| 网关    | 指可以挂载子设备的直连设备。网关可以管理子设备、可以维持与子设备的拓扑关系，并将该拓扑关系同步到云端。 |

设备与平台连接拓扑图如下：

![](/files/-MPgIS_iZOXnNn1162Um)

### 创建网关

登录IoT 后，在左侧导航栏选择“设备管理”，点击右上角的“+”按钮，可添加设备，页面如下图所示，新增成功后在设备管理列表中可查看新创建的设备。

![](/files/-MPc17Jtbzp1U9uM-l5z)

### 添加网关

点"添加新设备"后弹出如下窗口，按截图指引进行网关创建。

![](/files/-MPc2unADR47K5C-P4MB)

### 设备列表

添加成功后如下图列表效果：

![](/files/-MPc3EKviXbYOobX5Nod)

### 设备详细

对创建的新设备进行详细查看，并获取**访问令牌**:

![](/files/-MPc4qePe-_ghSSJfVXf)

### **获取访问令牌**

![](/files/-MPhNwtAh0ExCw7MuZp4)


# 管理后台


# 业务租户

你可以将Yun-IOT云平台租户视为一个单独的业务实体：拥有或生产设备的个人或组织。

**系统管理员**可以创建租户实体

![](/files/-MK3sWwExRicmUWCqAaS)


# 客户管理

提供添加和管理客户的能力。允许创建普通用户，分配场地设施，分配设备，分配仪表板到用户所属。

![](/files/-MK3tbAmcD5V-riewzU1)

![](/files/-MK3uJKQUNNsxch-L0nM)

### **客户添加管理**

添加普通客户与基础信息可以将场地设备分配给特定的客户。这将允许客户用户使用REST API接口或可视化绑定获取场地设施的属性数据。

### **客户添加普通用户管理**

客户可以添加删除普通用户或直接登陆普通用户。

### &#x20;**场地设施/设备/仪表板分配给客户**

可以将场地设施/设备/仪表板分配给指定的客户。

### &#x20;**管理公共的场地设施/设备/仪表板**

可以将公共的场地设施/设备/仪表板分配给指定的客户。


# 客户用户

![](/files/-MK3vGW_S2U1M4fg_jFd)

![](/files/-MK3v-WeBpRHyh3cZQER)


# 场地设施

提供添加和管理场地设施的能力。允许配置场地设施的基础属性 并监控相关警报。能够使用关系构建与其它对象或设备的关联层次结构。

支持以下使用Web UI和REST API的资产管理功能。

* 添加和删​​除资产
* 获取资产ID
* 向客户分配资产
* 管理资产属性
* 浏览资产警报
* 浏览资产事件
* 管理资产关系

![](/files/-MK3vU3QYmuvzb_BAHQ6)

### **将场地设备分配给客户**

租户管理员可以将场地设备分配给特定的客户。这将允许客户用户使用REST API接口或可视化绑定获取场地设施的属性数据。

### &#x20;**场地设施属性管理**

租户管理员和客户用户可以管理场地设施的属性。

### **浏览场地设施报警**

租户管理员和客户用户可以浏览场地设施警报日志。

### &#x20;**浏览场地设施事件**

租户管理员和客户用户可以在“事件”选项卡浏览与特定场地设施相关的事件。生命周期事件和统计数据的事件日志记录。

### **管理场地设施关系**

租户管理员和客户用户可以管理场地设施的所属关联关系。


# 设备管理

支持以下设备管理功能。

* 添加和删​​除设备
* 管理设备凭证
* 获取设备ID
* 将设备分配给客户
* 浏览设备属性
* 浏览设备遥测
* 浏览设备警报
* 浏览设备事件
* 管理设备关系

### 设备列表

![](/files/-MPhH7k3fcAHyFOZm3_r)

### 设备详细信息

![](/files/-MK3wk3HL-GxlYU3tlx2)

### 设备对象属性

此类目为设备的属性包数据，以下为网关的终端组网档案属性信息。

![](/files/-MK3x-SUtTtiBgti4jHb)

### 对象数据

以下主要为终端的遥测数据，以及终端的下面各类数据包：

#### **心跳包**（键名称以“1\_xxx” 开头）

#### **数据包**（键名称以“2\_xxx” 开头）

#### **终端属性包**（键名称以“3\_xxx” 开头）

#### 查询响应包（键名称以“4\_xxx” 开头）

#### 复位包（键名称以“5\_xxx” 开头）

#### 状态包（键名称以“6\_xxx” 开头）

![](/files/-MK3x4um9vMQMTvcGUnd)

### 设备的关联与所属关系

可将设备绑定上层的父级对象，以级下层的子级对象，通过此配置，可以在可视界面中实现树形结构的列表展示效果。

![](/files/-MPhJP1Xum_AFwYYDFQV)

### 设备批量导入创建

![](/files/-MK3xQECcp-uwuYVOBNe)

### [添加设备](/she-bei-jie-ru)

![](/files/-MPhKCOjcDcHTnOB1b6n)

### 公开设备

![](/files/-MK3xgtgmJbbuieaqSi9)


# 网关管理

### 网关信息

![](/files/-MPDYcO_TRF1z2b-S8Rg)

### 网关报警信息：实时信息，历史记录

![](/files/-MPDbFP3cNcZa_bmIosi)

### 网关电源管理板信息：实时信息，历史记录

![](/files/-MPDbpW4evi9PWmnP5W9)

### 下行命令：读取命令，配置命令，控制命令，电源管理命令，自定义命令

![](/files/-MPDce1nznpkCnDCVfYp)


# 中继管理

### 基本信息

![](/files/-MPDg2KmVU6umeQjvZQO)

### 心跳信息

![](/files/-MPDgUp__vlbd593aaD3)

### 复位信息：实时信息，历史记录

![](/files/-MPDhbr0cwiJsvc5PdnJ)

### 状态信息：实时信息，历史记录

![](/files/-MPDiJFSHQLGpOnfE1Ir)

### DDA信息：DDA模块无线参数

![](/files/-MPDltrsvLy-ArKYypkC)

### 设备信息：属性信息，设备参数

![](/files/-MPDizQ-l88vqq2lZAYr)

### 电源管理板信息：版本信息，设备参数，设备状态

![](/files/-MPDjOJ_5Plr6OVKTN__)

### 下行命令：控制命令，配置命令

![](/files/-MPDjdllrBuoCmqaXKFt)


# 终端管理

### 终端属性信息

![](/files/-MPDr-yUU7sdISgsESxd)

### 心跳信息

![](/files/-MPDrPLPodURlLi_iuIF)

### 复位信息：实时信息，历史记录

![](/files/-MPDruaWt-sxxWo-pee0)

### 状态信息：实时信息，历史记录

![](/files/-MPDs4JSwcx-x0QFbRQG)

### 基本信息：产品基本信息，传感器基本信息

![](/files/-MPDsfL3F6xR7sJ9llVB)

### 电池信息

![](/files/-MPDsyb_50iRcEmyxcQ3)

### DDA模块信息

![](/files/-MPDtBTDwRvMo_mfnmJN)

### 下行命令：查询命令，控制命令

![](/files/-MPDtIEN9qHPwX1pNajX)


# 设备分布

### 地图上设备分布

![](/files/-MPDuOEYZcUA-mLjVq1w)


# 远程升级

![](/files/-MK3yNRwh4zh9Z732eI7)


# 实体视图

### 功能概述

实体视图功能它与SQL数据库的视图类似，Yun-IOT云平台实体视图限制了基础表向外公开数据的可见程度同时还限制了设备、资产**遥测**和**属性**向**客户**公开的可见程度。

租户管理员可以为每一个设备或创建多个视图（EV）并为之分配给不同的客户。

支持说明如下:

* 允许同时将指定设备或资产数据**共享**给多个客户，由于Yun-IOT云平台安全模型的限制以前的实体视图（EV）无法实现。
* 允许指定的用户查看采集的数据（例如：传感器数据），但隐藏调试信息例如电量、系统错误等。
* 设备即服务(**DaaS**)模型，表示设备在不同时间段收集的数据属于不同的客户。

### 架构 <a href="#jia-gou" id="jia-gou"></a>

实体视图包含如下信息:

* **TenantId** - 表示视图所属租户;
* **CustomerId** - 表示视图所属访问者;
* **EntityId** - 表示视图所属设备、资产;
* **Name and type** - 表示在ThingsBoard中进行常规搜索的字段;
* **Start and end time** - 表示目标设备遥测访问的时间间隔，客户将不可见超出时间间隔的实体;
* **Timeseries keys** - 表示可以访问数据序列键列表;
* **Attribute keys** - 表示可以访问的属性键列表;

![](/files/-MK4ETTz6McGy0lERPlr)

了解云平台如何处理遥测和属性及修改将如何影响实体视图。

**Timeseries data视图**

所有时间序列数据都保存在目标数据库中，将不会存在相同数据。当用户打开仪表板或通过EntityID执行RESTAPI调用时会发生如下操作:

* 通过验证请求的开始时间戳和结束时间戳并将有效数据进行返回，如果Dashboard获取1年的数据，但是实体视图（EV）配置为只能获取6个月的数据所以请求将只返回6个月数据。
* 通过验证请求时间序列数据的密钥将有效数据返回，如果Dashboard获取禁止视图的遥测键时将会失败。

**属性视图**

每次保存或更新该实体视图时，实体视图都会自动从目标实体复制指定的属性。出于性能原因，每次属性更改时，目标实体属性都不会传播到实体视图。您可以通过在规则链中配置“Copy to VIew”规则节点和“Post attributes”和“Attributes Updated”消息链接到新规则节点来启用自动传播。

![](/files/-MK4Ebu_7Xh3j7LMMU3_)


# 仪表组件

### 简介 <a href="#jian-jie" id="jian-jie"></a>

所有IoT仪表板都是使用平台中的部件库中定义的Widget进行构建。每个部件都提供对应功能让用户进行操作，例如数据可视化，远程设备控制，警报管理以及显示静态自定义html内容。

### 部件类型 <a href="#bu-jian-lei-xing" id="bu-jian-lei-xing"></a>

根据提供的功能每个部件窗口定义代表特定的部件类型窗口。平台提供五种类型：

* Latest values
* Time-series
* RPC (Control widget)
* Alarm widget
* Static

每种部件类型都有自己特定的数据源配置和相应的部件API。

每个小部件都需要数据源才能进行数据可视化。

可用数据源的类型取决于窗口部件的窗口部件类型：

* 目标设备 - RPC中使用此数据源类型。 基本上你需要为RPC部件指定目标设备
* 警报源 - 警报部件中使用此数据源类型. 此数据源要求源实体显示相关的警报和相应的警报字段。
* 实体 - 时间序列和最新值部件均使用此数据源类型. 基本上你需要指定目标实体和时间序列key或attribute名称。
* 函数 - 此数据源类型在时间序列和最新值部件中均用于调试。基本上你可以指定一个javascript函数，该函数将模拟设备中的数据以调整可视化效果。

### Latest values

显示特定实体属性或时间序列数据点的最新值（例如，任何“仪表”部件或“实体列表”部件）。这种小部件使用实体属性或时间序列的值作为数据源。

![](/files/-MK3zbfMf5M9cAiU4C5y)

以下是最新值部件的示例-显示当前功率值的数字仪表。

![](/files/-MK3zeiQhPdiN_KsOP4C)

### Time-series

显示选定时间段的历史值或特定时间窗口中的最新值（例如“时间序列-浮点”或“时间序列表”）。 这种部件仅将实体时间序列的值用作数据源。 为了指定显示值的时间范围，使用**Timewindow**设置。 可以在仪表板级别或部件级别指定Timewindow。 它可以是实时-动态更改某个最近间隔的时间范围，也可以是历史-固定历史时间范围。所有这些设置都是 **Time-series**窗口部件配置的一部分。

![](/files/-MK3zhjVTYdy4TFgDNus)

以下是时间序列部件的示例-“Timeseries - Flot”实时显示三个设备的安培数。

![](/files/-MK3ziv9YSjzUmzh4Yed)

### RPC (Control部件)

允许将RPC命令发送到设备并处理/可视化来自设备的答复（例如“ Raspberry Pi GPIO控制”）。通过将目标设备指定为RPC命令的目标端点来配置RPC窗口小部件。

![](/files/-MK3zkQMryGJg3oLOAk6)

以下是RPC小部件的示例-“基本GPIO控制”-发送GPIO切换命令并检测当前的GPIO切换状态。

![](/files/-MK3zldBGjKrWIFmx_Cz)

### Alarm部件

在特定时间窗口中显示与指定实体相关的警报（例如“警报表”）。 通过将实体指定为警报源和相应的警报字段来配置警报窗口小部件。 像**Time-series widgets**一样，警报部件具有时间窗口配置，以便指定显示警报的时间范围。另外，配置还包含“Alarm status”和“Alarms polling interval”参数。“ Alarm status”参数指定正在获取的警报的状态。“Alarms polling interval”控制警报获取频率（以秒为单位）。

![](/files/-MK3zn0Z63Jjj87YD6S3)

以下是“警报”窗口小部件的示例-“警报表”实时显示资产的最新警报

![](/files/-MK3zpNib2BIupgaJGWO)

### Static

显示静态的可定制html内容（例如“ HTML卡”）。静态小部件不使用任何数据源，通常通过指定静态html内容和可选的CSS样式进行配置

![](/files/-MK3zr4ooVrJsLNQVay2)

以下是一个静态小部件的示例-显示指定html内容的“ HTML卡”。

![](/files/-MK3zsIWTIeGaJF5mRX4)

&#x20;


# 组件库部件包

部件定义根据其用途分为部件包。有系统级别和租户级别的**部件包**。 最初的系统初始安装随附基本的系统级**部件包**。 现成可用的七个部件包中有三十多个部件。 系统级别部件包可以由**系统管理员管理**，并且可供系统中的任何租户使用。 租户级别部件包可以由**租户管理员管理**，并且只能由该租户及其客户使用。您始终可以按照本指南实施和添加小部件。

![](/files/-MK3zy-Zr5ToEKd5rH_e)

### **仪表组件(可视化组件库)**

为物联网数据分析提供丰富的数据可视化组件库，组件类型越丰富，数据可视化的呈现效果将越丰富，所有组件仪表支持平台在线开发定制。

### **1. 数字仪表盘控件**

![](/files/-MK3cimmmgwLFqrMCeSq)

### **2. 模拟仪表盘类控件**

![](/files/-MK3cksaihM4-l9pdNe1)

### **3. 卡片列表类控件**

![](/files/-MK3cmbFMd19XHM39KZw)

### **4. 图形统计类控件**

![](/files/-MK3co3nhmJNxDy588xw)

### **5. 开关控制部件**

![](/files/-MK3cpm-fJHKDuTufph6)

### **6. GPIO控件**

![](/files/-MK3cr7_Me2FSID6aLPd)

### **7. 地图控件**

![](/files/-MK3cs_W73sh5cEYLYSO)

### **警告列表部件**

![](/files/-MK4-d9Gd89JD30Jga_7)


# 开发自定义组件

允许开发者用户在云平台上开发自定义的组件

![](/files/-MK4KibmO-uUXo9bPrFc)

### **组件库的集成（开发人员）**

组件库的维护需要掌握前端开发js基础语法，进行前端模板的开发与集成，组件库的完善性，将提高设备数据可视化效果，为方便客户自定义组件效果，平台集成在线IDE环境，所有组件在IOT平台都可在线的开发与调试程序效果。

### **基本小组件JS API**

所有与窗口小部件相关的代码都位于JavaScript部分。作为对小部件实例的引用的内置变量self也是可用的。应将每个窗口小部件函数定义为自变量的属性。&#x20;

自变量具有属性ctx - 对窗口小部件上下文的引用，其具有窗口小部件实例使用的所有必需的API和数据。

以下是窗口小部件上下文属性的简要说明

| **Property**        | **Type**      | **js函数**                                            |
| ------------------- | ------------- | --------------------------------------------------- |
| $container          | jQuery Object | 小部件的容器元素。可用于使用jQuery API动态访问或修改窗口小部件DOM。            |
| $scope              | Object        | 当前窗口小部件元素的角度范围对象。使用Angular方法构建窗口小部件时，可用于访问/修改范围属性。  |
| width               | Number        | widget容器的当前宽度（以像素为单位）                               |
| height              | Number        | 窗口小部件容器的当前高度，以像素                                    |
| isEdit              | Boolean       | 指示仪表板是处于视图还是编辑状态。                                   |
| isMobile            | Boolean       | 指示仪表板视图是否小于960px宽度（默认移动断点）。                         |
| widgetConfig        | Object        | 包含颜色（文本颜色），backgroundColor（窗口小部件背景颜色）等属性的常用窗口小部件配置。 |
| settings            | Object        | 根据定义的设置json模式包含小部件特定属性的小组件设置                        |
| units               | String        | 可选属性定义单元格显示的值的文本。适用于简单的小部件，如卡片或仪表。                  |
| decimals            | Number        | 可选属性，用于定义应使用多少个位置来显示值编号的小数部分。                       |
| hideTitlePanel      | Boolean       | 管理小部件标题面板的可见性。适用于具有自定义标题面板或不同状态的小部件。                |
| defaultSubscription | Object        | 请参阅订阅对象                                             |
| timewindowFunctions | Object        | 请参阅Timewindow功能                                     |
| controlApi          | Object        | 请参阅Control API                                      |
| actionsApi          | Object        | 请参阅Actions API                                      |
| stateController     | Object        | 见状态控制器                                              |

为了实现新的小部件，应该定义以下JavaScript函数（注意：每个函数都是可选的，可以根据小部件特定/行为来实现）：

![](/files/-MK3cznZJzBn4KwyddeK)

| **Function函数**             | **描述**                                                              |
| -------------------------- | ------------------------------------------------------------------- |
| onInit()                   | 当widget准备好初始化时调用的第一个函数。应该用于准备小部件DOM，处理小部件设置和初始订阅信息。                 |
| onDataUpdated()            | 在窗口小部件订阅中提供新数据时调用。可以从窗口小部件上下文（**ctx**）的defaultSubscription对象访问最新数据。 |
| onResize()                 | 调整窗口小部件容器的大小时调用。最新的宽度和高度可以从窗口小部件上下文（**ctx**）获得。                     |
| onEditModeChanged()        | 更改仪表板编辑模式时调用。最新模式由**ctx**的isEdit属性处理。                               |
| onMobileModeChanged()      | 仪表板视图宽度越过移动断点时调用。最新状态由**ctx**的isMobile属性处理。                         |
| onDestroy()                | 在widget元素被销毁时调用。如有必要，应该用于清理所有资源。                                    |
| getSettingsSchema()        | 可选函数返回窗口小部件设置架构json，作为Settings schema部分的**Settings选项卡**的替代。         |
| getDataKeySettingsSchema() | 可选函数返回特定数据键设置架构json，作为“设置架构”部分的“ **数据键设置架构”**&#x9009;项卡的替代。         |
| typeParameters()           | 重新描述描述窗口小部件数据源参数的对象。请参见类型参数对象。                                      |
| actionSources()            | 重新描述描述用于定义用户操作的可用窗口小部件操作源的对象。                                       |

### **动作JS API**

一组API函数，用于处理用户定义的操作。

| **Function函数**                                               | **描述**                                                                                                            |
| ------------------------------------------------------------ | ----------------------------------------------------------------------------------------------------------------- |
| getActionDescriptors(actionSourceId)                         | 返回提供的actionSourceId的操作描述符列表                                                                                       |
| handleWidgetAction($event, descriptor, entityId, entityName) | 处理特定动作源产生的动作。$ event - 与action，descriptor - action descriptor，entityId和entityName相关联的事件对象- 当前实体id和动作源提供的名称（如果可用）。 |

### **小部件代码调试技巧**

最简单的调试方法是Web控制台输出。只需将[console.log（...）](https://developer.mozilla.org/en-US/docs/Web/API/Console/log)函数放在widget JavaScript代码的任何部分中。然后单击“运行”按钮以重新启动小部件代码并在Web控制台中观察调试信息。

### &#x20;**窗口小部件类型**

根据提供的功能，每个窗口小部件定义表示特定窗口小部件类型,目前有五种小部件类型：**最新值,时间序列,RPC（控件小部件）,报警小工具,静态的。**

每种小部件类型都有自己的特定数据源配置和相应的小部件API。每个小部件都需要数据源来进行数据可视化。可用数据源的类型取决于窗口小部件的窗口小部件类型：

**目标设备** - 此数据源类型用于RPC。基本上，您需要为RPC小部件指定目标设备

**警报源** - 此数据源类型用于警报窗口小部件。该数据源要求源实体显示相关的警报和相应的警报字段。

**实体** - 此数据源类型用于时间序列和最新值窗口小部件。基本上，您需要指定目标实体和时间序列键或属性名称。

**函数** - 此数据源类型用于时间序列和最新值小部件以用于调试目的。基本上，您可以指定一个javascript函数，该函数将模拟设备中的数据以调整可视化。


# 数据仪表

根据不同场景传感器的数据特征，我们可以将设备采集的数据在平台中提供的30个以上可配置可视化组件组件部件绑定,并渲染成以下我们根据不同业务场景所创建的可视化效果

对于数据可视界面的制作可通过[设备实践](/chuang-jian-ke-shi-ying-yong-jie-mian/she-bei-shi-jian)学习更多

![](/files/-MK42n0AASURQpMSjqjn)

![](/files/-MK448yuwgwFZ0ry4dnq)

![](/files/-MK43uhh68n4D_EvBfxo)

![](/files/-MK44-gyl66IRy4Nmgbk)


# 操作日志

此功能可以查询当前用户下的所有操作，比如想知道什么时间点对某个设备是否做操作，可以通过以下界面，过滤出类型为 “RPC调用”的数据，并通过点击“详情”查看具体的操作，如下发的命令操作。

![](/files/-MK44R1HYhaMQSB23Odv)

![](/files/-MK44V8I9xdX7bVEpeJx)


# 流量监控

![](/files/-MPgKB0ngds-oHnKWnET)


# 规则引擎


# 什么是规则引擎?

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


# 规则引擎概述

规则引擎是对于处理复杂的事件具有灵活配置和高度定制化的特点。

您可以使用规则引擎的Filter、Enrichment和Transform节点通过设备和相关资产发出输入消息。

您可以使用规则引擎的Action、Externala节点触发各种操作与通信。

### 概念 <a href="#gai-nian" id="gai-nian"></a>

**规则引擎消息**

规则引擎消息可以被被序列化并有着规定的数据结构同时可以表示系统中的各种消息。

例如：

* 设备**遥测**、**属性**更新或**RPC调用**;
* 实体生命周期事件: created、updated、deleted、assigned、unassigned、属性更新;
* 设备状态事件: connected, disconnected, active, inactive, etc;
* 其他事件。

规则引擎消息包含以下信息:

* 消息ID：基于时间的通用唯一标识符;
* 消息发起者：Device，Asset或其他Entity标识符;
* 消息类型：遥测或不活动的事件等;
* 消息负载：消息payload的JSON字符串;
* 元数据：键值对的列表以及与消息有关的其他数据.

**规则节点**

规则节点是规则引擎的基本组件每次处理单个输入消息并生成一个或多个输出消息。

规则节点是规则引擎的主要逻辑单元。

规则节点可以是Filter、Enrichment、Transform输入消息或者是执行Action与External节点对外部系统进行通信。

**规则节点关系**

规则节点之间存在关联性每个节点都有对应关系类型，用于标识关系的逻辑标签。

当规则节点生成输出消息时，它总是将消息路由到下一个指定的节点并通过关系类型进行关联。

表示成功与否的规则节点关系是**Success**和**Failure**。

表示逻辑运算的规则节点可以是**True**或**False**。

一些特定的规则节点可能使用完全不同的关系类型例如：“Post Telemetry”、“Attributes Updated”、“Entity Created”等。

**规则链**

规则链是规则节点及其关系的逻辑组；例如：下面的规则链将：

* 将所有遥测消息保存到数据库中;
* 如果消息中的温度字段高于50度，则发出“高温警报”;
* 如果消息中的温度字段低于-40度，则发出“低温警报”;
* 如果在脚本中发生逻辑或语法错误时，则无法执行温度脚本检查控制台记录。

![](/files/-MK47vYhqgVxjFUD3bm4)

租户管理员可以定义一个**Root Rule Chain**还可以定义多个其他规则链。根规则链处理所有输入的消息，并将其转发到其他规则链以进行其他处理。

例如：

* 如果消息中的温度字段高于50度，则发出“高温警报”；
* 如果消息中的温度字段小于50度，则清除“高温警报”
* 将有关“已创建”和“已清除”警报的事件转发到外部规则链，该规则链处理向相应用户的通知。

![](/files/-MK47z_UK9H9Ra_Aw2hz)

**消息处理结果**

有三种消息处理结果：成功、失败和超时。

当消息被规则引擎中所有节点处理成功，那么该消息将被标注为”Success”。

当消息被规则引擎中任一节点处理失败，那么此消息将被标记”Failure”。

当处理超过配置的阈值时将消息标记为“Timeout”。

可能存在的情况参见下图：

![](/files/-MK483uDFflckMz_NGP9)

如果”Transformation”脚本失败则该消息不会标记为”Failed”，因为存在与”Failure”关系连接到”Save to DB”节点。

如果”Transformation”脚本成功则将通过REST API调用将其推送到”External System”。

如果外部系统阻塞则REST API调用可能会“等待”一段时间。

假设消息处理超时为20秒忽略Transformation脚本的执行的小于1毫秒时间。

如果”External System”在20秒内回复则消息将被成功处理。

如果”Save to DB”调用成功则消息将被成功处理。

如果外部系统在20秒内未答复将消息标记为”timed-out”。

如果”Save to DB”调用失败将该消息将标记为失败。

**规则引擎队列**

规则引擎在启动时订阅队列并轮询消息，总是有”Main”主题作为消息的入口。

您可以在Thingsboard.yml或环境变量配置多个队列，配置完成后您可以用”Checkpoint”节点将消息放置到另一个主题，并自动确认当前主题中的对应消息。

队列的定义由以下参数组成：

* name - 用于统计和记录；
* topic - 队列实现用于生成和使用消息；
* poll-interval - 如果没有新消息到达则两次轮询之间的持续时间（以毫秒为单位）；
* partitions - 队列关联的分区数用于扩展并行处理的消息数；
* pack-processing-timeout - 处理消费者返回的特定消息包时间间隔（以毫秒为单位）；
* submit-strategy - 定义向规则引擎提交消息的逻辑和顺序，请参阅下面的段落。
* processing-strategy - 定义消息确认的逻辑，请参阅下面的段落。

**提交策略**

规则引擎服务不断轮询主题一旦有返回消息它就会创建TbMsgPackProcessingContext对象。

有5种策略控制如何提交TbMsgPackProcessingContex消息到规则链：

* BURST - 所有消息按到达的先后顺序提交到规则链。
* BATCH - 使用”queue.rule-engine.queues\[queue index].batch-size” 配置参数将消息分组切片在确认之前的切片之前不会提交新切片。
* SEQUENTIAL\_BY\_ORIGINATOR - 消息在特定实体（消息发起者）内按顺序提交消息；例如：在确认设备A的上一个消息之前不会提交设备A的新消息。
* SEQUENTIAL\_BY\_TENANT - 消息在租户（消息发起者的所有者）内按顺序提交消息；例如：在确认租户A的上一个消息之前不会提交租户A的新消息。
* SEQUENTIAL - 这是一个处理相当慢的消息处理，消息按顺序提交在确认上一个消息之前不会提交新消息。

**处理策略**

有5种策略控制消息失败或超时的重新处理方式：

* SKIP\_ALL\_FAILURES - 如果忽略所有故障和超时会导致消息丢失；例如：如果DB关闭消息将不会保存可以标记为”acknowledged(已确认)”并从队列中删除，此策略是为了兼容以前的版本和开发及演示。
* RETRY\_ALL - 重试处理所有消息；如果100条消息中有1条将失败策略将重新处理（重新提交到规则引擎）100条消息。
* RETRY\_FAILED - 重试处理所有失败的消息；如果每100条消息中有1条失败策略将仅重新处理（重新提交到规则引擎）1条消息同时超时的消息将不会重新处理。
* RETRY\_TIMED\_OUT - 重试处理所有超时消息；如果每100条消息中有1条超时策略将仅重新处理（重新提交到规则引擎）1条消息同时失败的消息将不会被重新处理。
* RETRY\_FAILED\_AND\_TIMED\_OUT - 重试处理所有失败和超时的消息。

所有”RETRY\*“策略都支持配置参数：

* retries - 重试次数，0表示无限。
* failure-percentage - 如果失败或超时少于消息的X百分比则跳过重试;
* pause-between-retries - 在重试之前在线程中等待时间（以秒为单位）；

**默认队列**

基于提交和处理策略的不同队列配置了三个默认：Main、HighPriority和SequentialByOriginator。

规则引擎处理主题中的消息并可以选择使用”Checkpoint”规则节点将其放入其他主题；默认情况下主题只忽略失败的消息这样做的目的是为了让以前的版本向后兼容，但是您需要自行承担重新配置带来的风险。

请注意：如果由于规则节点脚本中的某些故障而有未处理的消息则可能会阻止处理下一条消息。

我们已经设计了特定的仪表板监视规则引擎的处理和故障。

HighPriority主题用于传递警报或处理步骤在发生故障的情况下HighPriority主题中的消息会不断进行重新处理直到消息处理成功为止。

如果SMTP服务器或外部系统中断规则引擎将重试消息发送直到处理完成为止。

如果您想确保正确的消息处理顺序SequentialByOriginator主题很重要对来自同一实体的消息将按照到达队列的先后顺序进行处理，在确认相同实体ID的上一条消息之前规则引擎不会向规则链提交新消息。

### 预定义消息类型 <a href="#yu-ding-yi-xiao-xi-lei-xing" id="yu-ding-yi-xiao-xi-lei-xing"></a>

预定义消息类型列表：

| **类型**                              | **显示名称**                    | **描述**                               | **元数据**                                                                                                                                                                                    | **payload**                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |
| ----------------------------------- | --------------------------- | ------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| POST\_ATTRIBUTES\_REQUEST           | **属性发布**                    | 发布设备客户端属性 (参见属性API)                  | <p><strong>deviceName</strong> - 设备名称,<br><strong>deviceType</strong> - 设备类型</p>                                                                                                           | <p>键/值<br><code>{</code><br>  <code>"currentState": "IDLE"</code><br><code>}</code></p>                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |
| POST\_TELEMETRY\_REQUEST            | **遥测发布**                    | 发布设备遥测数据(参见遥测api)                    | <p><strong>deviceName</strong> - 设备名称,<br><strong>deviceType</strong> - 设备类型,<br><strong>ts</strong> - 时间戳 (毫秒)</p>                                                                        | <p>键/值<br><code>{</code><br>  <code>"temperature": 22.7</code><br><code>}</code></p>                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |
| TO\_SERVER\_RPC\_REQUEST            | **RPC Request from Device** | 设备RPC请求(参见客户端rpc api)                | <p><strong>deviceName</strong> - 设备名称,<br><strong>deviceType</strong> - 设备类型,<br><strong>requestId</strong> - RPC请求Id</p>                                                                  | <p>包含<strong>方法</strong>和<strong>参数</strong>的json:<br><code>{</code><br>  <code>"method": "getTime",</code><br>  <code>"params": { "param1": "val1" }</code><br><code>}</code></p>                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |
| RPC\_CALL\_FROM\_SERVER\_TO\_DEVICE | **服务端RPC响应**                | 响应RPC请求(参见服务端rpc api)                | <p><strong>requestUUID</strong> - sustem表示内部应答的请求id,<br><strong>expirationTime</strong> - 请求过期时间,<br><strong>oneway</strong> - 指定请求类型: true - 无响应, false - 有响应</p>                         | <p>包含<strong>方法</strong>和<strong>参数</strong>的json:<br><code>{</code><br>  <code>"method": "getGpioStatus",</code><br>  <code>"params": { "param1": "val1" }</code><br><code>}</code></p>                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |
| ACTIVITY\_EVENT                     | **活动事件**                    | 表明设备处于活动状态的事件                        | <p><strong>deviceName</strong> - 设备名称,<br><strong>deviceType</strong> - 设备类型</p>                                                                                                           | <p>包含设备活动信息的json:<br><code>{</code><br>  <code>"active": true,</code><br>  <code>"lastConnectTime": 1526979083267,</code><br>  <code>"lastActivityTime": 1526979083270,</code><br>  <code>"lastDisconnectTime": 1526978493963,</code><br>  <code>"lastInactivityAlarmTime": 1526978512339,</code><br>  <code>"inactivityTimeout": 10000</code><br><code>}</code></p>                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |
| INACTIVITY\_EVENT                   | **不活动事件**                   | 表示设备处理非活动状态的事件                       | <p><strong>deviceName</strong> - 设备名称,<br><strong>deviceType</strong> - 设备类型</p>                                                                                                           | 设备活动信息的json**活动事件** payload                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |
| CONNECT\_EVENT                      | **连接事件**                    | 设备连接时的事件                             | <p><strong>deviceName</strong> - 设备名称,<br><strong>deviceType</strong> - 设备类型</p>                                                                                                           | 设备活动信息的json**活动事件** payload                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |
| DISCONNECT\_EVENT                   | **断开事件**                    | 设备断开连接产生的事件                          | <p><strong>deviceName</strong> - 设备名称,<br><strong>deviceType</strong> - 设备类型</p>                                                                                                           | 设备活动信息的json**活动事件** payload                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |
| ENTITY\_CREATED                     | **实体创建**                    | 实体创建产生的事件                            | <p><strong>userName</strong> - 实体创建的用户名,<br><strong>userId</strong> - 用户Id</p>                                                                                                             | <p>实体详细信息的json:<br><code>{</code><br>  <code>"id": {</code><br>    <code>"entityType": "DEVICE",</code><br>    <code>"id": "efc4b9e0-5d0f-11e8-8559-37a7f8cdca74"</code><br>  <code>},</code><br>  <code>"createdTime": 1526918366334,</code><br>  <code>...</code><br>  <code>"name": "my-device",</code><br>  <code>"type": "temp-sensor"</code><br><code>}</code></p>                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |
| ENTITY\_UPDATED                     | **实体更新**                    | 更新实体产生的事件                            | <p><strong>userName</strong> - 更新实体的用户名,<br><strong>userId</strong> - 用户Id</p>                                                                                                             | 实体详细信息的json:参见**实体创建** payload                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |
| ENTITY\_DELETED                     | **实体删除**                    | 删除实体产生的事件                            | <p><strong>userName</strong> - 删除实体的用户名,<br><strong>userId</strong> - 用户Id</p>                                                                                                             | 实体详细信息的json:参见**实体创建** payload                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |
| ENTITY\_ASSIGNED                    | **实体分配**                    | 实体分配给客户时生的事件                         | <p><strong>userName</strong> - 分配实体的用户名,<br><strong>userId</strong> - 用户Id,<br><strong>assignedCustomerName</strong> -分配的客户名,<br><strong>assignedCustomerId</strong> - 客户Id</p>            | 实体详细信息的json:参见**实体创建** payload                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |
| ENTITY\_UNASSIGNED                  | **取消实体分配**                  | 取消实体对客户分配时产生的事件                      | <p><strong>userName</strong> - 取消分配操作的用户名,<br><strong>userId</strong> - 用户Id,<br><strong>unassignedCustomerName</strong> - 取消配客户名称,<br><strong>unassignedCustomerId</strong> - 取消配客户Id</p> | 实体详细信息的json:参见**实体创建** payload                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |
| ADDED\_TO\_ENTITY\_GROUP            | **添加分组**                    | 将实体添加到实体分组时产生的事件。 仅用于ThingsBoard PE。 | <p><strong>userName</strong> - 操作的用户名,<br><strong>userId</strong> - 用户Id,<br><strong>addedToEntityGroupName</strong> - 分组名称,<br><strong>addedToEntityGroupId</strong> - 分组Id</p>           | payload为空                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |
| REMOVED\_FROM\_ENTITY\_GROUP        | **移除分组**                    | 移除分组。仅用于ThingsBoard PE。              | <p><strong>userName</strong> - 操作的用户名,<br><strong>userId</strong> - 用户Id,<br><strong>removedFromEntityGroupName</strong> - 分组名称,<br><strong>removedFromEntityGroupId</strong> - 分组Id</p>   | payload为空                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |
| ATTRIBUTES\_UPDATED                 | **属性更新**                    | 实体属性更新时产生的事件                         | <p><strong>userName</strong> - 操作的用户名,<br><strong>userId</strong> - 用户Id,<br><strong>scope</strong> - 属性更新作用 ( <strong>SERVER\_SCOPE</strong>或<strong>SHARED\_SCOPE</strong>)</p>          | <p>键/值json:<br><code>{</code><br>  <code>"softwareVersion": "1.2.3"</code><br><code>}</code></p>                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |
| ATTRIBUTES\_DELETED                 | **属性删除**                    | 实体属性删除时产生的事件                         | <p><strong>userName</strong> - 操作的用户名,<br><strong>userId</strong> - 用户Id,<br><strong>scope</strong> - 属性删除作用 (<strong>SERVER\_SCOPE</strong>或<strong>SHARED\_SCOPE</strong>)</p>           | <p>已删除的<strong>属性</strong>的keys列表:<br><code>{</code><br>  <code>"attributes": \["modelNumber", "serial"]</code><br><code>}</code></p>                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |
| ALARM                               | **警报事件**                    | 创建、更新或删除警报时产生的事件                     | <p>消息发起者元数据中的所有字段<br><strong>isNewAlarm</strong> - 创建了一个新的Alram，则为true<br><strong>isExistingAlarm</strong> - 已存在警报，则为true<br><strong>isClearedAlarm</strong> - 清除了警报，则为true</p>            | <p>创建警报的json详细信息:<br><code>{</code><br>  <code>"tenantId": {</code><br>     <code>...</code><br>  <code>},</code><br>  <code>"type": "High Temperature Alarm",</code><br>  <code>"originator": {</code><br>     <code>...</code><br>  <code>},</code><br>  <code>"severity": "CRITICAL",</code><br>  <code>"status": "CLEARED\_UNACK",</code><br>  <code>"startTs": 1526985698000,</code><br>  <code>"endTs": 1526985698000,</code><br>  <code>"ackTs": 0,</code><br>  <code>"clearTs": 1526985712000,</code><br>  <code>"details": {</code><br>    <code>"temperature": 70,</code><br>    <code>"ts": 1526985696000</code><br>  <code>},</code><br>  <code>"propagate": true,</code><br>  <code>"id": "33cd8999-5dac-11e8-bbab-ad47060c9431",</code><br>  <code>"createdTime": 1526985698000,</code><br>  <code>"name": "High Temperature Alarm"</code><br><code>}</code></p> |
| REST\_API\_REQUEST                  | **REST API请求到规则引擎**         | 执行REST API调用时产生的事件                   | <p><strong>requestUUID</strong> - 请求id,<br><strong>expirationTime</strong> - 请求过期时间</p>                                                                                                    | json请求的playload                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |

### 规则节点类型 <a href="#gui-ze-jie-dian-lei-xing" id="gui-ze-jie-dian-lei-xing"></a>

根据其性质将所有可用规则节点分组：

* **Filter Nodes**用于消息过滤和路由;
* **Enrichment Nodes**用于更新传入消息的元数据;
* **Transformation Nodes**用于更改传入的消息字段，例如Originator, Type, Payload, Metadata;
* **Action Nodes**根据传入的消息执行各种动作;
* **External Nodes**用于与外部系统进行交互.

### 配置 <a href="#pei-zhi" id="pei-zhi"></a>

每一个规则节点具有特定的参数配置，例如：Filter节点可以通过自定义JS函数。External节点可以通过参数配置实现外部邮件服务器连接设置

可以通过在“规则链”编辑器中双击节点来打开“规则节点”配置窗口：

![](/files/-MK48UKr7OkICTjJSDlS)

#### Javascript函数 <a href="#javascript-han-shu" id="javascript-han-shu"></a>

一些规则节点具有特定的UI功能，允许用户测试JS函数。单击**Test Filter Function**后，您将看到JS编辑器，可使用该编辑器替换输入参数并验证函数的输出。

![](/files/-MK48Y_DJ6yt4_i5btjb)

你可以定义:

* **Message Type** 左上角.
* **Message payload** 左侧中间.
* **Metadata** 右上角.
* **JS script** 实际脚本.

点击**Test**按钮将在右侧**Output**返回值

### 规则引擎统计 <a href="#gui-ze-yin-qing-tong-ji" id="gui-ze-yin-qing-tong-ji"></a>

ThingsBoard已经为“规则引擎”统计信息准备了“默认”仪表板。

将为每个租户自动加载此仪表板。统计信息收集默认情况下处于启用状态，并通过配置属性进行控制。

您可能会在下面的仪表板上注意到有关处理错误及其原因的见解：

![](/files/-MK48fZRoAFoMhc3D_K2)

### 调试 <a href="#tiao-shi" id="tiao-shi"></a>

启用调试后，只要相应的关系类型，用户就可以查看传入和传出消息的信息。请参阅下图，获取示例调试消息视图：

![](/files/-MK48jV61joba0CwgX4a)

### 导入导出 <a href="#dao-ru-dao-chu" id="dao-ru-dao-chu"></a>

您可以将规则链导出为JSON格式，并将其导入到相同或其他ThingsBoard实例。 为了导出规则链，您应该导航到**Rule Chains**页面，然后单击位于特定规则链卡上的导出按钮。

![](/files/-MK48muERURKb-qrRUxR)

类似地，要导入规则链，您应该导航到**Rules Chains**页面，然后单击屏幕右下角的大“ +”按钮，然后单击导入按钮。<br>


# 数据规则引擎

![](/files/-MK3_9tkH1PnIBACvr23)

### **1. 过滤器引擎**

![](/files/-MK3_NIvBvj4LolvRvRR)

基于规则引擎可以配置**过滤器引擎**下提供的子节点，实现设备传入消息的过滤，控制数据的逻辑节点流向。

### **2. 属性引擎**

![](/files/-MK3_QNZN-f-EWSe0xYf)

基于规则引擎可以配置**属性引擎**下提供的子节点，实现设备传入属性的数据获取。

### **3. 数据转换引擎**

![](/files/-MK3_SOA_bA0f4VYAx-Y)

基于规则引擎可以配置**数据转换引擎**下提供的子节点，实现设备传入数据的函数运算与边缘计算。

### **4. 动作触发引擎**

![](/files/-MK3_URpEJawhHLtprhX)

基于规则引擎可以配置**动作触发引擎**下提供的子节点，实现设备传入消息的各种规则处理完后，根据动作需要创建特定的触发操作，

使用场景示例：

l 通过**创建警报**节点根据配置设备阀值做邮件**告警**通知，同时通过，**RPC调用**节点实现**M2M**，设备对设备的级联控制，实现物联操作下的场景联动。

l 通过**生成器节点**创建**虚拟设备**，模拟真实设备参数，推送数据做接入调试或业务测试。

### **5. 外部推送引擎**

![](/files/-MK3_Wp-c2Qc6D5eLrn0)

基于规则引擎可以配置**外部推送引擎**下提供的子节点，实现将IOT平台上设备传入的消息，进行转发与推送到外部MQ消息队列或第三方业务系统。

使用场景示例：

l 通过**MQTT**节点，配置好外部的mqtt服务地址，将IOT平台上设备的数据发布推送到外部的停车业务系统上进行数据订阅。其它节点使用场景类似。

### **6. 规则链调用引擎**

![](/files/-MK3_YeqFVG5bVUXRXqo)

基于规则引擎可以配置**规则链调用引擎**下提供的子节点，实现规则链节点之间的相互调用，更好的实现不同规则链方法封装与解藕。

### **7. 规则导入/导出**

不同的业务租户下可以创建自己不同的规则节点，可以将规则导出为JSON格式并将其导入平台的其它租户下使用。


# 规则链功能节点


# Filter

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

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

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

![](/files/-MK496JpIB8_xUWr2PM9)

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

![](/files/-MK49AAaF-qcdCskIikF)

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

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

![](/files/-MK49ZdiezOQLi2-NeKM)

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

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

![](/files/-MK49aQxdAaq87BVDxcL)

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

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

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

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

![](/files/-MK49fqKjJRQXCKSYTYE)

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

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

![](/files/-MK49kV9HNc52LPrsX6r)

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

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

![](/files/-MK49lphJPHX-qmfkgOm)

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

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

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

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

![](/files/-MK49o72-Ze08HRzuuAe)

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

![](/files/-MK49q4m7cKkKrItJnLJ)

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

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

![](/files/-MK49uDs99ScRiXvYXdG)

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

### **脚本**

![](/files/-MK4A-42PltvhWoMph9Q)

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

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

· **msg** - 消息payload

· **metadata** - 消息metadata

· **msgType** - 消息类型

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

![](/files/-MK4A0w_UFxQMt_3XcG5)

消息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;
```

### **交换**

![](/files/-MK4AI3FSlGUXTvrDYQY)

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

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

· **msg** - 消息payload

· **metadata** - 消息metadata

· **msgType** - 消息类型

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

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

![](/files/-MK4AJpvW6D4bVkv_e6B)

消息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 [];
```

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

![](/files/-MK4AQrBHb1uUI28NZSW)

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

![](/files/-MK4AUxQZ_hqBlKgI4wH)

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

![](/files/-MK4AWKydoo-Mqfedfar)

默认情况下规则节点从消息元数据中获取外围信息如果未**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)

![](/files/-MK4AfAiT1-vlO-FchFY)

· 圈（Circle）

![](/files/-MK4AhYkc3KNzZhXSjC9)

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

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

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


# Enrichment

Enrichment节点用于更新入站消息的元数据。

* 用户组属性
* 设备属性
* 发起者属性
* 发起者字段
* 关联属性
* 租户属性
* 发起者遥测
* 租户详细信息
* 客户详细信息

### **用户组属性**

![](/files/-MK4BDGxOOST_GI8Baxu)

此节点查找消息发起者实体的客户并将客户属性或最新遥测数据添加到消息元数据中。

管理员可以配置原始属性名称和元数据属性名称之间的映射关系。

如果选中节点的**Latest Telemetry**配置复选框则节点将通过配置密钥获取最新遥测，否则将获取服务端作用域的相关属性。

![](/files/-MK4BF-IfnXJrqqb9z0F)

出站消息元数据将包含已配置的属性。

可以通过’`metadata.temperature`‘模板获取其它节点属性。

允许以下消息发起者类型： **Customer**,**User**,**Asset**,**Device**。

如果找到不支持的原始发起者类型则会引发错误。

如果没有对发起者分配客户实体则使用**Failure**链否则使用**Success**链。

在下一面教程中你可以看到使用该节点的真实示例：

* 发送邮件

### **设备属性**

![](/files/-MK4BJnaRRV_DFa9r2n_)

此节点查找消息发起者实体的相关设备并将属性(client\shared\server)和最新的遥测值添加到消息元数据中。

元数据中的属性前缀

* shared属性 -> `shared_`
* client属性 -> `cs_`
* server属性 -> `ss_`
* telemetry -> 无前缀

例如shared属性版本将以名称”shared\_version”添加到元数据中。

client属性使用”cs\_“前缀。

server属性使用”ss\_“前缀。

最新遥测数据不带前缀添加到消息元数据中。

在”Device relations query”配置中管理员可以选择所需的**Direction**和**relation depth level**;还可以使用所需的**Device types**配置**Relation type**。

![](/files/-MK4BMdDey1MVMZWWYKz)

如果找到多个相关实体则仅第一个实体用于属性Enrichment节点其他实体将被丢弃。

如果未找到相关实体则使用**Failure**链否则是**Success**链。

如果找不到属性或遥测则不会将其添加到消息元数据中并且仍会通过**Success**链进行路由。

出站消息元数据将仅包含配置的属性。

可以通过’`metadata.temperature`‘模板获取其它节点属性。

**注意:** 从版本2.3.1开始如果出站消息中至少一个选定的密钥，则规则节点可以启用/禁用报告**Failure**。

![](/files/-MK4BOYZSPk6zcEbVwEe)

### **发起者属性**

![](/files/-MK4BSeO2ryVEJc1HTVt)

在消息元数据中添加消息发起者属性(client\shared\server)和最新的遥测值。

元数据中的属性前缀

* shared属性 -> `shared_`
* client属性 -> `cs_`
* server属性 -> `ss_`
* telemetry -> 无前缀

例如shared属性版本将以名称”shared\_version”添加到元数据中。

client属性使用”cs\_“前缀。

server属性使用”ss\_“前缀。

最新遥测数据不带前缀添加到消息元数据中。

![](/files/-MK4BV0rzgaScGl8XLvF)

出站消息元数据将仅包含配置的属性。

可以通过’`>metadata.cs_temperature`‘模板获取其它节点属性。

**Note:** 从TB版本2.3.1开始如果出站消息中至少一个选定的密钥则规则节点可以启用/禁用报告**Failure**

![](/files/-MK4BX7MGn0jNDLUxPNY)

在下一面教程中你可以看到使用该节点的真实示例：

* 转换设备历史消息
* 发送邮件

### **发起者字段**

![](/files/-MK4B_HTzxsa3T7aWGit)

此节点获取消息发起者实体的字段值并将其添加到消息元数据中。

管理员可以配置字段名称和元数据属性名称之间的映射关系。

如果指定的字段不是消息发起者实体字段的一部分它将被忽略。

![](/files/-MK4BbE9Ytgi1yR8BN88)

允许以下消息发起者类型: **Tenant**, **Customer**, **User**, **Asset**, **Device**, **Alarm**, **Rule Chain**。

如果发现不支持的发起者类型则使用**Failure**链否则使用**Success**链。

如果没有找到字段值则不会将其添加到消息元数据中而是通过成功链进行路由。

出站消息元数据将只包含已配置的属性。

可以通过’`metadata.devType`‘模板获取其它节点属性。

### **关联属性**

![](/files/-MK4BdlSg6FWwP7OqbG2)

节点查找消息发起者实体的相关实体并将属性或最新遥测数据添加到消息元数据中。

管理员可以配置原始属性名称和元数据属性名称之间的映射关系。

在”Relations query”配置中管理员可以选择所需的**Direction**和**relation depth level**。

还可以使用必需的关系类型和实体类型配置**Relation filters**。

如果选中节点的**Latest Telemetry**配置复选框则节点将通过配置密钥获取最新遥测，否则将获取服务端作用域的相关属性。

![](/files/-MK4BgeQIW6mdFkD_Vl5)

如果找到多个相关实体**只使用第一个实体**Enrichment属性的其他实体则被丢弃。

如果未找到相关实体则使用**Failure**链否则使用**Success**链。

出站邮件元数据将包含已配置的属性

可以通过’`>metadata.tempo`‘模板获取其它节点属性。

在下一面教程中你可以看到使用该节点的真实示例：

* RPC调用回复

### **租户属性**

![](/files/-MK4BnvSD2o532bi160-)

此节点查找消息发起者实体的租户并将租户属性或最新遥测值添加到消息元数据中。

管理员可以配置原始属性名称和元数据属性名称之间的映射关系。

选中**Latest Telemetry**复选框则节点将获取已配置密钥的最新遥测否则使用Node将获取服务器作用域属性.

![](/files/-MK4BpXgXrFcxKYMj2UD)

出站消息元数据将包含已配置的属性。

可以通过’`>metadata.tempo`‘模板获取其它节点属性。

允许以下消息发起者类型: **Tenant**,**Customer**,**User**,**Asset**,**Device**,**Alarm**,**Rule Chain**。

如果找到了不支持的原始发起者类型则会引发错误。

如果发起者尚未分配租户实体则使用**Failure**链否则**Success**链。

### **发起者遥测**

![](/files/-MK4C3obUHXYk7CKAo8v)

将在节点配置中选择的特定时间范围内的消息发起者遥测数据添加到消息元数据中。

![](/files/-MK4C8QPwRpbbdfa7AgO)

遥测数据添加到不带前缀的消息元数据中。

规则节点具有三种获取模式:

* FIRST: 从数据库中检索最接近时间范围开始的遥测
* LAST: 从最接近时间范围末尾的数据库中检索遥测
* ALL: 在指定时间范围内从数据库检索所有遥测.

![](/files/-MK4BwXnRpooDv5z2UMy)

如果选择获取模式**FIRST**或**LAST**则出站消息元数据将包含JSON元素(key/value)否则选定的获取模式**ALL**则遥测将作为数组获取。

| ***注意:***                    |
| ---------------------------- |
| 规则节点可以将记录的限制大小提取到数组中：1000个记录 |

该数组将包含带有时间戳和值的JSON对象。

| ***注意:***        |
| ---------------- |
| 间隔的结尾必须始终小于间隔的开头 |

如果选中**Use metadata interval patterns**复选框则规则节点将使用元数据中的Start Interval和End Interval模式。

自UNIX时代(January 1, 1970 00:00:00 UTC)以来，模式单位以毫秒为单位设置。

![](/files/-MK4CBmCy-_OvFgP7iXI)

* 如果消息元数据中不存在任何模式则出站消息将通过**failure**链进行路由。
* 如果任何模式的数据类型无效则出站消息还将通过**failure**链进行路由。

出站消息元数据将包含已配置的遥测字段（如果存在且属于所选范围）。

如果找不到属性或遥测则不会将其添加到消息元数据中并且仍会通过**Success**链进行路由。

可以通过’`JSON.parse(metadata.temperature)`‘模板获取其它节点遥测。

**注意:** 从 2.3版开始当选择Fetch mode: **ALL**时规则节点可以选择遥测采样顺序。

![](/files/-MK4CD9Wvf9ddL642LKw)

在下一面教程中你可以看到使用该节点的真实示例：

* 遥测增量计算

**租户详细信息**

![](/files/-MK4CFp3v3sNTIBG9OU9)

此节点将字段从租户详细信息添加到消息正文或元数据

选中**Add selected details to the message metadata**复选框则现有字段将添加到消息元数据中而不是消息数据中。

![](/files/-MK4CHOylPBZ-_-9RHPN)

选定的详细信息将添加到带有前缀:**tenant\_**&#x5143;数据中。

出站消息将包含已配置的详细信息。

可以通过以下模板获取其他节点的详细信息:

* `metadata.tenant_address`
* `msg.tenant_address`

如果发起者尚未分配租户实体则使用**Failure**链否则**Success**链。

### **客户详细信息**

![](/files/-MK4CJ8RHP9SvqxLC6iF)

规则节点将客户详细信息中的字段添加到消息正文或元数据。

选中**Add selected details to the message metadata**复选框则现有字段将添加到消息元数据中而不是消息数据中。

![](/files/-MK4CKbA7aRDHoIS66Cu)

选定的详细信息将添加到带有前缀:**customer\_**&#x5143;数据中。

出站邮件将包含已配置的详细信息（如果存在）。

可以通过以下模板获取其他节点的详细信息:

* `metadata.customer_email`
* `msg.customer_email`

允许以下消息发起者类型: **Asset**,**Device**,**Entity View**。

如果找到了不支持的原始发件人类型则会引发错误。

如果未分配发起者客户实体**Failure**链则使用**Success**链。


# Transformation

Transformation节点用于更改入站的消息字段例如：发起者、消息类型、playload和元数据。

* 变更发起者
* 脚本
* 邮件转换

### 变更发起者

![](/files/-MK4Ca0iEC80GAfPRaEx)

Thingsboard中的所有入站消息都有“发起者”字段该字段标识提交消息的实体可以是Device, Asset, Customer, Tenant等。

当提交的消息是来自另一个实体的消息处理的情况下使用此节点；例如：设备上传遥测并且遥测应复制到更高级别的资产或客户中。

在这种情况下管理员必须在**Save Timeseries**节点之前添加此节点。

发起者可以更改为:

* 发起人的客户
* 发起人的租户
* 关系查询所标识的相关实体

在’Relations query’管理员可以选择所需的**Direction**和**relation depth level**还可以使用必需的关系类型和实体类型配置**Relation filters**。

![](/files/-MK4Cc60o6mSj9QIVBho)

如果找到多个相关实体则**仅第一个实体当作**新的发起者其他实体则被丢弃。

如果未找到相关实体/客户/租户则使用**Failure**链否则**Success**链。

出站邮件将具有新的发起者ID。

### 脚本

![](/files/-MK4CeKEkCSQlr_p1_-3)

使用已配置的JavaScript函数更改消息payload、Metadata或消息类型。

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

* `msg` - 消息payload
* `metadata` - 消息metadata
* `msgType` - 消息类型

脚本应返回以下结构

```
{   
    msg: new payload,
    metadata: new metadata,
    msgType: new msgType 
}
```

![](/files/-MK4ChrA2vrt96MvyelL)

结果对象中的所有字段都是可选的如果未指定则将从原始消息中获取

来自此节点的出站消息将是使用已配置的JavaScript函数构造的新消息。

\
**Example**

节点收到带有**payload**的消息:

```
{
    "temperature": 22.4,
    "humidity": 78
}
```

Original **Metadata**:

```
{ "sensorType" : "temperature" }
```

原始**Message Type** - POST\_TELEMETRY\_REQUEST<br>

应该执行以下修改:

* 将消息类型更改为’CUSTOM\_UPDATE’
* 将其他属&#x6027;***version***&#x6DFB;加到payload中值&#x4E3A;***v1.1***
* 将元数据中的\_**sensorType**\_属性值更改&#x4E3A;***roomTemp***

以下转换函数将执行所有必要的修改:

```
var newType = "CUSTOM_UPDATE";
msg.version = "v1.1";
metadata.sensorType = "roomTemp"
return {msg: msg, metadata: metadata, msgType: newType};
```

在下一面教程中你可以看到使用该节点的真实示例：

* 转换入站遥测
* RPC调用回复

### 邮件转换

![](/files/-MK4ClcHY7zv_baOMpwU)

通过使用从消息元数据派生的值填充电子邮件字段后将消息转换为电子邮件并设置’SEND\_EMAIL’为输出消息类型后使用**发送邮件**节点发送。

可以将所有电子邮件字段配置为元数据中的值。

![](/files/-MK4CodP7VyO4XofY7Rr)

例如入站消息在元数据中具有**deviceName**字段并且电子邮件正文应包含其值。

在这种情况下可以像下面的示例一样引用**deviceName**值`${deviceName}`:

```
 Device ${deviceName} has high temperature
```

如果入站消息元数据包含引用存储在数据库中的**attachments**字段可以做为电子邮件的附件使用。


# Action

Action节点根据入站的消息执行各种动作。

* 生成警报
* 清除警报
* 延迟
* 生成节点
* 日志节点
* RPC调用回复
* RPC调用请求
* 保存属性
* 保存时间序列
* 保存到自定义表
* 分配给客户组
* 取消用户组分配
* 创建关系
* 删除关系
* GPS地理围栏事件
  * 从消息元数据中获取边界信息
  * 从节点配置中获取周边信息
  * 活动类型

### 生成警报

该节点尝试加载为消息发起者配置的**Alarm Type**最新警报。

如果存在**Uncleared**警报则将更新此警报否则将创建新的警报。

节点配置:

* **Alarm Details Builder** 脚本
* **Alarm Type** - 代表警报类型的任何字符串
* **Alarm Severity** - {CRITICAL | MAJOR | MINOR | WARNING | INDETERMINATE}
* **是否传播** - 是否将警报传播到所有与父相关的实体。

从消息中读取警报配置：

* 使用带有消息元数据字段的模式来获取警报类型：

按关系类型过滤传播到父实体：

*

**Alarm Details Builder**用于生成警报详细信息JsonNode。

这对于在Alarm内部存储其他参数很有用；例如：可以从原始消息payload或Metadata中保存属性名称/值对。

**Alarm Details Builder**脚本应返回**details**对象。

* 消息payload可以通过`msg`变量访问。例如：`msg.temperature`<br>
* 可以通过`metadata`变量访问消息。例如：`metadata.customerName`<br>
* 可以通过`msgType`变量访问。例如：`msgType`<br>

**可选:**&#x53EF;以通过访问先前的警报详细信息`metadata.prevAlarmDetails`。 如果先前的警报不存在则该字段将不会出现在元数据中。**注意**这个`metadata.prevAlarmDetails` 是一个原始的String字段，需要使用以下结构将其转换为对象:

```
var details = {};
if (metadata.prevAlarmDetails) {
    details = JSON.parse(metadata.prevAlarmDetails);
}
```

**Alarm Details Builder**可以使用Test JavaScript function来验证警报详细信息生成器脚本功能。

**Details Builder 功能示例**

`count`会从警报中获取属性并进行递增最后将`temperature`消息payload的属性放入警报详细信息。

```
var details = {temperature: msg.temperature, count: 1};

if (metadata.prevAlarmDetails) {
    var prevDetails = JSON.parse(metadata.prevAlarmDetails);
    if(prevDetails.count) {
        details.count = prevDetails.count + 1;
    }
}

return details;
```

**:**&#x4F7F;用以下属性创建/更新警报

* Alarm details - object returned from 从**Alarm Details Builder** 脚本中返回对象
* Alarm status - 如果是 **new alarm** -> *ACTIVE\_UNACK*. 如果是 **existing Alarm** -> 不改变
* Severity - 节点中配置的值
* Propagation - 节点中配置的值
* Alarm type - 节点中配置的值
* Alarm start time - 如果是 **new alarm** -> *当前系统时间*. 如果是 **existing Alarm** -> 不改变
* Alarm end time - *当前系统时间*

**出站消息具有以下结构:**

* **Message Type** - *警报*
* **Originator** - 入站消息具有相同的消息发起者
* **Payload** - 以JSON的形创建和更新警报
* **Metadata** -原始消息中的所有Metadata字段

创建警报后出站消息将在Metadata中包含**isNewAlarm**属性其值为**true**消息将通过**Created**链传递。

现有警报更新后出站消息将在Metadata中包含**isExistingAlarm**属性其值为**true**消息将通过**Updated**链传递。

这是出站消息的**payload**示例

```
{
  "tenantId": {
    "entityType": "TENANT",
    "id": "22cd8888-5dac-11e8-bbab-ad47060c9bbb"
  },
  "type": "High Temperature Alarm",
  "originator": {
    "entityType": "DEVICE",
    "id": "11cd8777-5dac-11e8-bbab-ad55560c9ccc"
  },
  "severity": "CRITICAL",
  "status": "ACTIVE_UNACK",
  "startTs": 1526985698000,
  "endTs": 1526985698000,
  "ackTs": 0,
  "clearTs": 0,
  "details": {
    "temperature": 70,
    "ts": 1526985696000
  },
  "propagate": true,
  "id": "33cd8999-5dac-11e8-bbab-ad47060c9431",
  "createdTime": 1526985698000,
  "name": "High Temperature Alarm"
}
```

### 清除警报

![image](http://www.ithingsboard.com/images/user-guide/rule-engine-2-0/nodes/action-clear-alarm.png)

该节点加载具有为消息发起者配置的**Alarm Type**的最新警报并清除警报（如果存在）。

节点配置:

* **Alarm Details Builder**脚本
* **Alarm Type** - 代表警报类型的任何字符串

**Alarm Details Builder**脚本用于更新警报详细信息JsonNode。 这对于在Alarm内部存储其他参数很有用；例如：可以从原始消息payload或Metadata中保存属性名称/值对。

**Alarm Details Builder**脚本应返回**详细信息**对象。

![image](http://www.ithingsboard.com/images/user-guide/rule-engine-2-0/nodes/action-clear-alarm-config.png)

* 消息payload可以通过`msg`变量访问。例如：`msg.temperature`<br>
* 可以通过`metadata`变量访问消息。例如：`metadata.customerName`<br>
* 可以通过`msgType`变量访问。例如：`msgType`<br>
* 当前的报警信息可以通过metadata.prevAlarmDetails访问

**注意** `metadata.prevAlarmDetails`是一个原始字符串字段需要使用此结构将其转换为对象:

```
var details = {};
if (metadata.prevAlarmDetails) {
    details = JSON.parse(metadata.prevAlarmDetails);
}
```

可以使用Test JavaScript function**验证警报详情构建器**脚本函数。

**Details Builder功能示例**

`count`会从警报中获取属性并进行递增。最后将 `temperature`消息payload的属性放入警报详细信息。

```
var details = {temperature: msg.temperature, count: 1};

if (metadata.prevAlarmDetails) {
    var prevDetails = JSON.parse(metadata.prevAlarmDetails);
    if(prevDetails.count) {
        details.count = prevDetails.count + 1;
    }
}

return details;
```

更新节点当前警报：

* 如果已经确认警报**状态**则将警报状态更改为**CLEARED\_ACK**否则更改为**CLEARED\_UNACK**
* 为当前系统设置确切的时间
* 使用从**Alarm Details Builder**返回的新对象更新警报细节

当警报不存在或已清除警报时原始消息将通过**false**链传递到下一个节点，否则新的消息将通过**Cleared**链传递。

**出站消息的结构如下:**

* **Message Type** - *ALARM*
* **Originator** - 来自入站消息的同一发起者
* **Payload** - JSON表示清除的警报
* **Metadata** - 来自原始消息元数据的所有字段，元数据中的额外属性将被添加：**isClearedAlarm**值为**True**。

这是出站消息的**payload**示例

```
{
  "tenantId": {
    "entityType": "TENANT",
    "id": "22cd8888-5dac-11e8-bbab-ad47060c9bbb"
  },
  "type": "High Temperature Alarm",
  "originator": {
    "entityType": "DEVICE",
    "id": "11cd8777-5dac-11e8-bbab-ad55560c9ccc"
  },
  "severity": "CRITICAL",
  "status": "CLEARED_UNACK",
  "startTs": 1526985698000,
  "endTs": 1526985698000,
  "ackTs": 0,
  "clearTs": 1526985712000,
  "details": {
    "temperature": 70,
    "ts": 1526985696000
  },
  "propagate": true,
  "id": "33cd8999-5dac-11e8-bbab-ad47060c9431",
  "createdTime": 1526985698000,
  "name": "High Temperature Alarm"
}
```

### 延迟

通过配置的时间段延迟入站消息。

配置:

![image](http://www.ithingsboard.com/images/user-guide/rule-engine-2-0/nodes/action-delay-config.png)

* **Period in seconds** - 指定应暂停入站消息的时间段
* **Maximum pending messages** - 指定允许的最大未处理消息数（已暂停消息的队列）

当到满特定入站消息的延迟时间时将从挂起队列中删除并通过**Success**链路由到下一个节点。

如果达到最大消息限制则每个下一条消息将通过**Failure**链进行路由。

### 生成节点

![image](http://www.ithingsboard.com/images/user-guide/rule-engine-2-0/nodes/action-generator.png)

生成具有可配置周期的消息JavaScript函数用于生成消息。

节点配置:

* 消息生成频率以秒为单位
* 消息发起者
* JavaScript函数将生成实际的消息。

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

* `prevMsg` - 是先前生成的消息的payload.
* `prevMetadata` - 是先前生成的消息的metadata.
* `prevMsgType` - 是先前生成的消息类型.

脚本应返回以下结构:

```
{   
    msg: new payload,
    metadata: new metadata,
    msgType: new msgType 
}
```

![image](http://www.ithingsboard.com/images/user-guide/rule-engine-2-0/nodes/action-generator-config.png)

结果对象中的所有字段都是可选的如果未指定则将从先前生成的Message中获取。

来自此节点的出站消息将是使用已配置的JavaScript函数构造的新消息。

使用Test JavaScript function来验证JavaScript生成器功能。

该节点可用于规则链调试

### 日志节点

![image](http://www.ithingsboard.com/images/user-guide/rule-engine-2-0/nodes/action-log.png)

使用配置好的JavaScript函数将传入消息转换为String并将最终值记录到Thingsboard日志文件中。

**INFO** 日志级别用于记录.

JavaScript函数接收3个输入参数

* `metadata` - 消息metadata.
* `msg` - 消息payload.
* `msgType` - 消息类型.

脚本应返回字符串值。

![image](http://www.ithingsboard.com/images/user-guide/rule-engine-2-0/nodes/action-log-config.png)

JavaScript转换功能可以使用Test JavaScript function进行验证。

在下一面教程中你可以看到使用该节点的真实示例：

* RPC调用回复

### RPC调用回复

![image](http://www.ithingsboard.com/images/user-guide/rule-engine-2-0/nodes/action-rpc-call-reply.png)

发送从设备来的RPC调用的回复

发送从设备来的RPC调用的回复所有入站的RPC请求都通过规则链作为消息传递，同样所有RPC请求都具有请求ID字段它用于映射请求和响应，消息发起者必须是**Device**实体因为已向消息发起者发起了RPC响应。

节点配置具有特殊的请求ID字段映射如果未指定映射则默认使用**requestId**元数据字段。

![image](http://www.ithingsboard.com/images/user-guide/rule-engine-2-0/nodes/action-rpc-call-reply-config.png)

可以通过不同的传输方式接收RPC请求:

* MQTT
* HTTP
* CoAP

消息payload示例

```
{
  "method": "setGpio",
  "params": {
    "pin": "23",
    "value": 1
  }
}
```

在以下情况下消息将通过**Failure**链进行路由：

* 入站消息发起者不是**Device**实体
* 消息元数据中不存在请求ID
* 入站消息payload为空

在下一面教程中你可以看到使用该节点的真实示例：

* RPC调用回复

### RPC调用请求

![image](http://www.ithingsboard.com/images/user-guide/rule-engine-2-0/nodes/action-rpc-call-request.png)

将RPC请求发送到设备并将响应路由到下一个Rule节点消息发起者必须是**Device**实体因为只能向设备发起RPC请求。

节点配置具有**Timeout**字段用于指定等待设备响应的超时。

![image](http://www.ithingsboard.com/images/user-guide/rule-engine-2-0/nodes/action-rpc-call-request-config.png)

RPC请求的payload消息正确格式必须包含**method** 和**params**字段。

例：

```
{
  "method": "setGpio",
  "params": {
    "pin": "23",
    "value": 1
  }
}
```

如果Payload消息包含**requestId**字段则其值用于标识对设备的RPC请求否则将生成随机的requestId。

出站消息将具有与入站消息相同的发起者和元数据对于设备的响应将添加到消息Payload中。

在以下情况下消息将通过**Failure**链进行路由：

* 入站消息发起者不是**Device**实体
* 入站消息丢失了**method**或**params**字段
* 节点在配置超时期间不接收响应

否则消息将通过**Success**链路由

### 保存属性

![image](http://www.ithingsboard.com/images/user-guide/rule-engine-2-0/nodes/action-save-attributes.png)

接收入站消息payload的属性存储到数据库中并将它们与消息发起者标识的实体相关联，通过**范围**用于标识属性范围。

支持的范围类型:

* 客户端属性
* 共享属性
* 服务端属性

![image](http://www.ithingsboard.com/images/user-guide/rule-engine-2-0/nodes/action-save-attributes-config.png)

预期消息类型为**POST\_ATTRIBUTES\_REQUEST**。 如果消息类型不是**POST\_ATTRIBUTES\_REQUEST**消息将通过f**Failure**链路由.

当属性通过现有API(HTTP/MQTT/CoAP等)上传时如果消息类型payload满足要求，那么消息将被传递到**Root Rule Chain**的**Input**节点。

如果需要在规则链中触发属性存储则需要配置规则链将消息Payload转换为预期格式并将消息类型设置为 **POST\_ATTRIBUTES\_REQUEST**。可以使用**脚本转换节点**完成。

**预期消息Payload的例子:**

```
{
  "firmware_version": "1.0.1",
  "serial_number": "SN-001"
}
```

成功保存属性后原始消息将通过**Success**链传递到下一个节点否则将使用**Failure**链。

### 保存时间序列

![image](http://www.ithingsboard.com/images/user-guide/rule-engine-2-0/nodes/action-save-timeseries.png)

将接入站消息的payload时间序列数据存储到数据库，并将它们与消息发起者标识的实体相关联通过配置**TTL**秒用于时间序列数据到期时间**0**表示数据永不过期。

![image](http://www.ithingsboard.com/images/user-guide/rule-engine-2-0/nodes/action-save-timeseries-config.png)

预期消息类型为**POST\_TELEMETRY\_REQUEST**如果消息类型不是**POST\_TELEMETRY\_REQUEST**则将通过**Failure**链路由消息。

当timeseries数据通过现有的API(HTTPMQTT/CoAP等)发布时如果消息类型和payload满足要求，那么消息将被传递到**Root Rule Chain**链的**Input**节点。

在需要触发规则链内的timeseries数据存储时应配置规则链来转换消息playload将消息类型设置为**POST\_TELEMETRY\_REQUEST**。

可以使用**脚本转换节点**完成该操作。

消息元数据必须包含**ts**字段。

该字段可识别已发布的遥测技术几毫秒内的时间戳。

此外如果消息元数据包含**TTL**字段则使用该字段值识别timeseries数据期限否则请使用节点配置中的**TTL**。

**预期消息Payload的例子:**

```
{  
  "values": {
    "key1": "value1",
    "key2": "value2"
  }
}
```

成功保存timeseries数据之后原始消息将通过**Success**链传递到下一个节点否则使用**Failure**链。

### 保存到自定义表

![image](http://www.ithingsboard.com/images/user-guide/rule-engine-2-0/nodes/action-save-to-custom-cassandra-table.png)

节点将来自传入消息payload的数据存储到**Cassandra DB**数据库中存储到应该具有**cs\_tb\_**\_前缀的预定义定制表中以避免将数据插入到公共TB表中。

请注意该规则节点只能用于**Cassandra DB**

配置:

管理员应设置不带前缀的自定义表名称: **cs\_tb\_**。

![image](http://www.ithingsboard.com/images/user-guide/rule-engine-2-0/nodes/action-save-to-custom-cassandra-table-name-config.png)

管理员可以配置消息字段名称和表的列名称之间的映射如果映射键&#x4E3A;**$entity\_id**由消息发起者标识则将消息发起者id写入适当的列名（映射值）。

![image](http://www.ithingsboard.com/images/user-guide/rule-engine-2-0/nodes/action-save-to-custom-cassandra-table-config.png)

如果指定的消息字段不存在或不是JSON则出站消息将通过**Failure**链进行路由否则消息将通过**Success**链进行路由。

### 分配给客户组

![image](http://www.ithingsboard.com/images/user-guide/rule-engine-2-0/nodes/action-assign-to-customer-node.png)

将消息发起者实体分配给Customer。

支持以下消息发起者类型: **Asset**,**Device**,**Entity View**,**Dashboard**。

通过客户名称模式查找目标客户然后将发起者实体分配给该客户。

如果不存在(**Create new Customer if not exists**)将创建新客户如果不存在将创建新客户设置为**true**。

配置:

![image](http://www.ithingsboard.com/images/user-guide/rule-engine-2-0/nodes/action-assign-to-customer-node-configuration.png)

* **Customer name pattern** - 可以设置直接的客户名称也可以使用，将使用消息元数据将其解析为真实的客户名称。
* **Create new customer if not exists** - 则创建新客户-如果选中则将创建不存在的新客户。
* **Customers cache expiration time** - 指定允许存储找到的客户记录的最大时间间隔（以秒为单位）0值表示记录永不过期。

在以下情况下消息将通过**Failure**链进行路由：

* 不支持发起者实体类型时。
* 目标客户不存在未选中创建客户如果不存在（**Create customer if not exists**）

在其他情况下消息将通过**Success**链进行路由。

### 取消用户组分配

![image](http://www.ithingsboard.com/images/user-guide/rule-engine-2-0/nodes/action-unassign-from-customer-node.png)

从Customer取消分配消息发起者实体

支持以下消息发起者类型: **Asset**, **Device**, **Entity View**, **Dashboard**。

通过客户名称模式查找目标客户然后从该客户取消分配发起者实体。

配置:

![image](http://www.ithingsboard.com/images/user-guide/rule-engine-2-0/nodes/action-unassign-from-customer-node-configuration.png)

* **Customer name pattern** - 可以设置直接的客户名称也可以使用模式，将使用消息元数据将其解析为真实的客户名称。
* **Customers cache expiration time** - 指定允许存储找到的客户记录的最大时间间隔（以秒为单位）0值表示记录永不过期。

在以下情况下消息将通过**Failure**链进行路由：

* 不支持发起者实体类型时。
* 目标客户不存在.

在其他情况下消息将通过**Success**链进行路由。

### 创建关系

![image](http://www.ithingsboard.com/images/user-guide/rule-engine-2-0/nodes/action-create-relation.png)

按类型和方向创建从所选实体到消息发起者的关系。

支持以下消息发起者类型: **Asset**,**Device**,**Entity View**,**Customer**,**Tenant**,**Dashboard**。

通过元数据键模式查找目标实体然后在发起方实体和目标实体之间创建关系。

如果选择的实体类型为**Asset**,**Device**或**Customer**规则节点: 则如果不存在则创建新的Entity并选中复选框**Create new Entity if not exists**.

**注意:** 如果选择的实体类型为**Asset**或**Device**则需要设置两种模式:

* 实体名称模式；
* 实体类型模式。

否则仅应设置名称模式。

配置:

![image](http://www.ithingsboard.com/images/user-guide/rule-engine-2-0/nodes/action-create-relation-node-configuration.png)

* **Direction** - 允许下列类型: **From**,**To**。
* **Relation type** - 与消息始发者实体的定向连接的类型可以从下拉列表中选择默认类型**Contains**和**Manages**。
* **Name pattern** and **Type pattern** - 可以设置直接实体名称/类型也可以使用模式使用消息元数据将其解析为真实实体名称/类型。
* **Entities cache expiration time** - 指定允许存储找到的目标实体记录的最大时间间隔（以秒为单位）0值表示记录永不过期。

在以下情况下消息将通过 **Failure** 链进行路由:

* 不支持发起者实体类型时。
* 目标实体不存在。

在其他情况下消息将通过**Success**链进行路由

**注意:** 自TB 2.3版以来规则节点具有以下功能:

* 根据方向和类型从传入消息的发起者中删除当前关系:

  ![image](http://www.ithingsboard.com/images/user-guide/rule-engine-2-0/nodes/action-create-relation-node-remove-relations.png)
* 将入站消息的始发者更改为所选实体并将出站消息作为来自另一个实体的消息进行处理:

  ![image](http://www.ithingsboard.com/images/user-guide/rule-engine-2-0/nodes/action-create-relation-node-change-originator.png)

### 删除关系

![image](http://www.ithingsboard.com/images/user-guide/rule-engine-2-0/nodes/action-delete-relation.png)

按类型和方向删除所选实体与消息发起者之间的关系。

支持以下消息发起者类型: **Asset**,**Device**,**Entity View**,**Customer**,**Tenant**,**Dashboard**。

通过实体名称模式查找目标实体然后删除发起者实体与该实体之间的关系。

配置:

![image](http://www.ithingsboard.com/images/user-guide/rule-engine-2-0/nodes/action-delete-relation-node-configuration.png)

* **Direction** - 允许下列类型: **From**,**To**。
* **Relation type** - 与消息始发者实体的定向连接的类型可以从下拉列表中选择默认类型**Contains**和**Manages**。
* **Name pattern** and **Type pattern** - 可以设置直接实体名称/类型也可以使用模式，使用消息元数据将其解析为真实实体名称/类型。
* **Entities cache expiration time** - 指定允许存储找到的目标实体记录的最大时间间隔（以秒为单位）0值表示记录永不过期。

在以下情况下消息将通过 **Failure** 链进行路由:

* 不支持发起者实体类型时。
* 目标实体不存在。

在以下情况下消息将通过**Success**链进行路由。

**注意:** 自TB版本2.3起规则节点可以通过禁用规则节点配置中的以下复选框来根据方向和类型从传入消息的始发者删除与指定实体或与实体列表的关系:

![image](http://www.ithingsboard.com/images/user-guide/rule-engine-2-0/nodes/action-delete-relation-node-new-functionality.png)

### GPS地理围栏事件

![image](http://www.ithingsboard.com/images/user-guide/rule-engine-2-0/nodes/action-gps-geofencing-event-node.png)

通过基于GPS的参数生成传入消息从入的消息数站据或元数据中提取纬度和经度并根据配置参数（地理围栏）返回不同的事件。

![image](http://www.ithingsboard.com/images/user-guide/rule-engine-2-0/nodes/filter-gps-geofencing-default-config.png)

默认情况下规则节点从消息元数据中获取外围信息。

如果未选中从**Fetch perimeter information from message metadata**则应配置其他信息。

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

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

* 多边形

  传入消息的元数据必须包含具有名称**perimeter**和以下数据结构的密钥

```
[[lat1,lon1],[lat2,lon2], ... ,[latN,lonN]]
```

* 圆形

```
"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).
```

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

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

* 多边形

![image](http://www.ithingsboard.com/images/user-guide/rule-engine-2-0/nodes/filter-gps-geofencing-polygon-config.png)

* 圆形

![image](http://www.ithingsboard.com/images/user-guide/rule-engine-2-0/nodes/filter-gps-geofencing-circle-config.png)

**活动类型**

地理围栏规则节点管理的事件有4种:

* **Entered** — -每当传入消息的纬度和经度首次属于所需的外围区域时报告;
* **Left** — 第一次报告来自传入消息的纬度和经度不属于所需的外围区域时;
* **Inside** 和 **Outside** 事件用于报告当前状态.

管理员可以配置持续时间阈值以报告内部事件或外部事件。

例如：每当最小内部时间设置为1分钟时消息发件人就被视为进入该区域后60秒之内最少的外部时间也定义了何时将消息发起者视为不在外围范围之内。

![image](http://www.ithingsboard.com/images/user-guide/rule-engine-2-0/nodes/action-gps-geofencing-event-node-duration-config.png)

在以下情况下将使用**Failure**链:

* 传入消息在数据或元数据中没有配置的纬度（latitude）或经度（longitude）键。
* 缺少周界定义;


# 外部节点

所使用的外部节点用于与外部系统进行交互。

### AWS SNS Node

外部节点指用来与外部系统交互的节点 AWS SNS (Amazon Simple Notification Service).

配置:

![](/files/-MPcjqUPNBH1_fpD0Mdl)

* **Topic ARN pattern** - 可以为消息发布设置直接主题名，也可以使用模式，使用消息元数据将其解析为真正的主题名.
* **AWS Access Key ID** and **AWS Secret Access Key** 是具有编程访问权限的AWS IAM用户凭据。更多关于AWS访问密钥的信息，请访问[这里](http://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_access-keys.html)找到。
* **AWS Region** 必须对应于创建SNS主题的区域。AWS区域当前列表可以在[这里](http://docs.aws.amazon.com/general/latest/gr/rande.html)找到。

在下面的例子中，主题名取决于设备类型，在元数据中有一条消息包含**deviceType**字段

```
{
    deviceType: controller
}
```

我们将在**Topic ARN pattern**中设置**controller**的topic中发布消息:

```
arn:aws:sns:us-east-1:123456789012:${deviceType}
```

在运行时，模式将解析为 `arn:aws:sns:us-east-1:123456789012:controller`

**Published payload** - —节点将向SNS发布完整的有效消息负载。如果有需要的话，可以配置规则链，使用转换节点链向SNS发送正确的负载。

**Outbound message** 将包含消息元数据中的响应**messageId**和**requestId**。原始消息有效负载、类型和发送方不会被更改。

### AWS SQS Node

![](/files/-MPcjnUmWmh7nWpEWAfL)

节点将消息发布到AWS SQS (亚马逊简单队列服务)。

配置:

![](/files/-MPcjkxWrgGT-lZbwQEJ)

* **Queue Type** -SQS队列类型可以是*Standard*，也可以是先进先出类型*FIFO*.
* **Queue URL Pattern** - 用于构建队列URL的模式。例如,`${deviceType}`。可以为消息发布设置直接队列URL，或使用模式，使用消息元数据将该模式解析为真正的队列URL。
* **Delay** - 以秒为单位的延迟，用于延迟特定的消息.
* **Message attributes** - 可选的要发布的消息属性列表.
* **AWS Access Key ID** and **AWS Secret Access Key** 是具有编程访问权限的AWS IAM用户的凭证。可以在[此处](http://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_access-keys.html)找到有关AWS访问密钥的更多信息
* **AWS Region** 必须与创建SQS队列的区域相对应。可在[此处](http://docs.aws.amazon.com/general/latest/gr/rande.html)找到AWS区域的最新列表。

在以下示例中，队列URL取决于设备类型，并且在元数据中有一个包含 **deviceType** 字段的消息:

```
{
    deviceType: controller
}
```

为了在 **controller**’s 的Queue中发布消息，我们将在**Queue URL pattern**模式中设置此模式:

```
https://sqs.us-east-1.amazonaws.com/123456789012/${deviceType}
```

在运行时，模式将解析为`https://sqs.us-east-1.amazonaws.com/123456789012/controller`

**Published body** - 节点将向SQS发布完整的消息有效负载。如果需要，可以将规则链配置为使用转换节点链，以将正确的有效负载发送到SQS。

**Published attributes** - 可以添加可选的属性列表以在SQS中发布消息。这是一个集合 – 对。NAME和VALUE都可以是静态值或模式，可以使用消息元数据进行解析。

如果选择了**FIFO**队列，则消息ID将用作重复数据**deduplication ID**，消息发起者将用作**group ID**。

**Outbound message** 这个节点的出站消息将包含消息元数据中的响应 **messageId**, **requestId**, **messageBodyMd5**, **messageAttributesMd5** 和 **sequenceNumber** 原始消息payload、类型和发送方不会被更改。

### Kafka Node

![](/files/-MPcjiRyw-jKqt0u4gLo)

Kafka节点向Kafka代理发送消息。消息可具有任何消息类型。将通过Kafka生产者发送记录到Kafka服务器.

配置:

![](/files/-MPcjh4kgET-SFzNh-BH)

* **Topic pattern** - 可以是静态字符串，也可以是使用消息元数据属性解析的模式。例如`${deviceType}`
* **bootstrap servers** - 用逗号分隔的kafka代理列表.
* **Automatically retry times** - 如果连接失败，尝试重发消息的次数.
* **Produces batch size** - 以字节为单位的批处理大小，用于对具有相同分区的消息进行分组.
* **Time to buffer locally** - ms中最大的本地缓冲窗口持续时间.
* **Client buffer max size** - 发送消息的最大缓冲区大小(以字节为单位).
* **Number of acknowledgments** - 确认节点在考虑请求完成之前需要接收的数量.
* **Key serializer** - 默认是org.apache.kafka.common.serialization.StringSerializer
* **Value serializer** - 默认是org.apache.kafka.common.serialization.StringSerializer
* **Other properties** - 可以为kafka代理连接提供任何其他属性.

**Published body** - Node将向Kafka主题发送完整的消息负载。如果需要可以配置规则链，使用转换节点链向Kafka发送正确的payload.

**Outbound message** 此节点的出站消息将在消息元数据中包含响应**offset**, **partition** and **topic**属性。原始消息payload、类型和发送方不会被更改。

**注意**-如果您要将[Confluent cloud](https://confluent.cloud/)用作kafka代理，则应添加下一个属性：

| 键                                     | 值                                                                                                                          |
| ------------------------------------- | -------------------------------------------------------------------------------------------------------------------------- |
| ssl.endpoint.identification.algorithm | https                                                                                                                      |
| sasl.mechanism                        | PLAIN                                                                                                                      |
| sasl.jaas.config                      | org.apache.kafka.common.security.plain.PlainLoginModule必需username =“ CLUSTER\_API\_KEY” password =“ CLUSTER\_API\_SECRET”; |
| security.protocol                     | SASL\_SSL                                                                                                                  |

* **CLUSTER\_API\_KEY-**&#x7FA4;集设置中的访问密钥。
* **CLUSTER\_API\_SECRET-**&#x60A8;在“群集”设置中的访问密码。

### MQTT Node

![](/files/-MPcj-FYemX0x9c2E1Eh)

使用QoS **AT\_LEAST\_ONCE**将传入消息有效负载发布到已配置的MQTT代理的主题

配置:

![](/files/-MPciz33P3RNGmWCfNcv)

* **Topic pattern** - 可以是静态字符串，也可以是使用消息元数据属性解析的模式。例如`${deviceType}`.
* **Host** - MQTT代理主机.
* **Port** - MQTT代理端口.
* **Connection timeout** - 连接到MQTT代理的超时(秒).
* **Client ID** - 可选的客户端标识符，用于连接到MQTT代理。如果没有指定，将使用默认生成的clientId.
* **SSL Enable/Disable** - 启用/禁用安全通信.
* **Credentials** - MQTT连接凭据。可以是匿名的，基本的或者PEM。

外部MQTT代理支持不同的身份验证凭证:

* Anonymous - 没有身份验证
* Basic - 用户名\密码对用于认证
* PEM - PEM证书用于身份验证

**PEM** PEM证书用于身份验证 如果选择PEM凭证类型:

* CA证书文件
* 证书文件
* 私钥文件
* 私钥密码

**Published body** - 节点将向MQTT主题发送完整的消息有效负载。如果需要，可以将规则链配置为使用转换节点链，以将正确的有效负载发送到MQTT代理.

在成功发布消息的情况下，原始消息将通过**Success**链传递到下一个节点，否则将使用**Failure**链。

### Azure IoT Hub Node

![](/files/-MPciwMXexZxeWiRJm8X)

配置:

![](/files/-MPcitJT21QBQ0PKSj2s)

* **主题**-有关IoT中心主题使用[链接的](https://docs.microsoft.com/en-us/azure/iot-hub/iot-hub-mqtt-support#sending-device-to-cloud-messages)更多信息。
* **主机名**-Azure IoT中心主机名。
* **设备ID-**&#x60A8;来自Azure IoT中心的设备ID。
* **凭据**-Azure IoT中心连接凭据。可以是*共享访问签名*或*PEM*。

Azure IoT中心支持不同的身份验证凭据：

* 共享访问签名-SAS密钥用于身份验证
* PEM-PEM证书用于身份验证

如果选择了**共享访问签名**凭据类型，则应提供以下配置：

* SAS密钥-它是[Azure IoT中心中](https://docs.microsoft.com/en-us/azure/iot-edge/how-to-authenticate-downstream-device#symmetric-key-authentication)设备的密钥
* CA证书文件，默认情况下使用的是巴尔的摩证书。有关证书的更多信息，请[点击此处](https://docs.microsoft.com/en-us/azure/iot-hub/iot-hub-mqtt-support#tlsssl-configuration)

如果选择了**PEM**凭证类型，则应提供以下配置：

* CA证书文件，默认情况下使用的是巴尔的摩证书。有关证书的更多信息，请[点击此处](https://docs.microsoft.com/en-us/azure/iot-hub/iot-hub-mqtt-support#tlsssl-configuration)
* 证书文件
* 私钥文件
* 私钥密码

[X.509 CA签名的身份验证](https://docs.microsoft.com/en-us/azure/iot-edge/how-to-authenticate-downstream-device#x509-ca-signed-authentication)

[CACertificates指令](https://github.com/Azure/azure-iot-sdk-c/tree/master/tools/CACertificates)

**已发布的正文**-节点会将完整的消息有效负载发送到Azure IoT中心设备。如果需要，可以将规则链配置为使用转换节点链，以将正确的有效负载发送到Azure IoT中心。

在成功发布消息的情况下，原始消息将通过**成功**链传递到下一个节点，否则将使用**失败**链。

### RabbitMQ Node

![](/files/-MPcicmc0qH_sTIFhDIp)

将传入的消息有效负载发布到RabbitMQ.

配置:

![](/files/-MPcibOGcJ_TSgo-zB3l)

* **Exchange name pattern** - 发布消息时所做的交换。可以是静态字符串，也可以是使用消息元数据属性解析的模式。例如`${deviceType}` .
* **Routing key pattern** - 路由密钥。可以是静态字符串，也可以是使用消息元数据属性解析的模式。例如 `${deviceType}` .
* **Message properties** - 可选的路由headers。支持*TEXT\_PLAIN*, *MINIMAL\_BASIC*, *MINIMAL\_PERSISTENT\_BASIC*, *PERSISTENT\_BASIC*, *PERSISTENT\_TEXT\_PLAIN*
* **Host** - 用于连接的默认主机
* **Port** - 用于连接的默认端口
* **Virtual host** - 连接代理时要使用的虚拟主机
* **Username** - AMQP用户名，在连接代理时使用
* **Password** - AMQP连接代理时使用的密码
* **Automatic recovery** - 启用或禁用自动连接恢复
* **Connection timeout** - 连接建立TCP超时，以毫秒为单位;零表示无限
* **Handshake timeout** - AMQP0-9-1协议握手超时，以毫秒为单位
* **Client properties** - 启动连接时发送到服务器的附加属性

**Published body** - 已发布的主体-节点将向RabbitMQ发送完整的消息有效负载。

如果需要，可以配置规则链，使用转换节点链发送正确的负载。 如果消息发布成功，原始消息将通过**Success**链传递到下一个节点，否则将使用**Failure**链。

### REST API Call Node

![](/files/-MPci_4u1ZTtnPRGehr3)

REST API调用外部REST服务器。

配置:

![](/files/-MPciYagOTZk0FV19-du)

* **Endpoint URL pattern** - 可以是静态字符串，也可以是使用消息元数据属性解决的模式。例如 `${deviceType}`
* **Request method** - *GET*, *POST*, *PUT*, *DELETE*
* **Headers** - 请求Headers、Headers或值可以是静态字符串，也可以是使用消息元数据属性解析的模式。

**Endpoint URL**

URL可以是静态字符串或patterns。只使用消息元数据解析模式。因此，模式中使用的属性名必须存在于消息元数据中，否则原始模式将被添加到URL中。

例如，如果消息payload包含带有值**container**的属性**deviceType**，则此模式:

`http://localhost/api/${deviceType}/update`

被解析为

`http://localhost/api/container/update`

**Headers**

可以配置标题名称/值的集合。 这些标题将被添加到Rest请求中。 模式应用于配置标头名称和标头值。 例如 `${deviceType}`. 仅消息元数据用于解决模式。因此，模式中使用的属性名称必须存在于消息元数据中，否则原始模式将添加到标头中。

**Request body** -节点将向配置的REST端点发送完整的消息Payload。如果需要，可以将规则链配置为使用转换节点链来发送正确的Payload。

**Outbound message** 将在消息元数据中包含响应状态，**status**, **statusCode**, **statusReason**和**headers**。 出站消息有效负载将与响应正文相同。原始邮件类型和原始发件人将不会更改。

如果请求成功，则出站消息将通过**Success**链传递到下一个节点，否则将使用**Failure**链

### Send Email Node

![](/files/-MPciQi9Z98dgffvwXzH)

节点通过已配置的邮件服务器发送传入消息。此节点只适用于在创建时使用**Email**的消息，请使用**Success**链将此节点与**To Email**节点连接。

配置:

![](/files/-MPciOFesyWEOPBVznWR)

* **Use system SMTP settings** - 如果启用，将使用在系统级别配置的默认邮件服务器
* **Protocol** - 邮件服务器传输协议：*SMTP* 或 *SMTPS*
* **SMTP host** - 邮件服务器主机
* **SMTP port** - 邮件服务器端口
* **Timeout ms** - 读取超时，以毫秒为单位
* **Enable TLS** - 如果为true，则启用STARTTLS命令的使用（如果服务器支持）
* **Username** - 邮件主机上帐户的用户名（如果有）
* **Password** - 邮件主机上帐户的密码（如果有）

该节点可以与在系统级别配置的默认邮件服务器一起使用。 请找到有关 如何配置默认系统SMTP设置的详细信息

如果此节点需要特定的邮件服务器，请禁用**Use system SMTP settings**复选框，并手动配置邮件服务器。 该节点可以与在系统级别配置的默认邮件服务器一起使用。有关如何配置默认系统SMTP设置请找到的更多详细信息。 如果此节点需要特定的邮件服务器，请禁用使用系统SMTP设置复选框并手动配置邮件服务器

另外，如果传入消息已参考数据库中存储的文件准备了**附件**字段，则此节点可以创建电子邮件附件。

如果成功发送邮件，原始消息将通过**Success**链传递到下一个节点，否则将使用**Failure**链。


# 组态控件


# 图表控件

柱状图（历史记录，实时信息）

![](/files/-MPc0ET3qWZq2bN1hzl7)

![](/files/-MPc6jY-zL33mLimmFBU)

折线图

![](/files/-MPc1-G9adm2uHlLlsza)

饼状图

![](/files/-MPc4OPj2-MyqvBCBC3G)

环状图

![](/files/-MPc4bQuTBKZOfmTr7zL)

雷达图

![](/files/-MPc79RGancQ0L-pOsf7)


# GPIO控件

![](/files/-MPcDgUQrgYfo3Pp0g7M)

![](/files/-MPcDm6kImCAROLNdegN)


# 地图控件

场地设施地图

![](/files/-MPcGqdsxwkEutu06_pc)

设备地图

![](/files/-MPcGzt9UfKdo6LC8F3P)

图片地图

![](/files/-MPcKR1_yOcourSvUBVD)

路线地图

![](/files/-MPcO2Pm8SgorZlP5UqW)


# 输入框控件

输入框控件：下发命令

![](/files/-MPcRFzI_egwVX2b3YPQ)


# 自定义控件

对开发人员支持在线IDE编写原生JS、HTML、CSS代码进行高度自定义控件实现你的需求

![](/files/-MPcVa7RqiIN9lRuy3U7)


# 实体管理控件

设备信息

![](/files/-MPcWRlQIDcaExN8eH7I)

![](/files/-MPcWVs-S8zwIGW2c6nk)


# 实时监控控件

实时监控

&#x20;设备序列号、时间等信息录制音视频通话、视频监控、视频处理的图片内容。\
&#x20;录制的文件可直接下载使用，视频统一为 mp4 格式，图片统一为 jpg 格式。

![](/files/-MPcC8aWzr41qoAbpmMt)


# 异常报警部件

![](/files/-MPcXdJpdjztfZkl20sF)

![](/files/-MPcXiiGfP0cBX_odE9S)


# 控制开关控件

![](/files/-MPcZxP5zXccYZ8j4Kmj)

![](/files/-MPc_0m-a-YWDgQOL0fO)

![](/files/-MPc_3ONmXwRiBLg8wuQ)


# 数字仪表控件

圆状仪表盘

![](/files/-MPcawSEHE1m7P2qtfdh)

![](/files/-MPcb3IpxQHzVdbXuyXz)

![](/files/-MPcbDfHgDoD6PQMK3YD)

半圆仪表盘

![](/files/-MPcb_NhdEBj5wTg692G)

竖状仪表盘

![](/files/-MPcbhw-UhKSkBO07lHg)

![](/files/-MPcbmJVn9wqN6iEwdub)

横状仪表盘

![](/files/-MPcbqbDvVYakCPX-8dT)

![](/files/-MPcbutbmlZzo9a71xK-)


# 卡片相关控件

可视界面标题

![](/files/-MPcgisEa7Cvw7JzwYP5)

设备实时信息

![](/files/-MPcgrPZOMC9jErOE-Am)

![](/files/-MPcgubh-4XiQKPTiKtj)


# 创建可视应用界面

### 创建可视界面

编辑可视界面标题以及描述，进入可视化界面

![](/files/-MPgOZ-GZTWoejuH9R-z)

![](/files/-MPgOfVmqrxKmT_ZiNc2)

![](/files/-MPgP-KEHIDL5RoohNEF)

### 界面配置项

可视界面：页面基本配置，添加子界面，绑定实体设备，选择界面需要的组态控件等

![](/files/-MPgP6U8XLvry056ypqu)

### 基本配置

![](/files/-MPgUhgM0DIBOpTNHQ0u)

### 绑定实体设备

![](/files/-MPgQn6OHl43jHtx1i0y)

### 添加界面组态控件

#### 图表类

![](/files/-MPgR4VM4KfeE2FqEt2n)

![](/files/-MPgRAwJECjCYicGGyOS)

#### 列表类

![](/files/-MPgWxUw805C92njwP_V)

![](/files/-MPgXGqMZXY4hkWr1PzH)

### 组态控件配置

#### 图表类

![](/files/-MPgRmYTJ-DVAwcBmsmO)

![](/files/-MPgRrXAgdPjXgFjMwLo)

#### 列表类

![](/files/-MPgVAJnYTR3ATdeOmgE)

![](/files/-MPgVFa_yfPOjn06WcXj)

### 添加可视界面子页面

![](/files/-MPgQPUUMl2UbfGfICHy)

![](/files/-MPgQY-QDT0rREyH8rds)

![](/files/-MPgQb1V3VoFATNhErFZ)


# 设备实践

### 选择设备

选择对应要显示的设备，以及选中设备的数据

![](/files/-MPh9A6vder6_9NKYIAP)

#### 图表类

![](/files/-MPh50G3i81BYjBzVKBy)

![](/files/-MPh5JBf4uOe0ut16hbN)

#### 列表类

![](/files/-MPh5qFb5r-y1L_zz79d)

![](/files/-MPh5v_-qgu7bW7ToIha)

![](/files/-MPh6BjvMGamv_0jKtj-)

### 可视界面查看

![](/files/-MPh6Krerdbylok4Inim)

![](/files/-MPh6Oi8Ng8xDEQXJKyA)


# 应用开发指南及协议API

平台API包含两个主要部分：设备接入协议API和服务器端Rest API。

设备API按支持的通信协议：MQTT API，CoAP API，HTTP API

**MQTT端口：**&#x34;7.106.143.1:1883

**HTTP端口：**<http://cloud.dda-iot.com>

**COAP端口：**&#x34;7.106.143.1:5663

####


# MQTT协议

### 入门 <a href="#ru-men" id="ru-men"></a>

**MQTT基础**

[MQTT](https://en.wikipedia.org/wiki/MQTT)是一种轻量级的发布-订阅消息传递协议，它可能最适合各种物联网设备。

你可以在[此处](http://mqtt.org/)找到有关MQTT的更多信息，ThingsBoard服务器支持QoS级别0（最多一次）和QoS级别1（至少一次）以及一组预定义主题的MQTT代理。

**客户端**

你可以在网上找到大量的MQTT客户端库，本文中的示例将基于Mosquitto和MQTT.js您可以使用我们的[Hello World](http://www.ithingsboard.com/docs/getting-started-guides/helloworld/)指南中的说明。

**MQTT连接**

我们将在本文中[使用令牌凭据](/she-bei-jie-ru/chuang-jian-she-bei#huo-qu-fang-wen-ling-pai)对进行设备访问，这些凭证稍后将称&#x4E3A;**$ACCESS\_TOKEN**应用程序需要发送用户名包&#x542B;**$ACCESS\_TOKEN**的MQTT CONNECT消息。

连接状态码说明：

* **0x00 连接成功** - 成功连接
* **0x04 连接失败** - 用户名或密码错误。
* **0x05 连接未授权** - -用户名包含无效的 **$ACCESS\_TOKEN**。

### Key-value格式 <a href="#keyvalue-ge-shi" id="keyvalue-ge-shi"></a>

支持以JSON格式的key-value字符串，值可以是string、bool、float、long或者二进制格式的序列化字符串；

### MQTT连接配置

```
47.106.143.1:1883
```

**userName**: GP1109N12345678（[在平台获取访问令牌](/she-bei-jie-ru/chuang-jian-she-bei#huo-qu-fang-wen-ling-pai)）\
**password**: (无)

### &#x20;**TOPIC主题发布接口列表**

|   | **topic**             | **Qos-级别** | **认证方式**    | **注释** |
| - | --------------------- | ---------- | ----------- | ------ |
| 1 | v1/gateway/connect    | 1          | accessToken | 连接到网关  |
| 2 | v1/gateway/disconnect | 1          | accessToken | 断开网关   |
| 3 | v1/gateway/attributes | 1          | accessToken | 设备属性   |
| 4 | v1/gateway/telemetry  | 1          | accessToken | 数据遥测   |

payload格式例如:

```
{
	"DEVICE": [{
		"ts": "1609144280398",
		"values": {
        "stringKey":"value1", 
        "booleanKey":true, 
        "doubleKey":42.0, 
        "longKey":73, 
        "jsonKey": {
           "someNumber": 42,
           "someArray": [1,2,3],
           "someNestedObject": {"key": "value"}
        }
       }
	}]
}

```

### v1/gateway/telemetry

网关心跳包实例：

```
{
	"WG12345678": [{
		"ts": "1609145640724",
		"values": {
			"H": "60",
			"mode": "2",
			"NET4GSTA": "1,0",
			"mT": "3,0,1",
			"mFifo": "618,618,1389,1389",
			"DDA": "1",
			"boxSta": "0",
			"TH": "30.40,42.4",
			"NR": "1247,1254",
			"Lat": "22.540456",
			"Lon": "113.928825",
			"SDR": 1,
			"power": {
				"0": 0,
				"1": "6.80",
				"2": "29",
				"9": "11.48",
				"10": "3800",
				"11": "3300",
				"12": "0",
				"13": "3300",
				"14": "40"
			}
		}
	}]
}
```

终端数据包实例：

```
{
	"WG12345678/sf_2_0_340000": [{
		"ts": "1609144280398",
		"values": {
			"T": "1609144280355",
			"SN": "00006500",
			"da": "010CE735CA7C271E21FFFFFF"
		}
	}]
}
```

###

在上面的示例中我们"ts":"1609144280398"，是具有毫秒精度的[Unix时间戳](https://en.wikipedia.org/wiki/Unix_time)。例如：值’1609140420031’转换后是’2020-12-28 16:31:20’。


# Yun-IOT后台服务HTTP接口

用户可通过此接口，与Yun-IOT平台进行二次开发，或是深入对接。

在线接口文档：


