美文网首页
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