ThingsBoard MQTT链接、掉线报警、数据转换规则引擎

MQTT 客户端接入

之前都是采用HTTP RESTFUL API方式去接入ThingsBoard。ThingsBoard能够兼容多种协议,今天就来尝试下使用MQTT 客户端接入ThingsBoard。客户端采用MQTTX工具。

hello world

  • 新增设备 复制ACCESS_TOKEN,输入到MQTTX客户端的username

ThingsBoard MQTT链接、掉线报警、数据转换规则引擎_第1张图片

  • 如上图,输入 v1/devices/me/telemetry 点击发送

ThingsBoard MQTT链接、掉线报警、数据转换规则引擎_第2张图片

ThingsBoard 服务器已经接收到MQTT客户端发送的数据。

设备配置设置

根规则链

默认情况下,根规则处理所有入站消息跟入站事件信息。当系统接入设备越来越多时,根规则链也就越来越复杂。因此平台用户可以根据设备类型创建特殊的规则链,处理各种信息,用来降低根规则链的复杂性。

为了避免上述业务痛点,从ThingsBoard3.2,针对特殊设备,你可以自定义根规则链。新的根规则链接收、处理所有的传感数据,如设备活跃状态、设备生命周期管理(创建、更新、删除)事件。

ThingsBoard MQTT链接、掉线报警、数据转换规则引擎_第3张图片

队列名称

默认情况下,Main队列用于存储所有入站消息、入站事件。传输层提交信息至该队列,规则引擎拉取消息进行事件处理。然后复杂场景下,为了隔离数据处理,你可能需要单独的消息队列进行数据存储。或者针对不同类型的设备使用不同的消息队列。

ThingsBoard MQTT链接、掉线报警、数据转换规则引擎_第4张图片

传输配置

ThingsBoard3.2开始,系统支持两种传输类型: 默认 、MQTT

默认传输类型

默认传输类型旨在兼容早起版本,使用默认传输类型,可以继续使用平台默认的MQTT、HTTP、Coap和LwM2M API来链接设备。默认传输类型没有特定的配置设置

MQTT传输类型

MQTT传输类型启用高级MQTTT传送设置。不同于默认的传输类型,它可以自定义MQTT协议topic 过滤、属性更新等特性。创建一个MQTT传输类型的设备配置文件,如下图:

  • 设置MQTT传输类型

    ThingsBoard MQTT链接、掉线报警、数据转换规则引擎_第5张图片

    指定topic名称 需要注意的是 这里有两个TOPIC; 应用分别如下

    • 遥测数据TOPIC筛选器 - 对应设备检测实时数据的topic
    • Attributes topic filter - 设备属性(如版本号)上报的topic

    两种topic都支持模糊匹配,+号表示匹配一级,#匹配多级

MQTT配置案例

发送检测数据

截图参考下面 规则转换引擎 -> 数据展示部分

发送属性数据

ThingsBoard MQTT链接、掉线报警、数据转换规则引擎_第6张图片

特别注意 要想设备规则生效,需要注意以下两点(本人采坑折腾了个把小时)

  • 设置MQTT设备配置为默认配置

    ThingsBoard MQTT链接、掉线报警、数据转换规则引擎_第7张图片

  • 新增的设备关联MQTT设备配置

ThingsBoard MQTT链接、掉线报警、数据转换规则引擎_第8张图片

规则转换引擎

业务场景

假设设备正在采集并上报温度数据(华氏度),但是ThingsBoard平台需要展示摄氏度,因此底层需要将他们进行转换,此时规则引擎派上用场,数据转换的公式如下:

[°C] = ([°F] - 32) × 5/9.

增加转换规则节点

点击 ”规则链库“ -> 选中根节点 -> 打开规则链,如下图

ThingsBoard MQTT链接、掉线报警、数据转换规则引擎_第9张图片

转换脚本如下

function precisionRound(number, precision) {
  var factor = Math.pow(10, precision);
  return Math.round(number * factor) / factor;
}

if (typeof msg.temperature !== 'undefined'){
    msg.temperature = precisionRound((msg.temperature -32) * 5 / 9, 2);
}

return {msg: msg, metadata: metadata, msgType: msgType};

验证规则

点击上图 “Test transformer function” 验证脚本是否正常

ThingsBoard MQTT链接、掉线报警、数据转换规则引擎_第10张图片

转换规则节点在规则链中的位置如下

ThingsBoard MQTT链接、掉线报警、数据转换规则引擎_第11张图片

数据展示

ThingsBoard MQTT链接、掉线报警、数据转换规则引擎_第12张图片

如上图,可以在设备最新的数据检查中观察到温度数据已经进行转换。

