在本地设备上实现外围设备角色。
- 启动外围设备管理器对象
- 在本地外围设备上设置服务和特征
- 将服务和特征发布到设备的本地数据库
- 广播服务
- 响应来自中心的读写请求
- 将更新的特征值发送到订阅中心
启动外围设备管理器
在本地设备上实现外设角色的第一步是分配和初始化外色管理器实例(CBPeripheralManager)。通过下面的方法启动外围设备管理器,如下所示:
myPeripheralManager =
[[CBPeripheralManager alloc] initWithDelegate:self queue:nil options:nil];
当创建一个外设管理器时,外色管理器调用它的委托方法peripheralManagerDidUpdateState:
。必须实现此委托方法以确保支持蓝牙低功耗并可在本地外围设备上使用。
设置服务和特征
本地服务和特征数据库以树状方式组织。必须以树状方式组织它们,以便在外围设备上设置服务和特征。执行这些任务的第一步是了解如何识别服务和特征。
服务和特征由UUID标识
外围设备的服务和特征由128位蓝牙特定UUID标识,这些UUID在核心蓝牙框架中由CBUUID对象表示。尽管并非所有标识服务和特征的UUID都由蓝牙特殊兴趣小组(SIG)定义。但蓝牙SIG已定义并发布了许多常用的UUID,为方便起见,这些UUID已缩短为16位。例如,Bluethooth SIG已经预定义了将心率服务标识为180D的16位UUID。此UUID是与其等效的128位UUID 0000180D-0000-1000-8000-00805F9B34FB的缩写。后者基于蓝牙4.0规范第3卷第F部分第3.2.1节中定义的蓝牙基本UUID。
该类CBUUID提供了工厂方法,可以在开发应用程序时更轻松地处理长UUID。例如,无需代码中传递心率服务的128位UUID的字符串表示形式,可以简单地使用该CBUUID的UUIDWithString方法从服务的预定义16位UUID创建一个对象,如下所示:
CBUUID *heartRateServiceUUID = [CBUUID UUIDWithString: @"180D"];
当从预定义的16位UUID创建CBUUID对象时,Core Bluethooth使用蓝牙基本UUID预填充128位UUID的其余部分。
为自定义服务和特征创建自己的UUID
你可能拥有未由预定义的蓝牙UUID识别的服务和特征。如果这样做,需要生产自己的128位UUID来识别它们。
使用命令行程序uuidgen轻松生成128位UUID。
$ uuidgen
71DA3FD1-7E10-41C1-B16F-4430B506CDE7
然后,可以使用UUID创建CBUUID对象,如下所示:
CBUUID *myCustomServiceUUID =
[CBUUID UUIDWithString:@"71DA3FD1-7E10-41C1-B16F-4430B506CDE7"];
构建特征和服务树
获得服务和特征的UUID(由CBUUID对象表示)后,可以创建可变服务和特征,并以上述树状方式组织它们。例如,如果你有一个特征的UUID,你可以通过调用CBMutableCharacteristic类的initWithType:properties:value:permissions:
方法来创建一个可变特征CBMutableCharacteristic,如下所示:
myCharacteristic =
[[CBMutableCharacteristic alloc] initWithType:myCharacteristicUUID
properties:CBCharacteristicPropertyRead
value:myValue permissions:CBAttributePermissionsReadable];
创建一个可变特征时,需要设置其属性、值和权限。设置的属性和权限决定了特征的值是可读还是可写,以及连接的中心是否可以订阅特征的值。在此示例中,特征值设置为可被连接的中心读取。