iOS 6 - Bluetooth LE 断开连接

8

好的,iOS6在处理蓝牙LE断开连接方面有什么问题?以前设备会立即断开连接,但现在由于某种奇怪的原因,设备等待大约30-60秒才会断开连接。我需要立即断开连接!

我已经在互联网上搜索了很久,试图找出如何从外围设备发起立即断开连接的方法,我找到了this nifty email,其中解释了一种解决方法,即取消订阅服务特征的通知。

现在我认为我正在这样做...当我想要断开连接时,我调用[connected_device setNotifyValue:NO forCharacteristic:connected_characteristic]

然后,在didUpdateNotificationStateForCharacteristic功能中,我有...

if((int)characteristic.isNotifying == 0){
   [manager cancelPeripheralConnection:peripheral];
}

在函数 didDisconnectPeripheral 中...
connected_peripheral = nil;
connected_characteristic = nil;
[connected_peripheral release];
[connected_characteristic release];

我也仔细研究了苹果的CoreBluetooth温度传感器示例,但并没有什么帮助......任何关于此的帮助都将是惊人的!! 我只是不知道我缺少了什么.....
更新:看起来应用程序需要连接到蓝牙设备至少一分钟才能允许断开连接。如果应用程序连接超过一分钟,则在发送命令时立即断开连接。否则,它将等待到那个一分钟标记才实际断开连接。
更新:当我尝试在一分钟标记之前断开连接时,当设备实际断开连接时,日志会输出以下内容。
Oct 24 16:49:35 Christophers-iPhone awdd[8168] <Error>: libMobileGestalt copySystemVersionDictionaryValue: Could not lookup ReleaseType from system version dictionary
Oct 24 16:49:35 Christophers-iPhone awdd[8168] <Error>: CoreLocation: CLClient is deprecated. Will be obsolete soon.
2个回答

7

根据Apple的说法,这个新功能是“设计”出来的。 我们解决这个问题的方法是向外设发送一个命令,并让其从其端点断开连接。如果你这样做,那么断开连接将是立即的。我不知道为什么Apple从iOS5到iOS6改变了这种行为,但他们一定有他们的原因。当然,这个解决方案只在您可以访问外设固件并且可以更改它时才适用。如果有其他解决方案,那么我们还没有找到。


我在外设上执行了[self.peripheralManager stopAdvertising][self.peripheralManager removeAllServices],但它仍然不能立即断开连接。直到60秒后,我仍然可以看到右上角有一个白色填充的蓝牙图标... - achow
3
“According to Apple”?这个(官方的?)声明在哪里可以找到? - MdaG
只是想确认一下,向BLE设备发出断开连接的命令解决了我们遇到的问题。 - James Parker
我在iOS 9.1上仍然遇到这个问题 - 是否有解决此问题的新方法? - benchuk

0

这是iOS 6.0中的一个bug,在6.1中已经修复。


不,它在iOS7中不存在。请检查您的设备端。 - AlexeyVMP
即使我在didConnect中取消连接,也会有10秒的延迟直到物理链接断开。然而,应用程序认为自己已经断开连接,只是在最终断开连接之前(10秒后)不会从外设接收任何数据。文档甚至声称,在cancelConnection上没有保证物理链接将被切断。 - MdaG
据我所记,断开连接的消息是由设备发送回中心的。也许你的设备发送消息的速度不够快。 - AlexeyVMP
我曾经使用过许多BLE设备:心率监测器、自行车传感器、钥匙扣等等 - 在iOS7上,所有设备都按预期断开连接。 - AlexeyVMP
感谢您的输入。 - MdaG

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接