2013-10-16 28 views
4

我發現我在iOS7中實現BLE協議的啓動階段非常慢。在我的應用程序中,啓動順序佔整個執行時間的約68%。有沒有辦法更快地發現BLE外設服務?

我該怎麼做才能讓它更快?

我已經計時了,這裏是我得到的。

 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

我很好奇你花了多長時間來發現外設。我的猜測是發現外圍設備的時間,他們的服務與他們的硬件實施有關。 – reTs

+0

根據我的經驗,以較高速率宣傳自己的外設將花費較短的時間來發現服務。也許巧合,因爲我只有幾個外圍設備可以玩。另外我發現一個外設服務的時間最長爲0.5秒,這對我來說是可以接受的。 – reTs

+0

我再次測試了兩個完全不同的(硬件方面)外設,結果是相同的(給出或花費50毫秒)。我不確定如何在發現外設之前測量時間?發現外圍設備和發現服務之間的差異時間仍然非常重要,因爲它會讓應用程序感覺比它更慢。 – MdaG

回答

1

沒有框架級API來提高發現速度。 BTLE與Classic Bluetooth(在系統框架級別)和Wi-Fi(在天線級別)共存,因此天線的最長時間受系統限制。

+0

所以這是硬件依賴呢?然後,這將解釋更快的Android應用程序。 – MdaG

+0

或多或少,是的。我認爲,在Android手機中,您可能會看到響應性方面的一些變化:不同的芯片組和天線佈局將決定不同的共存要求。 – cbowns

3

加密連接時,iOS應緩存GATT數據庫。因此,在第一次發現後的後續發現呼叫應該立即發生。

從iOS 7開始,即使是特徵值也被緩存,這意味着您可以通過特徵的value屬性讀取靜態值,如「設備名稱」。如果您想更新它們,您仍然需要發出讀取特性值請求。

有關緩存行爲的詳細信息,請查看幻燈片48中的WWDC 2013 session 703(應該可以觀看視頻中的相應部分)。

對於連接和發現時間,主要是廣告時間間隔。在Bluetooth Accessory Design Guidelines For Apple Products(第3.5節「廣告時間間隔」)中,蘋果推薦了幾個廣告時間間隔以獲得最佳性能。此外,您應該在連接時禁用掃描,因爲掃描會使連接過程減慢大約55​​倍。

請注意,基於iOS的每個連接事件發送數據包的限制不應該明顯影響發現時間(除非您有一個巨大的GATT數據庫並且正在查詢整個事件)。根據LE協議設計,這些限制只能在「無響應寫入」和「特徵值通知」中可見。

+0

您發佈的「WWDC 2013會話703」鏈接已損壞,請更新此鏈接:https://developer.apple.com/videos/wwdc/2013/?id = 703 – GoRoS

+0

已修復。謝謝 :) – Etan

相關問題