3. ThingWorx 订阅与事件驱动告警
订阅机制的核心对象与触发链路
ThingWorx 的事件驱动告警依赖三个关键对象:Thing(承载温度属性)、Subscription(订阅,绑定到某个属性或事件)、EventHandler(事件处理器,订阅触发后执行的服务)。订阅不是轮询,而是由属性写入动作直接触发,因此响应延迟取决于服务执行时间,而非扫描周期。
本例在已有虚拟温度传感器 Thing(假设名为 VirtualTempSensor)上,为属性 Temperature 配置一条订阅:当写入值超过阈值 80 时,触发事件并调用一个记录告警日志的服务。订阅的触发条件在 ThingWorx 中通过 Subscription 的 Event 与 Property 字段定义,事件类型选择 DATA_CHANGE(属性值变化)或 ALERT(阈值告警)。本例使用 ALERT 事件,因为它天然携带阈值判断语义,无需在服务内重复比较。
配置订阅与事件处理器的关键步骤
在 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 }
写入后检查两个位置:
- Thing 的 alertLog 属性:应出现包含
[ALERT]和当前温度值的字符串。 - 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 获取。