4. 设备属性更新触发动作

任务说明

本案例实现:当设备上报客户端属性更新时,ThingsBoard规则链自动捕获该事件,并触发两类动作——向设备下发RPC请求,以及发送通知邮件。你需要准备一个已注册的设备,并具备可用的SMTP邮箱配置。

实现路径

整体方案分为三步:首先在规则链中创建“属性更新”消息过滤器;其次添加“RPC下发”与“发送邮件”两个动作节点;最后通过设备SDK上报属性变更来验证链路是否生效。核心逻辑全部在ThingsBoard规则引擎中完成,无需编写后端代码。

规则链配置

进入规则链 → 新建规则链,命名为“属性更新触发动作”。添加以下节点并连线:

设备属性更新 消息来源 属性更新过滤器 msg.type == "ATTRIBUTES_UPDATED" RPC请求节点 method: getStatus timeout: 5000ms 发送邮件节点 to: admin@example.com subject: 属性更新通知 消息 True True

节点详细配置

① 过滤器节点(类型:message type filter)

// 消息类型筛选
ATTRIBUTES_UPDATED

② RPC请求节点(类型:rpc call request)

// 节点配置JSON
{
  "timeout": 5000,
  "method": "getStatus",
  "params": "{\"requestId\": ${msg.metadata.requestId}}"
}

③ 发送邮件节点(类型:send email)

// 节点配置JSON
{
  "from": "${smtpUsername}",
  "to": "admin@example.com",
  "subject": "设备属性更新通知",
  "body": "设备 ${metadata.deviceName} 更新属性: ${msg.data}"
}

设备端模拟代码

使用Python + paho-mqtt模拟设备上报属性更新:

import paho.mqtt.client as mqtt
import json, time, random

BROKER = "your-thingsboard-host"
ACCESS_ = "YOUR_DEVICE_"

client = mqtt.Client()
client.username_pw_set(ACCESS_)
client.connect(BROKER, 1883, 60)
client.loop_start()

# 上报客户端属性
attributes = {
    "temperature": round(random.uniform(20.0, 30.0), 2),
    "humidity": round(random.uniform(40.0, 60.0), 2),
    "timestamp": int(time.time())
}
client.publish("v1/devices/me/attributes", json.dumps(attributes), qos=1)
print("已上报属性:", attributes)
time.sleep(2)

# 订阅RPC响应
def on_message(client, userdata, msg):
    print("收到RPC响应:", msg.payload.decode())

client.subscribe("v1/devices/me/rpc/response/+")
client.on_message = on_message
time.sleep(5)
client.loop_stop()

验证方法与判定标准

验证步骤:

  1. 在ThingsBoard中打开该规则链,点击“将此规则链设为根规则链”,或通过“设备 → 管理规则链”将设备关联到该链;
  2. 运行上述Python脚本,观察控制台输出“已上报属性”;
  3. 检查规则链节点右上角“成功”计数是否增加;
  4. 查看设备“最新遥测”中是否出现temperature/humidity值;
  5. 登录配置的收件邮箱,查看是否收到主题为“设备属性更新通知”的邮件。

判定标准:

  • 规则链中“属性更新过滤器”成功计数≥1,且“RPC请求节点”与“发送邮件节点”的成功计数均≥1,表示链路完整触发;
  • 设备端Python脚本能打印出RPC响应(如{"success": true}),证明RPC请求已下发并收到设备回复;
  • 指定邮箱收到包含设备名称和属性数据的邮件,证明邮件动作生效。

若RPC节点失败,检查设备是否在线且已订阅RPC响应主题;若邮件未收到,检查SMTP配置及邮箱垃圾箱。