3

我正在開發一個應用程序連接和斷開幾次不同的藍牙低功耗外設。 經過在互聯網上的大量研究,我沒有找到一種方法來存儲已經發現的服務和特徵,以便我可以更快地重新連接。 目前,我在每次重新連接後發現所需的服務和特性,這會花費我1.5到2秒的時間。重新連接CBPeripheral更快

有人有經驗或解決方案來存儲/緩存CBService或CBCharacteristic或確實有人知道更快地重新連接的方法嗎?

感謝所有幫助

+0

你問如何緩存在應用程序中的東西嗎? – 2013-02-14 23:49:45

+1

這將是緩存服務和特性的解決方案,但我已經嘗試製作服務的副本。但不幸的是CBPeripheral,CBService和CBCharacteristic都沒有采用NSCopying。有另一種方式來存儲它們嗎? – 2013-02-15 07:49:48

+0

您可以將Pripheral放入數組中。您可以使用NSUserDefaults類 – 2013-02-19 12:23:28

回答

6

我試過高速緩存外圍,服務和存儲特性的對象和手動緩存不起作用。一旦與外設斷開連接,服務和特性對象就不再有效。事實上,即使CBPeripheral也可以從你下面更換 - CoreBluetooth有一個內部行爲,其中設備UDID每隔幾分鐘就會更改一次(如果CBPeripheral是另一個iOS設備)。

但是,如果您正在運行iOS 6開發,則有一種方法可以加快速度。如果您在WWDC 2012上進行高級藍牙通話,您將看到關於緩存服務和特性的幻燈片。本質上,操作系統可以將它們全部緩存爲,但僅適用於配對設備。要進行配對,您需要對認證錯誤不足的寫入請求做出響應。例如,對於在iOS周圍,你會寫是這樣的:

- (void)peripheralManager:(CBPeripheralManager *)peripheralManager didReceiveWriteRequests:(NSArray *)requests { 
     ... 

     [peripheralManager respondToRequest:request withResult:CBATTErrorInsufficientAuthentication]; 

     ... 
} 

這將彈出一個對話框配對在iOS周,在此之後,你會配對。除此之外,您不必更改代碼 - 只需像正常情況調用discoverServices等,它們將更快(即時)響應。

我也在10.8.3上測試了這種行爲,它似乎不起作用。所以,我不知道在OS X上加快速度的方法(除了保持與外設的連接)。

+0

謝謝你的回答。我已經填寫了一份錯誤報告,蘋果告訴我,他們正在緩存服務和特性。但我已經用我的外設測試過了,我看到了相同的連接間隔。這種緩存僅適用於2個iOS設備還是第三方外設? – 2013-04-18 15:13:06

+1

如果您使用第三方外設建立加密鏈接,它應該可以使用。自己沒有測試過。 – 2013-04-23 18:33:44

+0

它是一個加密的連接?因爲目前我連接到我的外設沒有任何加密 – 2013-04-25 20:45:25

3

iOS 7增加了額外的緩存(iOS 7: What's New in Bluetooth LE)。我看到,重新連接外設的時間少於100ms(平均約80ms),發現服務,發現特性並閱讀單個特性的價值。

我的測試配置爲一臺iPad的空氣連接到一臺iPad 3

+0

Darrinm,你能指定文章中緩存解釋的確切位置嗎?我可能很愚蠢,我似乎無法找到它。 – Max 2014-01-08 19:49:36

+0

@Max沒有太多的解釋,只有「外圍數據緩存增強了每個特性和服務的更多數據,包括每個特性的最後一個已知值。」因此,我計算了整個連接/發現服務/發現特性/讀取值過程,以瞭解新緩存所作的改進。 – darrinm 2014-01-09 02:02:41