在我的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。
我尝试了几种方法:
有一个Connect方法,您可以在其中保留连接以在后台等待蓝牙设备的请求,并且回调函数会在设备连接时通知您,但这不适用于永远不会连接的Apple AirPods。
我知道我可以扫描具有已知服务ID的设备,如下所示:scanForPeripherals(withServices serviceUUIDs: [CBUUID(string: GATT ServiceCode]?, options...
但是我在Bluetooth GATT Services Specifications website上尝试了每个分配编号,但它们似乎都找不到Apple Airpods或其他Apple设备。
我已经看到其他iOS应用程序在包括Apple AirPods在内的设备的后台运行,因此必须有一种方法来实现这一目标。
您正在将设备标识符与服务标识符混淆。您为iPad Pro显示的UUID是由Core Bluetooth在that]设备上为that]设备分配的标识符。世界上所有其他iOS设备将为该iPad收到一个不同的标识符。 设备可以宣传众所周知的GATT服务,例如电池信息,设备信息或“专用”服务。这些服务也由UUID标识。这些是您要扫描的UUID。例如。您的应用可能会扫描广告“心率监测器”服务的设备。
要查看广告中的特定服务,您需要在设备上运行的应用作为外围设备并宣传服务。
如果您打算了解此特定设备何时在附近,则方法是尝试维持与该设备的连接。
如果您connect
连接到该设备,则在断开连接时(例如,超出范围),您将收到委托回调。然后,您可以立即发出另一个connect
。该连接将一直挂起,直到设备返回范围。然后,iOS将重新连接,您将获得另一个委托回调。