设备状态监控

物联网开发中,常用的业务是监控设备的状态,出现异常(如掉线)情况则触发报警通知,进行人工干预进行处理。ThingsBoard设备状态检测服务监控设备连接状态,并把连接事件推送给规则引擎。ThingsBoard支持一下四种事件类型:

Event Type Description
Connect 设备连接到ThingsBoard时触发
Disconnect 设备断开链接时触发
Activity 设备发送数据、属性更新、接口调用时触发
Inactivity 当设备在一定时间段内不活动时触发

下面详细地讲解一下Inactivity事件是如何操作

  • 如何通过规则引擎创建Inactivity报警
  • 配置Inactivity事件超时参数

新增设备

新增设备 ,并设置Inactivity事件超时参数

  • 新增设备 设备名称: Inactivity-timeout-device

  • 选中设备 选择属性 -> 服务端属性

    ThingsBoard MQTT链接、掉线报警、数据转换规则引擎_第13张图片

  • 设置inactivityTimeout属性 6000毫秒,即一分钟

    ThingsBoard MQTT链接、掉线报警、数据转换规则引擎_第14张图片

配置根规则链

创建新的根规则链

ThingsBoard MQTT链接、掉线报警、数据转换规则引擎_第15张图片

打开规则链,如下图 光秃秃的啥都没有,后面一个个规则节点添加

ThingsBoard MQTT链接、掉线报警、数据转换规则引擎_第16张图片

添加 Message Type Switch node

这个规则节点将会根据消息类型路由入站信息,比如

  • POST_TELEMETRY_REQUEST;
  • POST_ATTRIBUTES_REQUEST;
  • ACTIVITY_EVENT;
  • INACTIVITY_EVENT.

ThingsBoard MQTT链接、掉线报警、数据转换规则引擎_第17张图片

新增 Save Timeseries 节点

将节点关联到Message Type Switch节点,关联类型为 Post telemetry。该节点会保存设备发送的消息至数据中

ThingsBoard MQTT链接、掉线报警、数据转换规则引擎_第18张图片

新增 Server Attributes 节点

节点关联 Message Type Switch 节点,关联类型为Post attributes,该节点会存储设备上报的相关属性信息。

ThingsBoard MQTT链接、掉线报警、数据转换规则引擎_第19张图片

新增 Create Inactivity alarm 节点

节点关联 Message Type Switch 节点,关联类型为Inactivity Event.该节点将根据报警配置产生报警信息。如果存在未清除的报警,则更新报警,否则将创建新的报警。

ThingsBoard MQTT链接、掉线报警、数据转换规则引擎_第20张图片

新增 Clear Inactivity alarm 节点

节点关联 Message Type Switch 节点,关联类型为Activity Event.该节点会存储设备上报的相关属性信息。该节点将根据报警配置清除报警信息(如果存在)。根规则链最终效果图如下

ThingsBoard MQTT链接、掉线报警、数据转换规则引擎_第21张图片

ThingsBoard MQTT链接、掉线报警、数据转换规则引擎_第22张图片

设置为默认节点

ThingsBoard MQTT链接、掉线报警、数据转换规则引擎_第23张图片

设备配置关联规则链

ThingsBoard MQTT链接、掉线报警、数据转换规则引擎_第24张图片

测试验证

curl -v -X POST -d '{"temperature":8}' http://192.168.0.5:8080/api/v1/kkBoG2tWqExmbp9LwXuo/telemetry --header "Content-Type:application/json"

ThingsBoard MQTT链接、掉线报警、数据转换规则引擎_第25张图片

说明,如上图设备最后一次活动时间是 22:15:12 秒,理论上一分钟之后设备变成 Inactivity 状态,什么为什么把报警时间 是 22:16:40,比预期的时间晚了28秒。

回答这个问题,我们需要了解 ThingsBoard 内部检测原理,即ThingsBoard是通过什么样的机制检测设备状态,摘录自官网的一段话:

Device State service uses a global configuration parameter to detect inactivity events. This parameter is defined in thingsboard.yml (state.defaultStateCheckIntervalInSec) and by default it is set to 60 seconds (1 minute).

使用全局的配置检测inactivity 事件,可以修改thingsboard.yml文件中的state.defaultStateCheckIntervalInSec参数,默认60秒。

我试过好几次,添加多个设备观察到本机的inactivity报警时间基本维持在40-41秒这两个值的区间。个人感觉跟ThingsBoard服务的启动时间有关系。为了达到1分钟之后报警,可以尝试去修改下默认参数,测试下。我就不折腾了

你可能感兴趣的:(Thingsboard,MQTT,物联网,Thingsboard规则引擎,MQTTX接入)