【问题标题】:Background Scan for Bluetooth Devices (inc. Apple AirPods) with known Peripheral UUID具有已知外设 UUID 的蓝牙设备(包括 Apple AirPods)的后台扫描
【发布时间】:2020-09-12 13:59:32
【问题描述】:

在我的 iOS 应用中,当我扫描蓝牙设备时,我会看到来自附近每个设备的外围设备 UUID 和其他数据,如下所示:

(uuid: 58B95943-A57E-F818-D3CC-9F8122C64D88, name: "iPad Pro"), advertisementPacket: ["kCBAdvDataRxSecondaryPHY": 0, "kCBAdvDataRxPrimaryPHY": 1, "kCBAdvDataIsConnectable": 1, "kCBAdvDataTimestamp": 612132622.292843, "kCBAdvDataTxPowerLevel": 12], rssi: -37

然后我希望在后台(应用关闭时)继续扫描具有特定 UUID 的单个设备,并在应用接近或可连接时收到通知。

请注意,许多设备(包括 Apple iPad 等)在广告包中没有 UUID。它们仅在外围信息中具有 UUID。

我尝试了几种方法:

  1. 有一种 Connect 方法,您可以在其中留下一个连接以请求蓝牙设备在后台等待,回调让您知道设备何时连接,但这不适用于从不连接的 Apple AirPods。

  2. 我知道我可以扫描具有已知服务 ID 的设备,如下所示: scanForPeripherals(withServices serviceUUIDs: [CBUUID(string: GATT ServiceCode]?, options... 但我在Bluetooth GATT Services Specifications website 上尝试了每个分配号,但似乎没有一个找到 Apple Airpods 或其他 Apple 设备。

我已经看到其他 iOS 应用程序在包括 Apple AirPods 在内的设备的后台运行,因此必须有一种方法来实现这一点。

【问题讨论】:

  • 后台蓝牙扫描所需的 serviceUUID 是该类型的所有设备公布的通用“服务”标识符(针对每个服务)。我认为 AirPods 不会宣传 serviceUUID,因此无法在后台模式下进行扫描。您能否举例说明在后台模式下能够扫描、检测和检测 AirPod 的应用程序?这可能会为它的发生方式提供线索。
  • 等等,不。 Above shared app description 有这个:它是如何工作的 -> 1. 打开 Wunderfind。 .. 那是在应用程序处于后台时找不到 airpods。你确定有应用程序在后台找到airpods吗?据我了解这是不可能的。
  • 您可以在此应用的 airpods 详细信息中选择“找到时通知”。然后关闭应用程序。一旦你靠近 airpods,它就会向你发送警报。
  • 我不认为 wunderfind 像你期望的那样工作(不过,这可能是我的手机/AirPod 版本的影响)。目前,我的 AirPods 就在我旁边,并且奇怪地发现它们最后一次被发现是在 15 分钟前。只有打开 AirPod 保护套,AirPods 才会开始做广告以便被检测到。

标签: ios swift bluetooth core-bluetooth


【解决方案1】:

您将设备标识符与服务标识符混淆了。 您为 iPad Pro 显示的 UUID 是 Core Bluetooth 在您的 设备上为 设备分配的标识符。世界上所有其他 iOS 设备都会收到该 iPad 的不同标识符。

设备可以宣传众所周知的 GATT 服务,例如电池信息、设备信息或“私人”服务。这些服务也由 UUID 标识。这些是您扫描的 UUID。例如。您的应用可以扫描宣传“心率监测器”服务的设备。

要查看广告中的特定服务,您需要在设备中运行的应用程序充当外围设备并宣传服务。

如果您的意图是了解此特定设备何时在附近,则方法是尝试保持与它的连接。

如果您 connect 连接到设备,那么当设备断开连接时(例如超出范围),您将收到一个委托回调。然后您可以立即发出另一个connect。此连接将处于挂起状态,直到设备回到范围内。然后 iOS 将重新连接,您将获得另一个委托回调。

【讨论】:

  • 我确实尝试了 Connect 方法,但它不适用于 AirPods。其他应用程序可以与 AirPods 一起使用,所以我假设它们是通过这种扫描方法来实现的。
  • 有没有办法找到 AiPod 的服务标识符?
  • 据我所知,AirPods 不会宣传应用可发现的 BLE 服务。 iOS 直接处理 AirPods。我见过的其他识别 AirPods 的应用程序是通过检测系统可用的音频设备来实现的。
  • 您可以扫描所有设备(无服务),但您只能通过名称识别 airpods,并且名称中不必包含“airpods”。您可以使用 BLE 数据包嗅探器来尝试识别 airpods 服务,但我不知道 Core Bluetooth 是否会接受它作为扫描标识符
  • 使用 services = nil 扫描在后台不起作用。
【解决方案2】:

您应该能够通过AVAudioSession route change notification 检测到 AirPods。

特别是将您的音频会话类别配置为playAndRecord,并将选项设置为allowBluetoothA2DP

编辑: 当您打开/关闭 AirPods(这是 wunderfind 找到它们时)时,我对蓝牙数据包进行了扫描。它显示了一个免提音频网关,因此如果您还没有尝试使用 AVAudioSession 来查看是否收到newDeviceAvailable 通知,这可能是他们进行检测的方式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-26
    相关资源
    最近更新 更多