一、简介
1.1 交互方式
交互模型层定义了客户端和服务器设备之间可以执行哪些交互。发起交互的节点称为发起者(通常为客户端设备),作为交互的接收者的节点称为目标(通常为服务器设备)。
节点通过以下方式进行交互:
- 读取属性和事件
- 订阅属性和事件(此交互用于创建与目标的订阅,以便定期接收来自目标的数据报告,而不是轮询数据。)
- 写入属性
- 调用命令
Matter 设备实现互联互通,主要是靠在上层定义了一套统一的 Data Model(数据模型), 在这套设备模型里面,设备内的逻辑功能单元是用 EndPoint 来表示的。每个 EndPoint 的功能有若干个 Culsters 来描述。 通讯的过程是有本地的 EndPoint 和远端的 EndPoint 来交互完成的,这个交互过程称之为 Interaction
。
1.2 群组
Matter 中的节点可以属于一个组。设备组是一种机制,用于在同一 Action 中同时寻址和向多台设备发送消息。一个群组中的所有节点共享同一群组 ID(一个 16 位整数)。
为了完成群组级别的通信(群组广播),Matter 利用 IPv6 Multicast 消息,并且所有群组成员具有相同的 Multicast 地址。
1.3 路径
每当我们想要与属性、事件或命令互动时,都必须指定此互动的路径:属性、事件或命令在节点数据模型层次结构中的位置。需要注意的是,路径可能还会使用组或通配符运算符来同时寻址多个节点或集群,从而聚合这些互动,从而减少操作数量。
此机制对于提高通信的响应速度非常重要。例如,当用户想要关闭所有灯时,语音助理可以与一组灯中的多个灯建立单次互动,而不是与一系列单独的互动互动。如果发起者与每个指示灯创建单独的交互,则可能会在设备响应速度方面产生人可感知的延迟。这种效果会导致多台设备对命令做出响应,且设备之间会有明显延迟。
可以使用以下某个选项组合 Matter 中的路径:
<path> = <node> <endpoint> <cluster> <attribute | event | command>
<path> = <group ID> <cluster> <attribute | event | command>
在这些路径构建块中,endpoint
和 cluster
还可能包含用于选择多个节点实例的通配符运算符。
1.4 可计时和无计时
有两种执行写入或调用 Matter 的方式:计时的和非计时的。计时事务为写入/调用操作的发送建立了一个超时上限。这个超时的目的是为了防止针对事务的拦截攻击。它特别适用于对控制资产进行访问的设备,如车库开门器和锁。
二、交互模型的层次结构
每当节点与另一个节点建立加密的通信序列时,它们就构成了交互关系。每次交互都由一个或多个事务组成,事务由一项或多项操作组成
,这些操作可理解为节点之间的即时通讯级消息。
事务支持多项 Action,如从其他节点请求属性或事件的读取请求操作,或其响应,即报告数据操作,用于将信息从服务器传回客户端。
三、读取交互
3.1 读取请求操作
- 属性请求:包含零个或多个 Target 属性的列表。此列表包含零个或多个指向目标所请求属性的路径。
- 事件请求:包含目标所请求事件的零个或多个路径的列表。
在目标收到读取请求操作后,它会使用所请求的信息组合一个报告数据操作。
3.2 报告数据操作
- 属性报告:读取操作请求中请求的零个或多个已报告属性的列表。
- 事件报告:包含零个或多个被报告事件的列表。
- 抑制响应:一个标志,用于确定是否应抑制对此操作的状态响应。
- 订阅 ID:如果此报告是订阅交互的一部分,则必须包含一个用于标识订阅交互的整数。
3.3 状态响应操作
Initiator 收到请求的数据后,默认情况下必须生成状态响应操作。此操作从 Initiator 发送,确认已收到所报告的数据。如果已设置“抑制状态响应”标志,Initiator 不得发送状态响应操作。
Initiator 发送状态响应操作后,或启用“禁止响应”标志的 Initiator 收到报告数据操作后,读取交互完成。
状态响应操作只包含一个 status 字段,该字段将确认操作成功或显示失败代码。
3.4 读取限制
读取请求操作和报告数据操作仅限 Unicast。此外,这些请求的路径不能定位一组节点。
状态响应操作仅限 Unicast,不能作为对组播的响应生成。
四、写入交互(非定时)
4.1 写入请求操作
- 写入请求:包含一个或多个元组(包含路径和数据)的列表。
- 定时请求:指示此操作是否属于定时写入交互的标志。
- 抑制响应:一个标志,用于确定是否应抑制对此操作的状态响应。
4.2 写入回复操作
- 写入响应:针对写入请求操作发送的每个写入请求的路径和错误代码列表。
4.3 非定时写入限制
写入请求操作可能是组播
,但在这种情况下必须设置“禁止响应”标志。其原因在于,网络可能会被群组中每个成员的同步响应所淹没。
如需启用此行为,“写入请求”列表中使用的路径可以包含群组,也可能包含通配符,但仅限于“端点”字段。
五、写入交互(定时)
5.1 定时请求操作
- Timeout:此事务可以保持打开状态的毫秒数。在此期间,Initiator 发送的下一项操作将被视为有效。
收到定时请求操作后,Target 必须使用状态响应操作确认定时请求操作。一旦 Initiator 收到未报告任何错误的状态响应操作,就会发送写入请求操作。
5.2 写入请求操作
与上文所述的写入请求操作相同。
5.3 写入回复操作
与上文所述的写入回复操作相同。
5.4 定时写入限制
定时请求操作、写入请求操作和写入响应操作是单播
操作。
六、调用命令交互(非定时)
6.1 调用请求操作
- 调用请求:集群命令的路径列表,以及命令的可选参数(名为命令字段)。
- 定时请求:一个标志,用于指示此操作是否为定时调用命令交互的一部分。
- 抑制响应:一个标志,用于指示是否应抑制调用响应操作。
- 互动 ID:一个整数,用于将调用请求操作与调用响应操作进行匹配。
6.2 调用响应操作
- 调用响应:每个发送的调用请求的命令响应或状态列表。
- 互动 ID:一个整数,用于将调用请求操作与调用响应操作进行匹配。
6.2 非定时调用限制
调用请求操作可能是组播
,但在这种情况下必须设置“禁止响应”标志。其原因在于,网络可能会被组中每个成员的同步响应应所淹没。
如需启用此行为,“调用请求”列表中使用的路径可能包含群组,也可能包含通配符,但仅限于“端点”字段。此外,如果 Action 是组播,则事务将终止,并且没有响应。
七、调用命令交互(定时)
7.1 定时请求操作
- Timeout:此事务可以保持打开状态的毫秒数。在此期间,Initiator 发送的下一项操作将被视为有效。
收到定时请求操作后,Target 必须使用状态响应操作确认定时请求操作。一旦 Initiator 收到未报告任何错误的状态响应操作,就会发送调用请求操作。
7.2 调用请求操作
与上文所述的调用请求操作相同。
7.3 调用响应操作
与上文所述的调用响应操作相同。
7.4 定时调用限制
定时请求操作、调用请求操作和调用响应操作仅限 Unicast,因此是单播
操作。
调用请求操作支持使用包含群组的路径以及通配符,但调用响应操作不支持通配符。
八、订阅交互
8.1 订阅请求操作
- 最小间隔时间:报告之间的最小时间间隔。
- 最大间隔时间:报告之间的最大时间间隔。
- 属性报告:读取操作请求中请求的零个或多个已报告属性的列表。
- 最大间隔时间:包含零个或多个所报告事件的列表。
发出订阅请求后,Target 会使用一个包含第一批报告数据的报告数据操作来响应发起方:Primed Publish Data。
然后,Initiator 会确认报告数据操作,并将状态响应操作发送至目标。一旦目标收到没有报告任何错误的状态响应操作,就会发送订阅响应操作。
随后,Target 将按协商的时间间隔定期发送报告数据操作,Initiator 将响应这些操作,直到订阅丢失或取消订阅。
8.2 订阅请求操作
- 订阅 ID:用于标识订阅的整数。
- 最小间隔:报告之间的最终确定的最小间隔。
- 最大间隔:报告之间的最终确定的最大间隔。
8.3 订阅限制
- 订阅请求操作和订阅响应操作是仅限 Unicast 的操作。
- 订阅互动中的所有报告数据操作都必须具有相同的订阅 ID。
- 如果 Initiator 未在操作之间的最大协商间隔内收到报告数据操作,订阅将终止。
- 由于上述规则,Initiator 只需停止发送定期报告数据操作即可终止订阅互动。
- Initiator 可通过使用 INACTIVE_SUBSCRIPTION 状态代码响应报告数据操作来终止订阅互动。
九、交互示例:门锁
以下部分介绍了交互类型的示例。这些示例使用虚构的 Matter 控制器作为交互发起者,使用门锁设备作为交互目标。
- 读取交互
Matter 控制器可以使用读取交互从门锁设备的数据模型层读取一个或多个属性或事件。例如,Matter 控制器可以读取集群LockType
的属性DoorLock
,以向用户显示适当的图标。下图显示了完成此交互需要交换的操作。
- 写入交互
写入交互可用于修改门锁设备的一个或多个属性。例如,Matter 控制器可以更改集群OperatingMode
的属性DoorLock
,将锁置于隐私模式,在该模式下,门只能从建筑物内部手动解锁。下图显示了完成此交互需要交换的操作。
- 调用命令交互
调用命令交互允许 Matter 控制器调用来自门锁设备的数据模型层的命令之一。例如,Matter 控制器可以使用集群UnlockDoor
的命令DoorLock
远程解锁门。下图显示了完成此交互需要交换的操作。
注:这是调用命令交互的一种特殊情况,即计时交互,它需要在发送实际命令之前再交换两条消息。需要这两条消息来确保攻击者无法在房主外出时拦截并重放该命令来解锁门。
- 订阅交互
订阅交互可用于监视门锁设备的一个或多个属性或事件的状态。例如,Matter 控制器可以订阅集群LockState
的属性DoorLock
,以便在门被其他用户解锁时接收通知。下图显示了完成此交互需要交换的操作。
注:这是一个长时间运行的交互,由执行的多个事务组成,直到任何一方停止响应或响应失败状态。
• 由 Leung 写于 2023 年 12 月 3 日
• 参考:互动模型 | Matter | Google Home Developers
nRF Connect SDK - Matter