2017-08-29 73 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外设实现中可用)。