7.充分利用蓝牙设备
iOS中蓝牙SDK是CoreBlueTool.framework,iOS 5后可用,专门为蓝牙LE设备设计。
蓝牙4.0之前,要使用蓝牙,指定设备必须实现某些蓝牙规范。诸如蓝牙音频耳机,蓝牙立体声耳机,蓝牙远程控制,SIM卡访问等常见用途都有现成的配置文件。然而,为了自己独特的设备开发配置文件是冗长乏味的工作,此外,开发一些定制的配置文件还要安装一些必需的驱动。如果使用定制的配置文件,还要获得MFi认证。
蓝牙4.0(蓝牙LE,蓝牙智能,低功耗蓝牙)使实现定制接口和定制数据交换变得容易,你可以完全在用户空间实现而不需要系统层的驱动。应用既是驱动,也是软件,你不需要一个系统层的配对,也不需要MFi认证。
服务器叫外围设备,客户端叫中心设备。产生数据的就是服务器,它们可能是心率监控器,温度计等。
- iOS 6中, SDK增加了一些类允许iOS设备作为外围设备来发送数据。
- 中心设备和外围设备的标识符用的是NSUUID(全局唯一标识符)
- CBCentralManager可以充当中心设备,通过CBCentralManagerDelegate委托,通知你发现的外围设备、服务、服务的特征和数值变化。
- 连接外围设备前需要将对象保存到列表,避免对象被释放导致无法连接
- 一个服务通常有一个或多个特性,比如打开/关闭服务,或者获取服务的当前值。
// 发现外设,打开功能
-(void)centralManager:(CBCentralManager *)central didDisconnectPeripheral:(CBPeripheral *)peripheral error:(NSError *)error {
[peripheral.services enumerateObjectsUsingBlock:^(CBService * _Nonnull service, NSUInteger idx, BOOL * _Nonnull stop) {
// 获取特定服务
if ([service.UUID isEqual:[CBUUID UUIDWithString:@"0000-0000"]]) {
NSArray *characteristicsArr = service.characteristics;
[characteristicsArr enumerateObjectsUsingBlock:^(CBCharacteristic *characteristics, NSUInteger idx, BOOL * _Nonnull stop) {
// 获取特定特征
if ([characteristics.UUID isEqual:[CBUUID UUIDWithString:@"0000-0000"]]) {
uint8_t data = 0x01;
// 向外设传递数据,比如开/关
[peripheral writeValue:[NSData dataWithBytes:&data length:1] forCharacteristic:characteristics type:CBCharacteristicWriteWithResponse];
}
if ([characteristics.UUID isEqual:[CBUUID UUIDWithString:@"1111-1111"]]) {
// 打开通知功能
[peripheral setNotifyValue:YES forCharacteristic:characteristics];
}
}];
}
}];
}
// 通过委托获取外设数值变化
- (void)peripheral:(CBPeripheral *)peripheral didUpdateValueForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error {
float info = [self infoFromData:characteristic.value];
NSLog(@"特征变动的数值信息 %f",info);
}
- (float)infoFromData:(NSData*)data {
char scratchVal[data.length];
int16_t temp;
[data getBytes:scratchVal length:data.length];
// 取第二个字节 和第三个字节 组成温度
temp = ((scratchVal[2] & 0xff) | ((scratchVal[3] << 8) & 0xff00));
return temp;
}
创建外围设备服务
-
通过CBUUID和特征CBMutableCharacteristic 创建服务 CBMutableService,将服务添加到CBPeripheraManager
-
外围设备负责维护一个已订阅中心设备列表,当有新的中心设备订阅时将其加入列表,当有中心设备取消订阅时,将其移出列表
-
通知已订阅中心设备
// CBPeripheralManager [self.manager updateValue:[@"" dataUsingEncoding:kCFStringEncodingUTF8] forCharacteristic:self.characteristic onSubscribedCentrals:self.centerList];
后台模式
可以通过info.plist配置后台模式 Bluetooth-central 、Bluetooth-Peripheral。应用进入后台后,scanfForPeripheralWithServices:Options:仍然会继续调用并返回已发现的设备。然而如果应用被系统终止,则不会在后台再次启动。CoreBluetooth.framework支持状态保存和恢复功能,使用这些API,当发现一个已连接设备时,应用会在后台启动。
省电考虑
苹果建议外围设备在前30s每20ms发送一次广播包,30s之后你希望节省电量,增加延迟。使用645ms、768ms、961ms、1065ms、1294ms可以增加被发现的机会。蓝牙进入后台,扫描频率会进入低电量模式。如果广播间隔是苹果推荐的数值,那么设备会更容易被发现。如果作为外围设备,则不用考虑这些问题,CoreBluetooth会为你处理。
状态保存和恢复的key:CBCentralManagerOptionRestoreIdentifierKey、CBPeripheralManagerRestoredStateAdvertisementDataKey