编者按:本文作者李松峰,资深技术图书译者,翻译出版过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
WoT 架构规范的核心分别从7个方面描述了 WoT 相关的术语及这些术语之间的相关关系。架构的本质就是术语及其关系。术语代表业界约定俗成的概念,是架构的骨骼和肌肉;关系描述术语的交互与特性,是架构的血液和神经。
Overview(概述)
Affordances(可识别功能)
Web Thing(Web物)
Interaction Model(交互模型)
Hypermedia Controls(超媒体控件)
Protocol Bindings(协议绑定)
WoT System Components and Their Interconnectivity(组件及互联)
这一部分从宏观上定义了 Thing、Consumer 和 Intermediary 三个基础概念及其相互关系。
Thing(物):指的是某个物理或虚拟实体(如设备或房间)的抽象表示,由标准化的元数据描述。在W3C WoT中,描述元数据 必须 是 WoT Thing Description(TD)。
Consumer(消费者):消费者 必须 能够解析和处理基于 JSON 的 TD。
Intermediary(中介):可以充当物体的代理,此时中介拥有与背后的物类似的 TD ,但指向的是由这个中介提供的 WoT 接口。中介也可以给背后的物添加额外的能力或者将多个可用的物体组合起来,从而构成虚拟实体。对消费者而言,中介看起来就像一个物,因为它拥有 TD 且提供 WoT 接口。
消费者与物直接交互是最简单直观的方式:
物 TD 中可以包含指向其他物或资源的链接:
互联网无法访问本地网络是实际部署中面临的一个典型问题,通常是因为存在IPv4 NAT(Network Address Translation)或防火墙。为解决这个问题,W3C WoT允许物与消费者之间存在中介。
上述几个概念适用于 IoT 应用的各个层面:设备层、边缘层和云计算层。在这些层面应用上述概念能够促进跨层级通用接口和 API 的产生,进而促成 IoT 应用间不同的交互模式如物与物、物与网关、物与云、网关与云,甚至云联盟(如两个或多个服务提供商的云计算环境互联)。
Affordance(可识别功能)是借用认知心理学领域的一个术语,“指的是某物可察觉且实际存在的属性,而且特指决定怎么使用它们的根本属性。”(Donald Norman)比如,看到门边有一块板,就知道需要推开它。
(参见:https://communitywiki.org/wiki/WhatIsAffordance)
可识别功能在 TD 中用于描述物的能力。WoT 将以下4个概念归为可识别功能:
导航
属性
动作
事件
其中,导航使用的是超链接。对超链接的描述(比如链接关系类型和链接目标属性)就是一种功能,它告诉Web客户端如何导航以及怎么处理链接的资源。换句话说,链接提供了导航这种可识别功能。
而属性、动作和事件使用另一个超媒体控件,表单来描述。相对于超链接,表单能实现与物的更复杂的交互。
Web物涉及4个方面:
Behavior(行为)
Interaction Affordance(交互可识别功能)
Security Configuration(安全配置)
Protocol Binding(协议绑定)
如下图所示,除了行为之外,交互可识别功能、安全配置和协议绑定都需要在 TD 中体现。这里的行为,可以理解为在其他3方面之上的基于场景的控制逻辑。
TD 中描述的交互可识别功能可以为消费者提供一个交互模型,但不涉及特定网络协议或数据编码。交互可识别功能到特定协议消息的映射由协议绑定来提供。一般来说,不同协议通常用于支持不同的交互可识别功能。而物的安全配置则代表交互可识别功能的访问控制机制,以及对相关公共或私有元数据的管理。
物架构
如前所述,WoT 在导航的基础之上,又正式规定了3种交互可识别功能:
属性
动作
事件
属性作为一种交互可识别功能,用于暴露物体的状态。属性暴露的状态 必须 可获取(可读)。属性暴露的状态 可以 被更新(可写)。物体可以通过在某个变化之后推送新状态让属性可观察(参见Observing Resources [RFC7641])。只写状态应该通过某个动作来更新。
属性的例子有传感器的值(只读)、有状态执行器(读写)、配置参数(读写)、物体状态(只读或读写),以及计算结果(只读)。
动作作为一种交互可识别功能,允许激活物体的某个功能。动作 可以 操作直接暴露的状态(参见属性)、同时操作多个属性或基于内部逻辑操作属性(如切换)。触发动作也 可以 触发物体上某个随时间推移而操作状态(包括通过执行器改变物理状态)的流程。
动作的例子包括同时改变多个属性、随时间推移或通过一个不应泄露的流程(如专有控制循环算法)改变属性(如调暗灯光),或者启动一个持续较长时间的流程(如打印文件)。
事件作为一种交互可识别功能,描述异步把数据从物体推送到消费者的事件来源。这里重点不在于传送状态,而在于传送状态变化(如事件)。事件 可以 通过未暴露为属性的条件触发。
事件的例子包括警报等离散事件,也包括定时推送的时序采样事件。
无论属性、动作,还是事件,如果交互过程中的数据没有被协议绑定(通过媒体类型)完全定义,那么它们都可以额外包含相应的数据模式(Data Schema)。
W3C WoT 用到了两种超媒体控件:众所周知的在网上冲浪的 Web链接(RFC8288)和更强大的可以支持任意操作的 Web表单。链接在其他 IoT 标准和 IoT 平台中已经被用到了,比如CoRE Link Format [RFC6690]、OMA LWM2M [LWM2M]、OCF [OCF]。表单则是一个新概念,除了W3C WoT,IETF的 Constrained RESTful Application Language (CoRAL) [CoRAL]也用到了它。
链接让消费者(或者更宽泛地讲Web客户端)改变当前上下文(Web浏览器当前呈现的各种资源)或者在当前上下文中包含更多资源,取决于上下文与链接目标的关系。消费者通过对目标 URI 解引用也就是通过跟进链接来获取资源表示来实现这一操作。
W3C WoT遵循Web链接([RFC8288])的定义,也就是说一个链接包含:
链接上下文
关系类型
链接目标
目标属性(可选)
在 WoT 中,链接用于发现和表示物体之间的关系(如层次关系或功能关系),以及物体与 Web 上其他文档的关系(如手册或 CAD 模型等替代表示)。
表单让消费者(或者更宽泛地讲Web客户端)执行超出解引用 URI 以外的操作(如操作物体的状态)。消费者通过填充并将表单提交给提交目标来实现上述操作。这通常需要比链接更详细的(请求)消息细节(如方法、首部字段或其他协议选项)。可以将表单看成一个请求模板,提供商会根据自己的接口和状态预先填充部分信息,剩余的字段由消费者(或Web客户端)填写。
W3C WoT把表单定义为一种新的超媒体控件。注意,CoRAL( [CoRAL])中的定义也差不多,可以看成是一致的。表单包含:
表单上下文
操作类型
提交目标
请求方法
表单字段(可选)
表单可以看成这么一句话:“在 表单上下文 中执行指定 操作类型 的操作,以指定的 请求方法 向 提交目标 发送请求”,然后可选的字段用于进一步描述请求。
操作类型 | 说明 |
---|---|
readproperty | 标识属性可识别功能的读操作,用于获取相应数据 |
writeproperty | 标识属性可识别功能的写操作,用于更新相应数据 |
observeproperty | 标识属性可识别功能的观察操作,当属性被更新时会收到包含新数据的通知 |
unobserveproperty | 标识属性可识别功能的取消观察操作,停止接收相应的通知 |
invokeaction | 标识动作可识别功能的调用操作,以执行相应的动作 |
subscribeevent | 标识事件可识别功能的订阅操作,当物体的事件发生时会收到通知 |
unsubscribeevent | 标识事件可识别功能的取消订阅操作,停止接收相应的通知 |
readallproperties | 标识物体的读取全部属性操作,用于一次性获取所有属性的数据 |
writeallproperties | 标识物体的写入全部属性操作,用于一次性写入所有属性的数据 |
readmultipleproperties | 标识物体的读取多个属性操作,用于一次性获取选择属性的数据 |
writemultipleproperties | 标识物体的写入多个属性操作,用于一次性写入选择属性的数据 |
协议绑定就是从一个交互可识别功能到某个特定协议(如HTTP [RFC7231]、CoAP [RFC7252]或MQTT [MQTT])具体消息的映射。协议绑定让消费者知道如何通过面向网络的接口激活交互可识别功能。为支持互操作,协议绑定遵循REST([REST] )的统一接口规范。
WoT对协议绑定从如下几方面做出了限制。
交互可识别功能 必须 包含一或多个协议绑定。协议绑定 必须 被序列化为超媒体控件,能够自解释如何激活交互可识别功能。超媒体控件 必须 由提供交互可识别功能的物体主体给出。所谓主体可以是物体自身,在运行时产生TD文档(基于自己当前状态并包含IP地址等网络参数),也可以从内存里给出(只包含当前网络参数)。主体也可以是能全面且实时掌握物体及其网络参数、内部结构的外部实体(如软件栈)。这可以让物体与消费者实现松散耦合,从而让它们拥有独立的生命周期并独立演进。超媒体控件可以被缓存在物体外部,以便离线时使用缓存的尚在有效期的元数据。
符合W3C WoT要求的协议必须具有在 IANA([RFC4395])注册的 URI 模式。超媒体控件依赖URI辨别链接和提交目标。因此,URI 模式(冒号前的第一个组件)表示与物体的交互可识别功能通信时使用的协议。W3C WoT称这些协议为传输协议。
符合 W3C WoT 要求的协议必须基于众所周知的标准方法。标准方法让消息可以自解释,从而让交互可识别功能可以进行中间处理,如通过代理来处理或者从一个协议绑定转换为另一个协议绑定[REST]。另外,还可能让消费者拥有可重用的传输协议栈,如 HTTP、CoAP 或 MQTT,避免消费者编写特定于物体的代码或插件。
在激活交互可识别功能时交换的所有数据(或者说内容)都必须通过协议绑定中的媒体类型[RFC6838] 来标识。媒体类型表示内容格式,如 application/json for JSON [RFC8259] or application/cbor for CBOR [RFC7049]。媒体类型由IANA管理。
有些媒体类型可能需要提供额外参数才能完整指定内容使用的格式。如 text/plain; charset=utf-8 or application/ld+json; profile="http://www.w3.org/ns/json-ld#compacted" 。在描述发送给物体的数据时,需要特别注意这一点。传输过程中可能需要对数据进行标准的转换,如内容编码 [RFC7231]。协议绑定可以包含额外信息,用于在媒体类型之外提供更具体的信息以供确定内容格式。
注意,很多媒体类型只标识一种通用的序列化格式,并不能对内容组成(如XML、JSON、CBOR)提供更多语义。因此,对应的交互可识别功能应该声明数据模式,以便为数据交换提供更具体的语法级元数据。
概述中从抽象 WoT 架构组件角度描述了 WoT 架构,包括物、消费者和中介。在把这些抽象的架构组件实现为软件栈,而这些软件栈在 WoT 架构中扮演相应角色时,这些软件栈就被称为服务套件(Servient)。
这一部分通过示意图来说明服务套件如何协同工作以构成基于 WoT 架构的系统。
首先,物可以被实现为服务套件。我们称包含物表示(TD)的服务套件软件栈为暴露体(Exposed Thing),该软件栈对物的消费者暴露 WoT 接口。暴露体可以由服务套件上的其他软件组件使用,以实现物的行为。
其次,消费者则始终会通过服务套件实现,因为它们必须能够处理T D,而且必须有一个可以通过 TD 中包含的协议绑定信息来配置的协议栈。
在消费者中,我们称提供物表示的服务套件软件栈为消费体(Consumed Thing),该软件栈让运行于这个服务套件之上、需要处理TD的应用可以与物体交互。
服务套件软件栈中消费体的实例旨在从应用中分离协议级别的复杂性,代替应用与暴露体进行通信。
最后,中介也是由服务套件实现的一个 WoT 架构组件。中介位于物与消费者之间,同时扮演消费者(对物而言)和物(对消费者而言)的角色。在中介服务套件中,软件栈既包含消费者(消费体)也包含物(暴露体)。
下图展示了物与消费者之间的直接通信,物通过 TD 暴露交互可识别功能,消费者通过该交互可识别功能来使用物。直接通信适用于双方的服务套件使用相同网络协议,且可以相互访问的场景。
暴露体是物抽象的软件表示,为物提供的交互可识别功能暴露 WoT 接口。
消费体是被消费者消费的一个远程物的软件表示,作为应用访问远程物的接口。消费者可以通过解析和处理TD生成一个消费体实例。消费者与物的交互通过消费体与暴露体直接连接并交换数据实现。
下图展示了消费者和物通过中介相互连接在一起。如果实现消费者与物的服务套件使用不同协议,或者消费者与物位于需要认证才能访问的不同网络,则它们之间必须通过中介实现通信。
中介同时包含暴露体和消费体的功能。中介的功能包括为消费者和物的交互可识别功能转发消息、可选地缓存物体的数据以加速响应,以及在物的功能被中介扩展的情况下进行通信转换。在中介里,消费体会创建物的暴露体的代理对象,消费者可以通过自己的消费体访问这个代理对象(即中介的暴露体)。
中介与消费者通信使用的协议可以不同于与物通信使用的协议。比如,使用 CoAP 的物与使用 HTTP 的消费者可以通过中介作为桥梁。
即使中介与物之间使用多种不同协议,消费者也可以只使用一种协议通过中介与这些物通信。同样,在认证的时候也是这样。消费者的消费体只需使用一种安全机制与中介的暴露体进行认证,而中介则可能需要通过多种安全机制对不同的物进行认证。
通常,中介会根据原始物的 TD 来创建其代理对象的 TD 。根据用例的需求,这个代理对象的 TD 可以使用与原始物 TD 相同的标识符,也可以被赋予一个新标识符。必要情况下,中介生成的 TD 可以包含支持其他通信协议的接口。
本文作为“W3C万维物联网标准解析”系列的第一篇,主要讲解了 WoT 架构的核心概念。架构的本质是概念及其关系。WoT架构描述了很多概念,包括物、中介、消费者、可识别功能(属性、动作、属性)、超媒体控件(链接、表单)、服务套件、暴露体、消费体,等等。其中物是对物理或虚拟设备的抽象,代表服务端功能。消费者是对WoT应用的抽象,代表客户端功能。而中介则兼具物的抽象和应用的抽象。物、消费者和中介的实现称为服务套件,有直接和间接两种通信模式。
WoT 架构的核心是规定了物描述(TD)包含交互可识别功能、安全配置和协议绑定。物可以拥有导航、属性、动作和属性等4种交互可识别功能,并通过超媒体控件(链接、表单)提供。这就是所谓的交互模型。WoT架构当前定义了12用常用交互操作,其中8种与属性相关、1种与动作相关,2种与事件相关。
协议绑定是交互可识别功能到具体协议调用的映射。安全配置代表交互可识别功能的访问控制机制。
关于 W3C 成立 WoT 工作组制定 WoT 标准的初衷,可以参考该文章。
“W3C万维物联网标准简介”
知乎用户“尧以俊德”的回答:https://www.zhihu.com/question/26469697/answer/537098445
WoT Architecture:https://www.w3.org/TR/wot-architecture/
WoT Thing Description:https://www.w3.org/TR/wot-thing-description/
WoT Scripting API:https://www.w3.org/TR/wot-scripting-api/
WoT Binding Templates:https://www.w3.org/TR/wot-binding-templates/
WoT Security and Privacy Considerations:https://www.w3.org/TR/wot-security/
WoT兴趣组:https://www.w3.org/2019/07/wot-ig-2019.html
WoT工作组:https://www.w3.org/2016/12/wot-wg-2016.html
《奇舞周刊》是360公司专业前端团队「 奇舞团 」运营的前端技术社区。关注公众号后,直接发送链接到后台即可给我们投稿。