我发现我在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 {
...
}
修改
我已经了解到Android上的类似应用程序的速度提高了十倍(让Android应用程序感觉更加快捷 - >更好的用户体验)所以我很好奇这是我的实现,BLE层或硬件是瓶颈。它在iPhone 4S上进行了测试。
答案 0 :(得分:4)
加密连接时,iOS应该缓存GATT数据库。因此,在第一个应该在瞬间发生之后的后续发现调用。
从iOS 7开始,即使是特征值也会被缓存,这意味着您可以通过特征的value属性读取静态值,如“设备名称”。如果要更新它们,仍需要发出读取特征值请求。
有关缓存行为的详细信息,请查看幻灯片48中的WWDC 2013 session 703(可能应该观看视频中的相应部分)。
对于连接和发现时间,主要是广告间隔。 Apple推荐了几个广告时段,以便在Bluetooth Accessory Design Guidelines For Apple Products(第3.5节广告时段)中获得最佳性能。此外,您应该在连接时禁用扫描,因为扫描会使连接过程减慢大约55倍。
请注意,基于iOS的每个连接事件发送数据包数量限制不应显着影响发现时间(除非您有一个巨大的GATT数据库并且正在查询整个事件)。根据LE协议设计,这些限制只应在“无响应写入”和“特征值通知”中可见。
答案 1 :(得分:1)
没有框架级API来提高发现速度。 BTLE与经典蓝牙(在系统框架级别)和Wi-Fi(在天线级别)共存,因此天线的最大时间受系统限制。