我发现我在 iOS7 中实现 BLE 协议在启动阶段非常慢。在我的应用程序中,启动序列约占整个执行时间的 68%。
我该怎么做才能让它更快?
我已经计时了,这就是我得到的。
t dt
37.598 [BLE] Discovered peripheral at RSSI -27 with UUID:XYZ
37.599 0.001 [BLE] Connecting to peripheral
37.602 0.003 [BLE] Scanning stopped
37.685 0.083 [BLE] Peripheral connected
38.48 0.795 [BLE] Discovered service
38.599 0.119 [BLE] Discovered characteristic
如您所见,在发现这项服务之前存在巨大的瓶颈。
我的启动代码简化了:
- (void)centralManagerDidUpdateState:(CBCentralManager *)central {
switch (central.state) {
case CBCentralManagerStatePoweredOn:
[central scanForPeripheralsWithServices:@[[CBUUID UUIDWithString:kServiceUuid]]
options:@{CBCentralManagerScanOptionAllowDuplicatesKey : @YES}];
break;
case CBCentralManagerStatePoweredOff:
[central stopScan];
break;
default:
break;
}
}
- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI {
if (self.discoveredPeripheral != peripheral) {
self.discoveredPeripheral = peripheral; // Save a local copy of the peripheral, so CoreBluetooth doesn't get rid of it
[central connectPeripheral:peripheral options:nil];
[central stopScan];
}
}
- (void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)peripheral {
[peripheral discoverServices:@[[CBUUID UUIDWithString:kServiceUuid]]];
}
- (void)peripheral:(CBPeripheral *)peripheral didDiscoverServices:(NSError *)error {
for (CBService *service in peripheral.services) {
[peripheral discoverCharacteristics:@[array of characteristics]
forService:service];
}
}
- (void)peripheral:(CBPeripheral *)peripheral didDiscoverCharacteristicsForService:(CBService *)service error:(NSError *)error {
...
}
EDIT
我了解到 Android 上的类似应用程序执行此操作的速度要快十倍(使 Android 应用程序感觉更快 -> 更好的用户体验),因此我很好奇我的实现、BLE 层或硬件是否是瓶颈。它已在 iPhone 4S 上进行测试。
当您加密连接时,iOS 应缓存 GATT 数据库。因此,第一个发现调用之后的后续发现调用应该立即发生。
从 iOS 7 开始,甚至特征值也会被缓存,这意味着您可以通过特征的 value 属性读取静态值,例如“设备名称”。如果您想更新它们,您仍然必须发出读取特征值请求。
有关缓存行为的详细信息,请检查WWDC 2013 第 703 场来自幻灯片 48(可能应该观看视频中的相应部分)。
对于连接和发现时间,主要是广告间隔。 Apple 推荐了几种广告间隔,以便在Apple 产品蓝牙配件设计指南(第 3.5 节广告间隔)。此外,您应该在连接时禁用扫描,因为扫描会使连接过程减慢约 55 倍。
请注意,基于 iOS 对每个连接事件发送的数据包数量的限制不应明显影响发现时间(除非您有一个巨大的 GATT 数据库并正在查询整个数据库)。根据 LE 协议设计,这些限制仅对“无响应写入”和“特征值通知”可见。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)