10

我在iPhone 5S使用藍牙LE,我也做了以下內容:藍牙LE,在後臺scanForPeripheralsWithServices,提高速度

  • 我有一個藍牙外設和我已將其配置爲在發佈各20毫秒所有三個藍牙廣告頻道(37,38和39)。

  • 我已經配置我的應用程序UIBacgroundModes =藍牙中央在Info.plist中

  • 我已經開始了一個scanForPeripheralsWithServices像下面

代碼:

NSDictionary *options = @{ 
    CBCentralManagerOptionRestoreIdentifierKey:@"myCentralManagerIdentifier", 
    CBCentralManagerScanOptionAllowDuplicatesKey:[NSNumber numberWithBool:YES] 
}; 
self.manager = [[CBCentralManager alloc] initWithDelegate:self queue:nil options:options];  
[self.manager scanForPeripheralsWithServices:[NSArray arrayWithObject:[CBUUID UUIDWithString:@"<uuid removed>"]] options:options]; 

目前狀態是:

  • 在前景模式中的應用程序快速地接收廣告消息時,我開始外圍設備(在一秒鐘內)

  • 在背景模式下啓動外圍設備(其可以是可接受的,即使後該應用有時接收內如10秒內的廣告消息如果它不好),但它通常很長一段時間(幾分鐘或更長時間)沒有收到廣告,這對於應用程序來說不起作用。

的問題是:

是它在某種程度上可以提高其速率的iOS正在掃描藍牙4.0 LE外設當掃描應用程序在後臺?由於我不認爲有這樣的公共API,我正在尋找一個不是由Apple發佈的私有API。這是針對內部企業應用程序的,因此私有API將非常合適。

+0

@jesnolsson如何在啓動應用程序時查找CBUUID?我想在我的項目中做到這一點。 –

+0

你可能應該在SO上寫一個新的問題。但是爲了讓你開始,只需按照上面的代碼。服務的實際UUID特定於您所擁有的藍牙LE附件的種類,因此您需要查看實際的數字。爲此,我會推薦App Store上的LightBlue。 –

回答

5

背景模式對於掃描的工作方式不同。

  • 每一週邊時,才報告,觀察第一單時間(你不能跟蹤通過RSSI接近而無需連接到它,而在後臺模式下)。

  • 您可以向不在範圍內的外圍設備發起連接請求,當外圍設備可用時連接將完成。不必主動掃描(初始發現除外,因此您知道要連接哪個UUID)。

也許,您可以通過在後臺發送連接請求而不是掃描來解決問題。這樣,iOS知道你對某個特定外設非常感興趣,我可以想象這會影響發現時間。

根據您的目標,不同的方法可以通過將iPhone置於外設模式並在中央模式下使用當前的LE外設來反轉連接。似乎hackish,但如果它解決了你的情況的問題:爲什麼不:)

關於私人API:抱歉,我不知道一個會影響掃描參數。

+1

感謝您的回覆,這非常有趣,如果我在中央模式下製作iPhone外圍設備和配件,iPhone多久會宣傳自己?廣告能否在後臺運作良好,還是會遭受與掃描一樣低的廣告投放速度? 因爲我想從多個外圍設備獲取信息,所以連接並不適合用途。如果iPhone是一個外設,那麼也許這也是一個問題,因爲只有一箇中心可以與它通信? –

+1

iPhone的廣告時間間隔取決於它的啓動頻率(它隨着時間的推移會變得更慢)以及您的應用是否是後臺。它應該在後臺工作(在Info.plist中需要另一個背景模式鍵),不確定連接延遲(但是,您可以使用藍牙數據包嗅探器進行測量 - 請注意,您必須掃描所有3個廣告頻道,因爲iPHone不能配置爲僅使用一個)。 iPhone外設模式不符合標準,並允許多箇中心連接。 – Etan

+0

@Etan,關於你在答案中的第一點。 CBCentralManager可以監聽(和NSLog)centralManager:didDiscoverPeripheral:advertisementData:RSSI:,即使外設在後臺,我也可以獲得RSSI。你是指readRSSI?這有什麼不同?謝謝 – Spectravideo328