如果我们无法对节点的数据模型 (DM) 执行操作,那么该数据模型就无关紧要。交互模型 (IM) 定义了节点的 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 接收该消息,例如通过某种无线电干扰。
- Alice 未收到 Bob 的回复,因此发送了第二条消息。
- Eve 再次拦截并阻止 Bob 接收该消息。
- Eve 将第一条拦截的消息发送给 Bob,就好像该消息来自 Alice 一样。
- Bob 将回复发送给 Alice(和 Eve)。
- Eve 保留第二条拦截的消息,以供日后重放。由于 Bob 从未收到 Alice 发送的原始第二条拦截的消息,因此会接受该消息。如果消息编码了“开锁”等命令,则此消息表示安全事故。
为了防止此类攻击,有时限操作会在事务开始时设置最长事务超时时间。即使 Eve 设法执行了攻击途径的前六个步骤,也无法在第 7 步重放消息,因为事务已超时。
有时限事务会增加操作的复杂性和数量。因此,不建议对每个事务都使用有时限事务,而仅建议对控制物理或虚拟安全和隐私资产的设备上的关键操作使用有时限事务。
SDK 抽象
读取事务、写入事务和调用事务部分简要介绍了 SDK 执行的交互模型操作。
创建使用 Matter SDK 的产品的开发者通常不会直接调用来执行操作;操作由 SDK 函数抽象出来,这些函数会将操作封装到交互中。 不过,了解 IM 操作对于让工程师熟练掌握 Matter 的功能以及对 SDK 实现进行精细控制非常重要。Matter