main
kingyg 2 years ago
parent 03c99f2b2e
commit cdfa0c016f
  1. 224
      iot-docs/advancement-guide/benchmark.md
  2. 30
      iot-docs/advancement-guide/children-device.md
  3. 2
      iot-docs/advancement-guide/create-data-visualization.md
  4. 310
      iot-docs/advancement-guide/custom-protocol.md
  5. BIN
      iot-docs/advancement-guide/images/third-mqtt/device-event-info.png
  6. BIN
      iot-docs/advancement-guide/images/third-mqtt/device-event-info1.png
  7. BIN
      iot-docs/advancement-guide/images/third-mqtt/device-event-report-log.png
  8. BIN
      iot-docs/advancement-guide/images/third-mqtt/device-offline.png
  9. BIN
      iot-docs/advancement-guide/images/third-mqtt/device-online.png
  10. BIN
      iot-docs/advancement-guide/images/third-mqtt/device-property-refresh.png
  11. BIN
      iot-docs/advancement-guide/images/third-mqtt/emq-connection-info.png
  12. BIN
      iot-docs/advancement-guide/images/third-mqtt/emq-dashboard.png
  13. BIN
      iot-docs/advancement-guide/images/third-mqtt/insert-mqtt-client.png
  14. BIN
      iot-docs/advancement-guide/images/third-mqtt/insert-mqtt-gateway.png
  15. BIN
      iot-docs/advancement-guide/images/third-mqtt/mqtt-client-debug.png
  16. BIN
      iot-docs/advancement-guide/images/third-mqtt/mqtt-client-message-send.png
  17. BIN
      iot-docs/advancement-guide/images/third-mqtt/mqtt-client-message-subscribe.png
  18. BIN
      iot-docs/advancement-guide/images/third-mqtt/mqtt-client-start.png
  19. BIN
      iot-docs/advancement-guide/images/third-mqtt/mqtt-gateway-start.png
  20. BIN
      iot-docs/advancement-guide/images/third-mqtt/mqttfx-config.png
  21. BIN
      iot-docs/advancement-guide/images/third-mqtt/mqttfx-connection.png
  22. BIN
      iot-docs/advancement-guide/images/third-mqtt/mqttfx-device-event-report.png
  23. BIN
      iot-docs/advancement-guide/images/third-mqtt/mqttfx-device-offline.png
  24. BIN
      iot-docs/advancement-guide/images/third-mqtt/mqttfx-device-online.png
  25. BIN
      iot-docs/advancement-guide/images/third-mqtt/mqttfx-replay-device-property.png
  26. BIN
      iot-docs/advancement-guide/images/third-mqtt/mqttfx-replyed-property-value.png
  27. BIN
      iot-docs/advancement-guide/images/third-mqtt/mqttfx-sub-read-property.png
  28. BIN
      iot-docs/advancement-guide/images/third-mqtt/mqttfx-subscribe.png
  29. BIN
      iot-docs/advancement-guide/images/third-mqtt/read-device-property-reply-log.png
  30. 274
      iot-docs/advancement-guide/jetlinks-protocol.md
  31. 410
      iot-docs/advancement-guide/mqtt-connection.md
  32. 2
      iot-docs/advancement-guide/rule-engine-send.md
  33. 2
      iot-docs/advancement-guide/rule-engine-subscription.md
  34. 14
      iot-docs/advancement-guide/tcp-connection.md
  35. 218
      iot-docs/advancement-guide/third-mqtt.md
  36. 124
      iot-docs/basics-guide/DemoDevice.md
  37. 10
      iot-docs/basics-guide/README.md
  38. 96
      iot-docs/basics-guide/cloud-docking.md
  39. 80
      iot-docs/basics-guide/course/coap-server-gateway.md
  40. 9
      iot-docs/basics-guide/course/data-visualization.md
  41. 110
      iot-docs/basics-guide/course/device-alarm.md
  42. 317
      iot-docs/basics-guide/course/device-connection.md
  43. 45
      iot-docs/basics-guide/course/device-gateway.md
  44. 28
      iot-docs/basics-guide/course/introduction.md
  45. 5
      iot-docs/basics-guide/course/logger.md
  46. 2
      iot-docs/basics-guide/course/message.md
  47. 94
      iot-docs/basics-guide/course/mqtt-client-gateway.md
  48. 10
      iot-docs/basics-guide/course/network-ca.md
  49. 504
      iot-docs/basics-guide/course/network.md
  50. 303
      iot-docs/basics-guide/course/notification.md
  51. 338
      iot-docs/basics-guide/course/notify-manager.md
  52. 36
      iot-docs/basics-guide/course/org-device-permission-setting.md
  53. 133
      iot-docs/basics-guide/course/rule-dingding.md
  54. 101
      iot-docs/basics-guide/course/rule-engine-nodered.md
  55. 338
      iot-docs/basics-guide/course/rule-engine.md
  56. 40
      iot-docs/basics-guide/course/rule-transfer-message.md
  57. 13
      iot-docs/basics-guide/course/start.md
  58. 246
      iot-docs/basics-guide/course/system-layout.md
  59. 64
      iot-docs/basics-guide/course/user-permisson.md
  60. 502
      iot-docs/basics-guide/device-manager.md
  61. BIN
      iot-docs/basics-guide/files/coap-server-gateway/coap-server-connected-test.png
  62. BIN
      iot-docs/basics-guide/files/coap-server-gateway/create-coap-server-gateway.png
  63. BIN
      iot-docs/basics-guide/files/coap-server-gateway/device-received-event.png
  64. BIN
      iot-docs/basics-guide/files/coap-server-gateway/save-coap-server.png
  65. BIN
      iot-docs/basics-guide/files/coap-server-gateway/send-device-event.png
  66. BIN
      iot-docs/basics-guide/files/device-connection/Physical-model.png
  67. BIN
      iot-docs/basics-guide/files/device-connection/bind-child-device.png
  68. BIN
      iot-docs/basics-guide/files/device-connection/check.png
  69. BIN
      iot-docs/basics-guide/files/device-connection/choose-child-device.png
  70. BIN
      iot-docs/basics-guide/files/device-connection/choose-device-product.png
  71. BIN
      iot-docs/basics-guide/files/device-connection/choose-position.png
  72. BIN
      iot-docs/basics-guide/files/device-connection/compile.png
  73. BIN
      iot-docs/basics-guide/files/device-connection/demo-protocol-1.0.jar
  74. BIN
      iot-docs/basics-guide/files/device-connection/device-event-info.gif
  75. BIN
      iot-docs/basics-guide/files/device-connection/device-event-info.png
  76. BIN
      iot-docs/basics-guide/files/device-connection/device-event-info1.png
  77. BIN
      iot-docs/basics-guide/files/device-connection/device-event-report-log.png
  78. BIN
      iot-docs/basics-guide/files/device-connection/device-gateway.png
  79. BIN
      iot-docs/basics-guide/files/device-connection/device-info-geo.png
  80. BIN
      iot-docs/basics-guide/files/device-connection/device-instance-alarm.png
  81. BIN
      iot-docs/basics-guide/files/device-connection/device-instance-function.png
  82. BIN
      iot-docs/basics-guide/files/device-connection/device-instance-general-check.png
  83. BIN
      iot-docs/basics-guide/files/device-connection/device-instance-general-info.png
  84. BIN
      iot-docs/basics-guide/files/device-connection/device-instance-log.png
  85. BIN
      iot-docs/basics-guide/files/device-connection/device-instance-not-active.png
  86. BIN
      iot-docs/basics-guide/files/device-connection/device-instance-offline.png
  87. BIN
      iot-docs/basics-guide/files/device-connection/device-instance-run-info-temp.png
  88. BIN
      iot-docs/basics-guide/files/device-connection/device-instance-run-info.png
  89. BIN
      iot-docs/basics-guide/files/device-connection/device-instance-sign.png
  90. BIN
      iot-docs/basics-guide/files/device-connection/device-instance-visual.png
  91. BIN
      iot-docs/basics-guide/files/device-connection/device-instance.xlsx
  92. BIN
      iot-docs/basics-guide/files/device-connection/device-offline-log.png
  93. BIN
      iot-docs/basics-guide/files/device-connection/device-offline.png
  94. BIN
      iot-docs/basics-guide/files/device-connection/device-online-log.png
  95. BIN
      iot-docs/basics-guide/files/device-connection/device-online.png
  96. BIN
      iot-docs/basics-guide/files/device-connection/device-product-info.gif
  97. BIN
      iot-docs/basics-guide/files/device-connection/device-product-info1.png
  98. BIN
      iot-docs/basics-guide/files/device-connection/device-product-info2.png
  99. BIN
      iot-docs/basics-guide/files/device-connection/device-product-info3.png
  100. BIN
      iot-docs/basics-guide/files/device-connection/device-product-published.png
  101. Some files were not shown because too many files have changed in this diff Show More

