与许多中央端事务一样,核心蓝牙框架使我们可以控制实现外围角色的大多数方面。本章提供了以负责任的方式利用此控制级别的指南和最佳实践。
播发外围数据是设置本地设备以实现外围角色的重要部分。以下各节可帮助我们以适当的方式执行此操作。
通过将广播数据字典传递给 startAdvertising: CBPeripheralManager 类的方法来通告外围设备的数据,如播发我们的服务中所述。创建广播词典时,请记住,我们可以投放广播的内容和数量是有限制的。
尽管广播数据包通常可以包含有关外围设备的各种信息,但我们可以仅播发设备的本地名称和要播发的任何服务的 UUID。也就是说,当我们创建广播词典时,我们只能指定以下两个键:CBAdvertisementDataLocalNameKey 和 CBAdvertisementDataServiceUUIDsKey。如果指定任何其他键,则会收到错误。
广播数据时可以使用的空间也有限制。当我们的应用位于前台时,它最多可以使用 28 字节的初始广播数据空间来存储两个受支持的广播数据键的任意组合。如果此空间已用完,则扫描响应中还有 10 个字节的空间只能用于本地名称。任何不适合分配空间的服务 UUID 都会添加到特殊的“溢出”区域;它们只能由显式扫描它们的 iOS 设备发现。当应用在后台运行时,不会播发本地名称,并且所有服务 UUID 都放置在溢出区域中。
注意:这些大小不包括每种新数据类型所需的 2 个字节的标头信息。播发和响应数据的确切格式在蓝牙 4.0 规范第 3 卷 C 部分第 11 节中定义。
为了帮助我们保持在这些空间限制范围内,请将我们播发的服务 UUID 限制为标识我们的主要服务的 UUID。
由于广播外围数据使用本地设备的无线电(因此使用设备的电池),因此仅当我们希望其他设备连接到我们时,才进行广播宣传。连接后,这些设备可以直接探索和交互外围设备的数据,而无需任何广播数据包。因此,为了最大限度地减少无线电使用、提高应用性能并节省设备的电池电量,请在不再需要促进任何预期的低功耗蓝牙交易时停止广播。要停止在本地外围设备上投放广播,只需调用 CBPeripheralManager 类的 stopAdvertising 方法,如下所示:
[myPeripheralManager stopAdvertising];
知道何时做广播通常是只有用户才能知道的事情。例如,当我们知道附近没有任何其他低功耗蓝牙设备时,让我们的应用在我们的设备上宣传服务是没有意义的。由于我们的应用通常不知道附近还有哪些其他设备,因此请在应用的用户界面 (UI) 中为用户提供一种决定何时投放广播的方法。
创建可变特征时,可以设置其属性、值和权限。这些设置决定了连接的中心如何访问特征值并与之交互。尽管我们可能决定根据应用的需要以不同的方式配置特征的属性和权限,但在需要执行以下两项任务时,以下部分提供了一些指导:
保护敏感特征值不被不成对的中心访问
配置特征以支持通知
如订阅经常更改的特征值中所述,建议中心订阅经常更改的特征值(远程外围设备的服务)。如果可能,通过允许连接的中心订阅我们的特征值来鼓励这种做法。
创建可变特征时,通过使用 CBCharacteristicPropertyNotify 常量设置特征的属性,将其配置为支持订阅,如下所示:
myCharacteristic = [[CBMutableCharacteristic alloc]
initWithType:myCharacteristicUUID
properties:CBCharacteristicPropertyRead | CBCharacteristicPropertyNotify
value:nil permissions:CBAttributePermissionsReadable];
在此示例中,特征的值是可读的,并且可以由连接的中央订阅。
根据用例,我们可能希望提供具有一个或多个特征的服务,其价值需要安全。例如,假设我们想出售社交媒体个人资料服务。此服务可能具有其值表示成员个人资料信息的特征,例如名字、姓氏和电子邮件地址。很可能,我们希望仅允许受信任的设备检索成员的电子邮件地址。
通过设置适当的特征属性和权限,可以确保只有受信任的设备才能访问敏感特征值。要继续上面的示例,要仅允许受信任的设备检索成员的电子邮件地址,请设置相应特征的属性和权限,如下所示:
emailCharacteristic = [[CBMutableCharacteristic alloc]
initWithType:emailCharacteristicUUID
properties:CBCharacteristicPropertyRead
| CBCharacteristicPropertyNotifyEncryptionRequired
value:nil permissions:CBAttributePermissionsReadEncryptionRequired];
在此示例中,特征配置为仅允许受信任的设备读取或订阅其值。当连接的远程中心尝试读取或订阅此特征的值时,Core Bluetooth 会尝试将我们的本地外围设备与中心配对以创建安全连接。
例如,如果中央设备和外围设备是 iOS 设备,则两台设备都会收到警报,指示另一台设备想要配对。中央设备上的警报包含一个代码,我们必须在外围设备警报的文本字段中输入该代码才能完成配对过程。
配对过程完成后,外设将配对的中心视为受信任的设备,并允许中心访问其加密的特征值。