如果我们无法对节点执行操作,那么节点的数据模型 (DM) 就无关紧要。交互模型 (IM) 定义了节点的 DM 与其他节点的 DM 之间的 DM 关系:一种用于 DM 之间通信的通用语言。
节点通过以下方式相互交互:
- 阅读和订阅属性和事件
- 写入属性
- 调用命令
当一个节点与另一个节点建立加密通信序列时,它们就构成 交互 关系。交互可以由一个或多个 事务 组成,而事务又由一个或多个 动作 组成,这些动作可以理解为节点之间的 IM 级消息。
事务支持多种操作,例如读取请求操作,该操作会从另一个节点请求属性或事件;或者其响应,即报告数据操作,该操作会将信息从服务器带回客户端。
发起者和目标
发起交易的节点是发起方,而响应的节点是目标方。通常情况下,发起方是客户端集群,目标是服务器集群。然而,这种模式也有例外,例如本节稍后分析的 订阅互动。
社区
Matter 中的节点可能属于某个群组。设备组是一种机制,用于同时向同一操作中的多个设备寻址和发送消息。一个组中的所有节点共享相同的组 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 接收该消息,例如通过某种类型的无线电干扰。
- 爱丽丝没有收到鲍勃的回复,于是发送了第二条消息。
- Eve 再次拦截,阻止 Bob 收到消息。
- 伊芙将截获的第一条信息发送给了鲍勃,就好像这条信息来自爱丽丝一样。
- Bob 将响应发送给 Alice(和 Eve)。
- 伊芙保留了第二条截获的信息,以便日后重放。由于 Bob 从未收到 Alice 发来的原始第二条拦截消息,因此会接受该消息。如果消息编码了“开锁”等命令,则表示存在安全漏洞。
为了防止此类攻击,定时操作会在事务开始时设置最大事务超时时间。即使 Eve 成功执行了攻击向量的前六个步骤,由于交易的超时时间已过,她也无法在第 7 步重放消息。
定时交易会增加复杂性和操作次数。因此,不建议在每笔交易中使用它们,而只建议在对可控制实体或虚拟安全和隐私资产的设备执行关键操作时使用。
SDK 抽象
读取事务、写入事务和调用事务部分简要介绍了 SDK 执行的互动模型操作。
创建使用 Matter SDK 的产品的开发者通常不会直接执行操作调用;操作由 SDK 函数抽象化,这些函数会将操作封装到 Interaction 中。不过,了解 IM 操作对于让工程师熟练掌握 Matter 的功能以及对 SDK 实现进行精细控制非常重要。