2017-08-29 112 views
0

我注意到,當你在應用程序中斷開連接藍牙設備的iOS設備將繼續保持約10秒的連接。我試圖通過寫入一個特性來解決這個問題,該特性導致藍牙模塊取消與iOS設備的連接,但這不起作用(主要是因爲我更改了模塊,而iOS沒有看到更改,因爲我假設該設備被緩存在某處)。有沒有辦法讓代碼立即斷開連接?我目前使用的是快速命令 manager.cancelPeripheralConnection(peripheral)斷開時間爲iOS BLE

回答

1

不幸的是,沒有。告訴系統斷開外設的唯一方法是通過您已經使用的cancelPeripheralConnection方法。但是,如果您調用此方法,則不一定意味着外設將斷開連接。

背景

在iOS整個BLE連接管理由操作系統維護。這意味着沒有單個應用程序「擁有」連接。所有BLE功能都是多路複用的,以允許多個應用程序訪問中央和外圍設備。例如,如果您已經安裝了可在後臺跟蹤心率傳感器數據的健身應用程序,那麼您也可以在應用程序中「連接」心率傳感器,但無法觸發真正的斷開連接只要健身應用程序保持連接。

你已經注意到該斷開延遲基本上是操作系統的優化。如果沒有應用程序與外設保持連接,它將等待一段時間(以避免不必要的連接/斷開週期),然後觸發藍牙芯片上的斷開連接。

希望有所幫助。

+0

威爾具有BLE模塊解除強制操作系統丟棄連接,或將它仍然堅持呢? – Ubarjohade

+1

理論上應該可以工作,但有一些問題:首先,iOS會嘗試自動重新連接一段時間(使用綁定/配對時)。其次,您必須考慮連接參數,特別是連接監視超時和從屬延遲。他們確定我何時連接被認爲是丟失。如果從外設側斷開連接,則根據上述參數,中央設備仍將顯示連接。請參閱以下鏈接獲取更多信息:https://devzone.nordicsemi.com/question/60/what-is-connection-parameters/。 –

0

在iOS中,當你調用CBCentralManager方法cancelPeripheralConnection(CBPeripheral),它並不總是立即終止連接。作爲蘋果公司的文檔狀態:

Because other apps may still have a connection to the peripheral, canceling a local connection does not guarantee that the underlying physical link is immediately disconnected. From the app’s perspective, however, the peripheral is considered disconnected, and the central manager object calls the centralManager:didDisconnectPeripheral:error: method of its delegate object.

如果你有需要立即終止連接編程,說要騰出周邊將被另一中央設備相連,或與一個自己的安全層重置,則需要遵循在以下的StackOverflow線程描述的程序:

iOS 6 - Bluetooth LE disconnect

其是用於該應用發送自己的專有命令,告訴周通過正常手段斷開外圍設備(例如,「GAPRole_TerminateConnection」或「GAP_TerminateLinkReq」要麼 「LL_Disconnect」或「HCI_Disconnect [_ *]」,原因HCI_DISCONNECT_REMOTE_USER_TERM)。這總是起作用,並且由於連接監視超時而延遲而不是,因爲它是通知中央設備(即iOS)的正式斷開連接。監控超時(iOS中最多6秒; Android中默認20秒)僅在超出範圍時意外斷開連接或者外設斷開連接而不通知遠程設備時發揮作用,例如「LL_EXT_DisconnectImmed 「(僅在某些BLE外設實現中可用)。