美文网首页
7.充分利用蓝牙设备

7.充分利用蓝牙设备

作者: LucXion | 来源:发表于2021-10-20 11:35 被阅读0次

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-centralBluetooth-Peripheral。应用进入后台后,scanfForPeripheralWithServices:Options:仍然会继续调用并返回已发现的设备。然而如果应用被系统终止,则不会在后台再次启动。CoreBluetooth.framework支持状态保存和恢复功能,使用这些API,当发现一个已连接设备时,应用会在后台启动。

省电考虑

苹果建议外围设备在前30s每20ms发送一次广播包,30s之后你希望节省电量,增加延迟。使用645ms、768ms、961ms、1065ms、1294ms可以增加被发现的机会。蓝牙进入后台,扫描频率会进入低电量模式。如果广播间隔是苹果推荐的数值,那么设备会更容易被发现。如果作为外围设备,则不用考虑这些问题,CoreBluetooth会为你处理。

状态保存和恢复的key:CBCentralManagerOptionRestoreIdentifierKey、CBPeripheralManagerRestoredStateAdvertisementDataKey

相关文章

网友评论

      本文标题:7.充分利用蓝牙设备

      本文链接:https://www.haomeiwen.com/subject/dehtaltx.html