CoreBluetooth:从应用程序断开外围设备连接

4

我的应用程序涉及与外围设备的蓝牙通信。从发现到连接,每个功能都能正常工作。但是在断开应用程序与外围设备的连接时,我编写了以下代码:

  -(void) disconnect
 {
 if (_selectedPeripheral != nil &&
    _selectedPeripheral.state != CBPeripheralStateDisconnected)
  {
    NSLog(@"Peripheral disconnecting");
    [_centralManager cancelPeripheralConnection:_selectedPeripheral];
    _selectedPeripheral = nil;
  }
 } 

当我点击按钮时,调用了上述方法,应用程序显示外围设备已断开连接,当我退出应用程序并查看设置/蓝牙/时,外围设备显示为已连接。如何在设备级别即设置中停止连接外围设备,请帮我找到正确的解决方案。

1
你是否将中心设备与外围设备配对了?不应该进行配对,因为设置应用程序会尝试重新连接外围设备。 - cxphong
cancelPeripheralConnection会断开您的应用程序与蓝牙设备之间的连接。如果设备已配对,则仍将保留在蓝牙设置页面中。如果您不希望它保留在该页面中,您应该只连接而不是配对该设备。 - Mihriban Minaz
你解决了吗? - User_1191
3个回答

8

您无法保证与外设断开系统级别的连接。

这是直接从CBCentralManager文档中摘录的链接:

cancelPeripheralConnection:

讨论

该方法是非阻塞的,任何仍在等待与外设通信的CBPeripheral类命令可能会完成,也可能不会完成。由于其他应用程序可能仍然连接到外设,取消本地连接并不能保证底层物理链接立即断开。然而,从应用程序的角度来看,外设被认为已经断开连接,并且中央管理器对象调用其委托对象的centralManager:didDisconnectPeripheral:error:方法。

根据我的经验,如果您是唯一使用外设的应用程序,则物理链接将很快断开,但如果您有可能不是,则苹果明确说明可能有其他应用程序正在维护持续连接,这将导致物理链接没有断开,尽管它向您表明已经断开连接。


2

我们曾经遇到过同样的问题,但是通过使用Objective C,我们成功地解决了这个讨厌的错误(或API设计缺陷)。

[peripheral writeValue:x forCharacteristic:y type:CBCharacteristicWriteWithResponse];

Swift

peripheral.writeValue(x, for: y, type: .withResponse)

奇怪的是iOS在外设执行断开连接操作后并没有取消与其物理连接,因此我们发送一个字符串表示应该进行断开连接。

我们使用Objective C实现。

[peripheral writeValue:x forCharacteristic:y type:CBCharacteristicWriteWithoutResponse];

Swift

peripheral.writeValue(x, for: y, type: .withResponse)

正如预期的那样,外设已经断开连接。

希望这个问题能够帮助到面临同样问题的任何人,因为这是CoreBluetooth API的缺陷。

x 是你的外设设备(即固件)支持的特定命令。

y 是你想要发送值的特定特征。


1
我知道这是一个旧的帖子,但我想为其他人添加一个潜在的解决方案。
您可以发出一个命令,导致外围设备重新启动,从而重置蓝牙连接。如果您的设备通过蓝牙可以发出这样的命令,那么您很幸运,否则,您将需要访问外围设备的固件,以添加一个新命令来执行此操作。我不是固件专家,所以我无法告诉您确切需要做什么;我只知道我正在使用的设备有这样一个命令(它是我们设备的专有命令,不是蓝牙协议的一部分),只要在调用cancelPeripheralConnection之前发出该命令,就可以保证断开连接。

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