2013-10-29 93 views
1

我正在構建幾個BLE應用程序,並且遇到了我的BLE協議以及外部供應商的這個問題。在大多數情況下,BLE按預期工作,但有時它將無法發現針對特定外設的服務,並且在我重新啓動或重置手機之前不會再工作。xcode 5 CoreBluetooth未發現外圍設備的服務

有其他人遇到過這個問題嗎?

當我完成我的外圍設備時,經理將調用closePeripheralConnection方法。相關代碼:

// Disconnect from peripheral 
- (void)closePeripheralConnection 
{ 
    NSLog(@"== closePeripheralConnection =="); 
    // If the peripheral is connected 
    if (self.peripheral.state == CBPeripheralStateConnected && self.peripheral != nil) { 
     // Cancel connection 
     [self.manager cancelPeripheralConnection:self.peripheral]; 
    } else { 
     [self clearPeripheralSettings]; 
    } 
} 

// Clear peripheral settings 
- (void)clearPeripheralSettings 
{ 
    // Clear peripheral variables 
    self.peripheral = 0; 
    // Clear services 
    self.service = 0; 
    // Clear characteristic values 
    self.data = 0; 
    self.notifyCharacteristic = 0; 
} 

- (void)centralManager:(CBCentralManager *)central didDisconnectPeripheral:(CBPeripheral *)peripheral error:(NSError *)error 
{ 
    [self clearPeripheralSettings]; 
} 
+0

請描述你的使用場景。但是,iOS BLE堆棧很容易陷入「僵局」並完全停止工作。 – allprog

+0

@allprog在我開發時,我經常連接/斷開我的外設。外圍設備包含在用戶從外設發起連接時向其提供的數據。經理(我應用程序的一個視圖中的一個對象)將保持與外設的會話,直到接收完數據。此時,我取消了連接並執行了小的清理。請查看我最新的問題,瞭解經理如何推倒會議。 – abriggs

+0

@abriggs:你有解決上述問題的方法嗎? –

回答

2

根據代碼和您的評論,你沒有做任何壞事。核心藍牙框架的不穩定阻礙了你的工作。對於iOS 6來說,這些問題比iOS 7更常見,但嚴重的壓力仍然會讓事情發生。蘋果開發者論壇和藍牙開發郵件列表中充滿了類似的報告。如果您在測試過程中使用的這種用法對於每天的使用不常見,那麼問題可能與最終用戶無關。 (雖然仍然很煩人。)

我建議你儘量收集統計數據。註冊您調用每個API的次數,並嘗試爲Apple建立一些證明框架仍然不穩定的證據。將統計數據存儲在NSUserDefaults中可能是最簡單的解決方案。

無論如何,如果你有強大的數據可以作爲故障的證據,然後向蘋果報告錯誤,在開發者論壇發帖,發送郵件到藍牙開發列表。讓儘可能多的人聽到你的聲音。

+1

+1,感謝您的建議。令人遺憾的是蘋果公司仍然無法正常使用BLE。至少,他們應該讓我們能夠更好地控制BLE堆棧。由於我樂觀地尋找可能的解決方案,因此我沒有將您的答案標記爲已接受,但如果進一步的共識證明沒有解決方案,我會爲您提供道具。 – abriggs

+0

我一直在與BLE扯皮了很長一段時間(自從它變得可用以來),如果你能找到任何替代解決方案,我會是最快樂的。 – allprog

+0

很酷。那麼,我用蘋果的一個TSI。當他們回到我身邊時我會更新。 – abriggs

0

你什麼時候調用這個方法? - closePeripheralConnection

你也許可能想要在一個更詳細內容加入到索要外設在其連接以發現其服務中心經理回調委託

- (void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)peripheral { 

    NSLog(@"peripheral: %@ state: %@", peripheral.name, peripheral.state == CBPeripheralStateConnected ? @"Connected" : @"Disconnected"); 

    if (peripheral.state == CBPeripheralStateConnected) { 
     peripheral.delegate = self; 
     [peripheral discoverServices:nil]; 
    } 

} 
相關問題