如果我们无法对节点执行操作,那么节点的数据模型 (DM) 就无关紧要。交互模型 (IM) 定义了节点的 DM 与其他节点的 DM 之间的关系:DM 之间通信的通用语言。
节点通过以下方式相互交互:
- 读取和订阅属性和事件
- 写入属性
- 调用命令
每当一个节点与另一个节点建立加密通信序列时,它们就会构成互动关系。互动可能由一个或多个事务组成,而事务由一个或多个操作组成,这些操作可以理解为节点之间的 IM 级消息。
事务支持多种操作,例如,从另一个节点请求属性或事件的读取请求操作,或其响应(即报告数据操作),该操作会将信息从服务器传回客户端。
发起方和目标
发起事务的节点是发起方,而响应的节点是目标。通常,发起方是客户端集群,目标是服务器集群。不过,此模式也有例外情况,例如本部分后面进一步分析的订阅互动。
社区
Matter 中的节点可能属于某个群组。设备组是一种机制,用于在同一 Action 中同时向多台设备寻址和发送消息。群组中的所有节点都具有相同的群组 ID(一个 16 位整数)。
为了实现群组级通信(群组播),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 设法执行了攻击途径的前六个步骤,由于 Transaction 的超时时间已过,它也无法在第 7 步中重放消息。
定时交易会增加操作的复杂性和数量。因此,不建议对每笔交易都使用这些功能,而只建议对设备上控制物理或虚拟安全和隐私资产的关键操作使用这些功能。
SDK 抽象
读取事务、写入事务和调用事务部分简要概述了 SDK 执行的交互模型操作。
创建使用 Matter SDK 的产品的开发者通常不会直接执行调用来执行 Action;Action 由 SDK 函数抽象化,这些函数会将 Action 封装到 Interaction 中。不过,了解 IM 操作对于让工程师熟练掌握 Matter 的功能以及精细控制 SDK 实现非常重要。