Matter 设备将如何进行交互,从而协同实现多样的自动化场景。例如:使用家里的一个开关就能控制一个或多个灯泡;恒温器可以根据接收到的传感器报告,自动打开或关闭。使用 Matter 可以很容易做到这一点。设备不需要借助任何云或手机 App,直接通过本地网络即可进行交互。
Matter 数据模型和设备类型中提到的,每个 Matter Cluster 都有一个 Cluster 服务器及其对应的客户端,Matter 设备之间的通信实际上就是 Cluster 服务器和客户端之间的通信。如上图所示,部署在开关中的 OnOff Cluster 客户端,可以打开或关闭部署在灯泡中的 OnOff Cluster 服务器。终端用户可以配置家中的 Matter 设备,使其与一个或多个设备进行交互。
要实现这样的交互,开关需要通过某种方式了解有关灯泡的细节信息,这种方式即为设备绑定。绑定代表一种持久的连接关系,为一个端点与其他一个或多个端点进行安全交互提供了可能。用户可以(通过 Matter 手机 App)将来自不同厂商的不同设备绑定起来。
Matter 设备之间的交互方式:
同步控制
以上述开关为例,开关作为绑定 Cluster 服务器,用户通过手机 APP 中的绑定 Cluster 客户端来发送绑定指令。能够提供绑定服务的绑定开关收到绑定指令后,会主动和灯泡建立一个安全的通信链路,从而实现灯泡和开关的绑定成功,之后用户对开关的任何操作(开或关)就会同步反映至灯泡上。具体过程如下:
同样地,如果我们希望通过一个 Dimmer Switch(调光器开关)控制一个 Dimmable Light(可调光灯泡),则 Dimmer Switch 还需要部署一个 OnOff Cluster 客户端、一个 Level Control Cluster 客户端以及一个 Binding Cluster 服务器。
异步订阅
这种异步订阅通知的交互方式允许订阅者接收来自发布者的数据报告,报告的内容可以是发布者的 Attribute 或 Event。
比如:恒温器可以订阅了传感器的Attribute获取最新的设备状态。首先,用户需要将恒温器与传感器绑定。完成后,恒温器就可以订阅传感器的 Attribute,并定期或在传感器 Attribute 变化时,接收来自传感器的数据。具体过程如下:
此外,设备也可以订阅 Event,Event 可以捕获各种变化,并将其这些变化通知给订阅者。我们生活中常见的 Event 可以是按下开关被按下、长按或打开门被打开等。
iOS设备绑定示范代码
/**
- (void)writeAttributeBindingWithValue:(NSArray * _Nonnull)value
completion:(MTRStatusCompletion)completion
MTR_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4));
*/
// 首先获取源设备
controller.getBaseDevice(sourceDeviceId, queue: testMatterQueue) { device, _ in
let bindingCluster = MTRBaseClusterBinding(device: device,
endpointID: NSNumber(value: endpoint),
queue: testMatterQueue)
bindingCluster.readAttributeBinding(with: nil) { finalParams, _ in
// finalParams MTRBindingClusterTargetStruct已经设备bind的集合
// 输入新增的目标参数
let param = MTRBindingClusterTargetStruct()
param.node = NSNumber(value: destinationDeviceId)
param.cluster = NSNumber(value: 6) // test
param.endpoint = NSNumber(value: 1) // test
// finalParams.append(param) 新增的逻辑
bindingCluster.writeAttributeBinding(withValue: finalParams) { error in
// show some UI hint
}
}
// 订阅属性变化
let subscribeParams = MTRSubscribeParams()
subscribeParams.shouldReportEventsUrgently = true
bindingCluster.subscribeAttributeBinding(
with: subscribeParams,
subscriptionEstablished: nil
) { respone, error in
}
}