另请参阅 翻译。
Copyright © 2017-2023 World Wide Web Consortium. W3C® liability, trademark and permissive document license rules apply.
W3C Web of Things(WoT)实现了跨 IoT 平台 和应用领域的互操作性。WoT 的目标是保留并 补充现有的 IoT 标准和解决方案。W3C WoT 架构旨在描述已有内容,并仅在必要时 规定新的机制。
本 WoT Architecture 规范描述了 W3C Web of Things 的抽象架构。该 抽象架构基于从多个应用领域的用例 推导出的需求。已识别出若干模块化构建块, 其详细规范在其他文档中给出。本文档 描述了这些构建块之间如何关联并 协同工作。WoT 抽象架构定义了一个基本的 概念框架,可映射到多种具体 部署场景,并给出了若干示例。然而,本 规范中描述的抽象架构本身并不定义具体机制, 也不规定任何具体实现。
本节描述本文档在 发布时的状态。当前 W3C 出版物列表以及本技术报告的 最新修订版可在 W3C 技术报告 索引中找到,网址为 https://www.w3.org/TR/。
本文档描述一个抽象架构。不过, 有一份 实现 报告,描述了一组遵循 W3C Web of Things 架构的具体实现。它还引用了各个 WoT 构建块的 其他实现报告。
本规范未来的更新可能纳入 新特性。
本文档由 Web of Things 工作 组作为推荐标准,按照 推荐标准 轨道发布。
W3C 建议将本规范作为 Web 标准进行广泛部署。
W3C 推荐标准是一种规范,它在经过广泛的 共识形成后,由 W3C 及其成员认可,并且 获得工作组成员对实现的 免版税许可承诺。
本文档由一个按照 W3C 专利政策运作的组制作。 W3C 维护一份 公开的任何 专利披露列表,其中列出了与该组交付成果 相关的披露;该页面还包括披露专利的说明。 任何实际知悉某项专利且认为该专利包含 必要 权利要求的个人,必须按照 W3C 专利政策第 6 节披露该信息。
本文档受 2023 年 11 月 03 日 W3C 流程 文档管辖。
本节为非规范性内容。
Web of Things(WoT)的目标是提升 物联网(IoT)的互操作性和可用性。 通过许多利益相关者多年来的协作, 已经识别出若干有助于应对这些挑战的构建块。
来自多个行业、面向各种应用领域的利益相关者 贡献了 30 多个 WoT 用例。这些用例已经收集起来, 并发布在 WoT Use Cases and Requirements https://www.w3.org/TR/wot-usecases/ 文档中。
该用例集合分为两类:
这些用例和需求推动了 W3C WoT 规范 家族的创建和进一步演进。
WoT 架构规范聚焦于 W3C WoT 标准化的范围,该范围可以分解为这些构建块, 以及定义它们如何相互关联的抽象架构。
架构文档具有多重用途:
构建块在单独的规范中定义并详细描述。 除了定义抽象架构及其术语和概念框架之外,本 规范还作为 WoT 构建块的引言, 并解释它们之间的协同工作:
本规范还涵盖 WoT 系统部署的非规范性架构 方面和条件。这些指南在示例部署场景的上下文中 描述,尽管本规范并不要求特定的具体实现。
本规范作为 W3C WoT 规范的总括性文档, 定义术语以及 W3C Web of Things 的底层 抽象架构等基础内容。总而言之,本规范的目的是提供:
其他需求、用例、概念性特性和 新构建块会收集到未来版本的 WoT Use Cases and Requirement https://www.w3.org/TR/wot-usecases/ 文档中。
除标记为非规范性的章节外,本规范中的所有创作 指南、图表、示例和注释均为非规范性内容。 本规范中的其他所有内容均为规范性内容。
本文档中的关键词 MAY、MUST、MUST NOT、 SHOULD 和 SHOULD NOT 应按照 BCP 14 [RFC2119] [RFC8174] 中所述方式解释,且仅当它们以此处所示的全大写形式 出现时才如此。
本节为非规范性内容。
本规范使用以下在此定义的术语。 WoT 前缀用于避免专门为 Web of Things 概念 (重新)定义的术语产生歧义。
如果某一定义与另一 WoT 文档中使用的术语发生冲突, 则以 WoT Architecture 中的定义为准。
id 属性)的 Thing Description。注:Partial TD 的一个用法示例位于 WoT Scripting API 中, 它在其中被用作创建 Exposed Thing 的输入。
@context,使用额外的
Vocabulary Term 扩展
Thing Description。
它是语义注释以及 Protocol Binding、Security Scheme
和 Data Schema 等核心机制扩展的基础。
在符合 WoT 抽象架构的 WoT 部署中,我们会看到多种不同的 设备类型。它们的范围(按占用空间和能力排序) 从小型嵌入式 node 设备, 到 gateway 或 hub, 再到功能强大的 edge 设备和 cloud 服务器。 这些设备之间的互操作性意味着一组核心 特性和功能可在 所有这些设备上使用。
以下设备类别描述了这些类别中典型代表的占用空间和 特征。这用于识别这些设备类别可能具备的特性和用例。
这些类别与 IETF [RFC7228] 为受限设备定义的类别保持一致,不过这些类别已扩展到 更大的设备,并提供了 RAM 和 Flash/ROM 的典型大小边界。 内存和存储大小都比性能更容易量化,也更具限制性, 因此这是此分类的基础。这不是严格分类。 各类别可能重叠,并且并非所有内存都可供用户应用使用。
| 类别 | 数据大小(RAM) | 代码大小(Flash、ROM,...) | 典型代表 | 备注,典型应用场景 |
|---|---|---|---|---|
| Class-0, C0 | << 10 KiB | << 100 KiB | 小占用空间微控制器 | 不具备安全通信的传感器节点 |
| Class-1, C1 | ~ 10 KiB | ~ 100 KiB | 微控制器 | 通常支持 TLS、DTLS 等安全 通信协议的传感器 |
| Class-2, C2 | ~ 64 KiB | ~ 256 KiB | 联网受限设备 | 小型嵌入式设备,例如 M2M 通信 节点、智能电表、传感器节点和其他嵌入式 电器、家用电器、低端电视机顶盒 以及销售点终端等。 |
| Class-3, C3 | ~ 64-256 KiB | ~ 256 KiB - several MBs | ISP 网关 | 小型家庭和工业网关 |
| Class-4, C4 | ~ 256 KiB - several MB | ~ 1 MB - several MB | 网关/集线器 | 大型家庭和工业网关 |
| Class-5, C5 | ~ 1 - 8 GB | ~ 1 - 16 GB | edge | 小型边缘服务器 |
| Class-6, C6 | ~ several GB | ~ several GB | edge | 大型边缘服务器 |
| Class-7, C7 | ~ several GB | ~ several GB | cloud | 具有多个计算节点的云系统 |
类别边界是软边界, 各类别并非互斥,也就是说,存在一些应用 场景可以由来自多个类别的设备实现。 对于安全通信,我们考虑支持 TLS/HTTP、DTLS/CoAP 以及类似安全协议的设备。
本节为非规范性内容。
本节介绍 W3C WoT 所面向的应用领域,并用这些领域推导 7. WoT 构建块中讨论的 抽象架构。
这些应用领域由 [WOT-USE-CASES-REQUIREMENTS] 中 描述的用例所驱动。
Web of Things 架构不对用例和应用领域 设置任何限制。已经考虑了各种应用 领域,以收集抽象架构必须满足的 共同模式。
以下各节并非穷尽列举。它们只是作为 示例,说明联网的 Thing 可以提供额外 收益或支持新的场景。
在消费者空间中,有多种资产会因联网而 受益。灯和空调可以根据房间占用情况 关闭。窗帘可以根据天气条件和 是否有人自动关闭。能源和其他资源消耗可以 根据使用模式和预测进行优化。
本节中的消费者场景描述的是智能 家居用例。
图 1 展示了 智能家居的一个示例。在此情况下,网关通过相应的 本地通信协议(如 KNX、ECHONET、ZigBee、DECT ULE 和 Wi-SUN)连接到传感器、摄像头和家用电器等 边缘设备。一个家庭中可以存在多个网关, 而每个网关可以支持多个本地协议。
网关可以通过互联网连接到云端,而某些 电器也可以直接连接到云端。在云端运行的服务从 边缘设备收集数据并分析数据,然后通过 边缘设备和其他 UX 设备向用户提供价值。
智能家居提供远程访问和控制、语音控制以及 家庭自动化等消费者收益。智能家居还使设备制造商 能够远程监测和维护设备。智能家居可以实现 能源管理和安全监控等增值服务。
本节中的工业用例适用于
不同的行业垂直领域。
由于应用场景存在重叠的性质,
不同垂直领域具有相似的用例。
图 2 展示了 智能工厂的一个 示例。在此情况下,现场级、单元级 和生产线控制器基于 PROFINET、Modbus、OPC UA TSN、 EtherCAT 或 CAN 等工业通信协议,对不同工厂设备 进行自动化控制。工业边缘设备从各种 控制器收集选定数据,并使其可供云后端 服务使用,例如用于通过仪表板进行远程监控, 或对其进行分析以实现预防性维护。
智能工厂需要对联网制造设备以及制造出的 产品进行高级监测。它们受益于对机器故障的预测 和对异常的早期发现,从而避免代价高昂的停机时间 和维护工作。
此外,对联网制造设备以及生产设施环境中 有毒气体、过度噪声或热量的存在进行监测, 可提高工人的安全性,并降低事件或事故的风险。
对生产设备进行实时监控和 KPI 计算有助于 发现生产率问题并优化供应链。
对车辆、燃料成本、维护需求和任务分配进行 监测,有助于优化车队的充分利用。
可以跟踪在途货运,以确保运输货物的 质量和状态保持一致。这对于确认从仓库到 冷藏卡车再到交付的冷链完整性尤其有用。
对仓库和堆场中的库存进行集中监测和管理, 可以防止缺货和库存过多的情况。
住宅以及 C&I(商业和工业)计量表的自动读数 和计费,为资源消耗和潜在瓶颈提供 持续洞察。
监测分布式可再生能源发电设备的状态和输出, 能够优化分布式能源资源。
对配电设备进行监测和远程控制, 有助于自动化配电过程。
对发电和配电基础设施进行持续监测, 正在提升现场公用事业工作人员的安全性。
海上平台监测、管道泄漏检测和预测, 以及对储罐和蓄存设施液位的监测与控制, 有助于提高对劳动力以及环境的工业安全。
通过各种储罐和输送管道/卡车对分布式库存 进行自动计算,可以改进规划和资源优化。
对联网结构、车队车辆等高价值资产进行主动 资产监测,可通过预测和对事件的早期检测 减轻严重损坏和高昂成本的风险。
可以通过使用情况跟踪和定制保险政策提供 基于使用情况的保险。
预测性天气监测以及将车队车辆重新调度到 有遮蔽的车库,可以限制冰雹损害、树木损害 造成的损失。
面向工业安全的监测降低了安全危害的风险。 对施工现场资产的监测可以防止损坏和丢失。
土壤状况监测、为浇水和施肥制定最佳计划, 以及监测农产品状态,可优化农产品的 质量和产量。
临床试验数据的收集和分析有助于 获得对新领域的洞察。
远程患者监测降低了老年人和住院后患者 关键情况未被发现的风险。
环境监测通常依赖大量分布式传感器, 这些传感器将其测量数据发送到公共网关、 边缘设备和云服务。
监测空气污染、水污染以及细尘、臭氧、挥发性 有机化合物、放射性、温度、湿度等其他环境风险因素, 以检测关键环境状况,可以防止不可恢复的健康 或环境损害。
对桥梁、水坝、堤坝、运河的材料状态、 劣化和振动进行监测,可发现维护修复工作并 防止重大损坏。监测高速公路并提供适当的标志, 可确保优化交通流。
智慧停车正在优化和跟踪停车位的使用情况和 可用性,并自动化计费/预订。
根据存在检测、天气预测等对路灯进行智能控制, 可降低成本。
可以监测垃圾容器,以优化废弃物管理和垃圾 收集路线。
监测整个建筑的能源使用有助于 优化资源消耗并减少浪费。
监测建筑中的设备,例如 HVAC、 电梯等,并及早修复问题,可提升 使用者的满意度。
对运行状态进行监测、对服务需求进行预测, 可优化维护需求和成本。通过针对关键道路和 交通状况的早期预警系统通知,可增强驾驶员安全。
图 3 展示了 联网汽车的一个 示例。在此情况下,网关通过 CAN 连接到汽车组件, 并通过专有接口连接到汽车导航系统。在云端 运行的服务收集从汽车组件推送的数据,并分析 多辆汽车的数据以确定交通模式。网关也可以消费 云服务;在此情况下,它获取交通数据并通过 汽车导航系统向驾驶员显示。
本节为非规范性内容。
本节介绍常见部署模式,说明设备/Thing 如何与 控制器、其他设备、代理和服务器交互。在本节中, 我们使用术语 client role 表示传输协议的发起方, 使用术语 server role 表示传输协议的被动组件。 这并不意味着为任何系统组件规定特定角色。 一个设备可以同时处于 client 和 server 角色。
这种双重角色的一个示例是传感器,它向云服务 注册自身,并定期向云端发送传感器读数。 在响应消息中,云端可以调整传感器消息的 传输速率,或选择未来消息中要传输的特定 传感器属性。由于传感器向云端注册自身并 发起连接,因此它处于“client”角色。不过, 由于它也会响应在响应消息中传输的请求, 因此它也履行“server”角色。
以下各节以逐渐增加的复杂度说明角色、任务和 用例模式。它们并非穷尽列举,而是用于说明 本规范后续章节所定义的 WoT 架构和构建块的动机。
本节还使用了 Trusted Environment 的概念,它是一组允许彼此之间 相对不受限制访问的设备。这是一种常见方法, 但也带来一些风险;这些风险及其缓解措施在第 10.4 可信 环境风险中讨论。
遥测是对远程设备的监测,这意味着将测量值 和其他数据自动传输到 Consumer 并在其上处理。 数据可以通过各种通信通道传输,包括无线和有线。 示例包括 GSM 网络、Bluetooth、WiFi、Ethernet 以及其他有线标准。
远程计量设备包括一个或多个传感器, 在某些情况下还包含执行器。在许多情况下, 传感器数据会按固定间隔、在状态变化时, 或作为对 Consumer 请求的响应进行传输。
远程计量设备通常是资源非常有限的小型嵌入式 系统,即 Class-2 或以下。它们可能由电池供电, 并必须通过各种措施(例如睡眠模式)尽量降低 功耗。这些设备大部分时间会处于睡眠状态, 不会传输任何数据以节省能源。它们只会在特定事件 (例如开关切换)发生时唤醒。当设备状态改变时, 会向 Consumer 发送事件。之后设备会再次进入 睡眠模式。
典型用户场景是对各种资产进行监测,示例包括 智慧城市、工厂、车队、环境监测和健康监测。 一些部署可能需要监测大量地理上分散的资产, 另一些部署则只包含少量设备,例如智能家居。 一种常见模式是单个 Consumer 与多个设备 (Thing) 之间的一对多关系。
一种常见部署模式是由用户操作的远程控制器控制 本地设备,如 图 4 所示。
远程控制器可以通过本地家庭网络直接访问 电子电器。在这种情况下,远程控制器可以由浏览器 或原生应用实现。
在此模式中,至少一个设备(如电子电器)具有 server 角色,可以接受来自其他设备的请求并 对其进行响应,有时还会发起机械动作。另一个设备 (如远程控制器)具有 client 角色,可以发送包含请求的 消息,例如读取传感器值或打开设备。此外, 为了发出设备的当前状态或事件通知,设备可能具有 client 角色,可以向另一个具有 server 角色的设备 发送消息。
图 5 展示了 直接 Thing 到 Thing 交互的一个示例。场景如下: 传感器检测到房间状态变化,例如温度超过阈值, 并向电子电器发出类似“turn on”的控制消息。 传感器单元可以向其他设备发出一些触发消息。
在此情况下,当两个具有 server 角色的设备 连接时,至少一个设备还必须具有 client 角色, 以向另一个设备发出消息来执行动作或通知。
此部署场景包含移动远程控制器 (例如在智能手机上),如 图 6 所示。远程控制器可以在 不同的网络连接和协议之间切换,例如在蜂窝网络 与使用 Wi-Fi 和 Bluetooth 等协议的家庭网络之间切换。 当控制器处于家庭网络中时,它是一个可信设备, 不需要额外的安全或访问控制。当它位于可信网络 之外时,必须应用额外的访问控制和安全机制, 以确保可信关系。请注意,在此场景中,网络连接可能 因在不同网络接入点或蜂窝基站之间切换而发生变化。
在此模式中,远程控制器和电子电器具有 client 和 server 角色,如 图 4 中的相关场景。
图 7 展示了 智能家居网关 的部署场景。网关位于家庭网络和 互联网之间。它管理屋内的电子电器,并可以通过 互联网接收来自远程控制器的命令,例如来自前一场景中 的智能手机。它也是设备的虚拟表示。 智能家居网关通常提供代理和防火墙 功能。
在此模式中,家庭网关同时具有 client 和 server 角色。当远程控制器驱动电子电器时, 它可以以 client 角色连接到电子电器,并以 server 角色连接到远程控制器。当电子电器向 远程控制器发出消息时,网关充当电子电器的 server 角色,并充当远程控制器的 client 角色。
Edge Device 或 Edge Gateway 类似于智能家居网关。我们使用该术语表示 边缘网关执行的额外任务。 与 图 8 中主要只是桥接公共网络和 可信网络的家庭网关不同,边缘设备具有本地计算 能力,并且通常在不同协议之间桥接。 边缘设备通常用于工业解决方案,在其中它们可以对 联网设备和传感器提供的数据进行预处理、过滤 和聚合。
Digital Twin 是一种虚拟表示, 即位于云服务器或边缘设备上的一个设备或一组设备的 模型。它可用于表示可能并非持续在线的现实世界设备, 或在新的应用和服务部署到真实设备之前 运行其模拟。
数字孪生可以为单个设备建模,也可以在组合设备的 虚拟表示中聚合多个设备。
数字孪生可以以不同方式实现,具体取决于 设备是否已经连接到云端,或者它是否连接到 自身连接到云端的网关。
图 11 展示了一个示例,其中 电子电器直接连接到云端。云端镜像这些电器,并作为 数字孪生,可以接收来自远程控制器(例如智能手机)的 命令。授权控制器可以位于任何地方,因为数字孪生 可以全局访问。
设备和操作流程的编排提供了超出 简单孤立使用某个设备的能力。 一组经过编排的设备可以提供组合操作, 通过一次操作影响多个设备的状态。
这些操作将单独操作组合为一个组合操作流程, 该流程可能具有若干备选路径,这些路径会基于 某些设备状态或属性值来选择。
经过编排的设备可以部署在各种拓扑中, 并可通过不同网络连接。由这些设备构建的系统 可以提供组合并超越单个设备能力的功能。
一个典型的编排示例是智能家居,其中各种传感器 (温度、占用、湿度、光照、空气质量、门传感器) 协同工作,并为进入或离开房屋、早晨/夜晚例程、 根据是否有人调整灯光和温度等场景提供操作流程。
图 12 展示了一个示例,其中旧式电子 电器并未直接连接到云端。这里需要一个网关来中继 连接。该网关作为:
云端镜像网关及所有连接的电器,并作为 数字孪生与网关结合在云端管理它们。此外, 云端可以接收来自远程控制器(例如智能手机)的 命令,这些控制器可以位于任何地方。
典型 IoT 部署由多个(数千个)设备组成。 如果没有标准化机制,针对特定云管理固件更新 需要大量工作,并会阻碍 IoT 更大规模的采用。
用于描述设备和设备类型的标准化机制的主要收益是, 能够将设备部署到不同云环境,而无需在设备软件/ 固件层面进行定制,即无需在设备上安装云特定代码。 这意味着解决方案足够灵活,能够以允许设备在 多个 IoT 云环境中入网和使用的方式描述设备。
这推动了 Web of Things 设备的采用,因为它 使得在现有部署中轻松使用新设备成为可能, 同时也支持将现有设备从一个云迁移到另一个云。
Virtual Thing 是一种 Service, 它充当一个或多个其他 Thing 的占位符,并向其 Consumer 提供接口。
在简单情况下,它是一种接口抽象, 为设备定义通用接口,从而可以在不改变 Consumer 的情况下用另一个设备模型替换一个设备模型。
在更复杂的场景中,Virtual Thing 为多个设备提供 单一接口,并向其 Consumer 提供更高层级的操作。 单个设备可以被替换,也可以通过软件升级提供 新操作。
Virtual Thing 通常会充当 Intermediary。示例 包括 Shadow 和 Digital Twin。
图 13 展示了跨域 协作的一个示例。在此情况下,每个系统都会涉及 其他领域中的其他系统,例如智能工厂与智慧城市、 智慧城市与智能家居。此类系统被称为“共生” 生态系统,如 [IEC-FOTF] 中所示。 存在两种协作模型:直接协作和间接协作。在直接协作模型中, 系统以点对点方式彼此直接交换信息。在间接协作中, 系统通过某种协作平台交换信息。为了维护并继续这种协作, 每个系统都提供其能力和接口的元数据,并使自身适配 其他系统。
上一节描述了各种架构模式。在这些模式中, 某些功能实体(例如包括旧式设备在内的设备、 控制器、网关和云服务器)位于物理位置, 例如建筑内部、建筑外部和数据中心。 图 14 是一个 概览,展示了这些实体的组合和通信路径。
在传输协议层中,每个实体会任意选择适合通信的 角色。例如,当设备向不定数量的应用提供服务时, 它可以充当 server。另一方面,如果设备具有有限或 间歇性的网络连接,它们可以充当 client,并在网络 可用时主动向应用发送消息。无论如何,在应用层中, 应用看到的是设备提供用于交互的抽象接口, 并且应用可以使用这些抽象接口与设备交互。
本节为规范性内容。
为满足 [WOT-USE-CASES-REQUIREMENTS] 中收集的需求和用例,Web of Things(WoT) 建立在 Web Thing 的概念之上——通常 简称为 Thing—— 它们可由所谓的 Consumer 使用。Consumer 可以直接与 Thing 交互, 也可以使用 中介进行 间接通信。
这些概念适用于第 4. 应用 领域中的各种应用领域。
本节提供背景和规范性断言,以定义整体 W3C Web of Things 架构。
由于 Web of Things 面向来自不同领域的 利益相关者,因此会更详细地解释 Web 技术的某些方面, 特别是超媒体的概念。
本节介绍 Web of Things 的基本概念。 它介绍了 Thing 抽象,该抽象由 Thing Description 和 Thing Model 描述,随后可由 Consumer 使用。
Thing 是物理 或虚拟实体(例如设备或房间)的抽象, 并由标准化元数据描述。Consumer 是一种实体, 能够读取并解释某个 Thing 的标准化元数据, 以便与该 Thing 通信。
WoT Thing Description(TD)是一种标准化、机器可读的 元数据表示格式,使 Consumer 能够发现并 解释 Thing 的能力(通过语义 注释),并在与 Thing 交互时适配不同的实现(例如 不同协议或数据结构),从而实现不同 IoT 平台之间的互操作性,即 不同生态系统和标准之间的互操作性。WoT Thing Model(TM) 同样是一种标准化、机器可读的元数据 表示格式,用于描述 Thing 的 类别,例如具有共同能力的 产品线设备。
Thing 也可以是 虚拟实体的抽象。虚拟实体是一个或多个 Thing 的组合(例如由 多个传感器和执行器组成的房间)。组合的一种选项是 提供单一、整合的 WoT Thing Description,其中包含虚拟实体的能力组合。 在组合较为复杂的情况下,其 TD 可以 链接到组合中的层级子 Thing。 主 TD 作为 入口点,并且只包含通用元数据和可能的 总体能力。这允许对更复杂 Thing 的某些方面进行分组。
WoT 架构提供了元数据格式,用于描述 Thing 的特定 实例以及 Thing 的 类别。用于 实例的元数据格式称为 Thing Description, 而用于 类别的格式称为 Thing Model。
Thing 实例由标准化元数据描述。 在 W3C WoT 中, 某个 Thing 实例的描述元数据 MUST 作为 WoT Thing Description(TD)可用 [WOT-THING-DESCRIPTION]。 该格式可以通过经典 JSON 库或 JSON-LD 处理器处理,因为其底层 信息模型是基于图的,并且其序列化 与 JSON-LD 1.1 [JSON-LD11] 兼容。使用 JSON-LD 处理器处理 TD 还能支持 语义处理,包括转换为 RDF 三元组、语义推理以及基于本体术语完成 给定任务,这会使 Consumer 表现得更加 自主。TD 是 实例特定的(即描述单个 Thing, 而不是 Thing 类型),并且是 Thing 默认的外部文本 (Web)表示。还 MAY 存在 Thing 的其他表示,例如基于 HTML 的 用户界面、物理实体的图像, 甚至封闭系统中的非 Web 表示。 然而, 要被视为 Thing, 至少一个 TD 表示 MUST 可用。
Thing Model 可用于 描述一组 Thing 可用的共同能力, 例如产品线中的大量设备。在这种情况下, Thing Model 定义 产品线中所有设备的共同能力, 但省略特定设备专有的信息。
当某个实例的完整信息不可用或不必要时, 也可以使用 Thing Model。 例如,某些 IoT 生态系统会隐式地单独处理通信。 在这种情况下,完全详细的 Thing Description (例如带有通信元数据)并不是必要的。 在 Thing 生命周期阶段的开始,通信元数据也可能 不可用,因为新的实体尚未部署 (例如 IP 地址尚未知晓)。
Thing Model 用于 定义 Thing 的基本信息模型, 以应对此类场景。Thing Model 可以 视为 Thing Description 的模板,但其限制少于 [WOT-THING-DESCRIPTION] 中“TD Information Model”和 “Representation Format”各节所定义的限制。 通常 Thing Model 示例 不包含任何实例特定信息,例如 IP 地址等 协议特定数据。然而,与其使用具体 URL 等, Thing Model 允许 使用 URL 模板。
Thing Model 支持:
Thing Model 是对接口以及与 Thing 的 Property、Action 和 Event 的可能交互的 逻辑描述,但它不包含 Thing 实例特定信息,例如具体协议使用情况 (例如 IP 地址),甚至序列号和 GPS 位置。不过,Thing Model 允许包含例如 安全方案,如果这些方案适用于该模型所描述的 整个实例类别。它们可能有 URL (例如令牌服务器之类的 URL),这些 URL 可能需要被省略或参数化(使用模板), 尽管在许多情况下也可能给出这些 URL。
Thing Model 可以 以与 Thing Description 相同的基于 JSON 的格式 序列化,该格式也允许 JSON-LD 处理。请注意, Thing Model 不能像 Thing Description 实例那样被验证,因为并非 Thing Description 的所有必需术语都要求出现在 Thing Model 中。缺少 必需术语。
链接可以表示 Thing 之间、Thing 与 Thing Model 之间, 以及 Thing Model 之间的关系。链接不仅适用于层级化的 Thing,也适用于 Thing 与一般其他资源之间的关系。链接关系 类型表达 Thing 如何关联,例如开关控制灯, 或房间由运动传感器监测。与 Thing 相关的其他资源可以是 文档手册、备件目录、CAD 文件、图形 UI, 或 Web 上的任何其他文档。总体而言, Thing 之间的 Web 链接使 Web of Things 对人类和机器都可导航。通过提供 Thing Description Directory 可以进一步促进这一点, 该目录管理 Thing 目录,通常通过缓存它们的 TD 表示来实现。
总之,WoT Thing Description 和 WoT Thing Model MAY 链接到其他 Thing、WoT Thing Model 以及 Web 上的其他资源,以形成 Web of Things。
Thing MUST 托管在带有软件栈的联网系统 组件上,以通过面向网络的接口实现交互, 即某个 Thing 的 WoT Interface。 一个示例 是运行在嵌入式设备上的 HTTP 服务器, 该设备带有与 Thing 抽象背后的物理实体交互的传感器和执行器。 不过,W3C WoT 并不强制规定 Thing 托管在何处;它可以直接位于 IoT 设备上、网关等 边缘设备上, 或位于云端。
一个典型的部署挑战是本地网络无法从互联网 访问的场景,通常是因为 IPv4 网络地址转换(NAT) 或防火墙设备。为解决这种情况, W3C WoT 允许在 Thing 和 Consumer 之间使用 中介。
Intermediary 可以充当 Thing 的代理, 其中 Intermediary 具有与原始 Thing 类似的 WoT Thing Description,但它指向 Intermediary 提供的 WoT Interface。Intermediary 也可以 为现有 Thing 增添额外能力,或由多个可用 Thing 组合出新的 Thing, 从而形成 Virtual Thing。对于 Consumer 而言,Intermediary 只是 另一种 Thing,因为 它们拥有 WoT Thing Description 并提供 WoT Interface。在像 Web 这样的分层系统 架构中 [REST], 它们可能与直接表示物理设备的 Thing 无法区分。
受限本地网络的另一种补救方法,是将 WoT Interface 绑定到一种协议,该协议从本地网络内的 Thing 建立到可公开访问的 Consumer 的连接。
W3C WoT 的概念适用于 IoT 应用相关的所有层级:设备层、 边缘层和云层。这促进了不同层级之间的 共同接口和 API,并支持各种集成模式, 如 Thing 到 Thing、Thing 到网关、Thing 到云、 网关到云,甚至云联合,即两个或多个服务提供商的 云计算环境面向 IoT 应用互连。图 19 概览了如何应用并组合上述 WoT 概念,以应对 WoT Use Cases and Requirements 文档中描述的用例 [WOT-USE-CASES-REQUIREMENTS]。
W3C WoT 的一个核心方面是提供 机器可读的元数据(即 WoT Thing Description)。理想情况下,此类元数据是 自描述的,使 Consumer 能够识别 Thing 提供了什么能力,以及 如何使用所提供的能力。这种 自描述性的关键在于 可供性概念。
可供性一词源于生态心理学, 但已被人机交互领域 [HCI] 采用,基于 Donald Norman 的定义:“‘Affordance’ 指事物的感知属性和实际属性, 主要是那些决定该事物可能如何使用的基本属性。” [NORMAN]
一个示例是带把手的门。门把手是一种 可供性,暗示门可以被打开。对于人类而言, 门把手通常也暗示门如何被打开; 美式旋钮暗示旋转,欧式杠杆把手暗示向下按压。
超媒体原则是 REST 架构风格的核心基础之一 [REST], 它要求 Web 上任何可用的信息片段都链接到其他 信息片段,使信息的消费者明确知道如何导航 Web 并控制 Web 应用。在这里,信息和控制的同时呈现 (以超链接形式提供)是一种机制, 它向 Web 客户端提供驱动 Web 应用的手段。 在此上下文中,可供性是对超链接的描述 (例如通过链接关系类型和链接目标属性), 用于提示 Web 客户端如何导航,以及可能如何对 所链接资源采取行动。因此,链接提供导航可供性。
从该超媒体原则出发,Web of Things 将 Interaction Affordance 定义为 Thing 的元数据,它向 Consumer 展示并描述可能的选择, 从而提示 Consumer 可以如何与 Thing 交互。一种通用的 Interaction Affordance 是导航,它通过跟随链接来激活, 从而使 Consumer 能够浏览 Web of Things。6.5 交互 模型 为 W3C WoT 定义了另外三种 Interaction Affordance: Property、Action 和 Event。
总体而言,W3C WoT 的该定义 与 HCI 和交互设计师保持一致,他们创建物理 Thing;也与 REST 和微服务社区保持一致, 后者通常从事 Web 服务工作。
Web Thing 有四个值得关注的架构方面:其 行为、其 Interaction Affordance、其 安全 配置,以及其 Protocol Binding,如 图 20 所示。 Thing 的行为方面 包括自主行为以及 Interaction Affordance 的处理程序。Interaction Affordance 提供了一个模型,说明 Consumer 如何通过抽象操作与 Thing 交互,但不引用特定的网络 协议或数据编码。协议绑定 添加了所需的额外细节,用于将每个 Interaction Affordance 映射到某种协议的具体消息。一般来说, 可以使用不同的具体协议来支持 Interaction Affordance 的不同子集,即使是在单个 Thing 内也是如此。Thing 的 安全 配置方面表示用于控制对 Interaction Affordance 的访问以及相关 Public Security Metadata 和 Private Security Data 管理的机制。
在应用 WoT 架构原则的部署中, 不同实体相互交互,并在它们之间交换信息。 WoT 部署的元素包括 设备、 中介、consumer 和 目录。每个元素都有自己的(内在) Thing 生命周期。这些元素 构成一个系统,其中整个系统具有一个 系统生命周期,即系统具有若干状态, 并通过某些状态转换而进入可运行状态。 这意味着设备会经历其生命周期以进入 可运行状态,并且设备必须在使用之前被其他实体知晓。
以下各节描述系统生命周期和 Thing 生命周期。它们包含示例流程,用于说明 部署中 Thing 的不同状态和阶段。本节的目的之一 是澄清术语,并确保 Web Thing 的实现者考虑共同生命周期模型的概念。
这些图左侧的参与者可以理解为设备所有者 或制造商。右侧的参与者是最终用户, 他在应用中使用该设备。
以下时序图展示了一个由两个直接通信 设备组成的系统的流程示例。
在此场景中,设备可被使用之前,必须先 引导并入网到 consumer。在入网操作中, consumer 和设备相互认识——这既可以通过 发现过程完成,也可以通过注册操作完成, 在注册操作中 consumer 注册到设备, 或反之亦然。
在激活步骤之后(该步骤可能由若干 操作组成,例如配置供给、配置等), 设备 和 consumer 处于常规 运行模式。当该设备在此场景中不再需要时, 它将从 consumer 下线。在此操作之后, 它可以被退役并销毁。
以下时序图展示了一个包含三个实体的 系统的流程示例:一个设备、一个 consumer 和一个目录。
该流程与上一节中的流程非常相似, 但额外包含一个 目录 实体,该实体维护设备目录。在 WoT 中, 该目录是一组 thing description。 设备像前一场景一样完成引导之后, 会注册到目录。
目录充当左侧参与者和 consumer 侧参与者之间的 信息代理。这将设备所有者与 consumer 解耦, 其中发现过程充当中间人,以支持 consumer 进行发现。
设备的引导和配置供给是所有 IoT 协议 套件中设置设备的重要组成部分。
使用 WoT 对设备进行配置供给的主要场景如下:
IoT 协议套件中使用了各种配置供给方案。 本节文本基于 提案和研究, 比较各种配置供给方案,例如 OCF、 OneM2M、Lightweight OneM2M、Thing to Thing Research Group (T2TRG)、OPC-UA/Anima 等。
本节呈现的配置供给模型类似于 T2TRG 配置供给模型。
跨各种 IoT 协议套件的设备引导和配置供给的 共同元素如下:
考虑这些配置供给流程,一般来说, 设备可以处于以下状态之一:
生命周期状态之间的典型转换如下:
最初,Web 资源通常表示万维网上的一个文档, 可由 Web 客户端简单获取。随着 Web 服务的引入, 资源成为更通用的交互实体,能够实现 任何类型的行为。这种非常高层次的抽象 使得由于多样的交互可能性而难以在 应用和资源之间提供松耦合。因此,在撰写本文时, 典型 API 描述由从应用意图到资源地址、方法、 请求载荷结构、响应载荷结构以及预期错误的 静态映射组成。这会在 Web 客户端和 Web 服务之间施加强耦合。
W3C WoT 的 Interaction Model 引入了一种中间抽象,用于形式化 从应用意图到具体协议操作的映射,并且也缩小了 Interaction Affordance 可以如何建模的可能性。
除 导航可供性(即 Web 链接)之外, Thing MAY 提供由本规范定义的另外三种 Interaction Affordance:Property、Action 和 Event。 这种窄腰结构 允许解耦 Consumer 和 Thing, 同时这四种 Interaction Affordance 仍能够对 IoT 设备和服务中几乎所有 交互类型进行建模。
Property 是一种 Interaction Affordance,用于暴露 Thing 的状态。 由 Property 暴露的状态可以 被检索(读取)。可选地,Property 暴露的状态可以被 更新(写入)。Thing 可以选择通过在 变化之后推送新状态,使 Property 可观察 (参见 Observing Resources [RFC7641])。 在只读状态的情况下,可以使用 Action 来更新状态。
如果数据格式未由所用 Protocol Binding 完全指定(例如通过 媒体类型),Property MAY 包含一个用于暴露状态的 数据 模式。
Property 的示例包括传感器值(只读)、 有状态执行器(读写)、配置参数 (读写)、Thing 状态(只读或读写), 或计算结果(只读)。
Action 是一种 Interaction Affordance,允许调用 Thing 的函数。 Action MAY 操纵未直接暴露的状态 (参见 Property)、一次操纵多个 Property,或基于内部逻辑(例如切换) 操纵 Property。 调用 Action MAY 还会在 Thing 上触发一个过程, 该过程会随时间操纵状态(包括通过执行器操纵 物理状态)。
如果数据格式未由所用 Protocol Binding 完全指定(例如通过 媒体类型),Action MAY 包含 用于输入参数和输出结果的 数据 模式。
Action 的一些示例包括同时设置多个 Property、随时间改变 Property (例如使灯的亮度渐变(调光)),或通过 不应披露的过程(例如专有控制循环算法)进行改变, 或调用持续时间较长的过程,例如打印文档。
Event 是一种 Interaction Affordance,它描述一个事件源,该事件源将 数据从 Thing 异步推送到 Consumer。这里传达的不是状态, 而是状态转换(即事件)。 Event MAY 由未作为 Property 暴露的条件触发。
如果数据未由所用 Protocol Binding 完全指定(例如通过媒体类型), Event MAY 包含用于 事件数据和订阅控制消息(例如用于通过 Webhook 订阅的回调 URI)的 数据模式。
Event 的示例包括离散事件(例如警报),或定期发送的 时间序列样本。
在 Web 上,可供性是信息和控件的同时呈现, 使得信息成为用户获得选择的可供性。 对人类而言,信息通常是描述或装饰超链接的 文本或图像。控件是 Web 链接,至少包括 目标资源的 URI,Web 浏览器可解引用它 (即可以跟随该链接)。但是,当 Web 链接进一步由 关系类型和一组目标属性描述时,机器也可以以 有意义的方式跟随链接。超媒体 控件是对如何激活可供性的机器可读描述。 超媒体 控件通常源自 Web 服务器,并在 Web 客户端与 服务器交互时以带内方式被发现。通过这种方式, Web 服务器可以根据客户端的当前状态以及授权等 其他因素,动态地引导客户端通过 Web 应用。 这与需要预先安装或硬编码到客户端中的带外接口描述 (例如 RPC、WS-* Web 服务、具有固定 URI-方法-响应 定义的 HTTP 服务)相对。
W3C WoT 使用两类 超媒体控件: Web 链接 [RFC8288],即用于导航 Web 的成熟 控件;以及作为更强大控件的 Web 表单, 用于支持任何类型的操作。链接已经在其他 IoT 标准和 IoT 平台中使用,例如 CoRE Link Format [RFC6690]、 OMA LWM2M [LWM2M]、 和 OCF [OCF]。Form 是一个 新概念,除 W3C WoT 外,也由 IETF 定义的 Constrained RESTful Application Language (CoRAL) [CoRAL] 引入。
链接使 Consumer(或更广义的 Web 客户端) 能够改变当前上下文(参见当前在 Web 浏览器中 渲染的资源表示集合),或根据上下文与链接目标之间的 关系,将额外资源纳入当前上下文。 Consumer 通过 解引用目标 URI 来做到这一点, 即通过跟随链接获取资源表示。
W3C WoT 遵循 Web Linking [RFC8288] 的定义,其中链接 由以下部分组成:
链接关系类型可以是向 IANA [IANA-RELATIONS]
注册的一组预定义 token(例如
stylesheet),也可以是 URI 形式的
扩展类型 [RFC3986]。
扩展关系类型 MUST 使用 ASCII
大小写不敏感比较作为字符串进行比较(参见 ASCII
case insensitive)。(如果它们以
不同格式序列化,则应转换为 URI)。
不过,扩展关系类型
SHOULD 使用全小写 URI
[RFC8288]。
在 Web of Things 中,链接用于 Discovery,并用于表达 Thing 之间的关系 (例如层级关系或功能关系)以及与 Web 上其他 文档的关系(例如文档手册或 CAD 模型等 替代表示)。
表单使 Consumer(或更广义的 Web 客户端) 能够执行超出解引用 URI 的操作 (例如操纵 Thing 的状态)。 Consumer 通过 填写表单并将其提交到 提交目标来做到这一点。这通常需要比链接所能提供的 更详细的(请求)消息内容信息 (例如方法、头字段或其他协议选项)。 表单可视为请求模板,其中提供者根据 其自身接口和状态预先填充部分信息, 并留下部分空白供 Consumer(或一般 Web 客户端) 填写。
W3C WoT 将表单定义为新的 超媒体控件。 请注意,CoRAL 中的定义实际上相同, 因而兼容 [CoRAL]。 在 CoRAL 中,表单由以下部分组成:
表单可视为这样一条语句:“要对
form
context 执行
operation type 操作,请向
submission target 发出
request method 请求”,其中
可选的表单字段可以进一步描述所需的
请求。
表单 上下文和提交目标 MUST 都是 Internationalized Resource Identifier(IRI)[RFC3987]。 不过,在常见情况下,它们也将是 URI [RFC3986], 因为许多协议(如 HTTP)不支持 IRI。
表单上下文和提交目标 MAY 指向同一资源或 不同资源,其中提交目标资源为该上下文实现 操作。
操作类型标识操作的语义。 操作类型以类似于链接关系类型的方式表示。
请求方法 MUST 标识由提交目标 URI 方案所识别协议的标准方法集合中的一种方法。
表单字段是可选的,并且 MAY 进一步指定给定操作的预期 请求消息。 请注意,这并不限于载荷, 也可能影响协议头。表单字段 MAY 取决于提交目标所用的协议, 如 URI 方案中所指定。 示例包括 HTTP 头字段、CoAP 选项、 协议无关的媒体类型 [RFC2046] 及其参数(即完整内容类型),用于 请求载荷,或关于预期响应的信息。
截至本规范,众所周知的 操作类型是由 WoT Interaction Model 产生的一组固定集合。 其他规范可以定义更多众所周知的 操作类型,这些类型对其各自的 文档格式或表单序列化有效。该规范的后续版本 或另一规范未来可能建立 IANA 注册表, 以支持扩展以及可应用于 WoT 规范之外的 更通用 Web 表单模型。
Protocol Binding 是 从 Interaction Affordance 到某一特定协议的具体消息的映射, 例如 HTTP [RFC7231]、 CoAP [RFC7252]、 或 MQTT [MQTT]。它告知 Consumer 如何通过 面向网络的接口激活 Interaction Affordance。 Protocol Binding 遵循 REST 的统一接口约束 [REST] 以支持互操作性。因此,并非所有通信协议都适合 为 W3C WoT 实现 Protocol Binding; 相关需求在以下断言中给出。
在 6.2 可供性中给出的门示例中, Protocol Binding 对应于旋钮与杠杆层级上的门把手, 它提示门可以如何被打开。
Interaction Affordance MUST 包含一个或多个 Protocol Binding。 Protocol Binding MUST 序列化为 超媒体 控件,以便对如何激活 Interaction Affordance 进行自描述。 超媒体 控件的权威来源可以是 Thing 本身,即在运行时生成 TD 文档 (基于其当前状态,并包含其 IP 地址等网络参数), 或从内存中提供该文档,仅插入当前网络参数。 权威来源也可以是外部实体,该实体对 Thing 具有完整且最新的知识, 包括其网络参数和内部结构(例如软件栈)。 这使得 Thing 与 Consumer 之间可以松耦合, 从而允许独立的生命周期和演进。如果有缓存元数据可用于确定 新鲜度,则 超媒体控件 MAY 缓存在 Thing 之外并用于离线 处理。
超媒体控件依赖 URI [RFC3986] 来识别链接和提交目标。由此,URI 方案(直到“:”的第一个组成部分)标识用于与 Thing 的 Interaction Affordance 交互的通信协议。 W3C WoT 将这些 协议称为 传输 协议。
激活 Interaction
Affordance 时交换的所有数据(又称内容)
MUST 在 Protocol Binding 中由
媒体类型 [RFC2046]
标识。 媒体类型是用于标识表示格式的标签,
例如用于 JSON 的 application/json
[RFC8259]
或用于 CBOR 的 application/cbor
[RFC7049]。
它们由 IANA 管理。
某些媒体类型可能需要额外参数,以完整指定所使用的
表示格式。示例包括
text/plain; charset=utf-8 或
application/ld+json;
profile="http://www.w3.org/ns/json-ld#compacted"。在描述要发送到
Thing 的数据时,
尤其需要考虑这一点。数据上也可能存在
标准化转换,例如内容编码 [RFC7231]。
Protocol Binding MAY
具有额外信息,用于比单独的媒体类型
更详细地指定表示格式。
请注意,许多媒体类型只标识一种通用 序列化格式,而不会为其元素提供进一步语义 (例如 XML、JSON、CBOR)。因此, 结构化数据类型的 Interaction Affordance SHOULD 与 数据模式关联, 以便为交换的数据提供更详细的语法元数据。 更多细节在 WoT Thing Description 规范中进一步描述 [WOT-THING-DESCRIPTION]。
Web of Things 支持可互操作的国际化, 并允许使用和处理多语言数据,例如用于 用户界面的数据。多语言 Web of Things 实现的设计和实现由 Thing Description [WOT-THING-DESCRIPTION] 规范指导。它描述了如何基于 [JSON-LD] 和 [BCP47] 等既有标准, 应用不同语言的人类可读文本。
第 6.1 基本 概念以抽象 WoT 架构组件的形式描述了 WoT 架构, 例如 Thing、Consumer 和 Intermediary。当这些 组件被实现为软件栈以在 WoT 架构中承担 特定角色时,这些软件栈称为 Servient。基于 WoT 架构的系统 涉及 Servient,它们 相互通信以实现系统目标。
本节使用系统配置图来说明 Servient 如何协同工作, 以构建基于 WoT 架构的系统。
Thing 可以由 Servient 实现。在 Thing 中,Servient 软件栈 包含一个称为 Exposed Thing 的 Thing 表示,并使其 WoT Interface 可供该 Thing 的 Consumer 使用。该 Exposed Thing 可以 由 Servient 上的其他软件组件 (例如应用)使用,以实现该 Thing 的行为。
另一方面,Consumer 总是 由 Servient 实现,因为它们必须能够 处理 Thing Description(TD) 格式,并且必须具有可通过 TD 中所含 Protocol Binding 信息配置的协议栈。
在 Consumer 中,Servient 软件栈提供 一个称为 Consumed Thing 的 Thing 表示, 并使其可供运行在 Servient 上且需要 处理 TD 以与 Thing 交互的应用使用。
Servient 软件栈中的 Consumed Thing 实例 用于将协议层复杂性与应用分离。 它代表应用与 Exposed Thing 通信。
类似地,Intermediary 也是由 Servient 实现的另一种 WoT 架构组件。Intermediary 位于某个 Thing 与 其 Consumer 之间,同时承担 Consumer(相对于 Thing)和 Thing (相对于 Consumer)的角色。在 Intermediary 中,Servient 软件栈 同时包含 Consumer(Consumed Thing) 和 Thing (Exposed Thing)的表示。
图 27 展示了 Thing 与 Consumer 之间的直接通信; 前者通过 Thing Description 暴露 Interaction Affordance, 后者借助 Interaction Affordance 使用该 Thing。 当两个 Servient 使用 相同的网络协议,并且彼此可访问时,适用直接通信。
Exposed Thing 是 Thing 抽象的软件表示,用于提供 由该 Thing 提供的 Interaction Affordance 的 WoT Interface。
Consumed Thing 是 被 Consumer 消费的远程 Thing 的软件表示, 作为应用访问远程 Thing 的接口。 Consumer 可以通过解析并处理 TD 文档来生成 Consumed Thing 实例。 Consumer 与 Thing 之间的交互由 Consumed Thing 和 Exposed Thing 通过它们之间的直接网络连接 交换消息来执行。
在 图 28 中,Consumer 和 Thing 通过 Intermediary 相互连接。如果 Servient 使用不同 协议,或者它们位于需要身份验证并提供访问控制的 不同网络(例如防火墙)上,则需要 Intermediary。
Intermediary 结合了 Exposed Thing 和 Consumed Thing 功能。Intermediary 的功能包括在 Consumer 和 Thing 之间中继 Interaction Affordance 的消息,可选地缓存该 Thing 的 数据以加快响应,并在 Thing 的功能由 Intermediary 扩展时转换通信。在 Intermediary 中,Consumed Thing 创建某个 Thing 的 Exposed Thing 的代理对象, 而 Consumer 可以通过其自身的 Consumed Thing 访问该 代理对象(即 Intermediary 的 Exposed Thing)。
Consumer 和 Intermediary 可以 使用不同于 Intermediary 和 Thing 之间的协议进行通信。例如, Intermediary 可以在使用 CoAP 的 Thing 与使用 HTTP 的 Consumer 应用之间提供桥接。
即使 Intermediary 与 Thing 之间使用多个不同协议, Consumer 仍可以 通过 Intermediary 使用单一协议与这些 Thing 间接通信。身份验证也是如此。 Consumed Thing of a Consumer 只需要使用单一 安全机制与 Intermediary 的 Exposed Thing 进行身份验证,而 Intermediary 可能需要多个安全机制来与不同 Thing 进行身份验证。
通常,Intermediary 会 基于来源 Thing 的 Thing Description, 为其代理对象生成 Thing Description。 根据用例的需求,代理对象的 TD 可以使用与 原始 Thing 的 TD 相同的标识符, 也可以分配一个新的标识符。如有必要,由 Intermediary 生成的 TD MAY 包含用于其他 通信协议的接口。
本节为非规范性内容。
Web of Things(WoT)构建块允许实现 符合抽象 WoT 架构的系统。这些构建块的具体细节 在单独的规范中定义;本节提供 概述和摘要。
WoT 构建块支持 Thing 的每个架构方面,这些方面在 6.3 Web Thing 中 讨论,并在 图 20 中描绘。各个构建块在 图 29 中以抽象 Thing 的上下文展示。这是一个抽象视图, 并不表示任何特定实现;相反,它说明了构建块和 Thing 的主要架构方面之间的关系。在该图中,WoT 构建块以黑色轮廓突出显示。 WoT Thing Description 是一个关键构建块,它提供描述 Thing 及其网络接口的元数据。 安全作为横切关注点,被分离为公共组件和受保护的 私有组件。 WoT Scripting API 是可选的,而 Binding Templates 是 资料性的。WoT Discovery 构建块 定义了分发 Thing Description 的机制;Thing 可以 直接提供 Thing Description, 或者由 Thing Description Directory 服务提供。
在以下各节中,我们将提供关于每个 WoT 构建块的 额外信息:WoT Thing Description、 WoT Discovery 机制、 WoT Binding Templates,以及 WoT Scripting API。 虽然安全是一个横切关注点,但也可以被视为 一个额外构建块。
WoT Thing Description(TD)规范 [WOT-THING-DESCRIPTION] 定义了一个基于语义词汇表的信息模型,以及一个 基于 JSON 的序列化表示。 TD 以既可供人类阅读又可供机器读取的方式,为 Thing 提供 丰富的元数据。TD 的信息模型和表示格式都与 Linked Data [LINKED-DATA] 对齐,因此 除了原始 JSON 处理之外,实现还可以选择 使用 JSON-LD [JSON-LD11] 和图数据库,以 支持对元数据进行强大的语义处理。
Thing Description 使用名称、ID、描述等通用元数据描述 Thing 实例,并且还可以通过指向相关 Thing 或 其他文档的链接提供关系元数据。 TD 还包含基于 6.5 交互 模型中定义的交互模型的 Interaction Affordance 元数据; Public Security Metadata;以及定义 Protocol Binding 的通信元数据。 TD 可以被视为 Thing 的 index.html,因为它提供了 一个入口点,用于了解由 Thing 提供的服务和相关资源, 二者都使用 超媒体 控件进行描述。
为了实现语义互操作性,TD 可以使用 领域特定 词汇表,并为此提供了明确的扩展点。 不过,开发任何特定的 领域特定 词汇表 目前超出了 W3C WoT 标准化活动的范围。
三个可能有用的外部 IoT 词汇表示例是 SAREF [SAREF]、 Schema Extensions for IoT [IOT-SCHEMA-ORG]、 以及 W3C Semantic Sensor Network ontology [VOCAB-SSN]。 在 TD 中使用此类外部词汇表是可选的。未来 可能会开发并与 TD 一起使用更多 领域特定 词汇表。
总体而言,WoT Thing Description 构建块通过两种方式促进互操作性: 第一,TD 支持 Web of Things 中的机器到机器通信。 第二,TD 可以作为一种通用、 统一的格式,供开发者记录和检索创建应用所需的 全部细节,这些应用能够访问 IoT 设备并使用其数据。
TD 必须被其他系统和设备知晓或可访问,才会有用。 下文将更详细描述的 WoT Discovery 构建块定义了一些机制,可以针对 自描述设备,以及那些由单独服务提供 TD 更为合适的情况 (棕地设备、受限设备、使用专用协议的设备、 睡眠设备等)实现这一点。
Thing Model 为 Thing Description 实例定义了基于模板的模型。Thing Model 不含 实例特定信息,并且只包含部分基于通信和 安全的信息。这类信息会通过创建 Thing Description 实例化来补充。
Thing Model 主要描述 Property、Action 和 Event 以及通用元数据, 这些内容随后会在所有已实例化的 Thing Description 中可用。这一范式可与 面向对象编程中的抽象类或接口定义(~Thing Model) 用于创建对象(~Thing Description)相比较。此类 Thing Model 与例如 IoT 设备的大规模生产、 云服务中的入网场景,或仿真尚未开发的 Device 相关。
目前,WoT Profile 规范 仅作为工作草案发布。
WoT Profile 规范 [WOT-PROFILE] 定义了 支持 Thing 与设备之间开箱即用互操作性的 Profile。开箱即用互操作性意味着设备可以集成到 各种应用场景中,而无需深层适配。 通常只需要少量配置操作 (例如输入网络密钥或 IP 地址),即可在 某个场景中使用设备。这些操作可以由 任何人完成,而无需专门培训。
Profile 是一组约束和规则, 它们提供应用于 WoT Thing Description 规范的额外语义保证。这些约束通过对 WoT Thing Description 的各个方面定义附加规则, 定义了有效 WoT Thing Description 的一个子集。
| 约束对象 | 理由 | 示例 |
|---|---|---|
| Thing Description 类的词汇表 | 有保证的元数据字段集合 | 使特定词汇术语成为必需项,移除 其他项 |
| 类关系 | 无歧义的结构 | 有限基数,例如每个交互可供性中每个 操作只允许一个 form。 |
| 词汇术语的值 | 简化处理 | 限制每个字符串的字符长度。凡是规范允许字符串或 字符串数组的地方,总是使用数组。 |
| 数据模式 | 简化处理 | 不允许任意嵌套对象或数组的 数组。 |
| 安全 | 降低实现工作量 | 仅使用受限的一组安全 机制。 |
| 协议绑定 | 有保证的协议语义 | 受限的协议和协议特性, 示例:将 http 动词(GET/PUT)预定义映射 到操作动词,其他协议也有类似约束。 |
这些约束和规则分为两类:
这两个类别彼此正交,即符合 Profile 的 信息模型可以映射到不同协议。每种协议的协议绑定 可以包含额外的(协议特定)约束。
Profile 不是排他的,也就是说,一个 Thing 可以符合 多个 Profile。Profile 可以彼此叠加构建 或重叠,扩展 Profile 可以基于 基线 Profile 构建。
WoT Discovery 规范 [WOT-DISCOVERY] 定义了通过网络分发和访问 WoT Thing Description 的机制。这些机制旨在 简化对 Thing 和服务的访问,并支持 它们的集成。WoT Discovery 机制 不受局域网边界限制,也可以支持远程发现。 它们还被设计为现有搜索和发现标准的扩展。
WoT Discovery 构建块的 一个主要设计需求,是保护 WoT 数据和元数据的 Consumer 与提供者双方的安全和隐私。特别是, WoT Discovery 机制不仅被设计用于保护和 控制对 WoT Thing Description 的访问,还被设计用于保护关于此类 数据和元数据的查询,并避免直接或可推断元数据的 意外分发。
为了兼容现有发现技术,同时提供强隐私和安全, WoT Discovery 使用一个 两阶段过程。在第一阶段,使用若干首次接触机制之一 进行“引入”。 在第二阶段,即“探索”阶段,实际 TD 会被提供, 但只有在合适的身份验证和授权之后才会提供。
提供了两种探索机制,既支持单个 TD 的 分发,也支持多个 TD 的目录服务:
鼓励使用这些机制,但并非强制。
Introduction 机制并不旨在提供强安全或隐私保证, 这允许使用多种现有的、相对弱安全性的 发现机制,只要它们满足以下 要求:
在完成合适的身份验证和授权过程 (基于用于保护 Web 服务的现有机制,以及现有的 协议安全协商机制)之后, WoT Discovery 定义了一组第二阶段的 “探索”机制, 用于提供对实际元数据的访问。
第一个也是最简单的 探索机制 定义了如何直接从设备自身获取 TD。 这支持临时的点对点发现。不过,在许多情况下 (包括但不限于管理大量 TD 的集合),另一种 探索 机制,即 WoT Thing Description Directory(TDD)服务, 更为合适。
TDD 提供 复杂的(但受保护的)查询机制,用于探索和检索 WoT 元数据。TDD 还 提供变更通知机制,以支持向已授权 Consumer 安全分发 TD 更新。 任何 WoT Discovery “探索”实现都必须只在完成适当的最佳实践 身份验证和授权之后提供元数据和 TD。 适用于不同情形的身份验证和授权最佳实践安全机制 在 [WOT-SECURITY] 中讨论。用于管理访问控制和密钥的合适机制 也在 [SOLID] 中讨论。
TDD 不只是 一种便利特性,而是在若干 WoT 用例中必不可少。 当 Thing 具有资源限制(例如有限的内存空间、有限的电力, 参见 设备 类别),使用需要由中介转换的专用协议 (在这种情况下,由 TDD 提供的 TD 将描述中介所支持的 转换后网络接口),或者需要将现有设备 (通常称为“棕地”设备)作为 Web of Things 的一部分使用, 但该设备本身难以修改以自托管 TD 时, 使用 TDD 是合适的。
[WOT-DISCOVERY] 中定义的 Discovery 机制 不是强制性的,但它们被设计用于满足上述 需求,并且其使用将增强互操作性和可用性。
IoT 使用多种协议访问设备, 因为没有一种协议适用于所有上下文。 因此,Web of Things 的一个核心挑战是支持 与众多不同的 IoT 平台 (例如 OMA LWM2M、OPC UA、oneM2M)以及 不遵循任何特定标准、但通过合适网络协议提供合格接口的 设备进行交互。WoT 通过 Protocol Binding 来应对这种多样性,这些绑定必须满足若干约束 (见 6.7 协议绑定)。
Binding Templates 处理这样一个方面:应用客户端(即 Consumer)可以使用 Thing Description 提取协议(例如关于 HTTP、MQTT、 Modbus 等)、载荷格式(二进制、JSON、CBOR、EXI 等)及其 在 IoT 平台上下文中(例如 ECHONET、OPC UA)使用方式的 特定元数据。该元数据可以传递给网络实现接口,以便 建立与 Thing 的交互,并对载荷消息进行 序列化/反序列化。在该上下文中, Binding Templates 包括三类绑定:Protocol binding、Payload format binding 和 Platform binding。
非规范性的 WoT Binding Templates 规范 [WOT-BINDING-TEMPLATES] 提供了一组蓝图集合,用于指导如何与使用不同 传输协议、 内容 类型,或不同 IoT 平台或标准 (例如 OCF、oneM2M、OMA LWM2M、OPC UA)的 不同 Thing 交互;这些平台或标准使用 传输协议 和 内容 类型的特定组合。在描述特定 IoT 设备或 平台时,可以使用相应的 Binding Template 来查找需要在 Thing Description 中提供的通信元数据, 以支持该平台。
图 31 展示了如何使用 Binding Templates。 基于协议、媒体类型或平台绑定,可以创建 TD。 正在处理 TD 的 Consumer 通过包含相应的 协议栈、媒体类型编码器/解码器或平台栈,并根据 TD 中给出的信息 (例如消息的序列化格式和头选项)配置该栈 (或其消息),来实现 TD 中存在的所需 Binding Template。
Binding Templates 跨越三个维度:
Web of Things 使用术语
传输协议
来表示底层的、标准化的应用层协议,
不带有应用特定选项或
子协议
机制。在
Interaction
Affordance 的 form 中发现的 URI 方案以及关联的协议端点 URI
包含识别
传输
协议所需的信息,例如通过
http、coaps 或
ws 分别识别 HTTP、CoAPS 或 WebSocket。
用于交换数据的表示格式(又称序列化)
可能因协议、
IoT
平台和标准而异。媒体类型
[RFC2046]
标识这些格式,而媒体类型参数可以进一步指定它们。
Form 可以在额外的 form 字段中包含媒体类型和可选参数,
例如 HTTP 中已知的内容类型字段,它组合了
媒体类型及其潜在参数(例如
text/plain; charset=utf-8)。
IoT 平台和标准通常会在应用层引入特定修改, 例如平台特定的 HTTP 头字段或 CoAP 选项。 它们还可以包含位于媒体类型之上的特定载荷结构, 这些结构需要准确地纳入 Thing 与其 Consumer 之间的 每条消息。不同平台特定的协议修改和载荷表示 都可以使用平台和标准的 binding template 中记录的 最佳实践,在 TD 中表示。
WoT Scripting API 是 W3C WoT 的一个可选“便利性”构建块, 通过提供基于 ECMAScript 的 API [ECMAScript], 类似于 Web 浏览器 API,从而简化 IoT 应用开发。 通过将脚本运行时系统集成到 WoT Runtime 中, WoT Scripting API 支持使用可移植应用脚本来定义 Thing、 Consumer 和 Intermediary 的行为。
传统上,IoT 设备逻辑是在固件中实现的, 这会带来类似嵌入式开发的生产力约束, 包括相对复杂的更新过程。相比之下, WoT Scripting API 支持通过在 IoT 应用运行时系统中执行的可复用脚本来实现 设备逻辑。它类似于 Web 浏览器,旨在提高 生产力并降低集成成本。此外,标准化 API 支持 应用模块的可移植性,例如将计算密集型逻辑从设备 移动到本地网关,或将时间关键型逻辑从云端 下移到网关或边缘节点。
非规范性的 WoT Scripting API 规范 [WOT-SCRIPTING-API] 定义了编程接口的结构和算法,使脚本可以发现、 消费并暴露 WoT Thing Description。WoT Scripting API 的运行时系统会实例化本地对象,这些对象作为 指向其他 Thing 及其 Interaction Affordance(Property、Action 和 Event)的接口。 它还允许脚本暴露 Thing, 也就是说,定义并实现 Interaction Affordance,并发布 Thing Description。
安全是一个横切关注点,应在系统设计的所有方面 加以考虑。在 WoT 架构中,安全由某些明确特性支持, 例如支持在 TD 中使用 Public Security Metadata,以及在 WoT Scripting API 的设计中进行关注点分离。每个构建块的规范 也包括对该构建块特定安全和隐私考虑的讨论。另一份 非规范性规范,即 WoT Security and Privacy Guidelines [WOT-SECURITY], 提供额外的横切安全和隐私指导。
本节为非规范性内容。
如 6.10 WoT 系统组件 及其互连性中所定义,Servient 是一种实现上一节所述 WoT 构建块的软件栈。Servient 可以托管并暴露 Thing, 和/或消费 Thing (即托管 Consumer)。根据 Protocol Binding, Servient 可以同时承担 server 和 client 角色,因此采用了这个混成命名。
上一节描述了 WoT 构建块在概念上如何 相互关联,以及它们如何对应于 抽象 WoT 架构(见 6. 抽象 WoT 系统架构)。在 实现这些概念时,需要一个更详细的视图, 将某些技术方面纳入考虑。本节 描述 Servient 实现的详细架构。
图 32 展示了一个使用(可选的) WoT Scripting API 构建块的 Servient 实现。 在这里,WoT Runtime 同时也是一个 Scripting Runtime 系统,它除了管理 WoT 特定 方面之外,还解释并执行应用脚本。 支持 WoT Scripting API 的 Servient 通常运行在功能较强的设备、边缘节点 或云端(参见 设备 类别)。WoT 架构并不将 WoT Runtime 面向应用的 API 限定为 JavaScript/ECMAScript。其他运行时系统也可以用于 实现 Servient。
第 8.8.1 原生 WoT API 介绍了一种 不使用 WoT Scripting API 构建块的替代 Servient 实现。 WoT Runtime 可以为其面向应用的 API 使用任何 编程语言。通常,它是 Servient 软件栈的原生语言,例如嵌入式 Servient 使用 C/C++,或基于云的 Servient 使用 Java。它也可以是 Lua 等替代脚本语言, 以便将应用脚本的收益与低资源 消耗结合起来。
图 32 中所示每个模块的角色和功能 将在以下各节中解释。
行为定义了 Thing 的整体应用逻辑,它具有若干方面:
它包括 Thing 的自主行为 (例如传感器采样或执行器控制回路)、Interaction Affordance 的处理程序 (即可供性被激活时采取的具体动作)、 Consumer 行为(例如 控制 Thing 或 实现 mashup),以及 Intermediary 行为 (例如简单代理某个 Thing 或组合虚拟 实体)。Servient 内部的行为实现定义了哪些 Thing、Consumer 和 Intermediary 被托管在该组件上。
图 32 描绘了实现可选 WoT Scripting API 构建块的 Servient,其中由 JavaScript [ECMAScript] 编写的可移植应用脚本定义行为。这些脚本由作为 WoT Runtime 一部分的脚本运行时 系统执行(在提供 WoT Scripting API 或 任何其他基于脚本的 API 时)。它们是可移植的, 因为它们针对通用的 WoT Scripting API 定义编写,因此可以由任何具备该构建块的 Servient 执行。 这使得可以在系统组件之间移动应用逻辑,例如将 Consumer 从云端移动到 边缘节点以满足网络需求,或将 Intermediary 移动到云端, 以满足不断增长的资源需求。可移植应用使得可以在 Servient 部署之后“安装”额外行为。
原则上,只要 Interaction Affordance 通过 WoT Interface 对外呈现,就可以使用任何编程语言和 API 来定义 Thing 的行为。面向应用的 API 与协议栈之间的 适配由 WoT Runtime 处理。关于不使用 WoT Scripting API 构建块的行为实现,见 8.8.1 原生 WoT API。
从技术上讲,Thing 抽象及其 Interaction Model 是在运行时系统中实现的。该 WoT Runtime 维护 行为实现的执行环境,并能够暴露和/或消费 Thing,因此必须能够 获取、处理、序列化和服务 WoT Thing Description。
每个 WoT Runtime 都为行为实现提供面向应用的接口 (即 API)。图 32 中所示的可选 WoT Scripting API 构建块定义了这样一种面向应用的 接口,它遵循 Thing 抽象,并支持在运行时 通过应用脚本部署行为实现。关于替代 API,见 8.8.1 原生 WoT API,这些 API 也可以仅在 编译时可用。一般而言,应用逻辑应在沙箱化执行环境中 执行,以防止应用代码未经授权访问 WoT Runtime 的管理方面, 特别是 Private Security Data。在多租户 Servient 中,也应防止 不同租户在未经授权的情况下访问彼此的数据。
WoT Runtime 需要提供某些操作来管理 Thing 的生命周期, 更准确地说,是管理其软件抽象和描述。生命周期管理 (LCM)系统可以在 Servient 内封装这些生命周期操作, 并使用内部接口实现生命周期管理。 此类操作的细节因实现而异。 WoT Scripting API 包含 LCM 功能,因此代表此类系统的一种可能实现。
WoT Runtime 必须与 Servient 的协议栈实现交互,因为它将 行为实现与 Protocol Binding 的细节解耦。 WoT Runtime 通常还会与底层系统交互,例如访问 所连接的传感器和执行器等本地硬件,或访问 存储等系统服务。这两个接口都依赖于实现, 但 WoT Runtime 必须提供到其所实现的 Thing 抽象的必要适配。
WoT Scripting API 构建块定义了一个 ECMAScript API,它紧密遵循 WoT Thing Description 规范 [WOT-THING-DESCRIPTION]。 它定义了行为实现与基于脚本的 WoT Runtime 之间的接口。 其他更简单的 API 可以在其上实现, 类似于 Web 浏览器 API 之上的 jQuery。
更多细节见 [WOT-SCRIPTING-API]。
WoT Runtime 根据 Thing 的 TD 实例化其软件表示。这些软件表示 提供通向行为实现的接口。
Exposed Thing 抽象 表示一个本地托管并可通过 Servient 的协议栈实现 从外部访问的 Thing。 行为实现可以通过定义 Exposed Thing 的元数据和 Interaction Affordance,并提供其自主行为,从而完全控制它们。
Consumed Thing
抽象表示一个远程托管的 Thing,供需要
使用通信协议访问它的 Consumer 使用。
Consumed Thing
是代理对象或桩对象。行为实现仅限于读取其元数据,
并按照对应 TD 中的描述激活其
Interaction
Affordance。Consumed Thing 还可以
表示系统特性,例如本地硬件或专有/旧式通信协议
背后的设备。在这种情况下,
WoT
Runtime 必须提供系统 API 与
Consumed Thing 之间的必要适配。
此外,它还必须提供相应的
TD,并使其可供行为实现使用,
例如通过面向应用的 API(例如
WoT Scripting API
[WOT-SCRIPTING-API]
中定义的 discover() 方法),扩展
WoT
Runtime 提供的任何
发现机制。
在使用 WoT Scripting API 时, Exposed Thing 和 Consumed Thing 是 JavaScript 对象,可由应用脚本创建、操作 和销毁。不过,访问可以通过安全机制加以限制, 例如在多租户 Servient 中。
私有安全数据,例如用于与 Thing 交互的 密钥,在概念上也由 WoT Runtime 管理,但有意不让应用直接 访问。实际上,在最安全的硬件实现中,此类 Private Security Data 存储在单独的隔离内存中 (例如安全处理元件或 TPM 上),并且只提供 一组抽象操作(甚至可能由隔离的处理器和软件栈实现), 这些操作限制攻击面并防止此类数据向外泄露。 Private Security Data 由 Protocol Binding 透明使用, 以授权交互并保护交互的完整性和机密性。
Servient 的协议栈实现 Exposed Thing 的 WoT Interface,并由 Consumer 用于访问远程 Thing 的 WoT Interface(通过 Consumed Thing)。它生成用于通过网络交互的具体协议消息。 Servient 可以实现 多个协议,因此支持多个 Protocol Binding, 以支持与不同 IoT 平台交互。
在许多使用标准协议的情况下, 可以使用通用协议栈来生成平台特定消息 (例如一个用于 HTTP(S) 方言,一个用于 CoAP(S) 方言,一个用于 MQTT 解决方案等)。在这种情况下, 来自 Thing Description 的通信元数据会用于选择并配置正确的 栈(例如带有正确头字段的 HTTP,或带有正确选项的 CoAP)。预期载荷表示格式(JSON、CBOR、XML 等)的 解析器和序列化器也可以跨这些通用协议栈共享, 这些格式由媒体类型 [RFC2046] 标识。
详见 [WOT-BINDING-TEMPLATES]。
WoT Runtime 的实现可以通过 Thing 抽象向行为实现提供本地硬件或系统服务, 就像它们可通过通信协议访问一样。在这种情况下, WoT Runtime 应使 行为实现能够实例化 Consumed Thing, 这些对象内部与系统接口,而不是与协议栈接口。 这可以通过在面向应用的 WoT Runtime API 所提供发现机制的结果中列出此类系统 Thing 来实现,这些 Thing 仅在本地 WoT Runtime 中可用。
设备也可以在物理上位于 Servient 外部,但通过专有协议或 不适合作为 WoT Interface 的协议连接 (见 6.7 协议绑定)。 在这种情况下, WoT Runtime 可以通过专有 API 访问使用此类协议的 旧式设备(例如 ECHONET Lite、BACnet、X10、I2C、 SPI 等),但也可以再次选择通过 Thing 抽象将其暴露给行为实现。 这样,Servient 可以充当 旧式设备的网关。只有当旧式设备无法直接使用 WoT Thing Description 描述时,才应这样做。
行为实现也可以通过专有 API 或其他方式 访问本地硬件或系统服务(例如存储)。 不过,这超出了 W3C WoT 标准化的范围,因为它会妨碍可移植性。
WoT Scripting API 构建块是可选的。替代性 Servient 实现是可能的, 其中 WoT Runtime 为应用逻辑提供 替代 API,而应用逻辑可以用任何编程语言编写。
此外,不知道 W3C WoT 的设备或服务 仍然可以被消费,只要能够为它们提供格式良好的 WoT Thing Description。在这种情况下,TD 描述具有黑盒 实现的 Thing 的 WoT Interface。
开发者可能出于多种原因选择不使用 WoT Scripting API 来实现 Servient。 这可能是由于内存或计算资源不足, 因而开发者无法使用所需的软件栈或 功能完备的脚本引擎。或者,为了支持其用例 (例如专有通信协议),开发者可能必须使用 只能通过特定编程环境或语言获得的 特定函数或库。
在这种情况下,仍然可以使用 WoT Runtime,但会通过 替代的面向应用接口暴露等价的抽象和功能, 而不是使用 WoT Scripting API。 除后者之外,8. 抽象 Servient 架构中的所有模块描述 同样适用于 图 33。
也可以将现有 IoT 设备或服务集成到 W3C Web of Things 中, 并通过为这些设备或服务创建 Thing Description 而将它们用作 Thing。 这种 TD 可以手动创建,也可以通过工具或服务创建。 例如,TD 可以由提供自动翻译另一种依赖生态系统的 机器可读格式所给元数据的服务生成。不过,这只有在 目标设备使用可通过 Protocol Binding 描述的协议时才可行。 相关需求见 6.7 协议绑定。前面的许多讨论也暗示 Thing 会提供其自己的 Thing Description。 虽然这是一种有用模式,但并非强制。 特别是,可能无法修改现有设备,使其能够直接提供自己的 Thing Description。 在这种情况下,Thing Description 必须通过目录等服务,或其他外部且独立的 分发机制单独提供。
本节为非规范性内容。
本节提供各种示例,说明当实现 Thing 和 Consumer 角色的设备和服务 连接在各种具体拓扑和部署场景中时,Web of Things(WoT)抽象架构可以如何实例化。这些 拓扑和场景并非规范性内容,但由 WoT 抽象架构启用并 支持。
在讨论具体拓扑之前,我们首先回顾 Thing 和 Consumer 可以在 WoT 网络中扮演的角色,以及它们与 Exposed Thing 和 Consumed Thing 软件 抽象之间的关系。Exposed Thing 和 Consumed Thing 分别在 Thing 和 Consumer 角色中,供 Servient 的行为实现内部使用。
处于 Thing 角色的 Servient 基于 Thing Description (TD)创建 Exposed Thing。 TD 会发布并提供给处于 Consumer 或 Intermediary 角色的其他 Servient。TD 可以 以各种不同方式发布:TD 可以注册到 Thing Description Directory 服务等管理系统中,或者 Thing 可以在收到 TD 请求时 向请求方提供 TD。在某些应用场景中,甚至可以将 TD 静态关联到 Thing。
处于 Consumer 角色的 Servient 使用发现机制获取 Thing 的 TD,并基于所获得的 TD 创建 Consumed Thing。 具体发现机制取决于具体部署场景:它可以由 Thing Description Directory 等管理系统提供,也可以通过 发现协议、静态分配等方式提供。如其他地方所讨论, 只要可能,建议使用 [WOT-DISCOVERY] 中定义的 Discovery 机制。
不过,需要注意,描述与可识别个人相关设备的 TD 可能被用于推断隐私敏感信息。因此,必须将对此类 TD 分发的约束纳入任何具体 TD 发现机制中。 如有可能,还必须采取措施限制 TD 中暴露的信息, 例如在某一特定用例并非严格需要时,过滤掉 ID 或 人类可读信息。隐私问题在 11. 隐私 考虑中进行了高层次讨论,更详细的讨论见 [WOT-THING-DESCRIPTION] 规范,并由 [WOT-DISCOVERY] 规范处理。
设备的内部系统功能,例如与所连接的传感器和执行器 交互,也可以选择表示为 Consumed Thing 抽象。
Consumed Thing 支持的功能通过编程语言接口提供给 Consumer 的行为 实现。在 WoT Scripting API 中, Consumed Thing 由对象表示。 运行在 Thing 中的行为实现 (即应用逻辑)可以通过 Exposed Thing 提供的编程语言接口,使用 Interaction Affordance 与 Consumer 交互。
Thing 不一定表示物理设备。Thing 也可以表示 设备集合,或运行在网关或云端的虚拟服务。 同样,Consumer 可以表示运行在 网关或云端的应用或服务。 Consumer 也可以 在边缘设备上实现。在 Intermediary 中,单个 Servient 同时承担 Thing 和 Consumer 角色,并共享同一个 WoT Runtime。
本节讨论 WoT 系统的各种拓扑和部署场景。 这些只是示例模式,其他互连拓扑也是可能的。 这里描述的拓扑源自 Web of Things Use Cases and Requirements [WOT-USE-CASES-REQUIREMENTS]。
在最简单的互连拓扑中,如 图 35 所示,Consumer 和 Thing 位于同一网络上, 并且无需任何中介即可彼此直接通信。 这种拓扑出现的一个用例是: Consumer 是运行在网关上的编排 服务或其他 IoT 应用,而 Thing 是与传感器或执行器接口的设备。 不过,client/server 关系也可以很容易地反转; client 可以是处于 Consumer 角色的设备, 访问作为 Thing 运行在网关或云端的服务。
如果 Thing 位于云端,而 Consumer 位于本地 网络上(智能家居用例中的示例见 图 1),则实际网络 拓扑可能更复杂,例如需要 NAT 穿越并禁止某些形式的发现。 在这种情况下,后面讨论的更复杂拓扑之一可能更合适。
Intermediary 在网络上同时扮演 Thing 和 Consumer 角色,并在其 WoT Runtime 中同时支持 Exposed Thing 和 Consumed Thing 软件 抽象。Intermediary 可用于在设备和网络之间代理,或用于 Digital Twin。
Intermediary 的一种简单应用是作为 Thing 的代理。当 Intermediary 充当代理时,它与两个独立网络或协议都有接口。 这可能涉及额外安全机制的实现,例如提供 TLS 端点。通常,代理不会修改交互集合, 因此 Intermediary 暴露的 TD 将具有与被消费 TD 相同的交互,只是连接元数据会被修改。
为了实现这种代理模式, Intermediary 获取某个 Thing 的 TD,并创建一个 Consumed Thing。它创建该 Thing 的代理对象, 作为具有相同 Interaction Affordance 的软件实现。然后,它为代理 对象创建一个具有新标识符的 TD,并可能带有新的 通信元数据(Protocol Binding)和/或新的 Public Security Metadata。最后,基于该 TD 创建一个 Exposed Thing,并且 Intermediary 通过适当的发布机制向其他 Consumer 或 Intermediary 通知该 TD。
更复杂的 Intermediary 可称为 Digital Twin。 Digital Twin 可能会也可能不会 修改协议或在网络之间进行转换,但它们会提供额外服务, 例如状态缓存、延迟更新,甚至对目标设备行为进行 预测性仿真。例如,如果某个 IoT 设备电力有限, 它可能选择以相对较低频率唤醒,与 Digital Twin 同步,然后立即再次进入睡眠。在这种情况下, Digital Twin 通常运行在 电力约束较少的设备上(例如云端或网关上), (参见 设备 类别),并能够代表受限设备响应交互。 对属性当前状态的请求也可以由 Digital Twin 使用缓存状态满足。当目标 IoT 设备处于睡眠状态时到达的请求 可以排队,并在设备唤醒时发送给它。为了实现该模式, Intermediary, 即 Digital Twin 需要 知道设备何时处于唤醒状态。作为 Thing 的设备实现可能需要为此包含通知机制。 这可以使用单独的 Consumer/Thing 对来实现, 或使用 Event 交互来实现此目的。
在智能家居用例中,连接到家庭网络的设备 (传感器和家用电器)通常由云服务监测, 在某些情况下也由云服务控制。连接这些设备的 家庭网络与云端之间通常存在 NAT 设备。 NAT 设备会转换 IP 地址,并通常提供防火墙服务, 以选择性阻止连接。只有通信能够成功穿越网关时, 本地设备和云服务才能彼此通信。
ITU-T Recommendation Y.4409/Y.2070 [Y.4409-Y.2070] 采用的一种典型结构如 图 37 所示。在该结构中, 同时存在一个本地和一个远程 Intermediary。本地 Intermediary 将多个 Thing 的 Interaction Affordance 聚合为一个(一组)Exposed Thing, 它们都可以映射到一个通用协议(例如 HTTP,其中所有交互都映射到具有公共基础服务器 并使用单一端口的单一 URL 命名空间)。这为远程 Intermediary 提供了一种 简单方式,用于访问 NAT 设备背后的所有 Thing,前提是本地 Intermediary 使用了 能够穿越 NAT 设备的融合协议,并且具有某种方式将该服务 暴露到互联网(STUN、TURN、动态 DNS 等)。此外,本地 Intermediary 可以 充当 Thing 代理,因此即使所连接的 Thing 各自使用 不同协议(HTTP、MQTT、CoAP 等)和/或 不同的生态系统约定,Exposed Thing 也可以将它们汇聚到单一协议中,使 Consumer 无需 知晓这些 Thing 所使用的各种协议。
在 图 37 中,有两个 client 连接到远程 Intermediary,该 Intermediary 聚合了位于 NAT 边界后面的服务,并可能提供额外的 协议转换或安全服务。特别是,本地 Intermediary 可能 位于容量有限的网络中,将该服务直接提供给所有用户 可能不可行。在这种情况下,只向远程 Intermediary 提供对本地 Intermediary 的访问。 然后,远程 Intermediary 实现更通用的访问控制机制,并且还可以执行缓存或节流, 以保护 Consumer 免受过量流量影响。这些 Consumer 还会使用一种适合开放互联网的单一协议(例如 HTTPS) 与 Intermediary 通信, 这会使 client 的开发简单得多。
在这种拓扑中,Consumer 和 Thing 之间存在 NAT 和防火墙功能,但本地和远程 Intermediary 协同工作,将所有通信 通过防火墙隧道化,因此 Consumer 和 Thing 无需了解防火墙。成对 Intermediary 还通过提供访问控制和 流量管理来保护家庭设备。
在更困难的情况下,NAT 和防火墙穿越可能无法 如图所示准确工作。特别是,ISP 可能不支持可公开访问的地址, 或者 STUN/TURN 和/或动态 DNS 可能不受支持或不可用。 在这种情况下, Intermediary 可以改为反转它们之间的 client/server 角色以建立初始连接(由本地 Intermediary 首先连接到云端的远程 Intermediary),随后这对 Intermediary 可以 建立隧道(例如使用 Secure WebSocket, 它使用 TLS 保护连接)。随后,该隧道可用于通过 自定义协议编码 Intermediary 之间的所有通信。 在这种情况下,初始连接仍可通过 HTTPS 使用标准端口建立, 并且从本地 Intermediary 到远程 Intermediary 的连接与普通浏览器/Web 服务器交互相同。这应能够穿越大多数家庭防火墙, 并且由于连接是外向的,网络地址转换不会造成任何问题。 然而,即使需要自定义隧道协议,远程 Intermediary 仍可以将该自定义协议转换回标准外部协议。 已连接的 Consumer 和 Thing 无需了解它。 也可以将该示例扩展到这样的用例:Thing 和 Consumer 都可以连接到 NAT 边界的任一侧。不过,这也要求在两个 Intermediary 之间建立双向隧道。
一旦本地设备(以及可能的服务)能够由云端服务 进行监测或控制,就可以在此基础上构建各种 额外服务。例如,云应用可以基于对所收集数据的分析 改变设备的运行状态。
不过,当远程 Intermediary 是服务 client 应用的云平台的一部分时,client 需要能够找到 设备信息,例如访问已连接设备的目录。 为了简化下图,我们假设所有本地设备都实现为 Thing, 所有云应用都实现为 Consumer。为了使实现为 Thing 的本地设备元数据 可供云应用使用,可以将它们的元数据注册到 Thing Description Directory 服务中。该元数据具体是 本地设备的 TD,经修改后反映远程 Intermediary 提供的 Public Security Metadata 和通信元数据(Protocol Binding)。然后,client 应用可以通过查询 Thing Description Directory,获取它与本地设备通信以实现其功能所需的元数据。
在图中未显示的更复杂情况下,也可能存在充当 Thing 的云服务。 这些云服务也可以将自己注册到 Thing Description Directory。由于 Thing Description Directory 是 Web 服务,因此本地设备应 能够通过 NAT 或防火墙设备看到它,其接口甚至可以 通过自身的 TD 提供。随后,充当 Consumer 的本地设备可以通过 Thing Description Directory 发现云端的 Thing,并直接连接到这些 Thing,或在例如需要协议转换时 通过本地 Intermediary 连接。
多个各自基于不同 IoT 平台的云生态系统可以 协同工作,形成更大的系统之系统生态系统。 在前文讨论的云应用生态系统结构基础上, 下图展示了两个生态系统相互连接,以形成一个 系统之系统。考虑这样一种情况:一个生态系统中的 client(即下文的 Consumer A)需要 使用另一个生态系统中的 server(即下文的 Thing B)。 实现这种跨生态系统的应用-设备集成有不止一种机制。 下面使用图说明两种机制,展示如何实现这一点。
在 图 39 中, Thing Description Directory 的两个实例同步信息, 这使得 Consumer A 可以通过 Thing Description Directory A 获取 Thing B 的信息。如前几节所述,远程 Intermediary B 维护 Thing B 的 shadow 实现。通过获取该 shadow 设备的 TD, Consumer A 能够通过远程 Intermediary B 使用 Thing B。
在 图 40 中,两个远程 Intermediary 同步设备信息。当 Thing B 的 shadow 在远程 Intermediary B 中创建时,该 shadow 的 TD 会同时同步到远程 Intermediary A 中。 远程 Intermediary A 随后 创建其自己的 Thing B 的 shadow,并将该 TD 注册到 Thing Description Directory A。通过这种机制, Thing Description Directory 服务之间的同步就不是必要的。
安全是一个横切问题,需要在所有 WoT 构建 块和 WoT 实现中加以考虑。本章总结 一些通用问题和指南,以帮助保持具体 WoT 实现的安全性。不过,这些只是 通用指南,本文档所描述的抽象架构本身 无法保证安全。相反,需要考虑具体实现的 细节。关于安全(以及隐私)问题的更详细 和完整分析,见 WoT Security and Privacy Guidelines 文档 [WOT-SECURITY]。
总体而言,WoT 的目标是描述 IoT 设备和服务 现有的访问机制和属性,包括安全性。一般来说, W3C WoT 的设计目标是 描述已经存在的内容,而不是规定应该实现什么。 对现有系统的描述应准确描述该系统,即使其安全行为 并不理想。清晰理解系统的安全漏洞有助于制定安全 缓解措施——当然,此类数据无需分发给可能恶意利用它的人。
不过,尤其对于新系统,WoT 架构应支持 使用最佳实践。一般来说,WoT 安全架构必须支持 它所连接的 IoT 协议和系统的目标与机制。 这些系统在安全需求和风险容忍度方面各不相同, 因此安全机制也会基于这些因素而变化。
安全在 IoT 领域尤其重要,因为 IoT 设备需要 自主运行,并且在许多情况下可能控制 安全关键系统。IoT 设备面临不同于 IT 系统的风险, 在某些情况下风险更高。保护 IoT 系统也很重要, 以免它们被用于对其他计算机系统发起攻击。
一般而言,安全无法得到保证。WoT 不可能把一个 不安全的系统变成安全系统。不过,WoT 架构需要做到 不造成伤害:它应至少以与其描述和支持的系统同等的程度 支持安全。
WoT Thing Description(TD)中包含的元数据可能是敏感的。 作为最佳实践,TD 应与适当的完整性保护机制和 访问控制策略一起使用,目标是只向已授权用户提供它。
更多细节以及对这些要点的讨论,请参见 WoT Thing Description 规范中的隐私考虑章节。
TD 被设计为只携带 Public Security Metadata。TD 规范中定义的内置 TD 安全方案 有意不支持编码 Private Security Data。不过,存在这样一种风险:其他字段, 例如人类可读描述,可能被滥用来编码此类信息; 或者新的安全方案可能通过扩展机制被定义和部署, 并编码此类信息。
如果没有按最佳实践配置安全机制, 与 IoT 设备的通信被截获或破坏的风险会更高。
WoT Runtime 实现和 WoT Scripting API 应具有相关机制,以防止对系统的恶意访问, 并在多租户 Servient 中隔离脚本。 更具体地说,与 WoT Scripting API 一起使用的 WoT Runtime 实现应考虑以下安全和隐私风险, 并实现推荐的缓解措施。
一般来说,这些风险和缓解措施也应适用于 支持 WoT 系统可编程行为的任何系统, 而不仅仅是 WoT Scripting API。
在基本 WoT 设置中,所有运行在 WoT Runtime 内的脚本都被视为可信, 由制造商分发,因此不强烈需要将脚本实例彼此隔离。 不过,根据设备能力、部署用例场景和风险级别, 这样做可能是可取的。例如,如果一个脚本处理敏感数据 并经过充分审计,则可能希望将它与其余脚本实例分离, 以便在同一系统中的其他脚本在运行时被攻破时, 最大限度降低数据暴露风险。另一个示例是在单个 WoT 设备上不同租户的相互共存。在这种情况下, 每个 WoT runtime 实例都会托管不同租户, 通常需要防止租户未经授权访问彼此的数据。
如果脚本被攻破或发生故障,而脚本可以直接使用 暴露的原生设备接口,则底层物理设备(以及可能的周围 环境)可能受到损害。如果这些接口缺少对输入的 安全检查,它们可能会使底层物理设备(或环境) 进入不安全状态。
为了在脚本被攻破时减少对物理 WoT 设备的损害,重要的是根据脚本的功能, 最大限度减少向特定脚本暴露或可访问的接口数量。 WoT Runtime SHOULD NOT 向脚本开发者直接暴露 低层设备硬件接口。
硬件抽象层可以提供额外级别的保护。 硬件抽象层是调解应用与硬件之间交互的软件组件, 可以简单到一个软件库,尽管更复杂的实现可能实现为 可通过系统调用访问的驱动程序,或由 hypervisor 支持。 更复杂版本的硬件抽象层可以防止应用绕过它们。 WoT Runtime 实现 SHOULD 提供用于访问 低层设备硬件接口的硬件抽象层。 硬件 抽象层应拒绝执行可能使设备(或环境)进入不安全 状态的命令。此类“软件联锁”不应是防止系统进入 不安全状态的唯一机制。理想情况下,应使用多个分层 安全控制,包括软件联锁和硬件联锁。
如果 WoT Runtime 实现支持制造后的配置供给,或支持对其自身、 脚本或任何相关数据(包括安全凭证)的更新, 它就可能成为主要攻击向量。攻击者可以尝试在更新或 配置供给过程中修改上述任何元素,或直接配置供给 攻击者的代码和数据。
通常,WoT Runtime 需要存储 配置供给到 WoT 设备上的安全凭证,以便该设备在网络中运行。 如果攻击者能够破坏这些凭证的机密性或完整性, 那么它就可能获得对资产的访问权限,冒充其他 WoT Thing、 设备或服务,或发起拒绝服务(DoS)攻击。
在第 5. 常见 部署 模式中,介绍了若干使用场景, 其中包含 Trusted Environment 和安全边界的概念。属于 Trusted Environment 的实体都共享对一组公共资源(例如本地网络)的访问, 并被隐式授予彼此之间的某些访问权限。 一个常见示例是家庭中的 WiFi LAN,其中对 WEP 密码的 访问允许设备彼此通信,而无需任何进一步的访问控制。 像这样允许隐式访问权限,并为大量实体使用单一共享秘密, 意味着只要一个恶意行为者可以访问 Trusted Environment, 就可能造成重大损害。
一种常见的 IoT 情况是使用 HTTP/HTML 浏览器访问家庭环境中本地托管的 Web 服务。 此类本地托管的 Web 服务可能没有公开可见的 URL, 因而无法参与浏览器期望的 CA 系统,以启用 HTTP/TLS(HTTPS)。在这种情况下,通常使用纯 HTTP,而保护通信的唯一安全措施是网络加密, 例如 WEP,这相对较弱。
如 10.4 Trusted Environment 风险中所述,在某些情况下, TLS 等安全传输不可行或难以设置,例如家庭内部的本地 LAN。遗憾的是,HTTP 中的访问控制机制通常设计为 与安全传输一起使用,没有安全传输时很容易被绕过。 特别是,从可被第三方截获的未加密协议交互中捕获 密码和 token 相对容易。此外,如果没有 TLS 提供 服务器身份验证,中间人攻击也很容易实现。
由于在所有情况下设置安全传输存在实际困难, 我们不能一概断言它始终是必需的。相反,我们为 不同用例提供一组要求:
当通过 TCP 使用安全传输是适当的时,至少 SHOULD 使用 TLS 1.3 [RFC8446]。 如果出于兼容性原因 无法使用 TLS 1.3,但通过 TCP 使用安全传输是适当的, 则 MAY 使用 TLS 1.2 [RFC5246]。 当通过 UDP 使用安全传输是适当的时,如果可能,推荐至少使用 DTLS 1.3 [RFC9147]。 如果出于兼容性原因 无法使用 DTLS 1.3,但通过 UDP 使用安全传输是适当的, 则 MAY 使用 DTLS 1.2 [RFC6347]。 新开发 MUST NOT 使用早于 1.2 的 DTLS 或 TLS 版本。 使用 更早版本 TLS 或 DTLS 的现有 Thing 可以由 WoT 元数据 (例如 Thing Description)描述,但应视为不安全。
如果 Thing 可能揭示 Personally Identifiable Information(PII),则还适用额外考虑。 见 11.2 对 Personally Identifiable Information 的 访问。
隐私是一个横切问题,需要在所有 WoT 构建块 和 WoT 实现中加以考虑。本章总结一些通用 问题和指南,以帮助保持具体 WoT 实现的隐私。 不过,这些只是通用指南,本文档所描述的 抽象架构本身无法保证隐私。相反,需要考虑 具体实现的细节。关于隐私(以及安全)问题的更详细 和完整分析,见 WoT Security and Privacy Guidelines 规范 [WOT-SECURITY]。
WoT Thing Description(TD)中包含的元数据可能是敏感的, 即使它没有明确包含 Personally Identifiable Information(PII),也可能从中 推断出 PII。作为最佳实践,TD 应与适当的完整性保护机制 和访问控制策略一起使用,目标是只向已授权用户提供它。 一般来说,前一节讨论的许多 安全 考虑 在涉及不希望发生的、未经授权的信息披露时, 也可以被视为隐私风险。
更多细节以及对这些要点的讨论,请参见 WoT Thing Description 规范中的隐私考虑章节。
Thing Description 可能包含各种类型的 Personally Identifiable Information(PII)。即使它并不明确, TD 及其与可识别个人的关联也可以用于推断有关 该个人的信息。例如,由位置可确定的移动设备暴露的 可指纹化 TD 的关联可能构成跟踪风险。即使无法识别 某一特定设备实例,TD 所表示的设备类型在与某个人关联时, 也可能构成个人信息。例如,医疗设备可能被用于推断 用户有某种医疗状况。
一般来说,TD 中的 Personally Identifiable Information 应尽可能受到限制。 然而,在某些情况下,这无法避免。TD 中可能同时存在 直接和可推断的 PII,这意味着 TD 整体应像其他形式的 PII 一样对待。它们应以安全方式存储和传输, 应只提供给已授权用户,应只缓存有限时间, 应按请求删除,应只用于用户同意时所提供的目的, 并且还应满足使用 PII 的所有要求 (包括任何法律要求)。
除了 11.1.1 Thing Description Personally Identifiable Information 风险中讨论的 通过元数据揭示 Personally Identifiable Information(PII)的风险之外, Thing 返回的数据本身也可能是敏感的。例如, Thing 可能正在监测某个特定个人的位置或健康状况。 与个人相关的信息应被视为 PII,即使它并不立即显得敏感, 因为它可能与其他信息结合后揭示敏感信息。
本节为非规范性内容。
一般而言,IoT,尤其是 WoT,既为无障碍提供了 机会,也带来了挑战。一方面,通过网络访问支持互联网的 设备功能,使得可以为这些功能构建替代接口, 包括基于 Web 的接口和物理接口,而不受设备自身硬件限制。 此类接口可以且应遵循无障碍最佳实践。另一方面, IoT 设备类型多样,通常受成本和空间限制, 并且在它们确实需要依赖自身硬件进行接口交互的情况下, 例如在建立网络连接之前的入网期间,要实现无障碍 可能具有挑战性。
关于 WoT 的无障碍,需要考虑两种情况: 从一开始就设计为与 WoT 一起使用的绿地设备, 以及 WoT 仅用于描述现有系统的棕地设备。
若干与无障碍相关的用例包含在 WoT Use Cases and Requirements 文档 [WOT-USE-CASES-REQUIREMENTS] 中。
理想情况下,在任何绿地 WoT 系统中, 应从组件开发之初就考虑无障碍。如果组件的硬件 具有自己的显示器或其他形式的物理用户界面, 则该界面必须尽可能无障碍。如果无法使其无障碍 (例如由于屏幕尺寸限制),则应通过网络提供等效功能, 以便改用无障碍接口(例如 Web 或语音接口)。 当组件通过网络访问时,无论 Web 接口是直接托管在 设备上,还是由另一个组件(例如仪表板)提供, 都必须为无障碍 Web 接口做好安排。在板载硬件是 接口唯一选项的情况下,例如入网期间,应仔细设计, 使其尽可能无障碍。
一般来说,Thing 应始终至少具有一个完全符合 WCAG 和 EN 301 549 的用户界面 (直接界面或基于网络的界面)。无障碍必须应用于 面向所有类型用户提供的接口:制造商、安装人员、 设备所有者和最终用户。
Thing 的用户界面无障碍状态应在 Thing 的元数据中 声明,以便用户可以选择最适合自己的用户界面。 如果 Thing 具有 Web 接口,则应使用现有机制来描述 Web 接口。为了更好地支持 Web 与物理接口之间的连接, WoT Thing Description 中描述的可供性应以某种方式注释, 使其与设备上物理接口的关系可以被理解。
不直接提供用户界面的组件仍必须通过提供适当数据 和功能来支持无障碍。例如,公共 Thing (例如售票机或 ATM)的开发者应考虑提供定位功能, 用户可通过听觉、视觉或其他信号在物理上识别并定位 该 Thing。
WoT 的棕地应用涵盖这样的情况:WoT 元数据用于 描述现有设备,但在其设计期间并未考虑 WoT。 在这种情况下,上述许多规定仍然适用。例如, 由另一系统提供的、用于监测或控制该设备的 Web 接口 应遵循 WCAG 中的指南,Thing Description 也应适当地 注释可供性。如果设备自身的物理接口带来无障碍挑战, 则可能通过基于其网络可供性的替代接口来克服该挑战。
特别感谢 Kazuo Kajimoto、Toru Kawaguchi 和 Matthias Kovatsch 共同编辑 WoT 架构规范初始版本 并作出许多重要贡献。特别感谢 Cristiano Aguzzi、Andrea Cimmino Arriaga、Kazuyuki Ashimura、Luca Barbato、Ben Francis、 Christian Glomb、Klaus Hartke、Sebastian Käbisch、Takuki Kamiya、Ari Keränen、Zoltan Kis、Ege Korkan、Michael Koster、 Philippe Le Hegaret、Kazuaki Nimura、Daniel Peintner、James Pullen、Elena Reshetova 和 Farshid Tavakolizadeh 对本文档的 贡献。
特别感谢来自 W3C 的 Dr. Kazuyuki Ashimura 对 WoT Architecture Task Force 工作的持续帮助和支持。
衷心感谢 W3C 工作人员以及 W3C Web of Things Interest Group(WoT IG)和 Working Group(WoT WG)的所有其他活跃参与者, 感谢他们的支持、技术输入和建议,这些都促成了 本文档的改进。
WoT WG 还希望感谢关于 “Web of Things” 概念的 开创性努力,该概念最初以学术倡议的形式出现, 包括以下出版物: [WOT-PIONEERS-1] [WOT-PIONEERS-2] [WOT-PIONEERS-3] [WOT-PIONEERS-4] 以及始于 2010 年的 International Workshop on the Web of Things。
最后,特别感谢 Joerg Heuer 自成立起领导 WoT IG 2 年,并引导该小组提出包括 Thing Description 在内的 WoT 构建块概念。
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in: