gpt4 book ai didi

objective-c - 有没有办法更快地发现 BLE 外设服务?

转载 作者:太空狗 更新时间:2023-10-30 03:51:50 24 4
gpt4 key购买 nike

我发现我在 iOS7 中实现 BLE 协议(protocol)在启动阶段非常慢。在我的应用程序中,启动顺序占整个执行时间的 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 上进行了测试。

最佳答案

当您加密连接时,iOS 应该缓存 GATT 数据库。因此,在第一个发现调用之后的后续发现调用应该立即发生。

从 iOS 7 开始,甚至特征值也会被缓存,这意味着您可以通过特征的值属性读取静态值,如“设备名称”。如果你想更新它们,你仍然需要发出一个读取特征值请求。

有关缓存行为的详细信息,请查看 WWDC 2013 session 703来自幻灯片 48(可能应该观看视频中的相应部分)。

对于连接和发现时间,主要是广告间隔。在 Bluetooth Accessory Design Guidelines For Apple Products 中,Apple 推荐了几个广告间隔以获得最佳性能。 (第 3.5 节广告间隔)。此外,您应该在连接时禁用扫描,因为扫描会使连接过程减慢大约 55 倍。

请注意,基于 iOS 的对每个连接事件发送的数据包数量的限制不应显着影响发现时间(除非你有一个巨大的 GATT 数据库并且正在查询整个事情)。根据 LE 协议(protocol)设计,这些限制应该只对“Write Without Response”和“Characteristic Value Notification”可见。

关于objective-c - 有没有办法更快地发现 BLE 外设服务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19404503/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com