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

问题描述 投票:4回答:3

我的应用程序与外围设备的蓝牙通信有关。从发现到连接,每个功能都正常工作。虽然从应用程序断开外围设备,我已经编写了这样的代码

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

当我单击按钮时,上面的方法是调用和应用程序显示外围设备已断开连接,当我从应用程序中出来并查看设置/蓝牙/ .Peripheral正在显示已连接。如何停止连接外围设备级别,即在设置。请帮我解决问题。

ios objective-c iphone core-bluetooth
3个回答
6
投票

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

这是一个直接来自CBCentralManager文档的链接:

cancelPeripheralConnection:

讨论

此方法是非阻塞的,任何仍在等待外设的CBPeripheral类命令可能会也可能不会完成。由于其他应用程序仍可能与外围设备建立连接,因此取消本地连接并不能保证基础物理链路立即断开连接。但是,从应用程序的角度来看,外围设备被认为是断开的,并且中央管理器对象调用了centralManager:didDisconnectPeripheral:error:其委托对象的方法。

根据我的经验,如果您是使用外围设备的唯一应用程序,物理链接会很快断开连接,但如果您可能不像Apple明确指出的那样,其他应用程序可能会维持持久连接,这会导致物理链接不能尽管它已经向你说明它已经断开了。


1
投票

我知道这是一个老线程,但我想我会在这里为其他人添加一个潜在的解决方案。

您可以做的是发出一个命令,使外围设备重新启动,重置蓝牙连接。如果您的设备具有可以通过蓝牙发出的命令,那么您很幸运,否则,您需要访问外围设备的固件才能添加执行此操作的新命令。我不是固件人,所以我不能告诉你你到底需要做什么;我所知道的是我正在使用的设备有这样一个命令(它是专门用于我们设备的专有命令,不是蓝牙协议的一部分)并且只要我在调用cancelPeripheralConnection之前发出它就能保证断开连接。


1
投票

我们面临同样的问题,但我们设法通过使用来解决这个讨厌的错误(或API设计缺陷)

目标C.

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

迅速

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

奇怪的是,iOS不会取消与我们在外设中实现的外围设备的物理连接以执行断开连接,因此我们发送一个字符串表示应该发生断开连接。我们用了

目标C.

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

迅速

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

并且外围设备按预期断开连接。希望通过这个CoreBluetooth API漏洞帮助任何面临同样问题的人。

x是外围设备支持的特定cmd(即固件)

y是您要发送值的特定特征

© www.soinside.com 2019 - 2024. All rights reserved.