如何基于W3C WoT定义多表单交互的流程?
在W3C WoT中组合多步设备交互流程
核心实现方案
W3C WoT的Thing描述(TD)本身聚焦单个交互点(属性、动作、事件)的定义,但要实现先获取measurementIds再批量调用measurement的组合流程,可从以下几个方向落地:
1. 用TD语义扩展声明流程依赖
你可以在TD中添加自定义语义标注,明确两个属性的依赖关系,让客户端能识别出调用顺序:
{ "@context": ["https://www.w3.org/2022/wot/td/v1.1", { "custom": "http://your-domain.com/terms/" }], // ... "properties": { "measurementsIds": { // ... 原有定义 "custom:followedBy": "measurement" }, "measurement": { // ... 原有定义 "custom:dependsOn": "measurementsIds" } } }
这种方式仅做流程声明,具体执行逻辑仍需客户端实现。
2. 客户端侧编排交互流程
这是最直接的实现方式,客户端按步骤执行即可:
- 第一步:调用
measurementsIds属性的表单接口,传入start和finish参数,拿到包含多个ID的列表。 - 第二步:遍历ID列表,逐个调用
measurement属性的表单接口,将每个ID作为id参数传入。
示例伪代码(JavaScript风格):
// 获取Thing实例 const thing = await WoT.fetch("http://thing.org/td"); // 第一步:获取measurementIds列表 const idsRes = await thing.readProperty("measurementsIds", { uriVariables: { start: "2024-01-01", finish: "2024-01-02" } }); const idsList = await idsRes.value(); // 第二步:批量获取每个measurement数据 const measurementTasks = idsList.map(id => thing.readProperty("measurement", { uriVariables: { id } }).then(res => res.value()) ); const allMeasurements = await Promise.all(measurementTasks);
3. 用WoT动作封装组合逻辑
如果设备端支持,可在TD中定义一个动作(Action),把整个组合逻辑封装在设备侧,客户端只需调用这个动作就能完成全部流程:
{ "@context": "https://www.w3.org/2022/wot/td/v1.1", // ... "actions": { "getMeasurementsInRange": { "input": { "type": "object", "properties": { "start": { "type": "date" }, "finish": { "type": "date" } } }, "output": { "type": "array", "items": { "type": "object" } // 对应measurement的返回结构 }, "forms": [{ "href": "http://thing.org/getMeasurementsInRange", "htv:methodName": "POST" }] } } }
客户端调用该动作时,仅需传入start和finish,设备内部会自动完成measurementsIds查询、measurement批量获取,最终返回整合后的结果。
内容的提问来源于stack exchange,提问作者Eduard BABKIN
相关产品推荐
相关产品推荐

