读取事务

读取事务

在 Matter 中与节点交互时,最先遇到的用例之一是从另一个节点读取属性,例如从传感器读取温度值。在此类互动中,必须执行的第一个操作是读取请求操作。

读取事务的操作序列
图 1:读取事务

读取请求操作

方向:发起方 -> 目标

在此操作中,发起方会查询目标,并提供:

  • Attribute Requests:目标的零个或多个属性的列表。此列表由零个或多个指向目标请求属性的路径组成。
  • 活动请求:零个或多个指向目标请求事件的路径的列表。

目标收到读取请求操作后,会使用请求的信息组合成报告数据操作。

报告数据操作

方向:目标 -> 发起方

在此 Action 中,Target 会做出以下响应:

  • Attribute Reports:在读取操作请求中请求的零个或多个报告属性的列表。
  • 事件报告:包含零个或多个已报告事件的列表。
  • 禁止响应:一个标志,用于确定是否应禁止对此操作的状态响应。
  • 订阅 ID:如果此报告属于订阅交易,则必须包含一个用于标识订阅交易的整数。

状态响应操作

方向:目标 -> 发起方或发起方 -> 目标

发起方收到请求的数据后,默认情况下必须生成状态响应操作。此操作由发起方发送,用于确认已收到报告的数据。如果设置了“禁止发送状态响应”标志,发起方不得发送“状态响应”操作。

发起方发送状态响应操作或收到启用“禁止响应”标志的报告数据操作后,读取/报告查询即告完成。

状态响应操作仅包含一个 status 字段,该字段将确认操作成功或显示失败代码。

读取限制

“读取请求”操作和“报告数据”操作仅适用于 Unicast。此外,这些请求的路径可能不会定位到节点组。

状态响应操作仅限 Unicast,无法作为对群组播报的响应生成。

订阅交易

订阅交易的操作顺序
图 2:订阅交易

订阅请求操作

方向:发起方 -> 目标

除了单个读取请求操作之外,发起方还可以订阅属性或事件的定期更新。因此,在订阅交易之后,定期数据更新可能会生成相同的报告数据操作。

订阅互动会在两个节点之间建立关系,其中目标节点会定期向发起方节点生成报告数据操作。发起方是订阅方,目标方是发布方。

订阅请求操作包含:

  • Min Interval Floor:报告之间的最短间隔。
  • 最大间隔上限:报告之间的最大间隔。
  • 属性报告:读取操作请求中请求的零个或多个已报告属性的列表。
  • 事件报告:包含零个或多个已报告事件的列表。

在收到订阅请求后,目标会向发起方发送报告数据操作,其中包含第一批报告数据:准备就绪的已发布数据。

然后,发起方会向目标发送状态响应操作,以确认报告数据操作。目标收到报告无错误的“状态响应”操作后,会发送“订阅响应”操作。

随后,目标将按照协商的间隔时间定期发送报告数据操作,而发起方将响应这些操作,直到订阅丢失或取消。

订阅响应操作

方向:目标 -> 发起方

这是订阅交易中的最后一个操作,至此流程结束。其中包括:

  • 订阅 ID:用于标识订阅的整数。
  • 最小时间间隔:最终确定的报告之间的最小时间间隔。
  • Max Interval:最终确定的报告间隔上限。

订阅限制

  • “订阅请求”操作和“订阅响应”操作是仅限 Unicast 的操作。
  • 订阅互动中的所有报告数据操作都必须具有相同的订阅 ID。
  • 如果订阅者在操作之间的最大协商间隔内未收到报告数据操作,则订阅将被终止。
  • 根据上一条规则,发布者只需停止发送定期报告数据操作,即可终止订阅互动。
  • 订阅方可以通过使用 INACTIVE_SUBSCRIPTION 状态代码响应报告数据操作来终止订阅互动。