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

MQTT 客户端接入

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

hello world

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

在这里插入图片描述

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

在这里插入图片描述

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

设备配置设置

根规则链

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

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

在这里插入图片描述

队列名称

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

img

传输配置

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

默认传输类型

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

MQTT传输类型

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

  • 设置MQTT传输类型

    在这里插入图片描述

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

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

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

MQTT配置案例

发送检测数据

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

发送属性数据

在这里插入图片描述

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

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

    在这里插入图片描述

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

在这里插入图片描述

规则转换引擎

业务场景

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

[°C] = ([°F] - 32) × 5/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设备状态检测服务监控设备连接状态,并把连接事件推送给规则引擎。ThingsBoard支持一下四种事件类型:

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

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

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

新增设备

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

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

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

    在这里插入图片描述

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

    在这里插入图片描述

配置根规则链

创建新的根规则链

在这里插入图片描述

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

在这里插入图片描述

添加 Message Type Switch node

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

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

在这里插入图片描述

新增 Save Timeseries 节点

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

在这里插入图片描述

新增 Server Attributes 节点

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

在这里插入图片描述

新增 Create Inactivity alarm 节点

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

在这里插入图片描述

新增 Clear Inactivity alarm 节点

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

在这里插入图片描述

在这里插入图片描述

设置为默认节点

在这里插入图片描述

设备配置关联规则链

在这里插入图片描述

测试验证

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

在这里插入图片描述

说明,如上图设备最后一次活动时间是 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分钟之后报警,可以尝试去修改下默认参数,测试下。我就不折腾了

