Page 1 of 1

【iOS】Matter蓝牙与局域网的权限详解

Posted: 2024年 Dec 2日 16:16
by God of BLE

Matter 协议是 CSA 联盟 与谷歌、亚马逊、苹果公司共同推进的物联网标准连接方案,旨在实现所有智能设备的兼容性,实现一套协议控制所有设备,让设备使用单一协议与任何 Matter 认证的生态系统配合使用。

协议架构

Matter 是一个开源的 SDK,它不仅包含规范的实现,还有丰富的示例和可互操作的代码。其在 OSI(Open System Interconnection)模型中与 TCP/IP 的关系如下所示:
Image

从结构图中可以看出,Matter是基于IP的协议,蓝牙通道在配网过程中承载解密信道的载体,而iOS为了避免自家HomeKit Matter的生态,特地为开发者特定设置了一些权限,本文将从Matter协议入手,为大家解析开发Matter需要什么权限,并且每个权限是用来卡什么流程的。

蓝牙权限

Matter 蓝牙

讲到蓝牙,主要就是围绕蓝牙服务和特征值。
Matter拥有在蓝牙联盟注册的专属服务

Code: Select all

FFF6

根据文档,其服务下有三个专属特征值,分别是

C1 Characteristic

UUID = 18EE2EF5-263D-4559-959F-4F9C429F9D11
Characteristic Porperties = Write Without Response
max length = 247 bytes

C2 Characteristic

UUID = 18EE2EF5-263D-4559-959F-4F9C429F9D12
Characteristic Properties = Notify
max length = 247 bytes

C3 Characteristic

UUID = 64630238-8772-45F2-B87D-748A83218F04
Characteristic Properties = Read
max length = 512 bytes

C1是写数据,C2读数据,在加密信道中,App写C1,读C2,与设备完成数据交换的目的。而C3一般用于读取额外信息使用。

因此,在iOS开发时,我们首先应当给予工程蓝牙权限。

蓝牙拦路虎

当各位靓仔配置完蓝牙,并引入官方的MatterKit准备大显身手时,会发现配网时会有一个报错

Code: Select all

CHIP: [BLE] BLE:Error writing Characteristics in Chip service on the device: [The specified UUID is not allowed for this operation.]

是的,iOS系统禁止我们向C1写入数据,对外给出的原因是为了用户安全。但是使用HomeKit没有这种限制。个中原因懂得都懂,不过苹果还是贴心的为各位提供了描述文件,当使用开发者账号下载描述文件并在手机上安装后,这台手机将临时允许写C1。不过,这是不允许上架的,仅供方便测试。描述文件可以从下面的链接进行下载。注意,这个链接只有开发者账号才可以打开。
https://download.developer.apple.com/iO ... bileconfig

不过大家不用担心,涂鸦Home SDK集成了官方库,可以从Support链路接入普通Matter设备。具体的接入方式,可以见这篇文章:https://www.tuyaos.com/viewtopic.php?t=3981,本文主要阐述权限以及权限的作用,就不发散接入细节了。

局域网权限

iOS系统上对局域网通信并没有禁止的操作,不过还是需要在info.plist中配置几个协议。

matterc.udp

这个是配网广播协议,通过这个协议,来找到待配网的Matter设备

matter.tcp

这个是已配网广播协议,通过这个协议,来找到局域网中已配网的Matter设备

meshcop.udp

边界路由组网协议,当边界路由能力的网关接入局域网中,将会开始广播这个协议,以供子设备接入Thread网络

matterd.udp

Service Name and Port Number Procedures,参考https://datatracker.ietf.org/doc/html/rfc6335

工程配置

这些局域网协议必须在info.plist中进行声明,否则,配网时会造成崩溃。
info.plist的代码如下

Code: Select all

<key>NSBonjourServices</key>
	<array>
		<string>_meshcop._udp</string>
		<string>_matter._tcp</string>
		<string>_matterc._udp</string>
		<string>_matterd._udp</string>
	</array>

配置截图如下:
Image