蓝牙扫描未发现 iPhone 在设置应用程序中可见的设备 (CoreBluetooth)

ati*_*oSE 5 bluetooth ios core-bluetooth swift

更新:请记住,自 iOS 13 起,CoreBluetooth 现在支持 BLE 和经典蓝牙设备。

来自苹果

今年,我们将这两层合并在一起,现在,您无需执行任何操作即可透明地访问 BR/EDR 和低能量。现在,这对您来说意味着无需对 API 进行太多更改,您现在就可以使用经典设备和低能耗设备。[...] 现在将允许 GATT 与 BR/EDR 设备透明地使用。它仍然运行完全相同的蓝牙 SIG 协议。没有任何变化,因此您可以在蓝牙 SIG 网站上在线查看此规范。对于您的应用程序和开发人员来说,CBPeripheral API 是完全相同的。您仍然可以执行相同的服务发现并收到有关特征更改的通知。

注:BR/EDR 是指 4.0 之前的蓝牙规范的无线电技术,用于 LE 设备。更多信息请点击这里


我正在尝试使用 CoreBluetooth 扫描某些蓝牙设备,但无法发现它们。

我使用本次演讲中的Apple 示例代码作为参考。

这是中央管理器的初始化方式:

let cbManager = CBCentralManager(delegate: self, queue: nil)
Run Code Online (Sandbox Code Playgroud)

这就是我扫描外围设备的方式:

cbManager.scanForPeripherals(withServices: nil, options: [CBCentralManagerScanOptionAllowDuplicatesKey: true])
Run Code Online (Sandbox Code Playgroud)

由于我不知道serviceUUID最初应该连接到哪个,所以我使用 nil 作为 的列表进行扫描CBUUID

当发现外围设备时,我会通过 的centralManager(_:didDiscover:advertisementData:rssi:)方法收到通知CBCentralManagerDelegate,并且保留这​​些外围设备,这使我能够通过peripheral(_:didDiscoverServices:)的方法发现它们上的服务CBPeripheralDelegate

发现外围设备并发现其服务后,我下次可以通过以下方式直接连接到该外围设备:

cbManager.scanForPeripherals(withServices: [myDiscoveredService], options: nil)
Run Code Online (Sandbox Code Playgroud)

到目前为止,一切都很好。

但是,我似乎甚至无法开始使用未发现的设备。许多确实出现在蓝牙设置应用程序中的设备都会发生这种情况。

我怎样才能接触到那些设备清晰可见但我无法从代码中发现的设备?

如果我一开始就知道 serviceUUID 会有帮助吗?如何通过其他方式(可能使用其他工具)获取此类 serviceUUID?

我尝试过但不起作用的事情:

  • 使用新的Xcode 11 附加工具中的蓝牙资源管理器来获取有关设备的信息:尽管我可以获得有关目标蓝牙设备的大量信息(通过“显示设备发现”,然后“获取设备信息...”) ,我好像找不到合适的服务UUID

  • 使用数据包记录器在扫描时实时捕获 iOS 跟踪(来自相同的附加工具包):我看到 HCI 数据包和 HCI 事件,但我似乎无法从该流量中找出任何有价值的信息

我使用的是 iOS 13.2 和 Xcode 11.2

Rob*_*ier 5

CoreBluetooth 现在支持 BLE 和经典蓝牙设备。

这是对新功能的误解。正如引用的文字指出的那样,“现在将允许通过 BR/EDR 设备透明地使用GATT 。” (强调已添加)

GATT over BR/EDR 并不是蓝牙设备中特别常见的功能,并且与音频流设备无关。Core Bluetooth 仍然不支持 A2DP、HID 和 HFP 等其他配置文件。这些可能是您正在使用的设备支持的配置文件。

对于我们这些设计蓝牙产品的人来说,这个新功能确实相当强大和令人兴奋,但我们需要更新我们的固件来支持它。这不是你在硬件方面免费获得的东西。

  • 没有。iOS 13 中的核心蓝牙不支持 SPP。(这对我当前的产品之一有很大帮助,但它不可用。)如果设备经过 MFi(专为 iPhone 制造)认证,那么您可能可以与它们对话 IAP2与ExternalAccessory(而不是CoreBluetooth),它与SPP 有很多共同点。但没有SPP。 (2认同)