如果我们无法对节点执行操作,则其数据模型 (DM) 与它们无关。互动模型 (IM) 定义一个节点与其他节点的 DM 的关系,即 DM 之间通信的通用语言。
节点通过以下方式相互交互:
- 读取和订阅属性和事件
- 写入属性
- 调用命令
每当一个节点与其他节点建立加密的通信序列时,它们就构成了互动关系。互动可以由一项或多项“事务”组成,而“事务”则由一项或多项“操作”,这些操作可以理解为节点之间的 IM 级消息。
事务支持多种操作,例如从其他节点请求属性或事件的读取请求操作,或其响应、报告数据操作,它将信息从服务器传回客户端。
发起者和目标
启动事务的节点是发起者,而响应的节点是目标。通常,发起者是客户端集群,目标是服务器集群。不过,此模式也存在例外情况,例如本部分进一步分析的订阅互动部分。
群组
Matter 中的节点可能属于一个群组。设备组是一种通过同一 Action 同时寻址和向多台设备发送消息的机制。一个组中的所有节点都共用同一个组 ID(一个 16 位整数)。
为了实现群组级通信 (Groupcast),Matter 会使用 IPv6 Multicast 消息,并且所有群组成员都具有相同的 Multicast 地址。
路线
每当我们想要与属性、事件或命令互动时,都必须指定此互动的路径:属性、事件或命令在节点的数据模型层次结构中的位置。需要注意的是,路径还可以使用组或通配符运算符同时处理多个节点或集群,从而聚合这些互动,从而减少操作数量。
此机制对于提高通信的响应能力非常重要。例如,当用户想要关掉所有灯时,语音助理可以在一个群组内与多个灯进行一次互动,而不是进行一系列单独的互动。如果启动器会针对每个光源创建单独的互动,可能会导致设备响应能力出现人可感知的延迟。这种影响会导致多个设备对命令做出反应,并且在它们之间出现明显的延迟。这通常称为“爆米花效应”。
Matter 中的路径可以使用以下选项之一组建:
<path> = <node> <endpoint> <cluster> <attribute | event | command>
<path> = <group ID> <cluster> <attribute | event | command>
在这些路径构建块中,endpoint
和 cluster
还可以包含通配符运算符,用于选择多个节点实例。
定时和非定时
执行写入或调用事务的方法有两种:定时和未定时。定时事务为要发送的写入/调用操作设定了超时上限。此超时的目的是防止事务遭到拦截攻击。这对于限制访问资产的设备尤为有效,例如车库开启器和锁。
为了理解定时事务,了解拦截攻击的发生方式以及定时事务的重要性会很有帮助。
拦截攻击
拦截攻击具有以下模式:
- Alice 向 Bob 发送一条初始消息,例如写入请求操作。
- 中间人 Eve 拦截了消息并阻止 Bob 接收,例如通过某种类型的无线电干扰。
- Alice 没有收到 Bob 的回复,因此发送了第二条消息。
- Eve 再次拦截,阻止了 Bob 收到。
- Eve 将第一条拦截的消息发送给 Bob,就像来自 Alice 一样。
- Bob 将回复发送给 Alice(和 Eve)。
- Eve 持有第二条拦截消息以供稍后重放。由于 Bob 从未收到来自 Alice 的原始第二条拦截消息,因此将接受该消息。如果消息对“打开锁”等命令进行了编码,则表示存在安全漏洞。
为防止这些类型的攻击,Timed Actions 在 Transaction 开始时设置了事务超时上限。即使 Eve 设法执行了攻击途径的前六个步骤,由于 Transaction 的超时已过,它也无法在第 7 步重放消息。
定时事务增加了操作的复杂性和数量。因此,我们不建议对每个事务都执行这些操作,而只建议对可以控制物理或虚拟安全和隐私资产的设备执行关键操作。
SDK 抽象
读取事务、写入事务和调用事务部分简要介绍了 SDK 执行的互动模式操作。
创建使用 Matter SDK 的产品的开发者通常不会执行调用来直接执行操作;操作由 SDK 函数抽象化,而 SDK 函数会将它们封装为互动。但是,了解 IM 操作对于帮助工程师很好地熟练掌握 Matter 功能以及对 SDK 实现进行精细控制非常重要。