@ -0,0 +1,224 @@
# 压力测试
压力测试主要对设备连接数以及设备消息处理速度进行测试.
测试场景:
1. 10万设备连接
2. 30万设备连接
3. 50万设备连接
4. 每秒随机10000个设备发送1条消息. 总计10000每秒.
5. 每秒随机20000个设备发送1条消息. 总计20000每秒
::: tip 注意
本测试在本地虚拟机中进行,屏蔽了网络环境影响,仅仅是对平台性能进行测试.
:::
## 压测环境
使用2个本地Linux虚拟机,一个作为服务端,一个作为压测客户端.
主机: i7 8700K, 64G内存 ,SSD, macOS,
服务端虚拟机: 6核28G内存,ubuntu 16.4.
客户端虚拟机: 4核10G内存,ubuntu 16.4.
初始数据: 200万设备实例,使用demo中的型号以及物模型.
```sql
--生成200万模拟数据
insert into dev_device_instance
select 1584008694260,null,null,null,'演示型号',null,null,
'demo-device',
concat('测试-',generate_series(0,2000000)),
'admin','admin',
'notActive',
concat('test-',generate_series(0,2000000))
;
```
服务端使用[docker快速启动](/install-deployment/docker-start.md),除了`elasticsearch`和`jetlinks`对内存配置,没有做其他修改.
客户端使用[模拟器](https://github.com/jetlinks/device-simulator)批量模拟设备.
参考脚本:
```bash
#!/usr/bin/env bash
sudo sysctl -p
sudo ufw disable
# 创建虚拟网卡
for i in {10..40}; do sudo ifconfig enp0s6:$i 10.211.55.2$i up ;done
java -jar -Xmx8G -Xms1024m -XX:+UseG1GC device-simulator.jar \
mqtt.batchSize=1000 \
mqtt.port=1883 \
mqtt.address=10.211.55.6 \
mqtt.scriptFile=./scripts/demo-device.js \
mqtt.timeout=1000 \
mqtt.limit=200000 \
mqtt.enableEvent=false \
mqtt.eventLimit=40000 \
mqtt.eventRate=1000 \
mqtt.threadSize=128 \
mqtt.bindPortStart=10000 \
mqtt.binds=10.211.55.210,10.211.55.211,10.211.55.212,10.211.55.213,10.211.55.214,10.211.55.215\
,10.211.55.217,10.211.55.218,10.211.55.219,10.211.55.220,10.211.55.221,10.211.55.222,10.211.55.223\
,10.211.55.224,10.211.55.225,10.211.55.226,10.211.55.227,10.211.55.228,10.211.55.229,10.211.55.230\
,10.211.55.231,10.211.55.232,10.211.55.233,10.211.55.234,10.211.55.235,10.211.55.236,10.211.55.237\
,10.211.55.238,10.211.55.239
```
## 测试结果
### 10万设备连接
1000并发请求连接.总计10万连接.
第一次,CPU平均使用率48%.JVM内存:4.64G.
```bash
create mqtt client: 99000 ok
create mqtt client: 100000 ok
max : 2364ms
min : 386ms
avg : 1036ms
> 5000ms : 0(0.00%)
> 2000ms : 418(0.42%)
> 1000ms : 54172(54.17%)
> 500ms : 45374(45.37%)
> 200ms : 36(0.04%)
> 100ms : 0(0.00%)
> 10ms : 0(0.00%)
```
第二次,CPU平均使用率78%.JVM内存:4.91G.
```bash
create mqtt client: 99000 ok
create mqtt client: 100000 ok
max : 934ms
min : 127ms
avg : 257ms
> 5000ms : 0(0.00%)
> 2000ms : 0(0.00%)
> 1000ms : 0(0.00%)
> 500ms : 3360(3.36%)
> 200ms : 58178(58.18%)
> 100ms : 38462(38.46%)
> 10ms : 0(0.00%)
```
::: tip
第一次为刚启动服务,设备首次连接均需要到redis中获取认证信息.
第二次设备信息已经加载到了内存,连接速度快了3倍以上,cpu使用率也更高.
:::
### 30万设备连接
1000并发请求连接.总计30万连接.
第一次,CPU平均使用率65%,JVM内存:5.16G
```bash
create mqtt client: 298000 ok
create mqtt client: 299000 ok
create mqtt client: 300000 ok
max : 1549ms
min : 312ms
avg : 972ms
> 5000ms : 0(0.00%)
> 2000ms : 0(0.00%)
> 1000ms : 103558(34.52%)
> 500ms : 196319(65.44%)
> 200ms : 123(0.04%)
> 100ms : 0(0.00%)
> 10ms : 0(0.00%)
```
第二次,CPU平均使用率81%,JVM内存: 4.38G
```bash
create mqtt client: 298000 ok
create mqtt client: 299000 ok
create mqtt client: 300000 ok
max : 5959ms
min : 120ms
avg : 358ms
> 5000ms : 257(0.09%)
> 2000ms : 6486(2.16%)
> 1000ms : 6902(2.30%)
> 500ms : 16411(5.47%)
> 200ms : 179659(59.89%)
> 100ms : 90285(30.09%)
> 10ms : 0(0.00%)
```
## 50万设备连接
1000并发请求连接.总计50万连接.
第一次,CPU平均使用率58%,JVM内存:5.38G
```bash
create mqtt client: 499000 ok
create mqtt client: 500000 ok
max : 1743ms
min : 156ms
avg : 878ms
> 5000ms : 0(0.00%)
> 2000ms : 0(0.00%)
> 1000ms : 57223(11.44%)
> 500ms : 431645(86.33%)
> 200ms : 9621(1.92%)
> 100ms : 1511(0.30%)
> 10ms : 0(0.00%)
```
第二次,CPU平均使用率88%,JVM内存:8.2G
```bash
create mqtt client: 499000 ok
create mqtt client: 500000 ok
max : 4662ms
min : 128ms
avg : 294ms
> 5000ms : 0(0.00%)
> 2000ms : 2421(0.48%)
> 1000ms : 5273(1.05%)
> 500ms : 34368(6.87%)
> 200ms : 278833(55.77%)
> 100ms : 179105(35.82%)
> 10ms : 0(0.00%)
```
## 数据上报,每秒上报10000条属性消息.
持续30分钟,CPU使用率: 43%.JVM最大内存:3.5G.
数据无堆积,ElasticSearch索引速率`20,002.9/s`.
## 数据上报,每秒上报20000条属性消息.
持续30分钟,CPU使用率: 79%.JVM最大内存:7.3G.
数据无堆积,ElasticSearch索引速率`40,528.1/s`.
::: tip
由于硬件资源不足,没有进行更大量的消息测试. 理论上性能瓶颈会在`elasticsearch`的索引速度.
:::

@ -0,0 +1,30 @@
# 接入网关设备,并通过网关接入子设备
场景: 设备的接入是由设备侧的网关(下称父设备)代理的. 一个父设备管理着多个子设备.
在自定义消息协议里,将收到的`设备消息(ChildrenDeviceMessage)`转换为对应`子设备消息`即可(通过`DeviceMessage.deviceId`).
一个典型的流程:
1. 自定义消息协议编解码: `ChildrenDeviceMessage`则为平台发往子设备的消息.
2. 父设备通过MQTT接入平台.
3. 父设备上报子设备数据,消息协议需要解码为`ChildDeviceMessage`或者`ChildDeviceMessageReply`. `ChildDeviceMessage.deviceId`
父设备ID,`ChildDeviceMessage.message.deviceId`为子设备ID.
4. 如果平台需要发送消息到子设备,那么必须先对子设备进行上线: 消息协议解码为`ChildDeviceMessage.message=DeviceOnlineMessage`.
5. 通过API直接向子设备发送消息.平台将自动根据设备关联信息转换对应的消息.
6. 消息协议将收到`ChildDeviceMessage`,根据消息类型转换为对应对设备消息.
::: tip 注意
在[jetlinks-community](https://github.com/jetlinks/jetlinks-community)
中的模拟器内置了子设备模拟.启动模拟器时指定脚本`demo-children-device.js`即可.
:::
以[demo-children-device.js](https://github.com/jetlinks/jetlinks-community/blob/master/simulator/scripts/demo-children-device.js)模拟器脚本为例:
1. 进入平台
2. 使用最新的[演示协议jar包](https://github.com/jetlinks/jetlinks-community/blob/master/simulator/demo-protocol-1.0.jar)更新协议管理中对应的协议.
3. 在设备实例中新建父设备: id为`gateway-1`.
4. 在设备实例中新建子设备: id为`child-device-1`
5. 激活设备
6. 启动模拟器
7. 设备状态均为在线说明成功,可以进入子设备运行状态进行相应的操作.

@ -0,0 +1,2 @@
# 创建可视化图表,实时展示设备属性变更(PRO)
待完成..

@ -0,0 +1,310 @@
# 自定义协议开发
## 环境准备和开发工具
* JDK:1.8+
* MAVEN:3.1+
::: warning 注意
maven不要使用全局仓库配置,可能导致依赖无法下载
:::
* 开发工具:idea
## 第一步 通过idea创建maven工程:demo-protocol
## 第二步 修改pom文件,添加依赖
```xml
<dependencies>
// jetlinks 核心依赖
<dependency>
<groupId>org.jetlinks</groupId>
<artifactId>jetlinks-core</artifactId>
<version>1.0.2-BUILD-SNAPSHOT</version>
</dependency>
// jetlinks 协议解析接口包
<dependency>
<groupId>org.jetlinks</groupId>
<artifactId>jetlinks-supports</artifactId>
<version>1.0.2-BUILD-SNAPSHOT</version>
</dependency>
// lombok,需要idea安装lombok插件,否则去掉
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.10</version>
</dependency>
// vertx核心包,可以用来进行网络模拟测试
<dependency>
<groupId>io.vertx</groupId>
<artifactId>vertx-core</artifactId>
<version>3.8.3</version>
<scope>test</scope>
</dependency>
// 单元测试包
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<version>5.5.2</version>
<scope>test</scope>
</dependency>
// logback日志
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>
</dependencies>
// netty组件
<dependencyManagement>
<dependencies>
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-bom</artifactId>
<version>${netty.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
```
* 修改maven pom文件properties
~~~xml
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.build.locales>zh_CN</project.build.locales>
<java.version>1.8</java.version>
<project.build.jdk>${java.version}</project.build.jdk>
<netty.version>4.1.45.Final</netty.version>
</properties>
~~~
* 添加maven编译规则
~~~xml
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>${project.build.jdk}</source>
<target>${project.build.jdk}</target>
<encoding>${project.build.sourceEncoding}</encoding>
</configuration>
</plugin>
</plugins>
</build>
~~~
* 添加hsweb私服和阿里云仓库
~~~xml
<repositories>
<repository>
<id>hsweb-nexus</id>
<name>Nexus Release Repository</name>
<url>http://nexus.hsweb.me/content/groups/public/</url>
<snapshots>
<enabled>true</enabled>
<updatePolicy>always</updatePolicy>
</snapshots>
</repository>
<repository>
<id>aliyun-nexus</id>
<name>aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
</repository>
</repositories>
~~~
## 第三步 协议开发
* 新建packag:org.jetlinks.demo.protocol
* 创建协议编码解码类:DemoDeviceMessageCodec
```java
import io.netty.buffer.ByteBuf;
import io.netty.buffer.ByteBufUtil;
import io.netty.buffer.Unpooled;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.codec.DecoderException;
import org.apache.commons.codec.binary.Hex;
import org.jetlinks.core.message.DeviceMessage;
import org.jetlinks.core.message.DeviceOnlineMessage;
import org.jetlinks.core.message.Message;
import org.jetlinks.core.message.codec.*;
import org.jetlinks.core.message.function.FunctionInvokeMessage;
import org.jetlinks.core.message.function.FunctionInvokeMessageReply;
import org.jetlinks.core.server.session.DeviceSession;
import org.jetlinks.wt.protocol.message.NbIotMessage;
import org.jetlinks.wt.protocol.message.data.enums.DataIdEnum;
import org.jetlinks.wt.protocol.message.enums.ControlEnum;
import org.reactivestreams.Publisher;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
@AllArgsConstructor
@Slf4j
public class DemoDeviceMessageCodec implements DeviceMessageCodec {
// 传输协议定义
@Override
public Transport getSupportTransport() {
return DefaultTransport.TCP;
}
// 把tcp消息解码为平台消息,多用于设备上报消息到平台
@Override
public Mono<? extends Message> decode(MessageDecodeContext context) {
return Mono.empty();
}
// 把平台消息编码为协议传输消息,多用于平台命令下发到设备
@Override
public Publisher<? extends EncodedMessage> encode(MessageEncodeContext context) {
retrun Mono.empty();
}
}
```
* 创建协议入口类: DemoProtocolSupportProvider
~~~java
import org.jetlinks.core.ProtocolSupport;
import org.jetlinks.core.Value;
import org.jetlinks.core.defaults.CompositeProtocolSupport;
import org.jetlinks.core.device.AuthenticationResponse;
import org.jetlinks.core.device.DeviceRegistry;
import org.jetlinks.core.device.MqttAuthenticationRequest;
import org.jetlinks.core.message.codec.DefaultTransport;
import org.jetlinks.core.metadata.DefaultConfigMetadata;
import org.jetlinks.core.metadata.types.PasswordType;
import org.jetlinks.core.metadata.types.StringType;
import org.jetlinks.core.spi.ProtocolSupportProvider;
import org.jetlinks.core.spi.ServiceContext;
import org.jetlinks.demo.protocol.tcp.DemoTcpMessageCodec;
import org.jetlinks.supports.official.JetLinksDeviceMetadataCodec;
import reactor.core.publisher.Mono;
public class DemoProtocolSupportProvider implements ProtocolSupportProvider {
@Override
public Mono<? extends ProtocolSupport> create(ServiceContext context) {
CompositeProtocolSupport support = new CompositeProtocolSupport();
// 协议ID
support.setId("demo-v1");
// 协议名称
support.setName("演示协议v1");
// 协议说明
support.setDescription("演示协议");
// 物模型编解码,固定为JetLinksDeviceMetadataCodec
support.setMetadataCodec(new JetLinksDeviceMetadataCodec());
//TCP消息编解码器
DemoDeviceMessageCodec codec = new DemoDeviceMessageCodec();
// 两个参数,协议支持和编解码类DemoDeviceMessageCodec中保持一致,第二个参数定义使用的编码解码类
support.addMessageCodecSupport(DefaultTransport.TCP, () -> Mono.just(codec));
return Mono.just(support);
}
}
~~~
## 第四步 设备上报消息解码
本部分代码全部写在DemoDeviceMessageCodec.decode方法中
~~~java
@AllArgsConstructor
@Slf4j
public class DemoTcpMessageCodec implements DeviceMessageCodec {
....
// 把tcp消息解码为平台消息,多用于设备上报消息到平台
@Override
public Mono<? extends Message> decode(MessageDecodeContext context) {
return Mono.defer(() -> {
// 消息上下文
FromDeviceMessageContext ctx = ((FromDeviceMessageContext) context);
// 从上下文中获取消息字节数组
ByteBuf byteBuf = context.getMessage().getPayload();
byte[] payload = ByteBufUtil.getBytes(byteBuf, 0, byteBuf.readableBytes(), false);
// 把字节流转换为字符串,根据不同设备不同协议进行解析,
String text=new String(payload);
ReportPropertyMessage message.setProperties(properties); = new ReportPropertyMessage();
// 设置消息ID为我们获得的消息内容
message.setDeviceId(text);
// 以当前时间戳为消息时间
long time=LocalDateTime.now().toInstant(ZoneOffset.of("+8")).toEpochMilli();
message.setTimestamp(time);
// 构造上报属性
Map<String, Object> properties = new HashMap<>();
properties.put("text",text);
// 设置上报属性
message.setProperties(properties);
// 获取设备会话信息
DeviceSession session = ((FromDeviceMessageContext) context).getSession();
// 如果session中没有设备信息,则为设备首次上线
if (session.getOperator() == null) {
DeviceOnlineMessage onlineMessage = new DeviceOnlineMessage();
onlineMessage.setDeviceId(text);
onlineMessage.setTimestamp(System.currentTimeMillis());
// 返回到平台上线消息
return Flux.just(message,onlineMessage);
}
// 返回到平台属性上报消息
return Mono.just(message);
});
}
.....
}
~~~
## 第五步 平台发送消息到设备(消息编码)
本部分代码全部写在DemoDeviceMessageCodec.encode方法中
~~~java
@AllArgsConstructor
@Slf4j
public class DemoDeviceMessageCodec implements DeviceMessageCodec {
..........
// 把平台消息编码为协议传输消息,多用于平台命令下发到设备
@Override
public Publisher<? extends EncodedMessage> encode(MessageEncodeContext context) {
// 从平台消息上下文中获取消息内容
Message message = context.getMessage();
EncodedMessage encodedMessage=EncodedMessage.simple(Unpooled.wrappedBuffer(toBytes());) = null;
// 根据消息类型的不同,构造不同的消息
if (message instanceof ReadPropertyMessage) {
ReadPropertyMessage readPropertyMessage = (ReadPropertyMessage) message;
// 获取需要传输的字节
byte[] bytes=readPropertyMessage.toString().getBytes();
// 构造为平台传输到设备的消息体
encodedMessage=EncodedMessage.simple(Unpooled.wrappedBuffer(bytes));
}
...
retrun encodedMessage != null ? Mono.just(encodedMessage) : Mono.empty();
}
}
~~~
## 第六步 打成jar包上传到平台,并进行调试
以[TCP服务网关接入设备](../best-practices/tcp-connection.md#使用tcp工具接入)为例。
进行协议上传和 配置,并使用TCP工具进行调试。

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 62 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 61 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 69 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 129 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 90 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 84 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 67 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 51 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 53 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 77 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

@ -0,0 +1,274 @@
# 物模型说明
设备模型分为: 属性(properties),功能(function),事件(event).
设备模型使用场景:
1. 前端通过模型定义动态展示设备运行状态或者设备操作界面
2. 服务端可通过统一的API获取设备模型并进行相关操作,如: 在发送设备消息时进行参数校验,
在收到设备消息进行类型转换处理.
数据结构:
{
"id":"设备ID",
"name":"设备名称",
"properties":[...属性],
"functions":[...功能],
"events":[...事件]
}
## 属性
用于定义设备属性,运行状态等如: 设备SN,当前CPU使用率等.
平台可主动下发消息获取设备属性,设备也通过事件上报属性.
数据结构:
{
"id": "cpu_usage", //属性标识
"name": "CPU使用率",
"valueType": { //值类型
"type": "double", //类型标识,见类型表
"maxValue":100,
"minValue":0,
"unit":"percent", //单位
"expands":{"key1":"value1"} //其他自定义拓展定义
},
"expands":{"key1":"value1"} //其他自定义拓展定义
}
## 功能
用于定义设备功能,平台可主动调用,例如: 播放语音,开关操作等.
数据结构:
{
"id": "playVoice", //功能标识
"name": "播放声音", //名称
"inputs": [ //输入参数
{
"id": "text",
"name": "文字内容",
"valueType": { //参数类型
"type": "string"
},
"expands":{"key1":"value1"} //其他自定义拓展定义
}
],
"output": { //输出
"type": "boolean" //输出类型
},
"expands":{"key1":"value1"} //其他自定义拓展定义
}
## 事件
用于定义设备事件, 如: 定时上报设备属性, 设备报警等.
数据结构:
{
"id": "fire_alarm", //事件标识
"name": "火警",
"valueType": {
"type": "object", //对象(结构体)类型
"properties": [ //对象属性(结构与属性定义相同)
{
"id": "location",
"name": "地点",
"valueType": {
"type": "string"
}
},
{
"id": "lng",
"name": "经度",
"valueType": {
"type": "double"
},
"expands":{"gis":"lng"} //其他自定义拓展定义
},
{
"id": "lat",
"name": "纬度",
"valueType": {
"type": "double"
},
"expands":{"gis":"lat"} //其他自定义拓展定义
}
]
},
"expands":{"key1":"value1"} //其他自定义拓展定义
}
## 数据类型
所有类型共有属性:
- id 唯一标识
- name 名称
- description 描述
- expands 自定义配置
### 数字类型
1. int 整型
2. long 长整型
3. float 单精度浮点型
4. double 双精度浮点型
以上均为数字类型,共有属性:
- max 最大值
- min 最小值
- unit 单位
例:
{
"type":"double",
"max":100,
"min":0,
"unit":"percent",
"expands":{"readonly":true}
}
### boolean 布尔类型
属性
- trueText 为true时的文本,默认为`是`
- falseText 为false时的文本,默认为`否`
- trueValue 为true时的值,默认为`true`
- falseValue 为false时的值,默认为`false`
例:
{
"type":"boolean",
"trueText":"开启",
"falseText":"关闭",
"trueValue":"1",
"falseValue":"0"
}
### string 字符类型
例:
{
"type":"string",
"expands":{"maxLen":"255"}
}
### enum 枚举类型
属性:
- elements (Element)枚举中的元素
Element:
- value 枚举值
- text 枚举文本
- description 说明
例:
{
"type":"enum",
"elements":[
{"value":"1","text":"正常"},
{"value":"-1","text":"警告"},
{"value":"0","text":"未知"}
]
}
### date 时间类型
属性:
- format 格式,如: yyyy-MM-dd
- tz 时区,如: Asia/Shanghai
例:
{
"type":"date",
"format":"yyyy-MM-dd",
"tz": "Asia/Shanghai"
}
### password 密码类型
与string类型相同
### file 文件类型
属性:
- bodyType 类型: url,base64,binary
例:
{
"type":"file",
"bodyType":"url"
}
### array 数组(集合)类型
属性:
- elementType 元素类型
例:
{
"type":"array",
"elementType":{
"type":"string"
}
}
### object 对象(结构体)类型
属性:
- properties 属性列表
例:
{
"type":"object",
"properties":[
{
"id": "location",
"name": "地点",
"valueType": {
"type": "string"
}
},
{
"id": "lng",
"name": "经度",
"valueType": {
"type": "double"
},
"expands":{"gis":"lng"}
},
{
"id": "lat",
"name": "纬度",
"valueType": {
"type": "double"
},
"expands":{"gis":"lat"}
}
]
}
### geoPoint Geo地理位置类型
支持以逗号分割的经纬度字符串以及map类型.
默认支持3种格式转换: 逗号分割字符:`145.1214,126.123` ,json格式:`{"lat":145.1214,"lon":126.123}`.
例:
{
"type":"geoPoint"
}

@ -0,0 +1,410 @@
# 使用MQTT服务网关接入设备
本文档以MQTT.fx为例,介绍使用第三方软件以MQTT协议接入物联网平台。MQTT.fx是一款基于Eclipse Paho,使用Java语言编写的MQTT客户端工具。支持通过Topic订阅和发布消息。
## 创建协议
> 自定义消息协议创建,请参考[消息协议定义](../basics-guide/protocol-support.md)。
**例**
i. 选择 `设备接入`-->`协议管理`--> 点击`新建`按钮
![新建协议导航](../basics-guide/files/device-connection/new-protocol.png)
ii.输入协议ID
iii. 输入型号名称
iv. 选择型号类型为 `jar`
v. 输入类名`org.jetlinks.demo.protocol.DemoProtocolSupportProvider`
vi. 上传jar包`demo-protocol-1.0.jar`, 请检出[demo-protocol](https://github.com/jetlinks/demo-protocol)自行打包。
vii. 点击确认,完成协议新增。
### 创建完成信息展示
![新建型号协议](../basics-guide/files/device-connection/product-protocol.png)
viii. 在操作列表中将协议发布。
![新建型号协议](../basics-guide/files/device-connection/protocol-release.png)
## 创建产品
**例**
i.下载型号文件[配置JSON](../basics-guide/files/device-connection/设备型号-智能温控.json)
ii. 选择 `设备管理`-->`产品`--> 点击`导入配置`按钮
![导入型号导航](../basics-guide/files/device-connection/import-product.png)
iii. 选择[配置JSON](../basics-guide/files/device-connection/设备型号-智能温控.json)文件
::: tip 注意:
上传文件需要将standalone/src/main/resources/application.yml中的static-location修改为
http://后台服务ip:8848/upload,参考[协议上传问题](../common-problems/install.md#协议发布失败或出现不支持的协议:xxx)
:::
iv.产品导入完成后,产品状态为`未发布`,效果如下图
![未发布产品](../basics-guide/files/device-connection/device-product-unpublished.png)
v.点击刚导入产品中的`...`按钮会出现`发布`按钮,点击`发布`按钮完成产品发布,导航栏中发布状态变为`已发布`代表发布成功。
![已发布产品](../basics-guide/files/device-connection/device-product-published.png)
### 创建成功的产品信息展示
i. 点击产品中`编辑`链接查看和编辑产品的基本信息
![产品编辑按钮](../basics-guide/files/device-connection/compile.png)
ii. 点击产品中`查看`→`物模型`,对产品设备定义
![产品查看按钮](../basics-guide/files/device-connection/check.png)
![物模型按钮](../basics-guide/files/device-connection/Physical-model.png)
iii. 点击属性定义信、事件定义对应操作下的编辑按钮查看更详细的型号息
属性定义参数:
![型号信息1](../basics-guide/files/device-connection/device-product-info1.png)
功能定义参数:
![型号信息2](../basics-guide/files/device-connection/device-product-info2.png)
事件定义参数:
![型号信息3](../basics-guide/files/device-connection/device-product-info3.png)
## 创建设备
> 自定义创建设备,请参考[添加设备](../basics-guide/device-manager.md#添加设备)。
**例**
i. 下载设备Excel文件[设备Excel](../basics-guide/files/device-connection/智能温控测试设备.xlsx)
ii. 选择 `设备管理`-->`设备`--> `其他批量操作`-->`批量导入设备`
![导入设备导航](../basics-guide/files/device-connection/import-device.png)
iii. 选择需要导入的产品,点击文件上传
![选择产品](../basics-guide/files/device-connection/choose-device-product.png)
iv. 设备导入完成效果如下图
![未激活的设备](../basics-guide/files/device-connection/device-instance-not-active.png)
v. 点击上图中`启用`链接完成设备激活,状态栏中发布状态变为`离线`代表设备激活成功。
![已激活的设备](../basics-guide/files/device-connection/device-instance-offline.png)
### 创建成功的设备信息展示
i. 点击查看链接可以看到设备基本信息(实例信息)
![点击查看按钮](../basics-guide/files/device-connection/device-instance-general-check.png)
![设备基本信息](../basics-guide/files/device-connection/device-instance-general-info.png)
ii. 设备运行状态信息(运行状态)
![设备运行状态信息](../basics-guide/files/device-connection/device-instance-run-info.png)
iii.设备功能信息(设备功能)
![设备功能信息](../basics-guide/files/device-connection/device-instance-function.png)
iv. 设备日志(日志管理)
![设备日志](../basics-guide/files/device-connection/device-instance-log.png)
v.告警设置
![告警设置](../basics-guide/files/device-connection/device-instance-alarm.png)
vi.可视化
![可视化](../basics-guide/files/device-connection/device-instance-visual.png)
vii.设备影子
![设备影子](../basics-guide/files/device-connection/device-instance-sign.png)
## 创建网关配置
参照[启动设备网关服务](../basics-guide/course/device-gateway.md)
**例**
i.创建MQTT服务网络组件以及MQTT服务组件配置
![MQTT服务组件创建和配置](../basics-guide/files/device-connection/mqtt-config.png)
::: tip 注意:
此处使用的端口为1889,docker启动时没有默认开启,使用docker启动jetlinks时请映射1889端口或者使用1883端口。
:::
ii.启动MQTT服务组件(灰色为未启动,蓝色为启动)
![MQTT服务组件启动](../basics-guide/files/device-connection/mqtt-start.png)
iii.创建MQTT服务设备网关以及MQTT服务设备网关配置
![MQTT服务设备网关创建和配置](../basics-guide/files/device-connection/mqtt-gateway-info.png)
::: warning 警告
大部分情况,请勿勾选`认证协议`,认证协议的作用是: 使用指定的协议来进行统一的认证。不勾选时,则使用产品里选择的协议来进行认证,
这2种认证方式在协议包内的实现方式是不同的。大部分情况下不需要选择。
:::
iv.启动MQTT服务设备网关,点击 `启动`,`状态`变为`已启动`
![MQTT启动](../basics-guide/files/device-connection/mqtt-gateway-start1.png)
![MQTT启动](../basics-guide/files/device-connection/mqtt-gateway-start2.png)
::: tip 注意:
大部分情况无需选择认证协议.
:::
## 使用MQTT.fx接入
1.下载并安装MQTT.fx软件。请访问[MQTT.fx官网](https://mqttfx.jensd.de/index.php/download?spm=a2c4g.11186623.2.16.20ab5800HxuVJR)。
2.打开MQTT.fx软件,单击设置图标。
![mqttfx首页](../basics-guide/files/device-connection/mqttfx-index.png)
3.设置连接参数。
::: tip 注意
设置参数时,请确保参数值中或参数值的前后均没有空格。
:::
i. 设置基本信息
![mqtt基本信息设置](../basics-guide/files/device-connection/mqtt-connection-general.png)
| 参数 | 说明 |
| :----- | :----- |
| Profile Name | 输入您的自定义名称。 |
| Profile Type | 选择为**MQTT Broker**。 |
MQTT Broker Profile Settings
| 参数 | 说明 |
| :----- | :----- |
| Broker Address | 连接域名。本地连接可直接填写 `127.0.0.1`,如为远程连接,请填写远程连接地址 |
| Broker Port | 设置为`1889` |
| Client ID | 设备Id。本文档中为演示设备`test001` |
General栏目下的设置项可保持系统默认,也可以根据您的具体需求设置。
ii. 单击User Credentials,设置User Name和Password。
> 在消息协议未定义前,username,password可以填写任意字符,但是不能留空。
![mqtt用户名名密码设置](../basics-guide/files/device-connection/mqtt-connection-user.png)
| 参数 | 说明 |
| :----- | :----- |
| User Name | 由[消息协议定义](../basics-guide/protocol-support.md)中决定User Name值(消息协议未定义时可填写任意值) |
| Password | 由[消息协议定义](../basics-guide/protocol-support.md)中决定Password值 (消息协议未定义时可填写任意值) |
4.设置完成后,单击右下角的**OK**。
## 设备消息
设备连接上平台,并进行一些基本的事件收发、属性读取操作。
### 设备上下线
单击 Mqtt fx 中`Connect`进行连接
![mqtt连接](../basics-guide/files/device-connection/mqtt-connection.png)
平台中设备状态变为上线即为连接成功
![设备上线](../basics-guide/files/device-connection/device-online.png)
点击该设备的`查看`→`日志管理`,在设备日志模块可以看到设备上线日志
![设备上线日志](../basics-guide/files/device-connection/device-online-log.png)
单击 Mqtt fx 中`Disconnect`断开连接
![mqtt断开连接](../basics-guide/files/device-connection/mqtt-connection-stop.png)
平台中设备状态变为离线即为断开连接成功
![设备离线](../basics-guide/files/device-connection/device-offline.png)
点击该设备的`查看`→`日志管理`,在设备日志模块可以看到设备离线日志
![设备离线日志](../basics-guide/files/device-connection/device-offline-log.png)
### 读取设备属性
::: tip 注意
第2步中回复平台属性值需要在第1步平台发送订阅以后的十秒钟内完成,否则平台会视为该次操作超时,导致读取属性值失败。
:::
1.平台告知设备(MQTT.fx)需要设备返回设备属性
在MQTT.fx上订阅消息,订阅物联网平台下发设备返回属性的Topic
i. 在MQTT.fx上,单击Subscribe。
ii. 输入平台获取设备属性会发送给网关的topic`/read-property`
iii. 单击Subscribe,订阅这个topic
![订阅topic](../basics-guide/files/device-connection/mqtt-sub.png)
iv. 平台发送订阅操作
单击设备页面中`test001`设备对应的`查看`链接
选择弹出框中`运行状态板块`
单击属性刷新
![平台属性订阅操作](../basics-guide/files/device-connection/device-property-refresh.png)
v. 订阅topic: `/read-property`对应的消息
![订阅topic](../basics-guide/files/device-connection/mqttfx-sub-read-property.png)
::: tip 注意:
复制好订阅该topic收到的消息中的messageId。此messageId将作为回复与平台设备属性的凭据之一
:::
2.设备(MQTT.fx)回复平台设备属性值
在MQTT.fx上发送消息,发送平台所需要的设备属性值。
i. 在MQTT.fx上,单击 `Publish`
ii. 输入一个回复平台属性值消息Topic和要发送的消息内容,单击Publish,向平台推送该消息。
![回复设备属性](../basics-guide/files/device-connection/mqttfx-replay-device-property.png)
| 参数 | 说明 |
| :----- | :----- |
| messageId | 第一步订阅平台topic“/read-property”所收到的messageId值 |
| deviceId | 设备Id |
| timestamp | 当前时间戳 |
| success | 成功标识 |
| properties | 设备属性值对象。例如: { "threshold":"50"} |
该文档所使用的回复内容
```json
{
"messageId":"第一步订阅平台topic“/read-property”所收到的messageId值",
"deviceId":"test001",
"timestamp":1583809148000,
"success":true,
"properties":{
"temperature":36.5
}
}
```
iii. 平台收到Mqtt.fx推送的属性值
![平台收到属性值](../basics-guide/files/device-connection/mqttfx-replyed-property-value.png)
iv. 读取设备属性回复的日志
![设备属性读取日志](../basics-guide/files/device-connection/read-device-property-reply-log.png)
#### 获取设备属性值完整演示
::: warning 注意:在下图中,从在界面上刷新属性开始直到动图结束的所有操作,需要在十秒钟内完成。否则平台会视为该次操作超时,导致读取属性值失败。
:::
![获取设备属性值](../basics-guide/files/device-connection/read-device-property.gif)
### 设备事件上报
MQTT.fx 推送设备事件消息到平台
以火灾报警事件为例。
1.在MQTT.fx上,单击 `Publish`
2.输入事件上报Topic和要发送的事件内容,单击Publish按钮,向平台推送该事件消息。
![设备事件上报](../basics-guide/files/device-connection/mqttfx-device-event-report.png)
该文档使用的topic: `/fire_alarm`
该文档所使用的回复内容
```json
{
"deviceId":"test001",
"pname":"智能温控",
"aid":105,
"a_name":"未来科技城",
"b_name":"C2 栋",
"l_name":"12-05-201",
"timestamp":"2019-11-06 16:28:50",
"alarm_type":1,
"alarm_describe":"火灾报警",
"event_id":1,
"event_count":1
}
```
| 参数 | 说明 |
| :----- | :----- |
| deviceId | 设备Id |
| pname | 产品名称 |
| aid | 区域Id |
| a_name | 区域名称 |
| b_name | 建筑名称 |
| l_name | 位置名称 |
| timestamp | 上报时间 |
| alarm_type | 报警类型 |
| alarm_describe | 报警描述 |
| event_id | 事件 ID |
| event_count | 该事件上报次数 |
3.事件上报设备日志
![事件上报设备日志](../basics-guide/files/device-connection/device-event-report-log.png)
4.事件上报内容
![事件上报内容](../basics-guide/files/device-connection/device-event-info.png)
![事件上报内容1](../basics-guide/files/device-connection/device-event-info1.png)
### 地理位置上报
1. 物模型中添加地理位置。通过属性定义添加地理位置类型属性。
![添加地理位置属性](../basics-guide/files/device-connection/insert-geo-property.png)
2. 在设备产品详情页面点击`应用配置`按钮。
![应用配置](../basics-guide/files/device-connection/start-model.png)
3. 使用mqtt.fx连接到平台,设备上线后推送地理位置消息到平台, 此处使用topic为`/report-property`。
![推送地理位置消息](../basics-guide/files/device-connection/push-geo.png)
此处使用的报文为:
```json
{
"deviceId":"test001",
"properties":{
"geo-test": "102.321,36.523"
}
}
```
::: tip 注意:
上报geo地理位置类型数据有三种格式,一是字符串以逗号分隔,如:`"102.321,36.523"`;
二是数组类型,如:`[102.321,36.523]`;
三是map类型,如:`{"lat":102.321,"lon":36.523}`。
:::
4. 上报成功后将在设备的运行状态中显示。
![地理位置展示](../basics-guide/files/device-connection/device-info-geo.png)
也可查看上报历史消息。
![地理位置历史记录](../basics-guide/files/device-connection/geo-history.png)
::: tip 注意:
物模型中的标签也可创建geo类型,但不可通过标签上报地理位置信息,只能通过属性上报。
地理位置标签将主要运用在地图查询中。
:::

@ -0,0 +1,2 @@
# 通过规则引擎向其他设备发送消息
待完成..

@ -0,0 +1,2 @@
# 通过规则引擎订阅设备消息,处理后发送邮件通知
待完成..

@ -0,0 +1,14 @@
# 使用TCP服务网关接入设备
使用TCP服务来接入设备
使用:
1. 在`网络组件`中创建`TCP服务`并启动.
2. 在`设备网关`中创建`TCP服务设备网关`,配置使用的消息协议,启动网关.
::: tip 注意
如果消息支持粘拆包处理,请在TCP服务中配置好处理方式.
:::

@ -0,0 +1,218 @@
# 通过第三方MQTT服务接入设备
在某些场景,设备不是直接接入平台,而是通过第三方MQTT服务,如:`emqtt`.
消息编解码与MQTT服务一样,从消息协议中使用`DefaultTransport.MQTT`来获取消息编解码器.
本文使用mqtt.fx为设备端,通过emqtt接入平台。
## 安装并启动EMQ
可直接前往[官网下载](http://www.emqtt.io/downloads/) emqttd。
本文使用docker搭建。
### 拉取镜像
```shell script
docker pull registry.cn-hangzhou.aliyuncs.com/synbop/emqttd:2.3.6
```
### 运行镜像
```shell script
docker run --name emq -p 18083:18083 -p 1883:1883 -p 8084:8084 -p 8883:8883 -p 8083:8083 -d registry.cn-hangzhou.aliyuncs.com/synbop/emqttd:2.3.6
```
### 访问EMQ Dashboard
在浏览器中输入 http:192.168.99.100: 18083,默认账号密码为用户名:admin 密码:public。
![emq-dashboard](images/third-mqtt/emq-dashboard.png)
## 创建MQTT客户端网络组件
1. 选择 `网络组件`-->`组件管理`--> 点击`新增组件`按钮。
![insert-mqtt-client](images/third-mqtt/insert-mqtt-client.png)
2. 在创建完成的模块上点击`启动`按钮。
![mqtt-client-start](images/third-mqtt/mqtt-client-start.png)
## 创建MQTT客户端设备网关
1. 选择 `网络组件`-->`设备网关`--> 点击`新建`按钮。
![insert-mqtt-gateway](images/third-mqtt/insert-mqtt-gateway.png)
::: tip 注意
和MQTT服务设备网关不同的是,客户端必须指定消息协议,因为无法通过消息识别出对应的设备标识.
在消息解码时也无法通过上下文(`MessageDecodeContext`)获取到设备操作接口(`DeviceOperator`).
此处使用`demo`协议.
:::
此处使用的Topics:`/read-property,/device_online_status,/fire_alarm`。
2. 在操作列点击`启动`按钮启动网关。
![mqtt-gateway-start](images/third-mqtt/mqtt-gateway-start.png)
## 使用MQTT.fx连接EMQ
### 设置连接参数。
配置参数请参考[使用MQTT.fx接入](../advancement-guide/mqtt-connection.md#使用MQTT.fx接入)。
**此处参数设置:**
![mqttfx-config](images/third-mqtt/mqttfx-config.png)
::: tip 注意:
Client ID为设备实例Id,需在平台创建id为`MQTT_FX_Client`的设备实例。
:::
### 连接EMQ
单击 Mqtt.fx客户端 中`Connect`进行连接。
![mqttfx-connection](images/third-mqtt/mqttfx-connection.png)
连接成功后EMQ Dashboard页面上将会显示这条连接记录。
![emq-connection-info](images/third-mqtt/emq-connection-info.png)
## 模拟设备上下线
使用MQTT.fx模拟设备上下线。
1. 单击 `Publish`
2. 输入设备上下线的topic和事件内容,点击单击Publish按钮,将消息推送到EMQ,
EMQ将消息转发到平台。
![mqttfx-device-online](images/third-mqtt/mqttfx-device-online.png)
此处使用的topic: `/device_online_status`
此处使用的事件内容:
```json
{
"deviceId":"MQTT_FX_Client",
"status":"1"
}
```
消息发送成功后:
![device-online](images/third-mqtt/device-online.png)
离线操作及效果展示:
![mqttfx-device-offline](images/third-mqtt/mqttfx-device-offline.png)
![device-offline](images/third-mqtt/device-offline.png)
## 模拟设备消息订阅
1. 在MQTT.fx上点击`Subscribe`,输入topic:`test`,点击Subscribe按钮订阅。
![mqttfx-subscribe](images/third-mqtt/mqttfx-subscribe.png)
2. 在平台中选择 `网络组件`-->`组件管理`,找到[MQTT客户端组件](#创建MQTT客户端网络组件),点击`调试`按钮。
![mqtt-client-debug](images/third-mqtt/mqtt-client-debug.png)
3. 在调试页面,选择`推送消息`,编辑内容后,点击`发送`按钮,MQTT.fx将会收到消息。
![mqtt-client-message-send](images/third-mqtt/mqtt-client-message-send.png)
![mqttfx-client-message-subscribe](images/third-mqtt/mqtt-client-message-subscribe.png)
## 模拟平台读取设备属性
1. 设备(MQTT.fx)订阅平台读取设备属性的topic。
i. 在MQTT.fx上,单击Subscribe。
ii. 输入平台获取设备属性的topic`/read-property`。
iii. 点击击Subscribe。
![订阅topic](../basics-guide/files/device-connection/mqtt-sub.png)
2. 平台发送设备属性读取操作
i. 单击设备实例页面中`MQTT_FX_Client`设备对应的`查看`链接,选择`运行状态`。
ii. 单击属性刷新。
![平台属性订阅操作](images/third-mqtt/device-property-refresh.png)
iii. 订阅topic: `/read-property`对应的消息
![订阅topic](images/third-mqtt/mqttfx-sub-read-property.png)
::: tip 注意:
复制订阅该topic收到的消息中的messageId。此messageId将作为回复与平台设备属性的凭据之一
:::
3. 设备(MQTT.fx)回复平台设备属性值
i. 在MQTT.fx上,单击 `Publish`
ii. 输入一个回复平台属性值消息Topic和要发送的消息内容,单击Publish,向平台推送该消息。
![回复设备属性](images/third-mqtt/mqttfx-replay-device-property.png)
| 参数 | 说明 |
| :----- | :----- |
| messageId | 第一步订阅平台topic“/read-property”所收到的messageId值 |
| deviceId | 设备Id |
| timestamp | 当前时间戳 |
| success | 成功标识 |
| properties | 设备属性值对象。例如: { "temperature":"50"} |
该文档所使用的回复内容
```json
{
"messageId":"第一步订阅平台topic“/read-property”所收到的messageId值",
"deviceId":"MQTT_FX_Client",
"timestamp":"1584417135000",
"success":true,
"properties":{
"temperature":"50"
}
}
```
iii. 平台收到Mqtt.fx推送的属性值
![平台收到属性值](images/third-mqtt/mqttfx-replyed-property-value.png)
iv. 读取设备属性回复的日志
![设备属性读取日志](images/third-mqtt/read-device-property-reply-log.png)
## 模拟设备上报事件
1.在MQTT.fx上,单击 `Publish`
2.输入事件上报Topic和要发送的事件内容,单击Publish按钮,向平台推送该事件消息。
![设备事件上报](images/third-mqtt/mqttfx-device-event-report.png)
该文档使用的topic: `/fire_alarm`
该文档所使用的回复内容
```json
{
"deviceId":"MQTT_FX_Client",
"pname":"智能温控",
"aid":105,
"a_name":"未来科技城",
"b_name":"C2 栋",
"l_name":"12-05-201",
"timestamp":"2020-03-06 16:28:50",
"alarm_type":1,
"alarm_describe":"火灾报警",
"event_id":1,
"event_count":1
}
```
| 参数 | 说明 |
| :----- | :----- |
| deviceId | 设备Id |
| pname | 设备型号名称 |
| aid | 区域Id |
| a_name | 区域名称 |
| b_name | 建筑名称 |
| l_name | 位置名称 |
| timestamp | 上报时间 |
| alarm_type | 报警类型 |
| alarm_describe | 报警描述 |
| event_id | 事件 ID |
| event_count | 该事件上报次数 |
3.事件上报设备日志
![事件上报设备日志](images/third-mqtt/device-event-report-log.png)
4.事件上报内容
![事件上报内容](images/third-mqtt/device-event-info.png)
![事件上报内容1](images/third-mqtt/device-event-info1.png)

@ -0,0 +1,124 @@
# 树莓派演示设备操作手册
通过树莓派来接入传感器到JetLinks平台。 [演示视频](https://www.bilibili.com/video/BV1VA411W7JC)
::: tip
协议代码以及传感器未开源,如果想获取演示设备以及协议代码,请联系商务.
:::
## 新建
### 新建网络组件
1.进入系统,点击`设备接入` → `网络组件``新增组件`
![新建网络组件](images/device_demo/Network_components.png)
2.创建完后启动组件(蓝色为启动成功)
![启动网络组件](images/device_demo/start_network.png)
### 新建设备网关
1.点击 `设备接入 ``设备网关``新建`
![新建网关](images/device_demo/device_gateway.png)
2.创建成功后,找到刚创建的网关,开启网关
![开启网关](images/device_demo/start_gateway.png)
### 创建协议
1.点击 `设备接入``协议管理``新建`
上传对应的协议文件,
输入类名org.jetlinks.pisenser.protocol.PiSenserProtocolSupportProvider
(注:jar包在系统 /home/pi 目录下面)
![创建协议](images/device_demo/create_protocol.png)
2.在操作栏中点击点击`发布`
![发布协议](images/device_demo/protocol_release.png)
### 创建产品
1.点击 `设备管理` →`产品`→ `新建`
2.点击新建过后会跳转到创建产品界面,如下图:
![创建产品](images/device_demo/create_product.png)
3.点击保存过后会跳转到产品基本信息界面,点击 `发布``应用配置` ,如图下:
![发布产品](images/device_demo/product_release.png)
4.导入物模型
·下载快速导入物模型的文件,再点击`应用配置`
(注:物模型文件在/home/pi 目录下面,)
![导入物模型](images/device_demo/download.png)
### 创建设备:
1.点击 `设备管理``设备``添加设备`
![导入物模型](images/device_demo/create_equipment.png)
2.点击保存过后会跳转到设备的基本信息,点击激活设备,如下图:
![导入物模型](images/device_demo/activate_equipment.png)
## 模拟设备接入
1.下载并安装MQTT.fx软件。请访问[MQTT官网](https://mqttfx.jensd.de/index.php/download?spm=a2c4g.11186623.2.16.20ab5800HxuVJR)下载。
2.打开MQTT.fx软件,单击设置图标。
![下载MQTT](images/device_demo/mqttfx-index.png)
3.填写相应的信息
![配置MQTT参数](images/device_demo/mqtt_config.png)
4.点击 `ok` 保存后,测试连接设备,如下图:
![MQTT开始按钮](images/device_demo/start_config.png)
5.返回系统界面,查看设备是否上线,如下图:
![MQTT开始按钮](images/device_demo/equipment_online.png)
6.断开设备连接,如下图:
![MQTT断开连接](images/device_demo/stop_config.png)
![设备断开连接](images/device_demo/off_line.png)
::: tip 温馨提示:
如果回到系统,设备还是显示的在线,请刷新一下页面
:::
## 真实设备接入
设备通过网线接入路由器后,会通过DHCP协议自动获取IP地址,在路由器界面查询到设备IP地址。
:::warning 注意:
此处的IP地址根据你的实际地址确认
:::
![查看ip地址](images/device_demo/equipment_ip.png)
1.下载并安装Xshell软件。请访问[Xshell官网](https://www.xshellcn.com/xiazai.html)下载。
2.打开软件,新建一个会话,点击连接。(主机:192.168.3.139)
:::warning 注意:
此处的IP地址根据你的实际地址确认
:::
![连接会话](images/device_demo/Connect_session.png)
3.登录名和密码(name:pi password: qwer1234 )
![用户名](images/device_demo/login_name.png)
![密码](images/device_demo/login_password.png)
3.连接设备成功后,执行命令 : $vim Senser.py
![查看文件](images/device_demo/create_file.png)
4.执行完成后,在最下面修改配置文件(按i键切换为编辑模式)
![修改配置文件](images/device_demo/update_file.png)
5.编辑完过后,按ESC键退出编辑,执行命令 :$:wq保存文件并退出该文件
![退出](images/device_demo/exit_file.png)
6.执行$sudo reboot,重启程序,如下图
![重启程序](images/device_demo/reboot_procedure.png)
7.进入系统查看设备是否上线
![设备上线](images/device_demo/online_equipment.png)

@ -0,0 +1,10 @@
# JetLinks Pro 用户手册
## 操作手册
- [开始](start.md)
- [系统设置](system.md)
- [网络组件](network.md)
- [设备管理](device-manager.md)
- [规则引擎](rule-engine.md)

@ -0,0 +1,96 @@
# 云云对接
目前小度,阿里云,移动和电信平台能支持控制jetlinks平台的设备。
## DuerOS
### 新建产品
#### 操作步骤
1、进入系统:`云云对接`-`DuerOS`- `新建`
2、输入必填的产品,名称,厂商名称和设备版本。
3、点击确定进行`保存`。
![新建产品](images/cloud-docking/create-DuerOS.png)
![新建产品](images/cloud-docking/create-DuerOS1.png)
### 修改
在创建完产品后,可以点击`编辑`来修改创建好的内容。
![修改产品信息](images/cloud-docking/update-DuerOS.png)
### 删除
对于不需要的产品可以选择操作栏的`删除`按钮将其删除
![删除产品信息](images/cloud-docking/delete-DuerOS.png)
## 阿里云
### 新建产品
#### 操作步骤
1、进入系统:`云云对接`-`阿里云`- `添加产品`
2、输入产品所需要的信息。
3、点击确定进行`保存`。
![新建产品](images/cloud-docking/create-aliyun.png)
### 查看
在成功创建产品过后,可以点击查看按钮跳转到产品的基本信息页面。
![新建产品](images/cloud-docking/select-aliyun.png)
![新建产品](images/cloud-docking/jump.png)
### 修改
在创建完产品后,可以点击`编辑`来修改产品内容,修改完成后点击`保存`。
![修改产品信息](images/cloud-docking/update-aliyun.png)
### 启用与禁用
刚创建的产品默认为禁用状态,在操作栏点击启用按钮,状态栏变为启用中,说明启动成功。
![启动产品](images/cloud-docking/start.png)
![状态栏变为启动](images/cloud-docking/start1.png)
在启动中的设备,操作栏的启动按钮变为禁用。
### 删除
对于不需要的产品可以选择操作栏的`删除`按钮将其删除
![删除产品信息](images/cloud-docking/delete-aliyun.png)
::: tip 注意
所有平台启动中的设备不允许删除
:::
## 移动OneNet
### 新建产品
#### 操作步骤
1、进入系统:`云云对接`-`OneNet`- `新增`
2、输入产品基本信息
3、点击确定进行`保存`。
![新建产品](images/cloud-docking/create-OneNet.png)
### 修改
在创建完产品后,可以点击`编辑`来修改创建好的内容,修改完成后点击保存。
![修改产品信息](images/cloud-docking/update-OneNet.png)
### 删除
对于不需要的产品可以选择操作栏的`删除`按钮将其删除
![删除产品信息](images/cloud-docking/delete-OneNet.png)
## 电信CTWing
电信CTWing操作和移动OneNet操作相同

@ -0,0 +1,80 @@
# 启动CoAP服务设备网关,接收设备消息
创建CoAP服务设备网关,处理设备消息。
## 一、 创建CoAP服务并启动
进入系统: `网络组件`-`组件管理` 点击左侧菜单中的`CoAP服务` 添加一个CoAP服务。
![add mqtt server](../files/coap-server-gateway/save-coap-server.png)
点击状态列中的`已停止`开启服务. 状态变为`已启动`则为启动完成.
### 测试连接
使用[Node CoAP CLI](https://www.npmjs.com/package/coap-cli)进行连接测试.
1.[安装](https://www.npmjs.com/package/coap-cli)完成coap cli
2.打开终端,输入 `coap get coap://127.0.0.1:12344` 返回结果为404则表示coap服务启动成功
![coap服务连接测试](../files/coap-server-gateway/coap-server-connected-test.png)
## 二、创建设备网关
新建设备网关配置
![add device gateway](../files/coap-server-gateway/create-coap-server-gateway.png)
### 设备网关消息处理测试
#### 前提条件
i. 已在平台中创建产品和设备
ii. 设备已接入平台(设备已上线)
> 创建产品和设备具体操作细节,请参考[添加设备型号](../device-manager.md/#添加设备型号)、[添加设备实例](../device-manager.md/#添加设备实例)。
>
> 设备接入平台,请参考[设备接入教程](device-connection.md)
#### 创建成功的设备实例信息展示
i. 设备基本信息
![设备基本信息](../files/device-connection/device-instance-general-info.png)
ii. 设备运行状态信息
![设备运行状态信息](../files/device-connection/device-instance-run-info.png)
iii. 设备日志
![设备日志](../files/device-connection/device-instance-log.png)
#### 使用Node CoAP CLI测试
i. 安装[Node CoAP CLI](https://www.npmjs.com/package/coap-cli)
ii. 点击`操作`列中的`启动`按钮,启动网关。
iii. 终端输入: `coap post coap://127.0.0.1:12344/chiefdata/push/fire_alarm/department/1/area/1/dev/test001 -p {\"devid\":\"test001\"} -O 2100,test001`
![send-device-event](../files/coap-server-gateway/send-device-event.png)
vi. 设备收到一条上报事件则代表CoAP网关测试成功
![设备事件展示](../files/coap-server-gateway/device-received-event.png)
网关状态说明:
1. 停止:网关完全停止.不再接受设备连接,以及消息.重新启动后只会接受最新的连接以及消息。
2. 暂停:网关不再接受新的设备连接,以及消息.重新启动后恢复处理之前的所有连接的消息。
3. 启动:网关处理新的设备连接以及消息。
## 设备连接
参照[使用自定义消息协议接入设备](device-connection.md)进行设备配置,注册,以及连接,消息收发测试。

@ -0,0 +1,9 @@
# 数据可视化(Pro)
## 介绍
## 数据接口
## 可视化组件
## 可视化编排

@ -0,0 +1,110 @@
# 设备告警
通过规则引擎来设置告警规则,并启用相应动作如通知来转发告警消息。
## 配置产品下所有设备的告警规则
### 创建规则
**操作步骤:**
1. 进入系统: `设备管理`-`产品`。
选择需要设置告警规则的型号,在操作列单击`查看`进入设备型号详情页面。
![进入界面](../images/alarm/choose-alarm.png)
单击`新增告警`进入告警设置页面。
2. 设置触发条件,告警设置页面默认存在触发器1,点击下拉列表选择触发器类型。
i. 定时触发。
通过填写cron表达式([在线cron表达式](http://cron.qqe2.com/))的方式定时触发。
![定时触发](../images/alarm/alarm-cron.png)
设置完成后,还可以选择其他基于物模型的触发条件,如事件、属性等。
![触发条件1](../images/alarm/property-condition.png)
![触发条件1](../images/alarm/event-condition.png)
ii. 设备触发。
通过设备上下线以及物模型中定义的属性、事件等进行触发。
![设备触发](../images/alarm/alarm-device.png)
后续条件设置同定时触发。
::: tip 注意:
可同时添加多个触发器,任意一个触发器满足条件都将执行。
:::
3. 设置转换。
将内置的结果字段转换为自定义字段,例如:deviceId 转为 id。
![转换](../images/alarm/switch.png)
4. 设置执行动作。
当设置的告警规则触发后,可配置执行动作将告警信息以消息通知的形式转发出去。
![执行动作](../images/alarm/action.png)
5. 点击`确定`进行保存。
![保存](../images/alarm/save.png)
### 启动/停止
在告警设置列表页,单击操作列`启动`按钮即可启动告警。
![启动](../images/alarm/start.png)
启动成功后操作列会显示`停止`按钮,单击即可停止告警。
![停止](../images/alarm/stop.png)
### 告警日志
在告警设置列表页,单击操作列`告警日志`按钮即可查看告警日志。
![日志](../images/alarm/log.png)
![日志1](../images/alarm/log1.png)
## 配置单个设备的告警规则
::: tip 注意:
产品中设置的告警规则可应用于该产品下的所有设备,如需单独对设备设置告警规则,则需在设备实例中对其进行设置。
:::
### 创建规则
**操作步骤:**
1. 进入系统: `设备管理`-`设备`。
![进入界面](../images/alarm/choose-alarm-single.png)
找到需要设置的设备实例单击操作列的`查看`进入设备详情页。
在设备详情页单击`告警设置`进入告警设置页面。
![进入界面1](../images/alarm/choose-alarm-single1.png)
2. 设置触发条件,告警设置页面默认存在触发器1,点击下拉列表选择触发器类型。
i. 定时触发。
通过填写cron表达式([在线cron表达式](http://cron.qqe2.com/))的方式定时触发。
![定时触发](../images/alarm/alarm-cron.png)
设置完成后,还可以选择其他基于物模型的触发条件,如事件、属性等。
![触发条件1](../images/alarm/property-condition.png)
![触发条件1](../images/alarm/event-condition.png)
ii. 设备触发。
通过设备上下线以及物模型中定义的属性、事件等进行触发。
![设备触发](../images/alarm/alarm-device.png)
后续条件设置同定时触发。
::: tip 注意:
可同时添加多个触发器,任意一个触发器满足条件都将执行。
:::
3. 设置转换。
将内置的结果字段转换为自定义字段,例如:deviceId 转为 id。
![转换](../images/alarm/switch.png)
4. 设置执行动作。
当设置的告警规则触发后,可配置执行动作将告警信息以消息通知的形式转发出去。
![执行动作](../images/alarm/action.png)
5. 点击`确定`进行保存。
![保存](../images/alarm/save.png)
### 启动/停止
在告警设置列表页,单击操作列`启动`按钮即可启动告警。
![启动](../images/alarm/start-single.png)
启动成功后操作列会显示`停止`按钮,单击即可停止告警。
![停止](../images/alarm/stop-single.png)
### 告警日志
在告警设置列表页,单击操作列`告警日志`按钮即可查看告警日志。
![日志](../images/alarm/log.png)
![日志1](../images/alarm/log1.png)

@ -0,0 +1,317 @@
# 设备接入教程
本文档以MQTT.fx为例,介绍使用第三方软件以MQTT协议接入物联网平台。MQTT.fx是一款基于Eclipse Paho,使用Java语言编写的MQTT客户端工具。支持通过Topic订阅和发布消息。
## 创建协议
> 自定义消息协议创建,请参考[消息协议定义](../protocol-support.md)。
### 例
i. 选择 `设备管理`-->`协议管理`--> 点击`新建协议`按钮
![新建协议导航](../files/device-connection/new-protocol.png)
ii. 输入型号名称
iii. 选择型号类型为 `jar`
iv. 输入类名`org.jetlinks.thidparty.fh3j.Fh3jProtocolSupportProvider`
v. 上传jar包 [fh3j-v2](../files/device-connection/fh3j-protocol-2.0.jar)
vi. 点击保存,完成协议新增。
### 创建完成信息展示
![新建型号协议](../files/device-connection/product-protocol.png)
## 创建设备型号
> 自定义创建设备型号,请参考[添加设备型号](../device-manager.md/#添加设备型号)
### 例
i.下载型号文件[配置JSON](../files/device-connection/device-product-smokeSensation001.json)
ii. 选择 `设备管理`-->`设备型号`--> 点击`导入配置`按钮
![导入型号导航](../files/device-connection/import-product.png)
iii. 选择[配置JSON](../files/device-connection/device-product-smokeSensation001.json)文件
iv.型号导入完成效果如下图
![未发布型号](../files/device-connection/device-product-unpublished.png)
v.点击上图中`未发布`链接完成型号发布,导航栏中发布状态变为`已发布`代表发布成功。
![已发布型号](../files/device-connection/device-product-published.png)
### 创建成功的型号信息展示
i. 点击导航栏中`编辑`链接查看型号基本信息
ii. 点击弹出框中`设备定义`板块查看型号设备定义
iii. 点击属性定义、事件定义对应操作下的编辑按钮查看更详细的型号信息
![型号信息](../files/device-connection/device-product-info.gif)
## 创建设备实例
> 自定义创建设备实例,请参考[添加设备实例](../device-manager.md/#添加设备实例)
### 例
i. 下载设备实例Excel文件[设备实例Excel](../files/device-connection/device-instance.xlsx)
ii. 选择 `设备管理`-->`设备实例`--> 点击`导入实例`按钮
![导入设备导航](../files/device-connection/import-device.png)
iii. 选择[设备实例Excel](../files/device-connection/device-instance.xlsx)文件
iv. 设备实例导入完成效果如下图
![未激活的设备](../files/device-connection/device-instance-not-active.png)
v. 点击上图中`激活`链接完成设备实例激活,导航栏中发布状态变为`离线`代表设备激活成功。
![已激活的设备](../files/device-connection/device-instance-offline.png)
### 创建成功的设备实例信息展示
i. 设备基本信息
![设备基本信息](../files/device-connection/device-instance-general-info.png)
ii. 设备运行状态信息
![设备运行状态信息](../files/device-connection/device-instance-run-info.png)
iii. 设备日志
![设备日志](../files/device-connection/device-instance-log.png)
## 创建网关配置
参照[启动设备网关服务](device-gateway.md)
### 例
mqtt服务设备网关配
![网关配置](../files/device-connection/mqtt-config.png)
## 使用MQTT.fx接入
1.下载并安装MQTT.fx软件。请访问[MQTT.fx官网](https://mqttfx.jensd.de/index.php/download?spm=a2c4g.11186623.2.16.20ab5800HxuVJR)。
2.打开MQTT.fx软件,单击设置图标。
![mqttfx首页](../files/device-connection/mqttfx-index.png)
3.设置连接参数。
**说明** 设置参数时,请确保参数值中或参数值的前后均没有空格。
i. 设置基本信息
![mqtt基本信息设置](../files/device-connection/mqtt-connection-general.png)
| 参数 | 说明 |
| :----- | :----- |
| Profile Name | 输入您的自定义名称。 |
| Profile Type | 选择为**MQTT Broker**。 |
MQTT Broker Profile Settings
| 参数 | 说明 |
| :----- | :----- |
| Broker Address | 连接域名。本地连接可直接填写 `127.0.0.1`,如为远程连接,请填写远程连接地址 |
| Broker Port | 设置为`1889` |
| Client ID | 设备Id。本文档中为演示设备实例`test001` |
General栏目下的设置项可保持系统默认,也可以根据您的具体需求设置。
ii. 单击User Credentials,设置User Name和Password。
> 在消息协议未定义前,username,password可以填写任意字符,但是不能留空。
![mqtt用户名名密码设置](../files/device-connection/mqtt-connection-user.png)
| 参数 | 说明 |
| :----- | :----- |
| User Name | 由[消息协议定义](../protocol-support.md)中决定User Name值(消息协议未定义时可填写任意值) |
| Password | 由[消息协议定义](../protocol-support.md)中决定Password值 (消息协议未定义时可填写任意值) |
iii. (可选)TLS连接。需要选择SSL/TLS,勾选Enable SSL/TLS,设置Protocol。建议Protocol选择为TLSv1.2。
![mqtt TSL设置](../files/device-connection/mqtt-connection-tsl.png)
4.设置完成后,单击右下角的**OK**。
## 设备操作
设备连接上平台,并进行一些基本的事件收发、属性读取操作。
### 设备上下线
单击 Mqtt fx 中`Connect`进行连接
![mqtt连接](../files/device-connection/mqtt-connection.png)
平台中设备状态变为上线即为连接成功
![设备上线](../files/device-connection/device-online.png)
在设备日志模块可以看到设备上线日志
![设备上线日志](../files/device-connection/device-online-log.png)
单击 Mqtt fx 中`Disconnect`断开连接
![mqtt连接](../files/device-connection/mqtt-connection.png)
平台中设备状态变为离线即为断开连接成功
![设备离线](../files/device-connection/device-offline.png)
在设备日志模块可以看到设备离线日志
![设备离线日志](../files/device-connection/device-offline-log.png)
### 读取设备属性
> 注意:第2步中回复平台属性值需要在第1步平台发送订阅以后的十秒钟内完成,否则平台会视为该次操作超时,导致读取属性值失败。
1.平台告知设备(MQTT.fx)需要设备返回设备属性
在MQTT.fx上订阅消息,订阅物联网平台下发设备返回属性的Topic
i. 在MQTT.fx上,单击Subscribe。
ii. 输入平台获取设备属性会发送给网关的topic`/read-property`
iii. 单击Subscribe,订阅这个topic
![订阅topic](../files/device-connection/mqtt-sub.png)
iv. 平台发送订阅操作
单击设备实例页面中`test001`设备对应的`查看`链接
选择弹出框中`运行状态板块`
单击属性刷新
![平台属性订阅操作](../files/device-connection/device-property-refresh.png)
v. 订阅topic: `/read-property`对应的消息
![订阅topic](../files/device-connection/mqttfx-sub-read-property.png)
> 注意:
> 复制好订阅该topic收到的消息中的messageId。此messageId将作为回复与平台设备属性的凭据之一
> 复制好
2.设备(MQTT.fx)回复平台设备属性值
在MQTT.fx上发送消息,发送平台所需要的设备属性值。
i. 在MQTT.fx上,单击 `Publish`
ii. 输入一个回复平台属性值消息Topic和要发送的消息内容,单击Publish,向平台推送该消息。
![回复设备属性](../files/device-connection/mqttfx-replay-device-property.png)
| 参数 | 说明 |
| :----- | :----- |
| messageId | 第一步订阅平台topic“/read-property”所收到的messageId值 |
| deviceId | 设备Id |
| timestamp | 当前时间戳 |
| success | 成功标识 |
| properties | 设备属性值对象。例如: { "threshold":"50"} |
该文档所使用的回复内容
```json
{
"messageId":"第一步订阅平台topic“/read-property”所收到的messageId值",
"deviceId":"test001",
"timestamp":"1577710986304",
"success":true,
"properties":{
"threshold":"50"
}
}
```
iii. 平台收到Mqtt.fx推送的属性值
![平台收到属性值](../files/device-connection/mqttfx-replyed-property-value.png)
iv. 读取设备属性回复的日志
![设备属性读取日志](../files/device-connection/read-device-property-reply-log.png)
#### 获取设备属性值完整演示
> 注意:在下图中,从在界面上刷新属性开始直到动图结束的所有操作,需要在十秒钟内完成。否则平台会视为该次操作超时,导致读取属性值失败。
![获取设备属性值](../files/device-connection/read-device-property.gif)
### 设备事件上报
MQTT.fx 推送设备事件消息到平台
以火灾报警事件为例。
1.在MQTT.fx上,单击 `Publish`
2.输入事件上报Topic和要发送的事件内容,单击Publish按钮,向平台推送该事件消息。
![设备事件上报](../files/device-connection/mqttfx-device-event-report.png)
该文档使用的topic: `/chiefdata/push/fire_alarm/department/1/area/1/dev/test001`
该文档所使用的回复内容
```json
{
"devid":"test001",
"pname":"烟感001",
"aid":105,
"a_name":"未来科技城",
"b_name":"C2 栋",
"l_name":"12-05-201",
"timestamp":"2019-11-06 16:28:50",
"alarm_type":1,
"alarm_describe":"火灾报警",
"event_id":1,
"event_count":1
}
```
| 参数 | 说明 |
| :----- | :----- |
| devid | 设备Id |
| pname | 设备型号名称 |
| aid | 区域Id |
| a_name | 区域名称 |
| b_name | 建筑名称 |
| l_name | 位置名称 |
| timestamp | 上报时间 |
| alarm_type | 报警类型 |
| alarm_describe | 报警描述 |
| event_id | 事件 ID |
| event_count | 该事件上报次数 |
3.事件上报设备日志
![事件上报设备日志](../files/device-connection/device-event-report-log.png)
4.事件上报内容
![事件上报内容](../files/device-connection/device-event-info.gif)

@ -0,0 +1,45 @@
# 启动MQTT服务设备网关,接收设备消息
创建MQTT服务设备网关,用于直连设备、处理设备消息。
## 创建MQTT服务网络组件
进入系统: `网络组件`-`组件管理` 点击左侧菜单中的`MQTT服务` 添加一个MQTT服务网络组件.
![add mqtt server](../images/network/save-mqtt-server.png)
点击状态列中的`已停止`开启服务. 状态变为`已启动`则为启动完成.
## 测试连接
1. 点击表格中的`操作`-`调试`.
2. 点击调试界面中的`开始`按钮.
3. 使用[MQTT.fx](http://mqttfx.org/)软件进行连接测试.
![add mqtt server](../images/network/mqtt-fx-config.png)
在调试MQTT服务界面打印出相关连接消息则表示服务正常.
注意:
1. 一定要先在调试界面中点击开始.否则会拒绝MQTT连接.
2. 在没有配置网关服务前,mqtt客户端的`clientId`,`username`,`password`可以填写任意字符,但是不能留空.
## 创建设备网关
1. 新建设备网关配置:
![add device gateway](../images/network/save-device-gateway.png)
2. 启动网关:
点击`操作`列中的`启动`按钮,启动网关.
网关状态说明:
1. 停止:网关完全停止.不再接受设备连接,以及消息.重新启动后只会接受最新的连接以及消息.
2. 暂停:网关不再接受新的设备连接,以及消息.重新启动后恢复处理之前的所有连接的消息.
3. 启动:网关处理新的设备连接以及消息.
## 设备连接
参照[使用自定义消息协议接入设备](device-connection.md)进行设备配置,注册,以及连接,消息收发测试.

@ -0,0 +1,28 @@
# 介绍
## 项目简介
JetLinks 是一个物联网基础平台,用于快速建立物联网相关业务系统.
- 集成了各种常见的网络协议(HTTP,TCP,UDP,CoAP)等,并对其进行封装,
实现统一管理,监控,在线调试,在线启动,停止,更新等功能.大大降低网络编程的复杂度.
- 多消息协议支持,可在线配置消息解析规则,将自定义的消息解析为平台统一的消息格式.
- 统一的设备操作API,屏蔽各个厂家`不同协议`不同设备的差异,支持`跨服务`,同步(RRpc),异步的设备消息收发.
- 可视化拖拽规则引擎设计器,灵活可拓展的多种规则节点支持,可通过规则引擎在线动态配置数据,业务处理逻辑.
- 灵活的多维度权限控制,可支持`列`,`行`级别数据权限控制.
官方QQ群: `2021514`
## 技术选型
1. [Spring Boot 2.2.x](https://spring.io/projects/spring-boot)
2. [Spring WebFlux](https://spring.io/) 响应式Web支持
3. [R2DBC](https://r2dbc.io/) 响应式关系型数据库驱动
4. [Project Reactor](https://projectreactor.io/) 响应式编程框架
4. [Netty](https://netty.io/),[Vert.x](https://vertx.io/) 高性能网络编程框架
5. [ElasticSearch](https://www.elastic.co/cn/products/enterprise-search) 全文检索,日志,时序数据存储
6. [PostgreSQL](https://www.postgresql.org) 业务功能数据管理
7. [hsweb framework 4](https://github.com/hs-web) 业务功能基础框架

@ -0,0 +1,5 @@
# 日志管理
## 访问日志
## 系统日志

@ -0,0 +1,2 @@
# 消息通知配置教程
待完成..

@ -0,0 +1,94 @@
# 启动MQTT客户端设备网关,接收设备消息
创建MQTT客户端设备网关,用于设备已连接到第三方MQTT服务上时,处理设备消息。
## 一. 创建MQTT客户端
进入系统: `网络组件`-`组件管理` 点击左侧菜单中的`MQTT客户端` 添加一个MQTT客户端。
![add mqtt server](../files/mqtt-client-gateway/save-mqtt-client.png)
### 测试连接
使用[EMQ](https://docs.emqx.io/broker/v3/cn/install.html)软件进行连接测试.
1.[安装](https://docs.emqx.io/broker/v3/cn/install.html#)完成EMQ,并启动
2.进入emq客户端监控界面
![emq客户端监控](../files/mqtt-client-gateway/emq-client-monitor.png)
3.点击状态列中的`已停止`开启服务. 状态变为`已启动`则为启动完成.
![启动mqtt客户单](../files/mqtt-client-gateway/start-mqtt-client.png)
4.在EMQ客户端监控列表中,看到客户端连接成功。表示mqtt客户端正常。
![emq监控mqtt客户端连接成功](../files/mqtt-client-gateway/emq-mqtt-client-connected.png)
## 创建设备网关
新建设备网关配置
![add device gateway](../files/mqtt-client-gateway/save-mqtt-client-gateway.png)
### 设备网关连接测试
#### 前提条件
i. 已在平台中创建产品和设备
> 创建产品和设备具体操作细节,请参考[添加设备型号](../device-manager.md/#添加设备型号)、[添加设备实例](../device-manager.md/#添加设备实例)。
>
> 设备接入平台,请参考[设备接入教程](device-connection.md)
#### 创建成功的设备实例信息展示
i. 设备基本信息
![设备基本信息](../files/device-connection/device-instance-general-info.png)
ii. 设备运行状态信息
![设备运行状态信息](../files/device-connection/device-instance-run-info.png)
iii. 设备日志
![设备日志](../files/device-connection/device-instance-log.png)
使用[MQTT.fx](http://mqttfx.org/)软件进行连接测试
1.启动网关:
i. 点击`操作`列中的`启动`按钮,启动网关。
ii. 在EMQ订阅监控列表中,看到有MQTT客户端设备网关新建时,设置的topics订阅记录,表示网关topic订阅成功。
![add mqtt server](../files/mqtt-client-gateway/emq-sub-mqtt-client-topic.png)
2.使用MQTT.fx连接上EMQ
![add mqtt server](../files/mqtt-client-gateway/mqtt-fx-config.png)
> 注意:上图第2步中port为EMQ服务所暴露的端口
3.发送设备上线消息到EMQ中
![发送设备上线消息到EMQ中](../files/mqtt-client-gateway/mqttfx-publish-online-msg.png)
4.设备上线表示设备设备网关连接成功
![设备上线](../files/mqtt-client-gateway/mqttfx-publish-online-msg.png)
网关状态说明:
1. 停止:网关完全停止.不再接受设备连接,以及消息.重新启动后只会接受最新的连接以及消息。
2. 暂停:网关不再接受新的设备连接,以及消息.重新启动后恢复处理之前的所有连接的消息。
3. 启动:网关处理新的设备连接以及消息。
## 设备连接
参照[使用自定义消息协议接入设备](device-connection.md)进行设备配置,注册,以及连接,消息收发测试。

@ -0,0 +1,10 @@
# 在网络组件中使用CA证书
创建证书管理,用于网络组件调用
## 添加证书
网络组件中,有多种类型的服务和客户端。所以与之对应创建一份客户端证书和一份服务证书
### 添加客户端证书

@ -0,0 +1,504 @@
# 网络组件配置
各种网络通信协议管理,可视化配置HTTP(S),TCP(TLS),CoAP(DTLS),UDP(DTLS)
等客户端及服务端.是设备接入等功能的核心.
## 证书管理
证书管理用于统一管理各个网络组件所需的TLS证书,支持证书格式:`JKS`,`P12`,`PEM`.
### 新增
**操作步骤**
1. 进入系统: `设备接入`-`证书管理`-`新建`。
2. 输入证书信息。
3. 点击`确定`进行保存。
![证书新增](../images/network/insert-certificate.png)
### 编辑
**操作步骤**
1. 进入系统: `设备接入`-`证书管理`,在操作列点击`编辑`。
2. 编辑证书信息。
3. 点击`确定`进行保存。
![证书编辑](../images/network/update-certificate.png)
### 删除
进入系统: `设备接入`-`证书管理`,在操作列点击`删除`。
![证书删除](../images/network/delete-certificate.png)
## 协议管理
### 什么是协议
协议是设备与平台通信的一种标准,某个设备想与平台进行通信就必须按照某种协议标准进行规定上报的数据格式。
协议管理将提供两类协议类型:jar包形式,脚本形式。定义了这两类中的其中一种,即完成了协议管理的定义。
| 功能类型 | 说明 |
| :--------------: | ------------- |
| jar | 自定义协议打包成jar包,上传至平台中。|
| 脚本 | 在线编辑协议格式脚本。|
### 添加协议
1. 登录物联网管理平台。
2. 在左侧导航栏,选择设备接入 > 协议管理。
3. 在协议管理管理页面协议管理列表中,单击协议管理所对应的`新建`操作按钮。
4. 在弹出对话框中,填写协议相关信息,然后点击`保存`。
![协议jar包基本信息](../images/device/agreement-info-jar.png)
协议jar包属性参数设置说明如下表。
|参数 | 描述 |
| :--------------: | ------------- |
| 名称 |协议的名称,例如JetLinks V1.0。支持中文、大小写字母、数字、短划线和下划线。|
| 类型 | jar:自定义协议打包成jar包,上传至平台中。|
| 类名 | 上传的jar包所对应的java类的类名。|
| 文件地址 | 上传的jar包在平台的文件路径。|
| 描述 | 输入文字,对该功能进行说明或备注。长度限制为100字。|
![协议脚本基本信息](../images/device/agreement-info-script.png)
协议脚本属性参数设置说明如下表。
| 参数 | 描述 |
| :--------------: | -------------
| 名称 |协议的名称,例如JetLinks V1.0。支持中文、大小写字母、数字、短划线和下划线|
| 类型 | 脚本:在线编辑协议格式脚本。|
| 连接协议 | 常规的连接协议。|
| 协议标识 | 唯一标识符,在协议中具有唯一性。可包含英文、数字、下划线,长度不超过32个字符,例如PowerComsuption。|
| 脚本类型 | 脚本编辑器格式。支持`groovy`和`javascript`格式|
| 脚本 | 协议格式,在线编辑。|
| 描述 | 输入文字,对该功能进行说明或备注。长度限制为100字。|
后续操作步骤:
1. 在协议管理列表中单击该型号的`编辑`按钮,可以修改基本信息。
![协议jar包编辑信息](../images/device/agreement-compile.png)
![协议jar包编辑信息](../images/device/agreement-compile1.png)
2. 在协议管理列表中单击该型号的`发布`按钮,将该协议注册到注册中心,添加设备型号时将会查询消息协议时就能查询到该协议。
+ 协议管理发布后,状态将变为`已发布`状态,已发布的设备型号或者是已绑定设备实例的设备型号将不支持删除。
![协议jar包发布信息](../images/device/agreement-release.png)
![协议jar包发布信息](../images/device/agreement-release1.png)
3. 在协议管理列表中单击该型号的`删除`按钮,将物理删除该协议。
(注:`已发布`状态的协议将不显示`删除`按钮)
![协议jar包删除信息](../images/device/agreement-delete.png)
## 网络组件
### MQTT
#### 新增
**服务:**
**操作步骤**
1. 进入系统: `设备接入`-`网络组件`-`新增组件`。
2. 输入服务配置信息。
3. 点击`确定`进行保存。
![mqttserver新增](../images/network/insert-mqtt-server.png)
**参数说明**
| 名称 | 说明 | 是否必填 |
| :----: | :----- | :----: |
| 组件名称 | 组件的名称,例如:MQTT服务。支持中文、大小写字母、数字、短划线和下划线| 是 |
| 组件类型 | 组件支持的类型,此处为MQTT服务,如MQTT服务、HTTP服务、MQTT客户端等 | 是 |
| 线程数 | 最大消息处理工作线程数量 | 否 |
| HOST | 服务地址 | 是 |
| PORT | 服务端口 | 是 |
| TLS | 是否开启证书 | 否 |
| 证书 | 选择证书 | 否 |
| 最大消息长度 | 设置最大的消息长度 | 否 |
| 描述 | 组件描述 | 否 |
**客户端:**
**操作步骤**
1. 进入系统: `设备接入`-`网络组件`-`新增组件`。
2. 输入客户端配置信息。
3. 点击`确定`进行保存。
![mqttclient新增](../images/network/insert-mqtt-client.png)
**参数说明**
| 名称 | 说明 | 是否必填 |
| :----: | :----- | :----: |
| 组件名称 | 组件的名称,例如:MQTT服务。支持中文、大小写字母、数字、短划线和下划线 | 是 |
| 组件类型 | 组件支持的类型,此处为MQTT服务端,如MQTT服务、HTTP服务、MQTT客户端等 | 是 |
| clientId| 客户端ID | 否 |
| HOST | 请求服务地址 | 是 |
| PORT | 请求服务端口 | 是 |
| TLS | 是否开启证书 | 否 |
| 证书 | 选择证书 | 否 |
| 用户名 | 访问服务进行验证时所需的用户名 | 否 |
| 密码 | 访问服务进行验证时所需的密码 | 否 |
| 描述 | 组件描述 | 否 |
#### 编辑
**服务:**
**操作步骤**
1. 进入系统: `设备接入`-`网络组件`,点击对应配置的编辑按钮。
2. 输入服务配置信息。
3. 点击`确定`进行保存。
![mqttserver编辑](../images/network/update-mqtt-server.png)
**客户端:**
操作步骤与服务端相同。
#### 删除
进入系统: `设备接入`-`网络组件`,点击对应配置的删除按钮。
![mqttserver删除](../images/network/delete-mqtt.png)
#### 调试
客户端组件连上服务组件,并发送消息。
**操作步骤**
1. 进入系统:`设备接入`-`网络组件`。
2. 选择对应的MQTT服务组件,点击`启动`,点击`调试`。
3. 点击`开始`。
![网络组件调试1](../images/network/mqtt-debug1.png)
4. 在浏览器新建一个标签页,进入`组件管理`。
5. 选择对应的MQTT客户端组件,点击`启动`,此时服务组件调试窗口将会收到客户端上线消息。
![网络组件调试2](../images/network/mqtt-debug2.png)
![网络组件调试3](../images/network/mqtt-debug3.png)
6.点击客户端组件`调试`按钮进入调试页面,选择推送消息,点击`发送`,服务调试页收到消息表示调试成功。
![网络组件调试4](../images/network/mqtt-debug4.png)
![网络组件调试5](../images/network/mqtt-debug5.png)
### TCP
功能使用请参考[MQTT](#MQTT)。
**服务组件新建参数说明**
| 名称 | 说明 | 是否必填 |
| :----: | :----- | :----: |
| 组件名称 | 组件的名称,例如:TCP服务。支持中文、大小写字母、数字、短划线和下划线,且必须以中文、英文或数字开头,不超过32个字符 | 是 |
| 组件类型 | 组件支持的类型,此处为TCP服务,如MQTT服务、HTTP服务、MQTT客户端等 | 是 |
| SSL | 是否开启SSL | 否 |
| HOST | 服务地址 | 是 |
| PORT | 服务端口 | 是 |
| 证书 | 选择证书 | 否 |
| 解析方式 | TCP服务接收消息时的解析方式,如固定长度、自定义脚本等 | 否 |
| 描述 | 组件描述 | 否 |
**客户端组件新建参数说明**
| 名称 | 说明 | 是否必填 |
| :----: | :----- | :----: |
| 组件名称 | 组件的名称,例如:TCP客户端。支持中文、大小写字母、数字、短划线和下划线,且必须以中文、英文或数字开头,不超过32个字符 | 是 |
| 组件类型 | 组件支持的类型,此处为TCP客户端,如MQTT服务、HTTP服务、MQTT客户端等 | 是 |
| SSL | 是否开启SSL | 否 |
| HOST | 请求服务地址 | 是 |
| PORT | 请求服务端口 | 是 |
| 证书 | 选择证书 | 否 |
| 解析方式 | TCP服务接收消息时的解析方式,如固定长度、自定义脚本等 | 否 |
| 描述 | 组件描述 | 否 |
### CoAP(Pro)
功能使用请参考[MQTT](#MQTT)。
**服务组件新建参数说明**
| 名称 | 说明 | 是否必填 |
| :----: | :----- | :----: |
| 组件名称 | 组件的名称,例如:CoAP服务。支持中文、大小写字母、数字、短划线和下划线,且必须以中文、英文或数字开头,不超过32个字符 | 是 |
| 组件类型 | 组件支持的类型,此处为CoAP服务,如MQTT服务、HTTP服务、MQTT客户端等 | 是 |
| DTSL | 是否开启DTSL | 否 |
| address | 服务地址 | 是 |
| PORT | 服务端口 | 是 |
| 证书 | 选择证书 | 否 |
| 私钥别名 | | 否 |
| 描述 | 组件描述 | 否 |
**客户端组件新建参数说明**
| 名称 | 说明 | 是否必填 |
| :----: | :----- | :----: |
| 组件名称 | 组件的名称,例如:TCoAP客户端。支持中文、大小写字母、数字、短划线和下划线,且必须以中文、英文或数字开头,不超过32个字符 | 是 |
| 组件类型 | 组件支持的类型,此处为CoAP客户端,如MQTT服务、HTTP服务、MQTT客户端等 | 是 |
| DTSL | 是否开启DTSL | 否 |
| URL | 请求服务地址 | 是 |
| 超时时间 | 请求超时时间 | 是 |
| 证书 | 选择证书 | 否 |
| 描述 | 组件描述 | 否 |
### WebSocket(Pro)
功能使用请参考[MQTT](#MQTT)。
**服务组件新建参数说明**
| 名称 | 说明 | 是否必填 |
| :----: | :----- | :----: |
| 组件名称 | 组件的名称,例如:WebSocket服务。支持中文、大小写字母、数字、短划线和下划线,且必须以中文、英文或数字开头,不超过32个字符 | 是 |
| 组件类型 | 组件支持的类型,此处为WebSocket服务,如MQTT服务、HTTP服务、MQTT客户端等 | 是 |
| SSL | 是否开启SSL | 否 |
| HOST | 服务地址 | 是 |
| PORT | 服务端口 | 是 |
| 证书 | 选择证书 | 否 |
| 解析方式 | TCP服务接收消息时的解析方式,如固定长度、自定义脚本等 | 否 |
| 描述 | 组件描述 | 否 |
**客户端组件新建参数说明**
| 名称 | 说明 | 是否必填 |
| :----: | :----- | :----: |
| 组件名称 | 组件的名称,例如:WebSocket客户端。支持中文、大小写字母、数字、短划线和下划线,且必须以中文、英文或数字开头,不超过32个字符 | 是 |
| 组件类型 | 组件支持的类型,此处为WebSocket客户端,如MQTT服务、HTTP服务、MQTT客户端等 | 是 |
| SSL | 是否开启SSL | 否 |
| HOST | 请求服务地址 | 是 |
| PORT | 请求服务端口 | 是 |
| 证书 | 选择证书 | 否 |
| uri | 请求服务uri | 是 |
| 验证host | 是否验证host | 否 |
| 描述 | 组件描述 | 否 |
### HTTP(Pro)
功能使用请参考[MQTT](#MQTT)。
**服务组件新建参数说明**
| 名称 | 说明 | 是否必填 |
| :----: | :----- | :----: |
| 组件名称 | 组件的名称,例如:HTTP服务。支持中文、大小写字母、数字、短划线和下划线,且必须以中文、英文或数字开头,不超过32个字符 | 是 |
| 组件类型 | 组件支持的类型,此处为HTTP服务,如MQTT服务、HTTP服务、MQTT客户端等 | 是 |
| SSL | 是否开启SSL | 否 |
| PORT | 服务端口 | 是 |
| 证书 | 选择证书 | 否 |
| 描述 | 组件描述 | 否 |
**客户端组件新建参数说明**
| 名称 | 说明 | 是否必填 |
| :----: | :----- | :----: |
| 组件名称 | 组件的名称,例如:HTTP客户端。支持中文、大小写字母、数字、短划线和下划线| 是 |
| 组件类型 | 组件支持的类型,此处为HTTP客户端,如MQTT服务、HTTP服务、MQTT客户端等 | 是 |
| SSL | 是否开启SSL | 否 |
| baseUrl | 请求服务地址 | 是 |
| 证书 | 选择证书 | 否 |
| 验证host | 是否验证host | 否 |
| 信任所有 | 是否信任所有 | 否 |
| 描述 | 组件描述 | 否 |
## 设备网关
### MQTT服务设备网关
创建MQTT服务设备网关,用于直连设备、处理设备消息。
#### 启动MQTT服务
进入系统: `设备接入`-`网络组件` 点击右侧菜单中组件类型选择`MQTT服务`, 添加一个MQTT服务.
![add mqtt server](../images/network/save-mqtt-server.png)
点击状态列中的`已停止`开启服务. 状态变为`已启动`则为启动完成.
#### 测试连接
1. 点击表格中的`操作`-`调试`.
![调试按钮位置](../images/network/mqtt-fx-debug.png)
2. 点击调试界面中的`开始`按钮.
3. 请访问[MQTT.fx官网](https://mqttfx.jensd.de/index.php/download?spm=a2c4g.11186623.2.16.20ab5800HxuVJR)软件进行连接测试.
![add mqtt server](../images/network/mqtt-fx-config.png)
在调试MQTT服务界面打印出相关连接消息则表示服务正常.
![调试按钮位置](../images/network/mqtt-fx-debug_suceess.png)
注意:
1. 一定要先在调试界面中点击开始.否则会拒绝MQTT连接.
2. 在没有配置网关服务前,mqtt客户端的`clientId`,`username`,`password`可以填写任意字符,但是不能留空.
#### 创建设备网关
1. 新建设备网关配置:
![add device gateway](../images/network/save-device-gateway.png)
2. 启动网关:
点击`操作`列中的`启动`按钮,启动网关.
网关状态说明:
1. 停止:网关完全停止.不再接受设备连接,以及消息.重新启动后只会接受最新的连接以及消息.
2. 暂停:网关不再接受新的设备连接,以及消息.重新启动后恢复处理之前的所有连接的消息.
3. 启动:网关处理新的设备连接以及消息.
#### 设备连接
参照[使用自定义消息协议接入设备](device-connection.md)进行设备配置,注册,以及连接,消息收发测试.
### MQTT客户端设备网关
创建MQTT客户端设备网关,用于设备已连接到第三方MQTT服务上时,处理设备消息。
#### 创建MQTT客户端
进入系统: `设备接入`-`网络组件` 点击`新增组件` ,组件类型选择MQTT客户端。
![add mqtt server](../files/mqtt-client-gateway/save-mqtt-client.png)
#### 测试连接
使用[EMQ](https://www.emqx.io/downloads#broker)软件进行连接测试.
1.使用docker启动
```
$docker pull emqx/emqx:4.2.7
$docker run -d --name emqx -p 1883:1883 -p 8083:8083 -p 8883:8883 -p 8084:8084 -p 18083:18083 emqx/emqx:4.2.7
```
使用[EMQ](https://docs.emqx.cn/cn/broker/latest/getting-started/dashboard.html)开发文档查看原始用户名和密码.
2.进入emq客户端监控界面
![emq客户端监控](../files/mqtt-client-gateway/emq-client-monitor.png)
3.点击状态列中的`启动状态`开启服务.变为蓝色则为启动完成.
![启动mqtt客户单](../files/mqtt-client-gateway/start-mqtt-client.png)
4.在EMQ客户端监控列表中,看到客户端连接成功。表示mqtt客户端正常。
![emq监控mqtt客户端连接成功](../files/mqtt-client-gateway/emq-mqtt-client-connected.png)
#### 创建设备网关
点击 `设备接入`→`设备网关`
![add device gateway](../files/mqtt-client-gateway/save-mqtt-client-gateway.png)
#### 设备网关连接测试
##### 前提条件
i. 已在平台中创建产品和设备
> 创建产品和设备具体操作细节,请参考[添加设备型号](../device-manager.md/#添加设备型号)、[添加设备实例](../device-manager.md/#添加设备实例)。
>
> 设备接入平台,请参考[设备接入教程](device-connection.md)
##### 创建成功的设备实例信息展示
i. 设备基本信息
![设备基本信息](../files/device-connection/device-instance-general-info.png)
ii. 设备运行状态信息
![设备运行状态信息](../files/device-connection/device-instance-run-info.png)
iii. 设备日志
![设备日志](../files/device-connection/device-instance-log.png)
使用[MQTT.fx](http://mqttfx.org/)软件进行连接测试
1.启动网关:
i. 点击`操作`列中的`启动`按钮,启动网关。
ii. 在EMQ订阅监控列表中,看到有MQTT客户端设备网关新建时,设置的topics订阅记录,表示网关topic订阅成功。
![add mqtt server](../files/mqtt-client-gateway/emq-sub-mqtt-client-topic.png)
2.使用MQTT.fx连接上EMQ
![add mqtt server](../files/mqtt-client-gateway/mqtt-fx-config.png)
> 注意:上图第2步中port为EMQ服务所暴露的端口(1883)
3.发送设备上线消息到EMQ中
![发送设备上线消息到EMQ中](../files/mqtt-client-gateway/mqttfx-publish-online-msg.png)
4.设备上线表示设备设备网关连接成功
![设备上线](../files/mqtt-client-gateway/mqttfx-publish-online-msg.png)
网关状态说明:
1. 停止:网关完全停止.不再接受设备连接,以及消息.重新启动后只会接受最新的连接以及消息。
2. 暂停:网关不再接受新的设备连接,以及消息.重新启动后恢复处理之前的所有连接的消息。
3. 启动:网关处理新的设备连接以及消息。
#### 设备连接
参照[使用自定义消息协议接入设备](device-connection.md)进行设备配置,注册,以及连接,消息收发测试。
### TCP设备网关
待完成..
### CoAP设备网关(Pro)
创建CoAP服务设备网关,处理设备消息。
#### 一、 创建CoAP服务并启动
进入系统: `设备接入`-`网络组件`,点击`新增组件`,在组件类型选择`CoAP服务`。
![add mqtt server](../files/coap-server-gateway/save-coap-server.png)
点击`启动状态`按钮,从灰色变成蓝色代表启动成功。
##### 测试连接
使用[Node CoAP CLI](https://www.npmjs.com/package/coap-cli)进行连接测试.
1.[安装](https://www.npmjs.com/package/coap-cli)完成coap cli
2.打开终端,输入 `coap get coap://127.0.0.1:12344` 返回结果为404则表示coap服务启动成功
![coap服务连接测试](../files/coap-server-gateway/coap-server-connected-test.png)
#### 二、创建设备网关
新建设备网关配置
![add device gateway](../files/coap-server-gateway/create-coap-server-gateway.png)
##### 设备网关消息处理测试
**前提条件**
i. 已在平台中创建产品和设备
ii. 设备已接入平台(设备已上线)
> 创建产品和设备具体操作细节,请参考[添加设备型号](../device-manager.md/#添加设备型号)、[添加设备实例](../device-manager.md/#添加设备实例)。
>
> 设备接入平台,请参考[设备接入教程](device-connection.md)
**创建成功的设备实例信息展示**
i. 设备基本信息
![设备基本信息](../files/device-connection/device-instance-general-info.png)
ii. 设备运行状态信息
![设备运行状态信息](../files/device-connection/device-instance-run-info.png)
iii. 设备日志
![设备日志](../files/device-connection/device-instance-log.png)
**使用Node CoAP CLI测试**
参照[使用CoAP接入设备(PRO)](/best-practices/coap-connection.md)进行测试
网关状态说明:
1. 停止:网关完全停止.不再接受设备连接,以及消息.重新启动后只会接受最新的连接以及消息。
2. 暂停:网关不再接受新的设备连接,以及消息.重新启动后恢复处理之前的所有连接的消息。
3. 启动:网关处理新的设备连接以及消息。
#### 设备连接
参照[使用自定义消息协议接入设备](device-connection.md)进行设备配置,注册,以及连接,消息收发测试。

@ -0,0 +1,303 @@
# 通知管理
通知管理用于统一管理,维护各种消息通知配置以及模版. 可通过统一的接口发送短信,邮件等消息通知
## 通知配置和模板
配置用于管理各种通知的配置. 如邮件的地址,端口,用户名密码等信息.
模版用于管理各种通知的消息模版. 如邮件模版,短信模版等.
## 服务商
同一个消息类型,但是可能由不同的服务商提供服务. 如发送短信, 阿里云和腾讯云所需要的配置以及模版内容可能都不一样.
在配置和模版中,会根据不同的服务商,填写不同的配置以及模版内容.
::: tip
发送消息时,需要指定相同服务商的配置以及模版.
:::
## 邮件通知
进入系统: `通知管理`-`通知配置` 点击左侧菜单中的`邮件` 添加一个邮件通知配置.
### 添加163邮箱配置信息
![add notify config](../images/notify/save-mail-notify-config.png)
属性说明:
| 属性 | 说明 | 是否必填 |
| :----: | :----- | :----: |
| 配置名称 | 通知配置的名称,例如:测试网易邮配置。支持中文、大小写字母、数字、短划线和下划线,且必须以中文、英文或数字开头,不超过32个字符 | 是 |
| 服务商 | 邮件服务商,支持多服务商,不同服务商配置信息不同,服务商选择`默认`时,支持javax.mail发送邮件的服务商 | 是 |
| 服务器地址 | 邮件服务商提供的服务器地址,163邮箱服务器地址为:smtp.163.com | 是 |
| 端口 | 邮件服务商提供的服务端口,163邮箱端口为:25 | 是 |
| 发件人 | 发送邮件后显示的发件人信息 | 是 |
| 用户名 | 发件人账户 | 是 |
| 密码 | 发件人密码 | 是 |
| 其他配置 | 163邮箱需配置其他配置 | 否 |
| 说明 | 输入文字,对该配置进行说明或备注。长度限制为100字 | 否 |
163邮箱需操作设置如下图所示:
![add notify config](../images/notify/163-mail-config.png)
### 添加139邮箱配置信息
![add notify config](../images/notify/save-139-mail-config.png)
属性说明:
| 属性 | 说明 | 是否必填 |
| :----: | :----- | :----: |
| 配置名称 | 通知配置的名称,例如:测试网易邮配置。支持中文、大小写字母、数字、短划线和下划线,且必须以中文、英文或数字开头,不超过32个字符 | 是 |
| 服务商 | 邮件服务商,支持多服务商,不同服务商配置信息不同,服务商选择`默认`时,支持javax.mail发送邮件的服务商 | 是 |
| 服务器地址 | 邮件服务商提供的服务器地址,139邮箱服务器地址为:SMTP.139.com | 是 |
| 端口 | 邮件服务商提供的服务端口,139邮箱端口为:25 | 是 |
| 发件人 | 发送邮件后显示的发件人信息 | 是 |
| 用户名 | 发件人账户 | 是 |
| 密码 | 发件人密码 | 是 |
| 其他配置 | 139邮箱需配置其他配置 | 否 |
| 说明 | 输入文字,对该配置进行说明或备注。长度限制为100字 | 否 |
139邮箱需操作设置如下图所示:
![add notify config](../images/notify/139-mail-config.png)
### 添加腾讯企业邮配置信息
![add notify config](../images/notify/save-TencentEnterprise-mail-config.png)
属性说明:
| 属性 | 说明 | 是否必填 |
| :----: | :----- | :----: |
| 配置名称 | 通知配置的名称,例如:测试网易邮配置。支持中文、大小写字母、数字、短划线和下划线,且必须以中文、英文或数字开头,不超过32个字符 | 是 |
| 服务商 | 邮件服务商,支持多服务商,不同服务商配置信息不同,服务商选择`默认`时,支持javax.mail发送邮件的服务商 | 是 |
| 服务器地址 | 邮件服务商提供的服务器地址,腾讯企业邮服务器地址为:smtp.exmail.qq.com | 是 |
| 端口 | 邮件服务商提供的服务端口,腾讯企业邮邮箱端口为:465 | 是 |
| 发件人 | 发送邮件后显示的发件人信息 | 是 |
| 用户名 | 发件人账户 | 是 |
| 密码 | 发件人密码 | 是 |
| 其他配置 | 腾讯企业邮需配置其他配置,配置信息查看`其他配置`表 | 是 |
| 说明 | 输入文字,对该配置进行说明或备注。长度限制为100字 | 否 |
`其他配置`信息如下:
| 配置名称 | 配置值 | 说明 |
| :---- | :----- | :----: |
| mail.smtp.auth | true | |
| mail.smtp.ssl.enable | true | |
腾讯企业邮需操作设置如下图所示:
![add notify config](../images/notify/TencentEnterprise-mail-config.png)
### 添加阿里云企业邮配置信息
![add notify config](../images/notify/save-aliyun-mail-config.png)
属性说明:
| 属性 | 说明 | 是否必填 |
| :----: | :----- | :----: |
| 配置名称 | 通知配置的名称,例如:测试网易邮配置。支持中文、大小写字母、数字、短划线和下划线,且必须以中文、英文或数字开头,不超过32个字符 | 是 |
| 服务商 | 邮件服务商,支持多服务商,不同服务商配置信息不同,服务商选择`默认`时,支持javax.mail发送邮件的服务商 | 是 |
| 服务器地址 | 邮件服务商提供的服务器地址,腾讯企业邮服务器地址为:smtp.mxhichina.com | 是 |
| 端口 | 邮件服务商提供的服务端口,腾讯企业邮邮箱端口为:25 | 是 |
| 发件人 | 发送邮件后显示的发件人信息 | 是 |
| 用户名 | 发件人账户 | 是 |
| 密码 | 发件人密码 | 是 |
| 其他配置 | 阿里云企业邮需配置其他配置 | 否 |
| 说明 | 输入文字,对该配置进行说明或备注。长度限制为100字 | 否 |
> 阿里云企业邮是默认开启个人邮箱pop3、smtp协议的,所以无需在阿里云邮箱里设置
### 配置邮件模板
进入系统: `通知管理`-`通知模板` 点击左侧菜单中的`邮件` 添加一个邮件通知模板.
![add notify template](../images/notify/save-mail-notify-template.png)
属性说明:
| 属性 | 说明 | 是否必填 |
| :----: | :----- | :----: |
| 模板名称 | 通知模板的名称,例如:测试邮件-图片+附件。支持中文、大小写字母、数字、短划线和下划线,且必须以中文、英文或数字开头,不超过32个字符 | 是 |
| 服务商 | 邮件服务商,支持多服务商,不同服务商配置信息不同,服务商选择`默认`时,支持javax.mail发送邮件的服务商 | 是 |
| 标题 | 邮件发送成功后,收件人显示标题或主题。支持表达式替换<br>`注:不同服务商显示不同` | 是 |
| 正文 | 邮件内容 | 是 |
| 收件人 | 接收邮件的用户,可同时添加多个。支持表达式替换 | 否 |
| 附件列表 | 发送邮件时携带的文件,可同时添加多个文件。支持表达式替换 | 否 |
> 表达式说明:表达式通用格式为$符号开头,两个大括号中填写需要被替换的内容。例:${test}
### 测试发送通知
1. 点击`通知模板`表格中的`操作`列-`调试`.
2. 弹出会话框后选择`通知配置`.
3. 填写`变量`信息,用变量信息将`通知模板`中的表达式替换为相应的内容(通知模板中不存在表达式时,使用默认值`{}`即可)
>例:`通知模板`内存在表达式`${test}`。则可以用对应的json格式数据{"test":"测试"},将通知模板中`${test}`替换为`测试`
![mail send test](../images/notify/mail-send-test.png)
发送成功后会提示`发送成功,请注意查收`,打开邮箱查看是否收到邮件通知,收到邮件通知即测试通过.
![mail send test](../images/notify/mail-send-test-result.png)
## 微信企业消息
### 配置信息
进入系统: `通知管理`-`通知配置` 点击左侧菜单中的`微信` 添加一个企业微信通知配置.
![add notify config](../images/notify/save-corpWeChat-notify-config.png)
属性说明:
| 属性 | 说明 | 是否必填 |
| :----: | :----- | :----: |
| 模板名称 | 通知配置的名称,例如:微信企业消息通知。支持中文、大小写字母、数字、短划线和下划线,且必须以中文、英文或数字开头,不超过32个字符 | 是 |
| 服务商 | 支持`企业微信号`和`微信公众号`,不同服务商配置信息不同,目前只支持`企业微信号` | 是 |
| corpId | 每个企业都拥有唯一的corpId,获取此信息可在管理后台“我的企业”-“企业信息”下查看“企业ID”(需要有管理员权限)<br>登录`https://work.weixin.qq.com/`-`我的企业`,正下方可见企业ID | 是 |
| corpSecret | corpSecret是企业应用里面用于保障数据安全的“钥匙”,每一个应用都有一个独立的访问密钥,为了保证数据的安全,secret务必不能泄漏<br>登录`https://work.weixin.qq.com/`-在管理后台->“应用与小程序”->“应用”->“自建”,点进某个应用,即可看到 | 是 |
| 说明 | 输入文字,对该配置进行说明或备注。长度限制为100字 | 否 |
> 参考文档:<https://work.weixin.qq.com/api/doc/90000/90135/91039>
### 模板信息
进入系统: `通知管理`-`通知模板` 点击左侧菜单中的`微信` 添加一个企业微信通知模板.
![add notify template](../images/notify/save-corpWeChat-notify-template.png)
属性说明:
| 属性 | 说明 | 是否必填 |
| :----: | :----- | :----: |
| 模板名称 | 通知模板的名称,例如:微信企业消息通知。支持中文、大小写字母、数字、短划线和下划线,且必须以中文、英文或数字开头,不超过32个字符 | 是 |
| 服务商 | 支持`企业微信号`和`微信公众号`,不同服务商配置信息不同,现目前只支持`微信企业消息通知` | 是 |
| 应用ID | 每个应用都有唯一的agentId<br>登录`https://work.weixin.qq.com/`-在管理后台->“应用与小程序”->“应用”,点进某个应用,即可看到agentId | 是 |
| 收信人ID | 每个成员都有唯一的userId,即所谓“帐号”<br>登录`https://work.weixin.qq.com/`-在管理后台->“通讯录”->点进某个成员的详情页,可以看到 | 是 |
| 收信部门ID | 每个部门都有唯一的id<br>登录`https://work.weixin.qq.com/`-在管理后台->“通讯录”->“组织架构”->点击某个部门右边的小圆点可以看到 | 是 |
| 按标签推送 | 本企业的标签ID列表,最多支持100个 | 否 |
| 内容 | 播放模板内容次数。支持表达式替换 | 否 |
> 参考文档:<https://work.weixin.qq.com/api/doc/90000/90135/90250#%E6%96%87%E6%9C%AC%E6%B6%88%E6%81%AF>
> 表达式说明:表达式通用格式为$符号开头,两个大括号中填写需要被替换的内容。例:${test}
### 测试发送通知
1. 点击`通知模板`表格中的`操作`列-`调试`.
2. 弹出会话框后选择`通知配置`.
3. 填写`变量`信息,用变量信息将`通知模板`中的表达式替换为相应的内容(通知模板中不存在表达式时,使用默认值`{}`即可)
>例:`通知模板`内存在表达式`${test}`。则可以用对应的json格式数据{"test":"测试"},将通知模板中`${test}`替换为`测试`
![corpWeChat send test](../images/notify/corpWeChat-send-test.png)
发送成功后会提示`发送成功,请注意查收`,打开企业微信客户端,查看是否收到消息,收到消息即通过测试.
## 钉钉通知
### 配置信息
进入系统: `通知管理`-`通知配置` 点击左侧菜单中的`钉钉` 添加一个钉钉通知配置.
![add notify config](../images/notify/save-dingding-notify-config.png)
属性说明:
| 属性 | 说明 | 是否必填 |
| :----: | :----- | :----: |
| 模板名称 | 通知配置的名称,例如:钉钉测试。支持中文、大小写字母、数字、短划线和下划线,且必须以中文、英文或数字开头,不超过32个字符 | 是 |
| 服务商 | 钉钉 | 是 |
| appKey | 应用的唯一标识key | 是 |
| appSecret | 应用的密钥 | 是 |
| 说明 | 输入文字,对该配置进行说明或备注。长度限制为100字 | 否 |
> 参考文档:<https://developers.dingtalk.com/document/app/basic-concepts/title-kux-it4-9c7>
### 模板信息
进入系统: `通知管理`-`通知模板` 点击左侧菜单中的`钉钉` 添加一个钉钉通知模板.
![add notify template](../images/notify/save-dingding-notify-template.png)
属性说明:
| 属性 | 说明 | 是否必填 |
| :----: | :----- | :----: |
| 模板名称 | 通知模板的名称,例如:钉钉消息通知。支持中文、大小写字母、数字、短划线和下划线,且必须以中文、英文或数字开头,不超过32个字符 | 是 |
| 服务商 | 钉钉 | 是 |
| 应用ID | 每个应用都有唯一的agentId。<br>登录`https://open-dev.dingtalk.com/fe/app`-在管理后台->钉钉应用,点进某个应用,即可看到agentId | 是 |
| 收信人ID | 接收者的用户userid列表,最大列表长度:100。在`https://oa.dingtalk.com/contacts.htm`中点击查看的员工UserID | 可选(收信人ID,部门ID, 全部用户,必须有一个不能为空) |
| 收信部门ID | 接收者的部门id列表,最大列表长度:20, 接收者是部门id下(包括子部门下)的所有用户,示例:123,456 | 可选(可不传,若传不能为空) |
| 全部用户 | 是否发送给企业全部用户 | 可选 |
| 内容 | 消息内容,消息类型和样例参考“消息类型与数据格式”。支持表达式替换。最长不超过2048个字节 | 是 |
> 参考文档:<https://developers.dingtalk.com/document/app/app-faq>
> 注:`钉钉推送消息需要到钉钉开发平台应用中心内添加IP白名单`
> 表达式说明:表达式通用格式为$符号开头,两个大括号中填写需要被替换的内容。例:${test}
### 测试发送通知
1. 点击`通知模板`表格中的`操作`列-`调试`.
2. 弹出会话框后选择`通知配置`.
3. 填写`变量`信息,用变量信息将`通知模板`中的表达式替换为相应的内容(通知模板中不存在表达式时,使用默认值`{}`即可)
>例:`通知模板`内存在表达式`${test}`。则可以用对应的json格式数据{"test":"测试"},将通知模板中`${test}`替换为`测试`
![dingding send test](../images/notify/dingding-send-test.png)
发送成功后会提示`发送成功,请注意查收`,打开钉钉客户端,查看是否收到消息,收到消息即通过测试.
## 语音通知
### 配置信息
进入系统: `通知管理`-`通知配置` 点击左侧菜单中的`语音` 添加一个语音通知配置.
![add notify config](../images/notify/save-voice-notify-config.png)
属性说明:
| 属性 | 说明 | 是否必填 |
| :----: | :----- | :----: |
| 模板名称 | 通知配置的名称,例如:测试邮件-图片+附件。支持中文、大小写字母、数字、短划线和下划线,且必须以中文、英文或数字开头,不超过32个字符 | 是 |
| 服务商 | 语音服务商,支持多服务商,不同服务商配置信息不同,现目前只支持`阿里云` | 是 |
| regionId | 电信区域代码 | 是 |
| accessKeyId | 访问密钥id | 是 |
| secret | 密钥对 | 是 |
| 说明 | 输入文字,对该配置进行说明或备注。长度限制为100字 | 否 |
### 模板信息
进入系统: `通知管理`-`通知模板` 点击左侧菜单中的`语音` 添加一个语音通知模板.
![add notify template](../images/notify/save-voice-notify-template.png)
属性说明:
| 属性 | 说明 | 是否必填 |
| :----: | :----- | :----: |
| 模板名称 | 通知模板的名称,例如:测试邮件-图片+附件。支持中文、大小写字母、数字、短划线和下划线,且必须以中文、英文或数字开头,不超过32个字符 | 是 |
| 服务商 | 语音服务商,支持多服务商,不同服务商配置信息不同,现目前只支持`阿里云` | 是 |
| 模版ID | 阿里云内配置模板的ID。`注:不同服务商显示不同` | 是 |
| 被叫显号 | 被叫显号,必须是已购买的号码。您可以在阿里云`语音服务控制台`上查看已购买的号码 | 是 |
| 被叫号码 | 被叫号码。仅支持中国大陆号码 | 是 |
| 播放次数 | 语音文件的播放次数,取值范围为1~3 | 否 |
> 参考文档:<https://help.aliyun.com/document_detail/114036.html?spm=a2c4g.11186623.6.559.3ba33c2dejPA2P>
### 测试发送通知
1. 点击`通知模板`表格中的`操作`列-`调试`.
2. 弹出会话框后选择`通知配置`.
3. 填写`变量`信息,运营商模板内容里配置有`变量`时需填写相关`变量`信息,`JSON`格式.
![voice send test](../images/notify/voice-send-test.png)
发送成功后会提示`发送成功,请注意查收`,收到电话语言通知即测试通过.

@ -0,0 +1,338 @@
# 通知管理
用于管理推送通知的基本信息以及推送的消息模板.
## 一. 短信通知配置-通知模板
#### 配置信息如下:
进入系统: `通知管理`-`通知配置` 点击左侧菜单中的`短信` 添加一个短信通知配置.
![add notify config](../images/notify/save-sms-notify-config.png)
属性说明:
| 属性 | 说明 | 是否必填 |
| :----: | :----- | :----: |
| 配置名称 | 通知配置的名称,例如:测试短信配置。支持中文、大小写字母、数字、短划线和下划线,且必须以中文、英文或数字开头,不超过32个字符 | 是 |
| 服务商 | 短信服务商,支持多服务商,不同服务商配置信息不同,现目前只支持:宏衍2046 | 是 |
| userId | 服务商对应的用户ID,找对应的服务商提供 | 是 |
| 用户名 | 服务商对应用户的用户名,找对应的服务商提供或登录相关服务商管理后台查询 | 是 |
| 密码 | 服务商对应用户的密码,找对应的服务商提供或登录相关服务商管理后台查询 | 是 |
| 说明 | 输入文字,对该配置进行说明或备注。长度限制为100字 | 否 |
#### 模板信息如下:
进入系统: `通知管理`-`通知模板` 点击左侧菜单中的`短信` 添加一个短信通知模板.
![add notify template](../images/notify/save-sms-notify-template.png)
属性说明:
| 属性 | 说明 | 是否必填 |
| :----: | :----- | :----: |
| 模板名称 | 通知模板的名称,例如:测试短信模板。支持中文、大小写字母、数字、短划线和下划线,且必须以中文、英文或数字开头,不超过32个字符 | 是 |
| 服务商 | 短信服务商,支持多服务商,不同服务商配置信息不同,现目前只支持:宏衍2046 | 是 |
| 短信内容 | 短信通知的内容,支持表达式替换<br>`注`:短信内容最前面必须添加签名内容,例如:`【阿里云】、【测试】`等 | 是 |
| 收件人 | 收件人,支持表达式替换 | 是 |
> 表达式说明:表达式通用格式为$符号开头,两个大括号中填写需要被替换的内容。例:${test}
#### 测试发送通知
1. 点击`通知模板`表格中的`操作`列-`调试`.
2. 弹出会话框后选择`通知配置`.
3. 填写`变量`信息,用变量信息将`通知模板`中的表达式替换为相应的内容(通知模板中不存在表达式时,使用默认值`{}`即可)
>例:`通知模板`内存在表达式`${test}`。则可以用对应的json格式数据{"test":"测试"},将通知模板中`${test}`替换为`测试`
![sms send test](../images/notify/sms-send-test.png)
发送成功后会提示`发送成功,请注意查收`,打开手机查看是否收到短信通知,收到短信通知即测试通过.
## 二. 邮件通知配置-通知模板
进入系统: `通知管理`-`通知配置` 点击左侧菜单中的`邮件` 添加一个邮件通知配置.
#### 添加163邮箱配置信息如下:
![add notify config](../images/notify/save-mail-notify-config.png)
属性说明:
| 属性 | 说明 | 是否必填 |
| :----: | :----- | :----: |
| 配置名称 | 通知配置的名称,例如:测试网易邮配置。支持中文、大小写字母、数字、短划线和下划线,且必须以中文、英文或数字开头,不超过32个字符 | 是 |
| 服务商 | 邮件服务商,支持多服务商,不同服务商配置信息不同,服务商选择`默认`时,支持javax.mail发送邮件的服务商 | 是 |
| 服务器地址 | 邮件服务商提供的服务器地址,163邮箱服务器地址为:smtp.163.com | 是 |
| 端口 | 邮件服务商提供的服务端口,163邮箱端口为:25 | 是 |
| 发件人 | 发送邮件后显示的发件人信息 | 是 |
| 用户名 | 发件人账户 | 是 |
| 密码 | 发件人密码 | 是 |
| 其他配置 | 163邮箱需配置其他配置 | 否 |
| 说明 | 输入文字,对该配置进行说明或备注。长度限制为100字 | 否 |
163邮箱需操作设置如下图所示:
![add notify config](../images/notify/163-mail-config.png)
#### 添加139邮箱配置信息如下:
![add notify config](../images/notify/save-139-mail-config.png)
属性说明:
| 属性 | 说明 | 是否必填 |
| :----: | :----- | :----: |
| 配置名称 | 通知配置的名称,例如:测试网易邮配置。支持中文、大小写字母、数字、短划线和下划线,且必须以中文、英文或数字开头,不超过32个字符 | 是 |
| 服务商 | 邮件服务商,支持多服务商,不同服务商配置信息不同,服务商选择`默认`时,支持javax.mail发送邮件的服务商 | 是 |
| 服务器地址 | 邮件服务商提供的服务器地址,139邮箱服务器地址为:SMTP.139.com | 是 |
| 端口 | 邮件服务商提供的服务端口,139邮箱端口为:25 | 是 |
| 发件人 | 发送邮件后显示的发件人信息 | 是 |
| 用户名 | 发件人账户 | 是 |
| 密码 | 发件人密码 | 是 |
| 其他配置 | 139邮箱需配置其他配置 | 否 |
| 说明 | 输入文字,对该配置进行说明或备注。长度限制为100字 | 否 |
139邮箱需操作设置如下图所示:
![add notify config](../images/notify/139-mail-config.png)
#### 添加腾讯企业邮配置信息如下:
![add notify config](../images/notify/save-TencentEnterprise-mail-config.png)
属性说明:
| 属性 | 说明 | 是否必填 |
| :----: | :----- | :----: |
| 配置名称 | 通知配置的名称,例如:测试网易邮配置。支持中文、大小写字母、数字、短划线和下划线,且必须以中文、英文或数字开头,不超过32个字符 | 是 |
| 服务商 | 邮件服务商,支持多服务商,不同服务商配置信息不同,服务商选择`默认`时,支持javax.mail发送邮件的服务商 | 是 |
| 服务器地址 | 邮件服务商提供的服务器地址,腾讯企业邮服务器地址为:smtp.exmail.qq.com | 是 |
| 端口 | 邮件服务商提供的服务端口,腾讯企业邮邮箱端口为:465 | 是 |
| 发件人 | 发送邮件后显示的发件人信息 | 是 |
| 用户名 | 发件人账户 | 是 |
| 密码 | 发件人密码 | 是 |
| 其他配置 | 腾讯企业邮需配置其他配置,配置信息查看`其他配置`表 | 是 |
| 说明 | 输入文字,对该配置进行说明或备注。长度限制为100字 | 否 |
`其他配置`信息如下:
| 配置名称 | 配置值 | 说明 |
| :---- | :----- | :----: |
| mail.smtp.auth | true | |
| mail.smtp.ssl.enable | true | |
腾讯企业邮需操作设置如下图所示:
![add notify config](../images/notify/TencentEnterprise-mail-config.png)
#### 添加阿里云企业邮配置信息如下:
![add notify config](../images/notify/save-aliyun-mail-config.png)
属性说明:
| 属性 | 说明 | 是否必填 |
| :----: | :----- | :----: |
| 配置名称 | 通知配置的名称,例如:测试网易邮配置。支持中文、大小写字母、数字、短划线和下划线,且必须以中文、英文或数字开头,不超过32个字符 | 是 |
| 服务商 | 邮件服务商,支持多服务商,不同服务商配置信息不同,服务商选择`默认`时,支持javax.mail发送邮件的服务商 | 是 |
| 服务器地址 | 邮件服务商提供的服务器地址,腾讯企业邮服务器地址为:smtp.mxhichina.com | 是 |
| 端口 | 邮件服务商提供的服务端口,腾讯企业邮邮箱端口为:25 | 是 |
| 发件人 | 发送邮件后显示的发件人信息 | 是 |
| 用户名 | 发件人账户 | 是 |
| 密码 | 发件人密码 | 是 |
| 其他配置 | 阿里云企业邮需配置其他配置 | 否 |
| 说明 | 输入文字,对该配置进行说明或备注。长度限制为100字 | 否 |
> 阿里云企业邮是默认开启个人邮箱pop3、smtp协议的,所以无需在阿里云邮箱里设置
#### 配置邮件模板如下:
进入系统: `通知管理`-`通知模板` 点击左侧菜单中的`邮件` 添加一个邮件通知模板.
![add notify template](../images/notify/save-mail-notify-template1.png)
![add notify template](../images/notify/save-mail-notify-template2.png)
属性说明:
| 属性 | 说明 | 是否必填 |
| :----: | :----- | :----: |
| 模板名称 | 通知模板的名称,例如:测试邮件-图片+附件。支持中文、大小写字母、数字、短划线和下划线,且必须以中文、英文或数字开头,不超过32个字符 | 是 |
| 服务商 | 邮件服务商,支持多服务商,不同服务商配置信息不同,服务商选择`默认`时,支持javax.mail发送邮件的服务商 | 是 |
| 标题 | 邮件发送成功后,收件人显示标题或主题。支持表达式替换<br>`注:不同服务商显示不同` | 是 |
| 正文 | 邮件内容 | 是 |
| 收件人 | 接收邮件的用户,可同时添加多个。支持表达式替换 | 否 |
| 附件列表 | 发送邮件时携带的文件,可同时添加多个文件。支持表达式替换 | 否 |
> 表达式说明:表达式通用格式为$符号开头,两个大括号中填写需要被替换的内容。例:${test}
#### 测试发送通知
1. 点击`通知模板`表格中的`操作`列-`调试`.
2. 弹出会话框后选择`通知配置`.
3. 填写`变量`信息,用变量信息将`通知模板`中的表达式替换为相应的内容(通知模板中不存在表达式时,使用默认值`{}`即可)
>例:`通知模板`内存在表达式`${test}`。则可以用对应的json格式数据{"test":"测试"},将通知模板中`${test}`替换为`测试`
![mail send test](../images/notify/mail-send-test.png)
发送成功后会提示`发送成功,请注意查收`,打开邮箱查看是否收到邮件通知,收到邮件通知即测试通过.
![mail send test](../images/notify/mail-send-test-result.png)
## 三. 语音通知配置-通知模板
#### 配置信息如下:
进入系统: `通知管理`-`通知配置` 点击左侧菜单中的`语音` 添加一个语音通知配置.
![add notify config](../images/notify/save-voice-notify-config.png)
属性说明:
| 属性 | 说明 | 是否必填 |
| :----: | :----- | :----: |
| 模板名称 | 通知配置的名称,例如:测试邮件-图片+附件。支持中文、大小写字母、数字、短划线和下划线,且必须以中文、英文或数字开头,不超过32个字符 | 是 |
| 服务商 | 语音服务商,支持多服务商,不同服务商配置信息不同,现目前只支持`阿里云` | 是 |
| regionId | 电信区域代码 | 是 |
| accessKeyId | 访问密钥id | 是 |
| secret | 密钥对 | 是 |
| 说明 | 输入文字,对该配置进行说明或备注。长度限制为100字 | 否 |
#### 模板信息如下:
进入系统: `通知管理`-`通知模板` 点击左侧菜单中的`语音` 添加一个语音通知模板.
![add notify template](../images/notify/save-voice-notify-template.png)
属性说明:
| 属性 | 说明 | 是否必填 |
| :----: | :----- | :----: |
| 模板名称 | 通知模板的名称,例如:测试邮件-图片+附件。支持中文、大小写字母、数字、短划线和下划线,且必须以中文、英文或数字开头,不超过32个字符 | 是 |
| 服务商 | 语音服务商,支持多服务商,不同服务商配置信息不同,现目前只支持`阿里云` | 是 |
| 模版ID | 阿里云内配置模板的ID。`注:不同服务商显示不同` | 是 |
| 被叫显号 | 被叫显号,必须是已购买的号码。您可以在阿里云`语音服务控制台`上查看已购买的号码 | 是 |
| 被叫号码 | 被叫号码。仅支持中国大陆号码 | 是 |
| 播放次数 | 语音文件的播放次数,取值范围为1~3 | 否 |
> 参考文档:<https://help.aliyun.com/document_detail/114036.html?spm=a2c4g.11186623.6.559.3ba33c2dejPA2P>
#### 测试发送通知
1. 点击`通知模板`表格中的`操作`列-`调试`.
2. 弹出会话框后选择`通知配置`.
3. 填写`变量`信息,运营商模板内容里配置有`变量`时需填写相关`变量`信息,`JSON`格式.
![voice send test](../images/notify/voice-send-test.png)
发送成功后会提示`发送成功,请注意查收`,收到电话语言通知即测试通过.
## 四. 企业微信通知配置-通知模板
#### 配置信息如下:
进入系统: `通知管理`-`通知配置` 点击左侧菜单中的`微信` 添加一个企业微信通知配置.
![add notify config](../images/notify/save-corpWeChat-notify-config.png)
属性说明:
| 属性 | 说明 | 是否必填 |
| :----: | :----- | :----: |
| 模板名称 | 通知配置的名称,例如:微信企业消息通知。支持中文、大小写字母、数字、短划线和下划线,且必须以中文、英文或数字开头,不超过32个字符 | 是 |
| 服务商 | 支持`企业微信号`和`微信公众号`,不同服务商配置信息不同,现目前只支持`阿里云` | 是 |
| corpId | 每个企业都拥有唯一的corpId,获取此信息可在管理后台“我的企业”-“企业信息”下查看“企业ID”(需要有管理员权限)<br>登录`https://work.weixin.qq.com/`-`我的企业`,正下方可见企业ID | 是 |
| corpSecret | corpSecret是企业应用里面用于保障数据安全的“钥匙”,每一个应用都有一个独立的访问密钥,为了保证数据的安全,secret务必不能泄漏<br>登录`https://work.weixin.qq.com/`-在管理后台->“应用与小程序”->“应用”->“自建”,点进某个应用,即可看到 | 是 |
| 说明 | 输入文字,对该配置进行说明或备注。长度限制为100字 | 否 |
> 参考文档:<https://work.weixin.qq.com/api/doc/90000/90135/91039>
#### 模板信息如下:
进入系统: `通知管理`-`通知模板` 点击左侧菜单中的`微信` 添加一个企业微信通知模板.
![add notify template](../images/notify/save-corpWeChat-notify-template.png)
属性说明:
| 属性 | 说明 | 是否必填 |
| :----: | :----- | :----: |
| 模板名称 | 通知模板的名称,例如:微信企业消息通知。支持中文、大小写字母、数字、短划线和下划线,且必须以中文、英文或数字开头,不超过32个字符 | 是 |
| 服务商 | 支持`企业微信号`和`微信公众号`,不同服务商配置信息不同,现目前只支持`微信企业消息通知` | 是 |
| 应用ID | 每个应用都有唯一的agentId<br>登录`https://work.weixin.qq.com/`-在管理后台->“应用与小程序”->“应用”,点进某个应用,即可看到agentId | 是 |
| 收信人ID | 每个成员都有唯一的userId,即所谓“帐号”<br>登录`https://work.weixin.qq.com/`-在管理后台->“通讯录”->点进某个成员的详情页,可以看到 | 是 |
| 收信部门ID | 每个部门都有唯一的id<br>登录`https://work.weixin.qq.com/`-在管理后台->“通讯录”->“组织架构”->点击某个部门右边的小圆点可以看到 | 是 |
| 按标签推送 | 本企业的标签ID列表,最多支持100个 | 否 |
| 内容 | 播放模板内容次数。支持表达式替换 | 否 |
> 参考文档:<https://work.weixin.qq.com/api/doc/90000/90135/90250#%E6%96%87%E6%9C%AC%E6%B6%88%E6%81%AF>
> 表达式说明:表达式通用格式为$符号开头,两个大括号中填写需要被替换的内容。例:${test}
#### 测试发送通知
1. 点击`通知模板`表格中的`操作`列-`调试`.
2. 弹出会话框后选择`通知配置`.
3. 填写`变量`信息,用变量信息将`通知模板`中的表达式替换为相应的内容(通知模板中不存在表达式时,使用默认值`{}`即可)
>例:`通知模板`内存在表达式`${test}`。则可以用对应的json格式数据{"test":"测试"},将通知模板中`${test}`替换为`测试`
![corpWeChat send test](../images/notify/corpWeChat-send-test.png)
发送成功后会提示`发送成功,请注意查收`,打开企业微信客户端,查看是否收到消息,收到消息即通过测试.
## 五. 钉钉通知配置-通知模板
#### 配置信息如下:
进入系统: `通知管理`-`通知配置` 点击左侧菜单中的`钉钉` 添加一个钉钉通知配置.
![add notify config](../images/notify/save-dingding-notify-config.png)
属性说明:
| 属性 | 说明 | 是否必填 |
| :----: | :----- | :----: |
| 模板名称 | 通知配置的名称,例如:钉钉测试。支持中文、大小写字母、数字、短划线和下划线,且必须以中文、英文或数字开头,不超过32个字符 | 是 |
| 服务商 | 钉钉 | 是 |
| appKey | 应用的唯一标识key | 是 |
| appSecret | 应用的密钥 | 是 |
| 说明 | 输入文字,对该配置进行说明或备注。长度限制为100字 | 否 |
> 参考文档:<https://ding-doc.dingtalk.com/doc?spm=a2115p.8777639.0.0.66804260fOANzg#/serverapi2/eev437>
#### 模板信息如下:
进入系统: `通知管理`-`通知模板` 点击左侧菜单中的`钉钉` 添加一个钉钉通知模板.
![add notify template](../images/notify/save-dingding-notify-template.png)
属性说明:
| 属性 | 说明 | 是否必填 |
| :----: | :----- | :----: |
| 模板名称 | 通知模板的名称,例如:钉钉消息通知。支持中文、大小写字母、数字、短划线和下划线,且必须以中文、英文或数字开头,不超过32个字符 | 是 |
| 服务商 | 钉钉 | 是 |
| 应用ID | 每个应用都有唯一的agentId。<br>登录`https://work.weixin.qq.com/`-在管理后台->“应用与小程序”->“应用”,点进某个应用,即可看到agentId | 是 |
| 收信人ID | 接收者的用户userid列表,最大列表长度:100。,示例:zhangsan,lisi | 可选(收信人ID,部门ID, 全部用户,必须有一个不能为空) |
| 收信部门ID | 接收者的部门id列表,最大列表长度:20, 接收者是部门id下(包括子部门下)的所有用户,示例:123,456 | 可选(可不传,若传不能为空) |
| 全部用户 | 是否发送给企业全部用户 | 可选 |
| 内容 | 消息内容,消息类型和样例参考“消息类型与数据格式”。支持表达式替换。最长不超过2048个字节 | 是 |
> 参考文档:<https://ding-doc.dingtalk.com/doc#/serverapi2/pgoxpy>
> 注:`钉钉推送消息需要到钉钉开发平台应用中心内添加IP白名单`
> 表达式说明:表达式通用格式为$符号开头,两个大括号中填写需要被替换的内容。例:${test}
#### 测试发送通知
1. 点击`通知模板`表格中的`操作`列-`调试`.
2. 弹出会话框后选择`通知配置`.
3. 填写`变量`信息,用变量信息将`通知模板`中的表达式替换为相应的内容(通知模板中不存在表达式时,使用默认值`{}`即可)
>例:`通知模板`内存在表达式`${test}`。则可以用对应的json格式数据{"test":"测试"},将通知模板中`${test}`替换为`测试`
![dingding send test](../images/notify/dingding-send-test.png)
发送成功后会提示`发送成功,请注意查收`,打开钉钉客户端,查看是否收到消息,收到消息即通过测试.

@ -0,0 +1,36 @@
# 使用组织架构进行设备数据权限控制教程
使用超级管理员用户登录系统(默认账号密码:admin admin)。
>注意:该账号只能用于系统设置相关功能,请勿使用该账号操作业务功能。
**操作步骤**
1. 在系统左侧导航栏,单击系统设置>权限管理。
![选择权限导航菜单](../images/system/permission-choose.png)
2. 在权限管理页,选择设备型号权限。点击`编辑`按钮进入编辑页。
![进入权限编辑页](../images/system/permission-update.png)
i.在`支持的数据权限控制方式`下拉列表处选择`机构`;
![选择字段权限](../images/system/org-setting.png)
ii.在i的基础上`操作配置`中`支持数据权限`下拉列表将会出现`机构`的选择,选择即可;
![选择字段权限](../images/system/org-choose.png)
iii.在`操作配置`-->`支持数据权限`列下拉列表中选择`机构`选项。
如查询操作选择了机构数据权限,则在型号管理功能界面查询时将进行机构数据权限控制,用户将只能查询到自己所在机构的数据。
iv.在该页底部点击`保存`按钮即可保存配置。
3. 在系统左侧导航栏,单击系统设置>用户管理。
![进入用户管理](../images/system/choose-permission.png)
4. 用户管理页面选择需要分配权限的用户,点击`用户赋权`按钮进入用户赋权页面。
![进入用户赋权](../images/system/into-permission-setting.png)
如果需要新建用户,请点击`添加用户`按钮,补充完用户数据,点击`保存`即可完成新用户增加。
![新建用户](../images/system/insert-user.png)
5. 进入用户赋权页面,定位到设备型号,该行将多出一个`数据权限`按钮,点击进入数据权限控制配置。
![进入数据权限配置](../images/system/into-org-access.png)
6. 在数据权限配置页面,选择`仅限所在机构数据`行提供的选项。
![编辑数据权限配置](../images/system/update-org-access.png)
7. 点击赋权页下方`保存`按钮完成用户赋权操作。
![用户赋权保存](../images/system/permission-setting-save.png)
8. 在系统左侧导航栏,单击系统设置>机构管理。
![进入机构管理](../images/system/into-org.png)
9. 在机构管理页面,选择需要赋予用户的机构,点击该机构行选中,点击右侧上方`绑定用户`按钮进入选择用户页面。
![选中机构](../images/system/choose-org.png)
在选择用户界面,查询到需要绑定的用户,在操作列点击`选中`按钮即可绑定。
![机构绑定用户](../images/system/org-bind-user.png)
机构数据权限分配演示:

@ -0,0 +1,133 @@
# 通过规则引擎处理设备事件消息发送钉钉通知
本文档介绍通过MQTT.fx发送消息到物联网平台,物联网平台通过规则引擎的将MQTT.fx发送的消息到用户`钉钉`客户端上。
## 前提条件
1. 已在平台中创建产品和设备
2. 设备已接入平台(设备已上线)
> 创建产品和设备具体操作细节,请参考[添加设备型号](../device-manager.md/#添加设备型号)、[添加设备实例](../device-manager.md/#添加设备实例)。
>
> 设备接入平台,请参考[设备接入教程](device-connection.md)
### 创建成功的设备实例信息展示
i. 设备基本信息
![设备基本信息](../files/device-connection/device-instance-general-info.png)
ii. 设备运行状态信息
![设备运行状态信息](../files/device-connection/device-instance-run-info.png)
iii. 设备日志
![设备日志](../files/device-connection/device-instance-log.png)
## 新建规则引擎
进入系统: `规则引擎`-`规则模型` 点击列表上的`添加模型` 添加一个规则模型模板。
![add rule dingding](../images/rule/rule-dingding-message-info.png)
1.添加`消息网关`规则节点,用于接收设备事件上报消息。
![add rule dingding](../images/rule/rule-dingding-message-gateway.png)
i. `网关`:选择`系统默认`。
ii. `类型`:选择`订阅信息`。
iii. 填写`主题(Topic)`,该文档Topic使用`/device/**`(代表订阅以/device/开头的所有topic)。
2.添加`通知`规则节点,用于转发设备上报消息通知至`钉钉`。
![add rule dingding](../images/rule/rule-dingding-notice-dingding.png)
> 说明:上图第2步连线代表规则引擎节点指向下一个规则节点。参考文档[规则引擎-连线](rule-engine.md#连线)
i. `通知类型`:选择`钉钉`。
ii. `通知器`:选择`钉钉`。
> `通知器`详情如下图,自定义`通知器`请参考文档[钉钉通知配置](notification.md#钉钉通知)
![add rule dingding](../images/rule/dingding-config-info.png)
iii. `通知模板`:选择`钉钉`。
> `通知模板`详情如下图。
>
>通知模板内容中,表达式:`${#data["message"]["data"]}` 会被规则引擎内置变量替换为消息网关所收到的设备上报事件数据。
>
>自定义`通知模板`请参考文档:[钉钉通知模板](notification.md#钉钉通知)
>
>规则引擎内置变量说明:[规则引擎-内置变量](rule-engine.md#内置节点)
![add rule dingding](../images/rule/dingding-template-info.png)
3.`消息网关`和`通知`配置完成后,鼠标点击中间`空白处`,将会显示模型信息,`模型ID`填写完成后点击`保存`。
![add rule dingding](../images/rule/save-rule-dingding.png)
> 点击中间空白区域将会显示`保存`按钮
4.点击`操作`列中的`发布`按钮,发布规则引擎,发布成功后`规则实例`将会显示发布的`规则模型`。
![rule list](../images/rule/rule-list.png)
5.进入`规则实例`列表也,点击`操作`列的`启动`按钮,运行`规则模型`
![rule list](../images/rule/rule-example-list.png)
## 设备事件上报
MQTT。fx 推送设备事件消息到平台
以火灾报警事件为例。
1.在MQTT。fx上,单击 `Publish`
2.输入事件上报Topic和要发送的事件内容,单击Publish按钮,向平台推送该事件消息。
![设备事件上报](../files/device-connection/mqttfx-device-event-report.png)
该文档使用的topic: `/chiefdata/push/fire_alarm/department/1/area/1/dev/test001`
该文档所使用的回复内容
```json
{
"devid":"test001",
"pname":"烟感001",
"aid":105,
"a_name":"未来科技城",
"b_name":"C2 栋",
"l_name":"12-05-201",
"timestamp":"2019-11-06 16:28:50",
"alarm_type":1,
"alarm_describe":"火灾报警",
"event_id":1,
"event_count":1
}
```
| 参数 | 说明 |
| :----- | :----- |
| devid | 设备Id |
| pname | 设备型号名称 |
| aid | 区域Id |
| a_name | 区域名称 |
| b_name | 建筑名称 |
| l_name | 位置名称 |
| timestamp | 上报时间 |
| alarm_type | 报警类型 |
| alarm_describe | 报警描述 |
| event_id | 事件 ID |
| event_count | 该事件上报次数 |
## 测试结果
![rule result](../images/rule/rule-dingding-result.jpg)

@ -0,0 +1,101 @@
# 规则引擎
提供可视化,流程化的数据(逻辑)处理工具.
## 规则实例
### 创建规则
**操作步骤**
1. 进入系统: `规则引擎`-`规则实例`-`创建规则`。
2. 输入id、名称。
3. 点击`确定`进行保存。
![创建规则](../images/rule-engine/create.png)
### 设计器
在[创建规则](#创建规则)完成后,在对应规则的操作列点击`详情`进入设计器。
![详情](../images/rule-engine/info.png)
浏览器将新打开一个标签页来展示设计器。
![设计器](../images/rule-engine/designer.png)
#### 节点
规则中的节点可在设计器左侧的组件栏中选择,目前有通用、功能、网络三种类型的组件。
![组件](../images/rule-engine/component-info.png)
#### 连线
节点之间通过`连线`连接,`连线`保证多个节点连续执行和有序执行。
![连线](../images/rule-engine/line.png)
#### 设计规则
##### 创建节点
1. 使用鼠标左键在左侧组件栏中选择相应组件并拖动到中间工作区域。
![选择组件](../images/rule-engine/choose-component.png)
2. 双击该组件打开编辑页面,各组件对应的节点页面各有不同,此处以`设备指令`为例。
![编辑节点](../images/rule-engine/edit-node.png)
3. 编辑完成后点击`完成`。
![保存节点](../images/rule-engine/save-node.png)
**节点属性在节点帮助中有详细说明,请仔细阅读。**
![节点帮助](../images/rule-engine/node-help.png)
##### 连线
在节点的两段上使用鼠标左键拖动会形成线,在连接到下游节点即可。
![连接节点](../images/rule-engine/connect-node.png)
##### 保存
设计完整个规则之后,点击设计器右上角`部署`按钮保存。
![保存全部](../images/rule-engine/save-all.png)
::: tip 注意:
保存有两种方式,通过下拉展开,一是仅对规则进行保存;二是全部重新部署全部节点。
下拉列表选项选中后只是切换两个选项,还需点击`部署`按钮进行提交。  
:::
##### 部署或者启动
在设计器右上角选择部署后,点击`部署`按钮进行部署。  
或者保存规则后回到规则实例列表中,[启动](#启动)。  
### 启动
**操作步骤**
1. 进入系统: `规则引擎`-`规则实例`。
2. 选择需要启动的规则,在操作列点击`启动`。
![启动](../images/rule-engine/start.png)
### 停止
**操作步骤**
1. 进入系统: `规则引擎`-`规则实例`。
2. 选择需要停止的规则,在操作列点击`停止`。
![停止](../images/rule-engine/stop.png)
### 删除规则
**操作步骤**
进入系统: `规则引擎`-`规则实例`,在操作列点击`删除`。
![删除](../images/rule-engine/delete.png)
## 数据转发
[参考规则引擎-数据转发](../../best-practices/rule-engine-sql.md)

@ -0,0 +1,338 @@
# 规则引擎
## 介绍
提供可视化,流程化的数据(逻辑)处理工具.
### 场景
待完成..
## 规则模型
新建规则模型
- 登录物联网管理平台。
- 选择左侧导航栏,选择规则引擎 > 规则模型。
- 在规则模型板块中,单击`新建模型`操作按钮。
- 在弹出设计器中,拖拽节点和连线生成相应规则,填写模型id和名称点击`保存`。
- 规则模型提供配置的导出、导入(支持批量导入)、复制功能
![新建规则模型](../images/rule-engine/new-rule-model.gif)
### 节点
- 数据的处理逻辑由规则节点执行. 不同的节点类型需要不同的配置.
- 节点就像一个java方法,接收上一个节点的参数,处理之后输出到下一个节点.
- 节点之间使用`连线`进行连接,组成一个完整到流程.
- 节点可以不接收数据,只生产数据.如: `定时任务`,`消息网关`.
- 节点可分布在不同的服务器上执行(企业版支持).
### 连线
节点之间通过`连线`连接,`连线`保证多个节点连续执行和有序执行.连线类型分为: `连接`和`事件`.
`连接`表示当上一个节点输出数据后,数据会流入下一个节点.
`事件`表示当上一个节点触发一下事件时,数据才会流入下一个节点.
`连线`可以指定条件,当满足条件表达式时,数据才会流入下一个节点. 条件表达式为`javascript`. 表达式返回`true`则表示满足条件.
#### 类型
连线类型分为`连接`和`事件`两种:<br />
- 连接:连线的默认类型,用于连接两个节点。无节点执行状态判断<br />
- 事件:事件类型连线可判断连线后端的节点在连线前端的节点执行之前、执行之后
或是执行失败时进行执行
#### 条件
每一个连线都可以用脚本语言(javascript)配置连接条件,如 `data.type === 1` data为节点内置变量
用于判断上一节点的执行结果是否能启动对应的下一节点执行。默认连接条件为空(连线上一节点
执行完成即执行下一节点)
### 保存,发布
待完成..
### 内置节点
+ 规则引擎每个节点都有一个内置的上下文,该上下文中存储着节点执行的内置变量
+ 每个节点可以获取上一节点内置变量和输出自身内置变量到下一节点
+ 上一节点输出数据的内置变量名称为 data。
- 如上一节点输出数据为 {"username":"admin","password":"m123"}
则在下一节点可获取的内置变量为
```json
{
"data":{
"username":"admin",
"password":"m123"
},
"username":"admin",
"password":"m123"
}
```
- 在下一节点中可以用${data.username}或者 ${username} 获取username值admin
- ***如上一节点无数据输出,则获取上上一个节点的输出数据内置变量,以此类推直到规则开始节点***
+ 节点执行中的事件数据内置变量名称为 attr, ***节点执行错误事件会在当前节点的下个节点执行完成以前清空进而记录下一个节点的错误事件。
换言之:每个节点仅能获取自身上一个节点的错误事件数据。*** 事件类型有如下几种
- start_with: 开始节点事件。${attr[start_with]}:获取开始节点id
- end_with: 结束节点事件。${attr[end_with]}:获取结束节点id
- error_type: 节点执行错误事件。${attr[error_type]}: 获取节点执行错误类型
- error_message: 节点执行错误事件。${attr[error_message]}: 获取节点执行错误信息
- error_stack: 节点执行错误事件。${attr[error_stack]}: 获取节点执行错误异常
#### 定时任务
定时任务节点用于需要周期性执行某业务规则。如定时同步数据。
##### 参数说明
| 参数 | 用途 | 是否必须 | 用例|
| -------- | :-----: | :----: |:----:|
| cron表达式 | 生成定时任务规则 | 是 | cron表达式([在线cron表达式](http://cron.qqe2.com/)) |
| 执行参数 | 用于定时任务执行时 | 否 | {} |
##### 内置变量
- 变量说明:节点执行时的当前时间戳
- 获取方式:${data}
- 变量类型:时间戳
- 例:该节点执行时间为2019-12-15 00:00:00。则该节点的内置变量如下
```json
{
"data": 1576339200000
}
```
#### 消息网关
待完成..
#### 消息通知
通过此节点可调用消息通知组件进行消息发送。
参数说明:
| 参数 | 用途 | 是否必须 | 用例 |
| -------- | :-----: | :----: | :----: |
| 通知类型 | 设置通知类型 | 是 | 短信通知 |
| 通知器 | 设置通知类型对应的配置 | 是 | 选择通知器 |
| 通知模板 | 设置通知需要发送的内容 | 是 | 选择通知模板 |
::: tip 注意
在通知模版中可使用规则引擎节点的内置变量,具体是否支持需要看通知器实现是否支持.
:::
请参考[根据设备事件通过规则引擎发送钉钉通知](../course/rule-dingding.md)
#### MQTT服务
请参考[MQTT客户端](#MQTT客户端)
#### MQTT客户端
该节点可以模拟Mqtt客户端消息订阅、消息推送
##### 参数说明
| 参数 | 用途 | 是否必须 | 用例 |
| -------- | :-----: | :----: | :----: |
| mqtt客户端 | 设置客户端基本配置 | 是 | 弹出框中选择 |
| 操作 | 定义mqtt客户端操作类型 | 是 | 接收设备消息 |
| 消息体类型 | 定义mqtt客户端操作推送或订阅的消息类型 | 是 | JSON |
| 主题Topic | 定义推送或订阅消息的主题 | 是 | /{productId}/{deviceId}/event/{eventId} |
| 主题变量 | 定义推送或订阅消息的主题 | 否 | ${vars.deviceId} |
##### 内置变量
###### 接收消息
- 变量说明: mqtt客户端接收的消息
- 变量类型:Map
- 获取方式:${data.field}或${field} ——field为Map key
- 内置变量如下
```json
{
"data": {
"topic":"/{productId}/{deviceId}/event/{eventId}", //主题topic
"will":false,
"qos":0,
"dup":false,
"retain":false,
"clientId":"客户端Id",
"payloadType":"JSON",//接收消息类型
"payload": { //接收的消息
},
"vars":{//topic占位符变量
"productId":"型号Id",
"deviceId":"设备Id",
"eventId":"事件Id"
}
},
"topic":"/{productId}/{deviceId}/event/{eventId}", //主题topic
"will":false,
"qos":0,
"dup":false,
"retain":false,
"clientId":"客户端Id",
"payloadType":"JSON",//接收消息类型
"payload": { //接收的消息
},
"vars":{//topic占位符变量
"productId":"型号Id",
"deviceId":"设备Id",
"eventId":"事件Id"
}
}
```
###### 推送消息
- 变量说明: 推送状态
- 变量类型:Boolean
- 获取方式:${data}
- 内置变量如下
```json
{"data":true //推送成功状态}
```
#### TCP服务
请参考[TCP客户端](#TCP客户端)
#### TCP客户端
该节点可以模拟tcp客户端消息订阅、消息推送
##### 参数说明
| 参数 | 用途 | 是否必须 | 用例 |
| -------- | :-----: | :----: | :----: |
| tcp客户端 | 设置客户端基本配置 | 是 | 弹出框中选择 |
| 操作 | 定义tcp客户端操作类型 | 是 | 订阅消息 |
| 推送消息体类型 | 定义tcp客户端推送的消息类型 | 否 | JSON |
| 订阅消息体类型 | 定义tcp客户端订阅的消息类型 | 否 | JSON |
##### 内置变量
###### 订阅消息
- 变量说明: tcp客户端接收的消息
- 变量类型:Map
- 获取方式:${data.field}或${field} ——field为Map key
- 内置变量如下
```json
{
"data":{
"payloadType":"JSON",//接收消息类型
"payload": { //接收的消息
}
},
"payloadType":"JSON",//接收消息类型
"payload": { //接收的消息
}
}
```
###### 推送消息
- 变量说明: 推送状态
- 变量类型:Boolean
- 获取方式:${data}
- 内置变量如下
```json
{"data":true //推送成功状态}
```
#### SQL
该节点可以模拟数据库sql执行,支持动态选择数据源
##### 参数说明
| 参数 | 用途 | 是否必须 | 用例 |
| -------- | :-----: | :----: | :----: |
| 数据源 | 设置sql执行的数据源 | 是 | 默认数据源(服务启动所连接的数据源) |
| sql | 定义所选择数据源支持的sql语句 | 是 | select 1 |
##### 内置变量
- 变量说明: Sql执行结果
- 获取方式:如执行sql为 select 1。 则获取方式为${column}
#### 转换
该节点可转换数据字段。如 source:a=1 target:b=1
##### 配置说明
1. 单击转换规则
2. 在弹出框中,单击添加字段
3. 输入原字段、目标字段、类型
+ 原字段:需要转换的字段
+ 目标字段:转换后生成的字段
+ 字段类型: 该字段的数据类型
4. 点击保存生成字段转换配置
##### 内置变量
1. 变量说明: 字段转换结果与原入参
- 例:
入参:
```json
{
"a":1,
"b":2
}
```
转换规则:
| 原字段 | 目标字段 | 类型 |
| :-----: | :-----: | :----: |
| a | c | int |
- 内置变量为
```json
{
"data":{
"a":1,
"b":2,
"c":1
},
"a":1,
"b":2,
"c":1
}
```
2. 获取方式:${data.field}
#### 脚本
该节点可执行脚本语言
##### 参数说明
| 参数 | 用途 | 是否必须 | 用例 |
| -------- | :-----: | :----: | :----: |
| 脚本语言 | 定于将要执行的脚本语言类型 | 是 | javascript |
###### 脚本内容参数说明
1. 获取上一节点内置参数
- 上一节点内置参数为
```json
{
"data":{
"a":1,
"b":2,
"c":1
},
"a":1,
"b":2,
"c":1
}
```
- 获取方式
```js
var a = handler.onMessage.a; //a=1
```
2. 获取java类
获取方式
```js
var BytesUtils = org.jetlinks.pro.network.utils.BytesUtils;
```
##### 内置变量
脚本执行结果
### 调试
- 单击相应的节点,在右侧节点对应的功能表单中,填写好对应的数据。
- 点击运行,填写运行时需要的执行参数。
- 点击确认。
- 在下方日志展示栏中,查看节点对应的调试日志
## 规则实例
生成规则实例
- 在规则模型列表中,选择对应的模型。
- 在对应的模型列表中,单击操作列中的发布操作,用该规则模型生成规则实例。
### 查看运行情况
+ 点击规则模型列表操作列中的编辑操作
+ 在弹出的界面中点击执行按钮
+ 点击执行按钮后弹出的界面中选择开始节点、结束节点(开始、结束节点来自于规则
实例中的所有节点,且开始、结束节点可选择相同节点),填写执行参数。单击确认按钮,
在弹窗下方响应栏查看执行结果。
在第二步界面中,选择事件栏查看规则实例所有事件记录。
+ 选中规则实例中不同节点用以查看该节点对应的事件记录。
+ 选中规则实例页空白处,重新查看该规则实例所有节点事件记录。
### 查看日志
+ 点击规则模型列表操作列中的编辑操作
+ 在弹出的界面中点击执行按钮
+ 点击执行按钮后弹出的界面中选择开始节点、结束节点(开始、结束节点来自于规则
实例中的所有节点,且开始、结束节点可选择相同节点),填写执行参数。单击确认按钮,
在弹窗下方响应栏查看执行结果。
+ 节点执行日志:执行日志主要记录节点在执行过程中的错误信息或主动输出打印的日志信息。<br />
在第二步界面中,选择日志栏查看规则实例所有日志。
+ 选中规则实例中不同节点用以查看该节点对应的日志。
+ 选中规则实例页空白处,重新查看该规则实例所有节点日志。

@ -0,0 +1,40 @@
# 接收到设备事件上报消息并转换到MQTT客户端
本文档介绍通过MQTT.fx发送消息到物联网平台,并转发到另一个MQTT客户端中。
## 前提条件
1. 已在平台中创建产品和设备
2. 设备已接入平台(设备上线)
> 创建产品和设备具体操作细节,请参考[添加设备型号](../device-manager.md/#添加设备型号)、[添加设备实例](../device-manager.md/#添加设备实例)。
>
> 设备接入平台,请参考[设备接入教程](device-connection.md)
### 创建成功的设备实例信息展示
i. 设备基本信息
![设备基本信息](../files/device-connection/device-instance-general-info.png)
ii. 设备运行状态信息
![设备运行状态信息](../files/device-connection/device-instance-run-info.png)
iii. 设备日志
![设备日志](../files/device-connection/device-instance-log.png)
## 添加规则引擎
进入系统: `规则引擎`-`规则模型` 点击列表上的`添加模型` 添加一个规则模型模板。
![创建规则模型](../files/rule-transfer-message/create-rule-model.png)
1.添加`消息网关`规则节点,用于接收设备事件上报消息。
![生成消息网关节点](../files/rule-transfer-message/generate-message-gateway.png)
2.添加`MQTT客户端`规则节点,用于消息转发

@ -0,0 +1,13 @@
- [启动MQTT服务设备网关服务,接收设备消息](device-gateway.md)
- [启动MQTT客户端设备网关服务,接收设备消息](mqtt-client-gateway.md)
- [启动CoAP设备网关服务,接收设备消息](coap-server-gateway.md)
- [使用自定义消息协议接入设备](device-connection.md)
- 在网络组件中使用CA证书
- 整合`MQTT`,`CoAP`等网络组件,进行消息路由.
- 转发消息到`RabbitMQ`,`Kafka`等消息中间件.
- 在前端订阅消息网关中的消息.
- [通过规则引擎处理设备事件消息发送钉钉通知](rule-dingding.md)
- [配置用户权限](user-permisson.md)
- [使用组织架构进行设备数据权限控制](org-device-permission-setting.md)
- 自定义消息组件
- 自定义消息网关连接器

@ -0,0 +1,246 @@
# 系统配置
## 用户管理
用于系统用户的新增、修改、权限分配。
### 新增
**操作步骤**
1. 进入系统: `系统设置`-`用户管理`-`新建`。
2. 输入用户信息。
3. 点击`确定`进行保存。
![用户新增](../images/system/choose-permission.png)
### 编辑
**操作步骤**
1. 进入系统: `系统设置`-`用户管理`,在操作列点击`编辑`。
2. 编辑用户信息。
3. 点击`确定`进行保存。
![用户编辑](../images/system/update-user.png)
### 分配权限
请参考[权限分配](#权限分配 "权限分配")
使用超级管理员用户登录系统(默认账号:`admin`,密码:`admin`),注意:该账号只能用于系统设置相关功能,
请勿使用该账号操作业务功能。
#### 基本操作赋权
**操作步骤**
1. 进入系统: `系统设置`-`用户管理`添加`用户`。
![进入用户管理](../images/system/choose-permission.png)
2.用户管理页面选择需要分配权限的用户,点击`用户赋权`按钮进入用户赋权页面。
![进入用户赋权](../images/system/into-permission-setting.png)
3.进入用户赋权页面,在`权限操作`列勾选该用户需要控制的权限(可多选),如:通知管理的查询、保存、删除、发送通知等。
点击`保存`按钮进行保存;
![用户赋权](../images/system/permission-setting.png)
用户未分配权限时,进入系统后无权限、无菜单(这里以test1用户作为演示)。
![用户未分配权限](../images/system/no-permission.png)
用户分配权限后,进入系统将拥有已分配的权限以及对应的菜单。
![用户分配权限后](../images/system/have-permission.png)
## 权限管理
用于创建、编辑和删除新对权限,并且对系统,业务功能、api接口和多租户进行权限对分类。
### 新增权限
**操作步骤**
1、进入系统: `系统设置`-`权限管理`-`新建`
2、输入权限对ID、名称,权限需要用在哪里就选择对应对分类。
3、点击确定保存
![创建权限](../images/system/insert-Permissions-client.png)
###编辑权限
1、进入系统:`系统设置`-`权限管理`-`新建`,然后在操作列点击`编辑`。
2、对需要修改对信息进行响应对修改。也可以查看`关联权限`和编辑、删除 `数据视图`
3、点击`确定`进行保存。
![修改权限](../images/system/update-Permissions.png)
## 第三方平台
用于第三方平台管理。
### 新增
**操作步骤**
1. 进入系统: `系统设置`-`第三方平台`-`新建`。
2. 客户端信息。
3. 点击`确定`进行保存。
![OpenAPI客户端新增](../images/system/insert-openapi-client.png)
### 编辑
**操作步骤**
1. 进入系统: `系统设置`-`第三方平台`,在操作列点击`编辑`。
2. 编辑机构信息。
3. 点击`确定`。
![编辑oepnapi](../images/system/update-openapi-client.png)
### 赋权
::: tip 注意:
第三方平台赋权时,赋权页所展示的权限需要提前在`权限管理`→`编辑`,将分类设置为`API接口`,这样第三方平台赋权页才有相应的权限设置。
![设置API接口](../images/system/update-openapi-prompt.png)
:::
**操作步骤**
1. 进入系统: `系统设置`-`第三方平台`,在需要赋权行的操作列点击`赋权`按钮进入赋权界面。
![进入赋权页](../images/system/into-empowerment.png)
2. 在赋权页勾选需要分配的权限。
![选择权限](../images/system/openapi-choose-permission.png)
3. 点击`保存`按钮进行保存。
### 禁用
**操作步骤**
1. 进入系统: `系统设置`-`第三方平台`,在需要禁用行的操作列点击`禁用`按钮。
2. 点击`确定`。
![禁用openapi](../images/system/start-openapi-client.png)
### 启用
**操作步骤**
1. 进入系统: `系统设置`-`第三方平台`,在需要启用行的操作列点击`启用`按钮。
2. 点击`确定`。
![禁用openapi](../images/system/stop-openapi-client.png)
## 机构管理
用于组织机构的新增、修改、删除、权限分配、绑定用户。
### 新增
**操作步骤**
1. 进入系统: `系统设置`-`机构管理`-`新建`。
2. 输入机构信息。
3. 点击`确定`进行保存。
![机构新增](../images/system/insert-org.png)
如需增加子机构:
1. 在需要添加子机构的行点击操作列中的`添加子机构`。
2. 输入子机构信息。
3. 点击`确定`进行保存。
![子机构新增](../images/system/insert-org-child.png)
### 编辑
**操作步骤**
1. 进入系统: `系统设置`-`机构管理`,在操作列点击`编辑`。
2. 编辑机构信息。
3. 点击`确定`。
![编辑机构](../images/system/update-org.png)
### 删除
**操作步骤**
1. 进入系统: `系统设置`-`机构管理`,在需要删除行的操作列点击`删除`。
2. 点击`确定`。
![删除机构](../images/system/delete-org.png)
### 绑定用户
**操作步骤**
1. 进入系统: `系统设置`-`机构管理`,在需要绑定行的操作列点击`绑定用户`。
![绑定机构1](../images/system/org-bind-user1.png)
2. 在右侧弹出框中点击`绑定`,勾选需要绑定的用户,点击`保存`。
![绑定机构2](../images/system/org-bind-user2.png)
### 分配权限
请参考[权限分配](#权限分配) 。
## 角色管理
请参考[机构管理](#机构管理)。
## 系统配置
用于制定主题以及logo。
![系统配置](../images/system/system-configuration.png)
## 租户管理
### 新增
**操作步骤**
1. 进入系统: `系统设置`-`租户管理`-`添加`。
![进入租户页](../images/system/choose-tenant.png)
2. 输入租户信息。
3. 点击`确定`进行保存。
![租户新增](../images/system/save-tenant.png)
### 基本信息
在列表页对应租户操作列点击`查看`,进入基本信息页面。
![查看](../images/system/tenant-view.png)
### 资产信息
在基本信息页上点击`资产信息`选项卡进入资产信息页面。
![查看资产](../images/system/choose-assets.png)
#### 添加资产
1. 点击相应资产框上的编辑按钮,进入资产编辑页面。
![编辑资产](../images/system/update-assets.png)
2. 点击`添加`按钮进入资产添加页面。
3. 选择需要添加资产的租户成员。
4. 在列表中选择资产。
5. 点击`添加n项`按钮保存。
![添加资产](../images/system/add-assets.png)
#### 解绑资产
勾选需要解绑的资产,点击`解绑n项`按钮即可。
![添加资产](../images/system/delete-assets.png)
### 成员管理
租户新增时创建的用户默认为管理员。
#### 新增
在成员管理页面,点击`新增`按钮。
![添加成员](../images/system/tenant-member.png)
#### 解绑
在需要解绑的成员操作列点击`解绑`。
![解绑成员](../images/system/delete-tenant-member.png)
### 权限分配
点击`查看权限`选项卡,进入权限分配页面,勾选相应权限后点击`更新权限信息`。
![分配权限](../images/system/bind-permission.png)
::: tip 注意:
权限分配页面所展示的权限需要提前在`权限管理`→`编辑`,将`分类`设置为`多租户`,这样权限分配页面才有相应的权限设置。
![设置多租户接口](../images/system/update-openapi-permission.png)
:::
### 测试
使用创建的租户账号登录平台,只能访问对应的资产。
![测试](../images/system/tenant-test.png)

@ -0,0 +1,64 @@
# 配置用户权限教程
使用超级管理员用户登录系统(默认账号:`admin`,密码:`admin`),注意:该账号只能用于系统设置相关功能,
请勿使用该账号操作业务功能。
## 基本操作赋权
**操作步骤**
1. 进入系统: `系统设置`-`用户管理`添加`用户`。
![进入用户管理](../images/system/choose-permission.png)
2. 用户管理页面选择需要分配权限的用户,点击`用户赋权`按钮进入用户赋权页面。
![进入用户赋权](../images/system/into-permission-setting.png)
3. 进入用户赋权页面,点击该用户需要控制的权限,该行将展开列出具体的操作,如:查询、保存、删除、导入、导出等。
勾选操作(可多选)后继续选择其他权限进行选择或点击`保存`按钮进行保存;
![用户赋权](../images/system/permission-setting.png)
该页右侧为快捷导航,展开显示所有权限。
![用户赋权导航](../images/system/permission-setting-navigation.png)
点击权限快速定位到对应权限设置处并展开。
![用户赋权快速定位](../images/system/fast-permission-setting.png)
4. 点击赋权页下方`保存`按钮完成用户赋权操作。
![用户赋权保存](../images/system/permission-setting-save.png)
基本操作赋权演示:
![用户赋权演示](../images/system/permission-setting-play.gif)
用户未分配权限时,进入系统后无权限、无菜单。
![用户未分配权限演示](../images/system/no-permission.gif)
用户分配权限后,进入系统将拥有已分配的权限以及对应的菜单。
![用户分配权限后演示](../images/system/have-permission.gif)
## 字段权限赋权
**操作步骤**
1. 在系统左侧导航栏,单击系统设置>权限管理。
![选择权限导航菜单](../images/system/permission-choose.png)
2. 在权限管理页,选择需要进行字段权限控制的权限,本教程以设备型号为例。点击`编辑`按钮进入编辑页。
![进入权限编辑页](../images/system/permission-update.png)
i. 在`支持的数据权限控制方式`下拉列表处,选择`字段权限`;
![选择字段权限](../images/system/column-setting.png)
ii. 在i的基础上`操作配置`中`支持数据权限`下拉列表将会出现`字段权限`的选项,选择即可;
![选择字段权限](../images/system/column-choose.png)
iii. 在`操作配置`中,对应`标识`选择了`字段权限`将在对应操作时进行字段权限控制。
如在`标识`query行的`支持数据权限`,选择了字段权限,则在型号管理功能界面查询时将进行字段权限控制。
iv. 在该页底部点击`保存`按钮即可保存配置。
3. 在系统左侧导航栏,单击系统设置>用户管理。
![进入用户管理](../images/system/choose-permission.png)
4. 用户管理页面选择需要分配权限的用户,点击`用户赋权`按钮进入用户赋权页面。
![进入用户赋权](../images/system/into-permission-setting.png)
5. 进入用户赋权页面,定位到设备型号,该行将多出一个`字段权限`按钮,点击进入字段权限控制配置
![进入字段权限编辑](../images/system/into-field-access.png)
6. 在字段权限编辑页面将展示出权限编辑中`数据视图`中的所有字段,并且在每个字段后列出权限编辑中选择了字段权限控制的操作,以供用户选择。
![字段权限编辑](../images/system/update-field-access.png)
i. 在该页面中,勾选字段列后的操作选项,选中表示该字段允许进行此操作。
例如:`名称` 勾选了`保存`和`删除`,则在设备型号管理中查询时不会返回`名称`的数据。
![选择字段](../images/system/choose-field.png)
ii. 字段权限配置完成后点击需`保存`按钮完成编辑。
![保存字段权限配置](../images/system/save-field-access.png)
7. 点击赋权页下方`保存`按钮完成用户赋权操作。
![用户赋权保存](../images/system/permission-setting-save.png)

@ -0,0 +1,502 @@
# 设备管理
用于统一管理设备,设备建模,安全配置等操作
## 产品
### 什么是产品
产品是一个JSON格式的文件。它是物理空间中的实体,如传感器、车载装置、楼宇、工厂等在云端的数字化表示,从属性、功能和事件三个维度,分别描述了该实体是什么,能做什么,可以对外提供哪些信息。定义了这三个维度,即完成了产品功能的定义。
产品将产品功能类型分为三类:属性、功能、和事件。定义了这三类功能,即完成了产品的定义。
| 功能类型 | 说明 |
| :--------------: | ------------- |
| 属性(Properties) | 一般用于描述设备运行时的状态,如环境监测设备所读取的当前环境温度等。属性支持GET和SET请求方式。应用系统可发起对属性的读取和设置请求。|
| 功能(Functions) | 设备可被外部调用的能力或方法,可设置输入参数和输出参数。相比于属性,功能可通过一条指令实现更复杂的业务逻辑,如执行某项特定的任务。|
| 事件(Event) | 设备运行时的事件。事件一般包含需要被外部感知和处理的通知信息,可包含多个输出参数。如,某项任务完成的信息,或者设备发生故障或告警时的温度等,事件可以被订阅和推送。|
### 产品数据格式
您可以在产品的物模型中编辑的属性、功能、事件、标签。
产品的属性、功能、事件JSON字段结构如下:
```json
{
"properties":[
{
"id":"标识",
"name":"属性名称",
"valueType":{
"min":"参数最小值(int、float、double类型特有)",
"max":"参数最大值(int、float、double类型特有)",
"step":"步长,字符串类型",
"unit":"属性单位",
"expands":{},//扩展属性
"type":"属性类型: int(原生)、float(原生)、double(原生)、text(原生)、date(默认String类型UTC毫秒,可以自定义)、bool(0或1的int类型)、enum(int类型)、object(结构体类型,可包含前面6种类型)、array(数组类型,支持int/double/float/String)、file(文件,支持URL[地址]/base64[base64编码]/binary[二进制])、password(密码)"
},
"expands":{
"readOnly":"是否只读(true/false)",
"report":"设备是否上报(true/false)"
},
"description":"说明"
}
],
"functions":[
{
"id":"标识",
"name":"功能名称",
"inputs":[//输入参数
{
"id":"输入参数标识",
"name":"输入参数名称",
"valueType":{
"min":"参数最小值(int、float、double类型特有)",
"max":"参数最大值(int、float、double类型特有)",
"step":"步长,字符串类型",
"unit":"属性单位",
"type":"属性类型: int(原生)、float(原生)、double(原生)、text(原生)、date(默认String类型UTC毫秒,可以自定义)、bool(0或1的int类型)、enum(int类型)、object(结构体类型,可包含前面6种类型)、array(数组类型,支持int/double/float/String)、file(文件,支持URL[地址]/base64[base64编码]/binary[二进制])、password(密码)"
}
}
],
"outputs":{//输出参数
"min":"参数最小值(int、float、double类型特有)",
"max":"参数最大值(int、float、double类型特有)",
"step":"步长,字符串类型",
"unit":"属性单位",
"type":"属性类型: int(原生)、float(原生)、double(原生)、text(原生)、date(默认String类型UTC毫秒,可以自定义)、bool(0或1的int类型)、enum(int类型)、object(结构体类型,可包含前面6种类型)、array(数组类型,支持int/double/float/String)、file(文件,支持URL[地址]/base64[base64编码]/binary[二进制])、password(密码)"
},
"isAsync":"是否异步(true/false)",
"description":"说明"
}
],
"events":[
{
"id":"标识",
"name":"事件名称",
"valueType":{
"min":"参数最小值(int、float、double类型特有)",
"max":"参数最大值(int、float、double类型特有)",
"step":"步长,字符串类型",
"unit":"属性单位",
"type":"属性类型: int(原生)、float(原生)、double(原生)、text(原生)、date(默认String类型UTC毫秒,可以自定义)、bool(0或1的int类型)、enum(枚举)、object(结构体类型,可包含前面6种类型)、array(数组类型,支持int/double/float/String)、file(文件,支持URL[地址]/base64[base64编码]/binary[二进制])、password(密码)"
},
"expands":{
"level":"事件级别(普通[ordinary]/警告[warn]/紧急[urgent])",
"eventType":"事件类型(数据上报[reportData]/事件上报[reportEvent])"
},
"description":"说明"
}
]
}
```
所有数据类型对应的valueType的JSON结构如下:
```json
{
" int(原生)、float(原生)、double(原生)":{
"min":"参数最小值(int、float、double类型特有)",
"max":"参数最大值(int、float、double类型特有)",
"step":"步长,字符串类型",
"unit":"属性单位",
"type":"属性类型: int(原生)、float(原生)、double(原生)、text(原生)"
},
"date":{
"dateFormat":"时间格式",
"type":"date"
},
"bool":{
"trueValue":"true值,可自定义",
"trueText":"trueText值,可自定义",
"falseValue":"false值,可自定义",
"falseText":"falseText值,可自定义",
"type":"boolean"
},
"enum":{
"elements":[
{
"value":"1",
"key":"在线"
},{
"value":"0",
"key":"离线"
}
],
"type":"enum"
},
"text":{
"expands":{
"maxLength":"最大长度"
},
"type":"string"
},
"object":{
"properties":[//其它类型结构跟类型结构与外部属性的结构一致
{
"id":"标识",
"name":"名称",
"valueType":{
"min":"最小值",
"max":"最大值",
"step":"步长",
"unit":"单位",
"type":"数据类型"
},
"description":"备注"
}
],
"type":"object"
},
"array":{
"elementType":{
"type":"object",
"properties":[//其它类型结构跟类型结构与外部属性的结构一致
{
"id":"标识",
"name":"名称",
"valueType":{
"min":"最小值",
"max":"最大值",
"step":"步长",
"unit":"单位",
"type":"类型"
},
"description":"备注"
}
]
},
"expands":{
"elementNumber":"元素个数"
},
"type":"array"
},
"file":{
"bodyType":"文件元素类型",
"type":"file"
},
"password":{
"type":"password"
}
}
```
### 添加产品
1. 登录物联网管理平台。
2. 在左侧导航栏,选择设备管理 > 产品。
3. 在产品管理页面产品列表中,单击产品所对应的`新建`操作按钮。
4. 在跳转的页面中,填写产品的基本信息,然后填写产品所对应的属性数据并选择产品所对应的消息协议、连接协议。
![产品基本信息](images/device/model-info.png)
| 参数 | 描述 |
| :--------------: | -------------|
| 型号ID |唯一标识符,在属性中具有唯一性。可包含英文、数字、下划线,长度不超过32个字符,例如PowerComsuption。`不填写将由系统自动生成`。|
| 型号名称 |为型号命名。例如,test。支持中文、英文字母、数字、下划线(_)、连接号(-)、@符号和英文圆括号,长度限制4~30,一个中文汉字算2位。|
| 分类目录 |为产品分类,能更方便的管理产品。类似于分组。|
| 所属机构 |设备所属的机构,一个平台存在多个部门同时操作,能保证用户操作的产品是自己所在的机构下的产品。|
| 消息协议 |不同厂商不同的设备所用的消息传输协议不同,平台定义好消息协议后平台将根据所设定的消息协议格式进行解析设备所上报的数据。|
| 连接协议 |1. MQTT:MQTT是一个基于客户端-服务器的消息发布/订阅传输协议。MQTT协议是轻量、简单、开放和易于实现的,这些特点使它适用范围非常广泛。在很多情况下,包括受限的环境中,其在,通过卫星链路通信传感器、偶尔拨号的医疗设备、智能家居、及一些小型化设备中已广泛使用。<br>2. MQTT TLS:MQTT使用UDP上的数据报TLS协议来进行加密。<br>3. CoAP:Coap(Constrained Application Protocol)是一种在物联网世界的类web协议,它的详细规范定义在 RFC 7252。COAP名字翻译来就是“受限应用协议”,顾名思义,使用在资源受限的物联网设备上。物联网设备的ram,rom都通常非常小,运行TCP和HTTP是不可以接受的。<br>4. CoAP DTLS:CoAP使用UDP上的数据报TLS协议(DTLS)来进行加密。|
| 设备类型 |标识该型号所属的设备类型。|
| 说明 | 输入文字,对该属性进行说明或备注。长度限制为100字。|
| 扩展描述 | 选择消息协议和连接协议过后会有其他配置信息显示,设备注册时将携带配置中的参数及数据,平台验证上报数据中所传的数据是否正确。|
5. 点击产品的`查看`→选择`物模型`,
添加属性定义:在属性定义表格右上角有个添加按钮,点击按钮将弹出会话框。设置参数完成后,单击`保存`。
![产品属性信息0](images/device/model-attribute0.png)
![产品属性信息1](images/device/model-attribute1.png)
![产品属性信息2](images/device/model-attribute2.png)
属性参数设置说明如下表。
| 参数 | 描述 |
| :--------------: | ------------- |
| 属性标识 |唯一标识符,在属性中具有唯一性。即Jetlinks JSON格式中的id的值,作为设备上报该属性数据的Key,平台根据该标识符校验是否接收数据。可包含英文、数字、下划线,长度不超过32个字符,例如PowerComsuption。|
| 属性名称 | 属性的名称,例如网关SN。支持中文、大小写字母、数字、短划线和下划线,且必须以中文、英文或数字开头,不超过32个字符。|
| 数据类型 |1. int32:32位整型。需定义取值范围、步长和单位符号。<br>2. float:单精度浮点型。需定义取值范围、步长和单位符号。<br>3. double:双精度浮点型。需定义取值范围、步长和单位符号。<br>4. enum:枚举型。定义枚举项的参数值和参数描述,例如1-加热模式、2-制冷模式等。<br>5. bool:布尔型。采用0或1来定义布尔值,例如0-关;1-开。<br>6. text:字符串。需定义字符串的数据长度,最长支持2048字节。<br>7. date:时间戳。默认格式为String类型的UTC时间戳,单位:毫秒。`可自定义格式`,例如yyyy-MM-dd。<br>8. object:JSON对象。定义一个JSON结构体,新增JSON参数项,例如定义灯的颜色是由Red、Green、Blue三个参数组成的结构体。 `miniui版本不支持结构体嵌套`<br>9. array:数组。需声明数组内元素的数据类型,可选择int32、float、double、text或object。需确保同一个数组元素类型相同。数组内可包含1-128个元素。<br>10. file:文件。需声明文件元素类型,可选择URL、base64、binary(二进制)。<br>11. password:密码。上报时如果属性为密码将进行加密或者是隐秘的方式进行显现或者处理。<br>`备注:出参类型为object添加JSON对象。为array时选择元素类型,如果元素类型为object,添加JSON对象。填写元素个数。`|
| 精度 | 控制所需的小数位数。
| 单位 | 单位可选择为无或根据实际情况选择。|
| 是否只读 | 读写:请求读写的方法支持GET(获取)和SET(设置)。<br>只读:请求只读的方法仅支持GET(获取)。|
| 描述 | 输入文字,对该属性进行说明或备注。长度限制为100字。|
+ 添加功能定义:在功能定义表格右上角有个添加按钮,点击按钮将弹出会话框。设置参数完成后,单击`确认`。
![产品功能信息](images/device/model-functions.png)
功能参数设置说明如下表。
| 参数 | 描述 |
| :--------------: | ------------- |
| 功能标识 |唯一标识符,在功能中具有唯一性。即Jetlinks JSON格式中的id的值,作为设备上报该属性数据的Key,平台根据该标识符校验是否接收数据。可包含英文、数字、下划线,长度不超过32个字符,例如PowerComsuption。|
| 功能名称 | 功能的名称,例如CPU使用率。支持中文、大小写字母、数字、短划线和下划线,且必须以中文、英文或数字开头,不超过32个字符。|
| 是否异步 | 异步:服务为异步调用时,云端执行调用后直接返回结果,不会等待设备的回复消息。<br>同步:服务为同步调用时,云端会等待设备回复;若设备没有回复,则调用超时。|
| 输入参数 |设置该服务的入参,可选。<br>单击`添加参数`,在弹窗对话框中添加服务入参。|
| 出参类型 | 1. int32:32位整型。需定义取值范围、步长和单位符号。<br>2. float:单精度浮点型。需定义取值范围、步长和单位符号。<br>3. double:双精度浮点型。需定义取值范围、步长和单位符号。<br>4. enum:枚举型。定义枚举项的参数值和参数描述,例如1-加热模式、2-制冷模式等。<br>5. bool:布尔型。采用0或1来定义布尔值,例如0-关;1-开。<br>6. text:字符串。需定义字符串的数据长度,最长支持2048字节。<br>7. date:时间戳。默认格式为String类型的UTC时间戳,单位:毫秒。`可自定义格式`,例如yyyy-MM-dd。<br>8. object:JSON对象。定义一个JSON结构体,新增JSON参数项,例如定义灯的颜色是由Red、Green、Blue三个参数组成的结构体。 `miniui版本不支持结构体嵌套`<br>9. array:数组。需声明数组内元素的数据类型,可选择int32、float、double、text或object。需确保同一个数组元素类型相同。数组内可包含1-128个元素。<br>10. file:文件。需声明文件元素类型,可选择URL、base64、binary(二进制)。<br>11. password:密码。上报时如果属性为密码将进行加密或者是隐秘的方式进行显现或者处理。<br>`备注:出参类型为object添加JSON对象。为array时选择元素类型,如果元素类型为object,添加JSON对象。填写元素个数。`|
| 描述 | 输入文字,对该功能进行说明或备注。长度限制为100字。|
+ 添加事件定义:在事件定义表格右上角有个添加按钮,点击按钮将弹出会话框。设置参数完成后,单击`确认`。
![产品事件信息](images/device/model-events.png)
事件参数设置说明如下表。
| 参数 | 描述 |
| :--------------: | ------------- |
| 事件标识 |唯一标识符,在事件中具有唯一性。即Jetlinks JSON格式中的id的值,作为设备上报该属性数据的Key,平台根据该标识符校验是否接收数据。可包含英文、数字、下划线,长度不超过32个字符,例如PowerComsuption。|
| 事件名称 | 事件的名称,例如用电量数据上报。支持中文、大小写字母、数字、短划线和下划线,且必须以中文、英文或数字开头,不超过32个字符。|
| 事件类型 | 数据上报:指设备监测到某些数值的改变时上传改变后的数值,例如温度计监测到温度变化。<br>事件上报:事件监控功能为您提供上报自定义事件的接口,方便您将业务产生的异常事件采集上报到云监控,通过对上报的事件配置报警规则来接收报警通知。|
| 事件级别 |普通:指设备上报的一般性通知,例如完成某项任务等。<br>告警:设备运行过程中主动上报的突发或异常情况,告警类信息,优先级高。您可以针对不同的事件类型进行业务逻辑处理和统计分析。<br>故障:设备运行过程中主动上报的突发或异常情况,故障类信息,优先级高。您可以针对不同的事件类型进行业务逻辑处理和统计分析。|
| 出参类型 | 1. int32:32位整型。需定义取值范围、步长和单位符号。<br>2. float:单精度浮点型。需定义取值范围、步长和单位符号。<br>3. double:双精度浮点型。需定义取值范围、步长和单位符号。<br>4. enum:枚举型。定义枚举项的参数值和参数描述,例如1-加热模式、2-制冷模式等。<br>5. bool:布尔型。采用0或1来定义布尔值,例如0-关;1-开。<br>6. text:字符串。需定义字符串的数据长度,最长支持2048字节。<br>7. date:时间戳。默认格式为String类型的UTC时间戳,单位:毫秒。`可自定义格式`,例如yyyy-MM-dd。<br>8. object:JSON对象。定义一个JSON结构体,新增JSON参数项,例如定义灯的颜色是由Red、Green、Blue三个参数组成的结构体。 `miniui版本不支持结构体嵌套`<br>9. array:数组。需声明数组内元素的数据类型,可选择int32、float、double、text或object。需确保同一个数组元素类型相同。数组内可包含1-128个元素。<br>10. file:文件。需声明文件元素类型,可选择URL、base64、binary(二进制)。<br>11. password:密码。上报时如果属性为密码将进行加密或者是隐秘的方式进行显现或者处理。<br>`备注:出参类型为object添加JSON对象。为array时选择元素类型,如果元素类型为object,添加JSON对象。填写元素个数。`|
| 描述 | 输入文字,对该事件进行说明或备注。长度限制为100字。|
![产品事件信息](images/device/model-json.png)
JSON对象参数设置说明如下表。
| 参数 | 描述 |
| :--------------: | ------------- |
| 参数标识 |唯一标识符,在JSON对象中具有唯一性。即Jetlinks JSON格式中的id的值,作为设备上报该属性数据的Key,平台根据该标识符校验是否接收数据。可包含英文、数字、下划线,长度不超过32个字符,例如PowerComsuption。|
| 参数名称 | 参数的名称,例如SN。支持中文、大小写字母、数字、短划线和下划线,且必须以中文、英文或数字开头,不超过32个字符。|
| 数据类型 | 1. int32:32位整型。需定义取值范围、步长和单位符号。<br>2. float:单精度浮点型。需定义取值范围、步长和单位符号。<br>3. double:双精度浮点型。需定义取值范围、步长和单位符号。<br>4. enum:枚举型。定义枚举项的参数值和参数描述,例如1-加热模式、2-制冷模式等。<br>5. bool:布尔型。采用0或1来定义布尔值,例如0-关;1-开。<br>6. text:字符串。需定义字符串的数据长度,最长支持2048字节。<br>7. date:时间戳。默认格式为String类型的UTC时间戳,单位:毫秒。`可自定义格式`,例如yyyy-MM-dd。<br>8. file:文件。需声明文件元素类型,可选择URL、base64、binary(二进制)。<br>9. password:密码。上报时如果属性为密码将进行加密或者是隐秘的方式进行显现或者处理。<br>`备注:object和array类型miniui暂不支持。`|
| 最大长度 | 限制参数的最大数|
| 描述 | 输入文字,对该事件进行说明或备注。长度限制为100字。|
+ 添加标签定义:在标签定义表格右上角有个添加按钮,点击按钮将弹出会话框。设置参数完成后,单击`确认`。
事件参数设置说明如下表。
| 参数 | 描述 |
| :--------------: | ------------- |
| 标签标识 |唯一标识符,在事件中具有唯一性。即Jetlinks JSON格式中的id的值,作为设备上报该属性数据的Key,平台根据该标识符校验是否接收数据。可包含英文、数字、下划线,长度不超过32个字符,例如PowerComsuption。|
| 标签名称 | 事件的名称,例如用电量数据上报。支持中文、大小写字母、数字、短划线和下划线,且必须以中文、英文或数字开头,不超过32个字符。|
| 数据类型 | 数据上报:指设备监测到某些数值的改变时上传改变后的数值,例如温度计监测到温度变化。<br>事件上报:事件监控功能为您提供上报自定义事件的接口,方便您将业务产生的异常事件采集上报到云监控,通过对上报的事件配置报警规则来接收报警通知。|
| 出参类型 | 1. int32:32位整型。需定义取值范围、步长和单位符号。<br>2. float:单精度浮点型。需定义取值范围、步长和单位符号。<br>3. double:双精度浮点型。需定义取值范围、步长和单位符号。<br>4. enum:枚举型。定义枚举项的参数值和参数描述,例如1-加热模式、2-制冷模式等。<br>5. bool:布尔型。采用0或1来定义布尔值,例如0-关;1-开。<br>6. text:字符串。需定义字符串的数据长度,最长支持2048字节。<br>7. date:时间戳。默认格式为String类型的UTC时间戳,单位:毫秒。`可自定义格式`,例如yyyy-MM-dd。<br>8. object:JSON对象。定义一个JSON结构体,新增JSON参数项,例如定义灯的颜色是由Red、Green、Blue三个参数组成的结构体。 `miniui版本不支持结构体嵌套`<br>9. array:数组。需声明数组内元素的数据类型,可选择int32、float、double、text或object。需确保同一个数组元素类型相同。数组内可包含1-128个元素。<br>10. file:文件。需声明文件元素类型,可选择URL、base64、binary(二进制)。<br>11. password:密码。上报时如果属性为密码将进行加密或者是隐秘的方式进行显现或者处理。<br>`备注:出参类型为object添加JSON对象。为array时选择元素类型,如果元素类型为object,添加JSON对象。填写元素个数。`|
| 是否只读 | 是否允许修改已经创建好的标签|
| 描述 | 输入文字,对该事件进行说明或备注。长度限制为100字。|
6. 所有信息以及属性、功能、事件、标签全部补充完成后单击单击`应用配置`即可。
#### 后续操作步骤
![产品列表信息](images/device/model-list.png)
1. 在产品列表中单击该型号的`编辑`按钮,可以修改基本信息。
2. 在产品列表中单击该型号的`发布`按钮,将该产品注册到注册中心,添加设备时将会查询到该产品。
+ 产品发布后,状态将变为`已发布`状态,已发布的产品或者是已绑定设备的产品将不支持删除。
3. 在产品列表中单击该型号的`删除`按钮,将物理删除该产品。
+ `已发布`状态的产品将不显示`删除`按钮。
+ 取消发布后如果产品已关联设备,点击`删除`按钮时将提示:`删除失败:该型号已绑定实例,无法删除`。
4. 在产品列表中单击该型号的`下载`按钮,可以将该产品的配置信息导出成一个json文件,文件内容为JSONString形式保存。
5. 在产品列表中单击该型号的`快速导入`按钮,可以将导出的产品配置json文件导入至平台内,如果平台内存在相同ID主键的型号将会去修改相同主键的产品信息,反之就在平台内新增一条新的产品信息。
## 产品分类
添加
1. 登录物联网管理平台。
2. 在左侧导航栏,选择设备管理 > 产品分类。
3. 在产品分类管理页面设备列表中,单击`新增`操作按钮。
4. 在弹出对话框中,填写所需的基本信息即可。设置参数完成后,单击`保存`。
![添加产品分类](images/device/Product_categories_add.png)
编辑产品分类信息
![编辑产品分类](images/device/Product_categories_update.png)
删除产品分类信息
![删除产品分类](images/device/Product_categories_delete.png)
添加子分类
![添加子分类](images/device/Product_categories_add_son.png)
查看子分类
![查看子分类](images/device/Product_categories_select_son.png)
## 设备
### 添加设备
1. 登录物联网管理平台。
2. 在左侧导航栏,选择设备管理 > 设备。
3. 在设备管理页面设备列表中,单击设备所对应的`添加设备`操作按钮。
4. 在弹出对话框中,填写设备所需的基本信息即可。设置参数完成后,单击`保存`。
![设备基本信息](images/device/device-info.png)
设备参数设置说明如下表。
| 参数 | 描述 |
| :--------------: | ------------- |
| 设备ID |唯一标识符,在设备中具有唯一性。可包含英文、数字、下划线,长度不超过32个字符,例如PowerComsuption。`不填写将由系统自动生成`|
| 设备名称 | 设备的名称,例如`XXX门锁`。支持中文、大小写字母、数字、短划线和下划线,且必须以中文、英文或数字开头,不超过32个字符。|
| 产品 | 产品中发布后的产品在此处就能选择。新创建的设备将继承该产品定义好的属性、功能、事件。|
| 所属机构 |设备所属的机构,一个平台存在多个部门同时操作,能保证用户操作的设备是自己所在的机构下的设备。|
| 说明 | 输入文字,对该事件进行说明或备注。长度限制为100字。|
### 设备管理
![设备列表信息](images/device/device-list.png)
设备信息说明如下表。
| 参数 | 描述 |
| :--------------: | ------------- |
|搜索设备 | 输入设备ID,精准定位到某一台设备。输入设备名称、所属机构、设备标签、所属品类,云对云接入搜索相关设备,支持模糊查询。|
| 查看具体设备信息 | 单击对应设备的查看按钮。|
| 删除具体设备信息 | 单击对应设备的删除按钮。删除为物理删除,暂不支持逻辑删除<br>`备注:已激活设备不显示"删除"按钮`。|
| 编辑具体设备信息 | 单击对应设备的编辑按钮。|
| 启用具体设备 |新增设备状态为`未启用`,点击`启用`按钮先将设备激活。激活后设备未在线将显示`离线`状态,操作按钮将显示`禁用`。|
| 批量导出设备 | 设备支持批量导出,导出Excel表格模板。<br>`备注:暂只支持Excel表格`。|
| 批量导入设备 | 下载导出模板后在Excel表格内填写需要导入的设备的基本信息,然后点击界面`导入实例`按钮,选择填写好的Excel表格等待导入完成即可。|
| 激活全部设备 | 批量导入设备数量不可控,有可能几万或者更多,那么这些需要激活设备就只能通过`一键激活`的方式将设备进行激活。|
| 同步设备状态 | 同步列表中设备在设备注册中心中的状态到数据库。|
### 设备信息
在设备列表中,单击设备对应的查看按钮,进入设备详情页。
![设备认证后的基本信息1](images/device/device-find-info1.png)
![设备认证后的基本信息2](images/device/device-find-info2.png)
设备信息说明如下表。
| 参数 | 描述 |
| :--------------: | ------------- |
| 查看设备实例信息 |查看设备基本信息,包括产品信息、扩展信息、标签信息等内容。|
| 查看设备运行状态 | 在设备激活并上线后运行状态页签下,查看设备当前状态、产品配置的属性、事件等信息。<br>如果是事件可查看事件所上报的数据详情信息。|
| 查看设备日志 | 设备行为、上行消息、下行消息等消息内容,点击`详情内容`可查看具体日志的详细内容。|
设备信息说明如下表。
| 参数 | 描述 |
| :--------------: | ------------- |
| ID |唯一标识符,在设备中具有唯一性,例如PowerComsuption。|
| 型号 | 设备的名称,例如`XXX门锁`。支持中文、大小写字母、数字、短划线和下划线,且必须以中文、英文或数字开头,不超过32个字符。|
| 状态 | 设备的当前状态。当前状态分为:未激活、在线、离线。|
设备关联产品以后,在设备查看页面也将显示产品信息,说明如下表。
| 参数 | 描述 |
| :--------------: | ------------- |
| 设备名称 | 产品中发布后的产品在此处就能选择。新创建的设备将继承该产品定义好的属性、功能、事件。|
| 分类目录 |为产品分类,能更方便的管理产品。类似于分组。|
| 消息协议 |不同厂商不同的设备所用的消息传输协议不同,平台定义好消息协议后平台将根据所设定的消息协议格式进行解析设备所上报的数据。|
| 连接协议 |1. MQTT:MQTT是一个基于客户端-服务器的消息发布/订阅传输协议。MQTT协议是轻量、简单、开放和易于实现的,这些特点使它适用范围非常广泛。在很多情况下,包括受限的环境中,其在通过卫星链路通信传感器、偶尔拨号的医疗设备、智能家居、及一些小型化设备中已广泛使用。<br>2. MQTT TLS:MQTT使用UDP上的数据报TLS协议来进行加密。<br>3. CoAP:Coap(Constrained Application Protocol)是一种在物联网世界的类web协议,它的详细规范定义在 RFC 7252。COAP名字翻译来就是“受限应用协议”,顾名思义,使用在资源受限的物联网设备上。物联网设备的ram,rom都通常非常小,运行TCP和HTTP是不可以接受的。<br>4. CoAP DTLS:CoAP使用UDP上的数据报TLS协议(DTLS)来进行加密。|
| 设备类型 |标识该型号所属的设备类型。|
| 描述 | 产品填写的说明或备注。|
### 运行状态
![设备运行状态信息](images/device/device-running-state.png)
1. 记录展示设备当前状态以及用户自定义的产品内的属于以及事件信息。
2. 展示设备上报事件的详情`不同设备类型配置的设备属性、事件不同所展示的内容都有所不同`。
### 日志管理
![设备日志信息](images/device/device-log.png)
1. 展示设备行为、上行消息、下行消息等消息内容,点击`详情内容`可查看具体日志的详细内容。
2. 日志`详情内容`将显示设备行为、上行消息、下行消息等消息内容的详细内容。
### 设备影子
1. 在设备列表页,选择相应设备,点击`查看`按钮进入设备详情页面。
![选择设备](images/device/choose-device.png)
2. 点击`设备影子`选项卡。
![设备影子](images/device/choose-tab-shadow.png)
3. 编辑设备影子配置,格式为json。
![编辑设备影子](images/device/device-shadow.png)
4. 在协议包中获取设备影子配置。
```java
deviceOperator.getSelfConfig(DeviceConfigKey.shadow);
```
## 分组
### 新建分组
[参考创建房间分组](../best-practices/rule-engine-device-same-group.md#创建房间分组)
### 编辑
可对分组名称进行编辑。
### 解绑所有设备
点击`查看`→点击`解绑全部`按钮。
![添加地理位置属性](../basics-guide/files/device-connection/group-unbind-device1.png)
### 添加子分组
![添加子分组](../basics-guide/files/device-connection/group-unbind-son.png)
### 删除
在相应分组上点击`删除`按钮即可删除分组。
## 网关
### 新增
1. 进入系统: `设备管理`-`产品`。 在新建产品时选择设备类型为`网关设备`。
![新增网关设备](../basics-guide/files/device-connection/insert-gateway-device.png)
2. 进入系统: `设备管理`-`网关`。 设备类型为`网关设备`的设备将自动在此展示(注:新建产品必须要有设备)。
![网关](../basics-guide/files/device-connection/device-gateway.png)
### 绑定子设备
1. 选择需要绑定的网关,点击`绑定子设备`按钮。
![绑定子设备](../basics-guide/files/device-connection/bind-child-device.png)
2. 在绑定子设备页面,选择需要绑定的子设备并保存。
![选择子设备](../basics-guide/files/device-connection/choose-child-device.png)
### 解绑子设备
选择需要解绑子设备的网关,点击`解绑`按钮。
![解绑子设备](../basics-guide/files/device-connection/unbind-child-device.png)
## 地理位置
1. 物模型中添加地理位置。通过标签添加地理位置类型属性。
![添加地理位置属性](../basics-guide/files/device-connection/insert-geo-property.png)
![添加地理位置属性](../basics-guide/files/device-connection/insert-geo-property_one.png)
2. 在产品详情页面点击`应用配置`按钮。
![应用配置](../basics-guide/files/device-connection/start-model.png)
3. 在设备详情页将出现地理位置标签,编辑可设置坐标。
![编辑地理位置1](../basics-guide/files/device-connection/tags-geo.png)
点击编辑按钮进入标签编辑页面。
![编辑地理位置2](../basics-guide/files/device-connection/into-tags-geo.png)
在地图界面选择坐标。
![编辑地理位置3](../basics-guide/files/device-connection/choose-position.png)
4. 进入系统: `设备管理`-`地理位置`。 可在地图上查询到设备位置。
![地图查询](../basics-guide/files/device-connection/map-search.png)
## 固件升级
[参考设备固件管理](../dev-guide/device-firmware.md)

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 105 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 134 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 88 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 101 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 104 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 65 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 122 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 262 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 150 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 56 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 88 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 106 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 55 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 106 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 106 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 72 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 147 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 106 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 117 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 106 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 98 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 124 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 122 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 111 KiB

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save