3. ThingWorx 订阅与事件驱动告警

ThingWorx 订阅与事件驱动告警 学习卡片

订阅机制的核心对象与触发链路

ThingWorx 的事件驱动告警依赖三个关键对象:Thing(承载温度属性)、Subscription(订阅,绑定到某个属性或事件)、EventHandler(事件处理器,订阅触发后执行的服务)。订阅不是轮询,而是由属性写入动作直接触发,因此响应延迟取决于服务执行时间,而非扫描周期。

本例在已有虚拟温度传感器 Thing(假设名为 VirtualTempSensor)上,为属性 Temperature 配置一条订阅:当写入值超过阈值 80 时,触发事件并调用一个记录告警日志的服务。订阅的触发条件在 ThingWorx 中通过 Subscription 的 Event 与 Property 字段定义,事件类型选择 DATA_CHANGE(属性值变化)或 ALERT(阈值告警)。本例使用 ALERT 事件,因为它天然携带阈值判断语义,无需在服务内重复比较。

REST / 模拟写入 Temperature = 85 VirtualTempSensor 属性: Temperature 当前值: 85 Subscription 事件: ALERT 阈值: > 80 属性: Temperature 85 > 80 ? 条件成立 EventHandler 服务: LogAlertService 写入告警日志 告警日志: [85] 超阈值 @ 时间戳 未触发路径 Temperature ≤ 80 订阅条件不成立 不执行 EventHandler

配置订阅与事件处理器的关键步骤

在 ThingWorx Composer 中打开 VirtualTempSensor,进入 Subscriptions 面板,新建订阅并填写以下字段:

  • Name:HighTempAlert
  • Event:选择 ALERT(若平台版本中该事件不可用,则选 DATA_CHANGE 并在服务内做阈值判断)
  • Property:Temperature
  • Threshold:80(仅 ALERT 事件需要)
  • Handler:指向一个已存在的服务,本例为 LogAlertService

若使用 DATA_CHANGE 事件,则订阅在每次属性写入时都会触发,需要在服务内部比较阈值。两种方式的差异在于:ALERT 由平台在属性值越过阈值时触发一次,DATA_CHANGE 每次写入都触发,适合需要记录完整变化轨迹的场景。

LogAlertService 服务实现

在 Thing 的 Services 面板新建服务 LogAlertService,输入参数为 temperature(NUMBER),返回类型为 STRING。服务脚本如下:

// LogAlertService - 记录温度告警日志
// 输入: temperature (NUMBER)
// 输出: STRING 日志条目

var threshold = 80;
var now = new Date().toISOString();
var logEntry = "";

if (temperature > threshold) {
    logEntry = "[ALERT] Temperature=" + temperature +
               " exceeds threshold=" + threshold +
               " at " + now;
    // 写入 Thing 的告警日志属性(假设已定义 alertLog 属性)
    me.alertLog = logEntry;
    logger.warn(logEntry);
} else {
    logEntry = "[INFO] Temperature=" + temperature +
               " within normal range at " + now;
    logger.info(logEntry);
}

// 返回日志条目,便于订阅调试时查看
var result = logEntry;

服务中 me.alertLog 是 Thing 上预先定义的一个 STRING 属性,用于持久化最近一条告警日志。若需要保留多条历史记录,应改用数据表(DataTable)存储,这属于后续案例的范围。本例只验证事件驱动机制是否被正确触发。

验证事件驱动机制

通过 REST 客户端向 Thing 写入温度值,观察订阅是否触发、日志是否生成。ThingWorx 的属性写入接口通常为:

PUT /Thingworx/Things/VirtualTempSensor/Properties/Temperature
Content-Type: application/json
appKey: <your-app-key>

{ "Temperature": 85 }

写入后检查两个位置:

  1. Thing 的 alertLog 属性:应出现包含 [ALERT] 和当前温度值的字符串。
  2. Application Log:在 Composer 的 Monitoring 或日志查看器中,应看到 logger.warn 输出的告警条目。

再写入一个低于阈值的值(如 72),确认 alertLog 不被更新为告警内容,或更新为 [INFO] 条目(取决于服务逻辑)。若写入 85 后日志无变化,按以下顺序排查:订阅是否启用(Enabled 勾选)、事件类型是否匹配、Handler 服务名是否拼写正确、服务是否有执行权限。

订阅的 Enabled 状态默认为勾选,但复制或导入 Thing 时可能被重置。验证前先确认订阅处于启用状态。另外,ALERT 事件在部分 ThingWorx 版本中需要 Thing 模板启用 Alert 相关能力,若下拉列表中找不到该事件,改用 DATA_CHANGE 并在服务内判断阈值即可,功能等价。

告警日志记录格式参考

字段 示例值 说明
时间戳 2025-01-15T10:23:45.000Z ISO 8601 格式,由服务内 new Date() 生成
告警级别 [ALERT] 固定前缀,便于日志过滤
属性名 Temperature 触发订阅的属性
当前值 85 写入的数值
阈值 80 订阅或服务内定义的阈值

该格式可直接用于后续数据表存储或外部告警系统对接。若需要区分设备,可在日志中追加 Thing 名称,通过 me.name 获取。