本章节将演示常用Thingsboard功能的基本用法,基于一个流行的设施监控案例, 展示如何监视建筑物不同部分的温度,如何在温度超过特定阈值时发出警报以及如何可视化收集的数据和警报。通过本章节体验一下Thingsboard的工作流程。
主要内容有了解如何使用MQTT,HTTP或CoAP收集IoT设备数据并在简单的仪表板上对其进行可视化,另外也提供了示例脚本,可以在PC或笔记本电脑上运行这些脚本来模拟设备。具体流程包括:
在Thingsboard开源平台(一)2.软件安装这一章节中,安装完Thingsboard服务之后,提供了用于登陆系统的临时用户,在本章中将以租户管理员([email protected] / tenant)的身份来完成入门操作。
登录成功后,进入到管理页面,在这里我们能够创建资产、设备和客户,以及自定义仪表盘实时展示数据。
在主页面点击左侧栏 资产 项,进入资产管理页面,单击左上角 添加资产 =》 添加新资产 ,进入添加页面填写相关属性值:名称为 Building A ,资产类型为 Building;
点击 添加 后,即可在所有资产页面看到新增的 Building A 资产;
在主页面点击左侧栏 设备 项,进入设备管理页面,单击左上角 添加设备 =》 添加新设备 ,进入添加页面填写相关属性值:名称为 Thermometer A-1 ,设备类型为 thermometer;
填写完成后,添加设备 Thermometer A-2,步骤和上面一致;
点击 添加 后,即可在所有设备页面看到新增的 Thermometer A-1 、Thermometer A-2 设备;
创建完设备和资产后,需要定义资产和设置之间的关联关系。在 资产管理页面 单击上述创建的 Building A 资产,弹出资产详情页面,切换到 关联 tab页;
点击 添加 按钮,进入 * 添加关联* 页面,关联类型为 Contains 实体类型为 设备,选择刚刚创建的设备***Thermometer A-1*** 、Thermometer A-2 分别添加;
设备添加完成后,即可在资产***关联***页面查看到 Thermometer A-1 、Thermometer A-2 设备;
设备创建完成后,我们可以模拟设备实时产生的数据,thingsboard支持HTTP、MQTT或者COAP协议。为了简化演示,将下面将使用HTTP(cURL)协议从本机电脑发送数据到设备。至于在实际生产应用中,请查看连接设备获取所有可用的硬件连接方案以及具体使用示例。
安装cURL客户端
从 Windows 10 b17063 版本后,Windows系统内置了 cURL ;
NOTE: Starting Windows 10 b17063, cURL is available by default.
More info here: https://blogs.msdn.microsoft.com/commandline/2018/01/18/tar-and-curl-come-to-windows/
If you are using older version of Windows OS, you may find official installation guides here: https://curl.haxx.se/
模拟数据推送
HTTP协议api接口如下,其中 $ACCESS_TOKEN 需要替换成设备具体的访问令牌;
# For example, $HOST_NAME in case of local installation:
curl -v -X POST -d "{\"temperature\": 25}" http://localhost:8080/api/v1/$ACCESS_TOKEN/telemetry --header "Content-Type:application/json"
单击设备 Thermometer A-1,复制访问令牌,替换掉如上 $ACCESS_TOKEN;
打开命令行工具,输入HTTP访问接口,发送模拟数据;
C:\WINDOWS\system32>curl -v -X POST -d "{\"temperature\": 25}" http://localhost:8080/api/v1/FYzr6Div7oW7O6UeVRRO/telemetry --header "Content-Type:application/json"
Note: Unnecessary use of -X or --request, POST is already inferred.
* Trying ::1...
* TCP_NODELAY set
* Connected to localhost (::1) port 8080 (#0)
> POST /api/v1/FYzr6Div7oW7O6UeVRRO/telemetry HTTP/1.1
> Host: localhost:8080
> User-Agent: curl/7.55.1
> Accept: */*
> Content-Type:application/json
> Content-Length: 19
>
* upload completely sent off: 19 out of 19 bytes
< HTTP/1.1 200
< Vary: Origin
< Vary: Access-Control-Request-Method
< Vary: Access-Control-Request-Headers
< X-Content-Type-Options: nosniff
< X-XSS-Protection: 1; mode=block
< Cache-Control: no-cache, no-store, max-age=0, must-revalidate
< Pragma: no-cache
< Expires: 0
< Content-Length: 0
< Date: Mon, 13 Jul 2020 02:09:33 GMT
<
* Connection #0 to host localhost left intact
在设备 Thermometer A-1 =》最新遥测 Tab页,可以看到刚刚发送的温度数据;
在主页面点击左侧栏 规则链库 项,进入规则链管理页面,单击 添加规则 =》添加新规则,弹出添加规则页面填写属性值,名称为 Temperature emulation;
添加完成后,单击 Open rule chain 打开 Temperature emulation 规则,进入编辑页面,添加 generator 节点,填写相关属性值如下所示;
图中生成脚本如下:
var msg = { temperature: +(Math.random()*5 + 25).toFixed(1)};
var metadata = {};
var msgType = "POST_TELEMETRY_REQUEST";
return { msg: msg, metadata: metadata, msgType: msgType };
拖入 rule chain 节点到编辑面板,规则链选择已存在的 Root Rule Chain 规则,点击添加;
链接 Temperature generator 和 Root Rule Chain 节点,条件为 Success ;
添加完成后点击 应用更改 ,在设备 Thermometer A-1 最新遥测 tab页面即可看到实时变化的温度数据;
有了上述模拟产生的实时数据之后,即可创建用户仪表板动态的展示设备Temperature A-1温度的变化。
在主页面点击左侧栏 仪表板库 项,进入规则链管理页面,单击 添加仪表板 =》添加新的仪表板,弹出添加页面填写属性值,名称为 Demo Dashboard;
添加完成后,单击***打开仪表板*** 进入编辑页面,点击右下角***进入编辑模式*** =》找到右上角 实体别名 =》添加别名;
点击 添加别名,弹出添加别名页面,名称为 Thermometers,过滤类型为 设备搜索查询,详细信息参考如下页面;
点击 保存 按钮;
单击 添加新的部件 添加部件,当前包选择 Cards,切换到 最新值 Tab页,选择 实体 这一组件;
为部件添加实体数据源,参数选择 Thermometers 关键字选择 Temperature ,以及在 高级 填写实体表格名称为 Thermometers;
完成后效果图如下,可以实时看到温度值在变化:
点击右下角 编辑 进入Demo Dashboard编辑模式,单击左上角 仪表板状态管理 =》 添加仪表板状态,填写状态名 $(entityName): Temperature details 和状态ID temperature_details;
点击左上角切换仪表板到刚才新增的 Temperature details ,添加实体别名,步骤和上面类似;
添加别名,名称为 Current thermometer,过滤类型 实体(仪表板状态);
点击 添加新的部件,设置当前包为 Digital gauges,选择倒数第三个;
设置部件数据源为刚刚创建的 Current thermometer,同时修改 高级 =》 Mininum value 值为0;
添加温度值历史可视化组件,添加新的部件 =》 创建新部件,当前包设为 Charts,选择
Timeseries-Flot;
设置部件数据源为刚刚创建的 Current thermometer,同时修改 设置 =》 标题 为 Temperature history,在 ***高级***中勾选 Display smooth (curved) lines;
完成后,调整大小如下所示;
创建警报组件,添加新的部件 =》 创建新部件,当前包设为 Alarm widgets,单击 警告 组件填写属性值,高级 中名称填写 $(entityName): Alarms;
完成后结果图:
警报组件创建完成后,进入Demo Dashboard编辑模式,点击 编辑部件 找到 动作 Tab页;
添加动作,弹出属性值填写页面, 动作源 选择 点击行,名称 为 to_temperature_detail,类型选择 切换到新仪表板状态;
设置完成后,在Demo Dashboard页面点击Thermometer A-1 设备,将会自动导航到Current thermometer页面;
在本节中,我们将为温度设置阈值,模拟高温数据,触发警报;
在主页面点击左侧栏 规则链库 项,进入规则链管理页面,单击 添加规则 =》创建新的规则链,弹出添加页面填写属性值,名称为 Create alarm;
点击 Open rule chain 进入编辑页面,拖入 script 到容器中,填写名称为 Temperature check,阈值设为 ***msg.temperature > 50 ***;
在 动作 中找到 create alarm 节点,拖入节点并编辑属性值,名称为 Create alarm,类型为 Critical Temperature,并勾选 Propagate 选项;
建立节点链接,完成后保存;
把新建的 Create alarm 规则链添加到 Root Rule Chain,进入Root Rule Chain编辑页面,添加一个 rule chain 节点,选择规则链为刚刚创建的 Create alarm ;
链接 Save Timeseries 节点到 Create alarm,规则为 Success;
使用HTTP接口推送超过阈值的温度数据,模拟危险触发警报,代码如下:
注:要把 $ACCESS_TOKEN 替换成设备 Temperature A-1 的访问令牌;
curl -v -X POST -d "{\"temperature\": 55}" http://localhost:8080/api/v1/$ACCESS_TOKEN/telemetry --header "Content-Type:application/json"
C:\WINDOWS\system32>curl -v -X POST -d "{\"temperature\": 55}" http://localhost:8080/api/v1/FYzr6Div7oW7O6UeVRRO/telemetry --header "Content-Type:application/json"
Note: Unnecessary use of -X or --request, POST is already inferred.
* Trying ::1...
* TCP_NODELAY set
* Connected to localhost (::1) port 8080 (#0)
> POST /api/v1/FYzr6Div7oW7O6UeVRRO/telemetry HTTP/1.1
> Host: localhost:8080
> User-Agent: curl/7.55.1
> Accept: */*
> Content-Type:application/json
> Content-Length: 19
>
* upload completely sent off: 19 out of 19 bytes
< HTTP/1.1 200
< Vary: Origin
< Vary: Access-Control-Request-Method
< Vary: Access-Control-Request-Headers
< X-Content-Type-Options: nosniff
< X-XSS-Protection: 1; mode=block
< Cache-Control: no-cache, no-store, max-age=0, must-revalidate
< Pragma: no-cache
< Expires: 0
< Content-Length: 0
< Date: Mon, 13 Jul 2020 06:42:31 GMT
<
* Connection #0 to host localhost left intact
在Demo Dashboard中可以看到,一旦出现超过阈值的温度,将会触发警报;
触发警报自动将信息发送到邮件,这一功能我在尝试的时候一直没成功,暂时就不写了。