编者按:本文作者李松峰,资深技术图书译者,翻译出版过40余部技术及交互设计专著,现任360奇舞团Web前端开发资深专家,360前端技术委员会委员、W3C AC代表。
2019年10月21日,作者在“W3C万维物联网标准简介”一文中简单介绍了W3C Web of Things(WoT)工作组制定的WoT标准以及它们的最新状态:
规范 | 当前状态 |
---|---|
WoT Architecture | CR |
WoT Thing Description | CR |
WoT Scripting API | WD,Working Draft |
WoT Binding Templates | Working Group Note |
WoT Security and Privacy Considerations | Working Group Note |
本系列将从WoT标准本身出发,对目前已经进入CR阶段(W3C标准的阶段参见下图)的WoT Architecture(WoT架构)、WoT Thing Description(WoT物描述)以及处于WD阶段的WoT Scripting API(WoT编程API)进行一次快速解析。
如下图所示,标准进入CR阶段意味着内容已经相对稳定,WD阶段则意味着较大的不确定性,而Working Group Note(工作组备忘)则变数很大。因此处于CR阶段的“架构”和“物描述”是值得花时间了解的(成为正式推荐标准REC的可能性很大),而处于WD阶段的编程API在2019年10月28日做了一次大的内容改版,几乎完全废弃了上一版的内容,只能说接近稳定状态,但编程API始终是开发者所喜闻乐见的,所以本系列也会介绍。
W3C Process Document,https://www.w3.org/2019/Process-20190301/#recs-and-notes
1. 编程API简介
WoT Scripting API描述如何通过脚本暴露和消费物体,同时定义了通用的物发现API。基于WoT架构定义的“消费体”(consumed thing)和“暴露体”(consumed thing),这个规范提供了不同层次的交互操作能力。
首先,客户端通过消费TD(Thing Description)可以创建一个本地运行时资源模型,即消费体。消费体支持访问远程设备上的服务端物体暴露的属性、动作和事件。
其次,服务端负责暴露物体,为此需要:
定义TD
初始化一个实现该TD所定义WoT接口的软件栈,以服务于对暴露属性、动作和事件的请求
最终发布TD(比如发布到一个物体目录,以便消费者发现)
2. 支持的场景
编程API支持以下脚本使用场景。
2.1 消费物
消费物体的TD,如基于暴露WoT交互的TD创建一个编程对象:
-
读取一或多个属性的值
设置一或多个属性的值
观察属性值的变化
调用动作
观察物体发出的事件
推断(内省)TD,包括基于TD链接的资源
2.2 暴露物
暴露物体包括生成协议绑定以便访问底层功能
基于提供的字符串序列化格式的TD或既有物体对象创建本地要暴露的物体
给物体添加属性定义
从物体删除属性定义
给物体添加动作定义
从物体删除动作定义
给物体添加事件定义
从物体删除事件定义
发送事件,如通知订阅了该事件的所有监听程序
为外部请求注册处理程序
-
取得属性的值
更新属性的值
执行动作:接收来自请求的参数,执行定义的动作,返回结果
2.3 发现物
通过发送广播请求在WoT网络中发现所有物体
发现在本地WoT运行时中运行的物体
发现邻近的物体,如通过NFC或蓝牙连接的物体
通过向一个注册表服务发送发现请求发现物体
通过物体描述定义的过滤器发现物体
通过语义查询发现物体
停止或阻止进行中的发现过程
可选地给发现过程指定超时时间,超时后停止/阻止继续发现
3. 接口及类型定义
3.1 ThingDescription类型
typedef object ThingDescription;
下面是通过URL获取一个ThingDescription类型实例的示例:
例1:获取TD
try { let res = await fetch('https://tds.mythings.biz/sensor11'); // ... 可以对res.headers进行额外检查 let td = await res.json(); let thing = new ConsumedThing(td); console.log("Thing name: " + thing.getThingDescription().title); } catch (err) { console.log("Fetching TD failed", err.message); }
此外,规范也定义了如何扩展TD和验证TD。
3.2 WOT接口
[SecureContext, Exposed=(Window,Worker)] interface WOT { // methods defined in UA conformance classes Promise<ConsumedThing> consume(ThingDescription td); Promise<Exp