<think>好的,我现在需要帮用户了解智能农业温室控制系统的软件流程设计方案。首先,我需要回顾一下用户提供的引用内容,看看有哪些相关信息可以利用。 根据引用[1]、[2]、[3],这些资料提到了基于STM32的智能温室控制系统,涉及传感器数据采集、控制逻辑、通信模块等。特别是引用[2]提到了代码示例,可能涉及系统初始化和数据采集的流程。引用[3]则讨论了系统的总体架构,可能对软件流程的分层设计有帮助。引用[4]虽然主要关于灌溉系统,但其中的控制逻辑和优化方法也可能有参考价值。 接下来,我需要确定软件流程设计的主要模块。通常,这类系统包括初始化、数据采集、数据处理、控制执行、用户交互、通信和故障处理等模块。需要逐一分析每个模块的具体流程。 系统初始化部分,需要配置硬件和外设,比如GPIO、ADC、定时器、通信接口等。这可能涉及到引用[1]中提到的硬件准备和系统初始化步骤。 传感器数据采集需要定时读取温度、湿度、土壤湿度和光照强度,可能需要ADC转换和滤波处理。引用[2]中的传感器数据采集部分应该与此相关,可能需要参考其代码示例中的方法。 数据处理和控制逻辑部分,可能需要设定阈值或使用算法(如PID)来调整环境参数。引用[4]中的MATLAB优化可能在这里有应用,比如优化控制算法。同时,引用[3]提到的环境参数管理也需要在这里实现。 控制执行模块涉及驱动执行机构,比如继电器、电机、LED等。这里需要确保控制信号正确输出,可能需要参考引用[2]中的控制与状态指示部分。 用户交互包括本地显示和远程监控,引用[1]和[2]提到的Wi-Fi通信与远程监控部分需要整合到这里,确保数据能够上传和接收指令。 通信模块需要处理Wi-Fi或LoRa的数据传输,引用[1]和[2]中的相关部分可能提供协议设计的思路,比如MQTT或HTTP。 异常处理与日志记录是保证系统稳定性的关键,需要实时监测故障并记录,引用[3]中的常见问题及解决方案可能对此有帮助。 最后,主程序流程需要将以上模块整合成一个循环,确保实时性和稳定性。可能需要参考引用[2]中的代码结构,设计主循环的逻辑。 在整理这些内容时,要注意引用对应的来源,比如系统初始化参考引用[1],数据采集参考引用[2]等。同时,要确保回答结构清晰,分点说明每个模块的流程,并给出可能的代码示例,如主循环的伪代码。 还需要生成相关问题,可能需要围绕系统设计、优化、通信、故障处理等方面提问,确保覆盖用户可能关心的其他方面。 现在需要检查是否符合用户的要求,比如使用正确的中文表达,数学公式用$...$,独立公式用$$...$$,但当前问题可能不涉及数学公式,所以可能不需要。另外,确保所有引用正确标注,比如在提到系统初始化时标注[^1],数据采集标注[^2]等。 最后,确保回答结构清晰,分步骤说明软件流程设计,并给出示例和相关问题。</think>### 智能农业温室控制系统软件流程设计方案 智能农业温室控制系统的软件设计需围绕**实时性**、**稳定性**和**可扩展性**展开,以下是典型软件流程设计方案示例: --- #### 一、系统初始化流程 1. **硬件初始化** - 配置MCU时钟、GPIO、ADC、定时器等外设[^1]。 - 初始化传感器接口(如I2C、SPI)、执行机构驱动(继电器、电机)及通信模块(Wi-Fi/LoRa)。 ```c // 示例:STM32 HAL库初始化代码片段 HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_ADC1_Init(); MX_I2C1_Init(); ``` 2. **软件服务初始化** - 启动实时操作系统(如FreeRTOS)或配置任务调度器。 - 加载预设参数(如温度阈值、灌溉时长)[^3]。 --- #### 二、传感器数据采集流程 1. **定时采集** - 通过传感器周期性读取环境参数: - 温度/湿度(DHT11/SHT30) - 土壤湿度(电容式传感器) - 光照强度(BH1750) - 数据滤波:采用滑动平均或卡尔曼滤波消除噪声。 ```c // 示例:ADC读取土壤湿度 uint32_t read_soil_moisture() { HAL_ADC_Start(&hadc1); HAL_ADC_PollForConversion(&hadc1, 100); return HAL_ADC_GetValue(&hadc1); } ``` 2. **数据存储与上传** - 本地缓存历史数据(如环形缓冲区)。 - 通过Wi-Fi上传至云端(MQTT/HTTP协议)。 --- #### 三、控制逻辑与决策流程 1. **阈值判断** - 比较当前值与预设阈值,触发控制动作: - 若温度 > 30°C → 启动风扇 - 若土壤湿度 < 40% → 开启灌溉阀[^4]。 2. **闭环控制(可选)** - 采用PID算法动态调节执行机构(如加热器功率)[^3]。 $$ u(t) = K_p e(t) + K_i \int_0^t e(\tau)d\tau + K_d \frac{de(t)}{dt} $$ --- #### 四、执行机构驱动流程 1. **输出控制信号** - 根据决策结果驱动继电器、电机、LED补光灯等。 - 添加硬件保护(如PWM软启动防止电流冲击)。 2. **状态反馈** - 检测执行结果(如阀门是否开启成功)并记录日志。 --- #### 五、用户交互与通信流程 1. **本地交互** - LCD显示实时数据及系统状态。 - 按键输入调整参数(如手动模式)。 2. **远程监控** - 通过ESP8266等模块连接云平台(阿里云/ThingsBoard)。 - 支持手机APP指令下发与报警推送。 --- #### 六、异常处理与日志记录 1. **故障检测** - 监测传感器断线、通信超时、执行机构卡死等异常。 - 触发蜂鸣器报警或发送短信通知[^3]。 2. **日志管理** - 存储故障事件及操作记录至SD卡或Flash。 --- #### 七、主程序流程示例(伪代码) ```c void main() { hardware_init(); // 初始化硬件[^1] software_service_init(); // 启动任务调度 while (1) { read_sensors(); // 采集数据[^2] process_data(); // 滤波与分析 make_decision(); // 控制逻辑[^4] drive_actuators(); // 执行动作 update_remote(); // 上传云端 handle_exceptions(); // 异常处理 } } ``` --- ### §§ 1. 如何优化温室控制系统的实时响应性能? 2. 智能温室中如何设计低功耗的传感器网络? 3. 多温室协同控制时通信协议应如何设计? 4. 如何通过机器学习优化温室环境调控策略?
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值