Фоновое сканирование устройств Bluetooth (в c. Apple AirPods) с известным периферийным UUID - PullRequest
3 голосов
/ 26 мая 2020

В моем приложении iOS, когда я сканирую устройства Bluetooth, я вижу периферийный UUID и другие данные с каждого ближайшего устройства, как показано ниже:

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

Я затем wi sh для продолжения сканирования одного устройства с указанным c UUID в фоновом режиме (когда приложение закрыто) и получения уведомлений, когда приложение находится рядом или может быть подключено.

Обратите внимание, что многие из устройств (включая Apple iPad et c) не имеют UUID в рекламном пакете. У них есть UUID только в периферийной информации.

Я пробовал несколько подходов:

  1. Существует метод Connect, в котором вы оставляете соединение для запроса на ожидание устройства Bluetooth в фоновом режиме и обратный вызов позволяют узнать, когда устройство подключается, но это не работает для Apple AirPods, которые никогда не подключаются.

  2. Я знаю, что могу сканировать устройства с известными идентификаторами службы, например: scanForPeripherals(withServices serviceUUIDs: [CBUUID(string: GATT ServiceCode]?, options..., но я попробовал каждый номер назначения на веб-сайте спецификаций служб Bluetooth GATT , и ни один из них, похоже, не нашел Apple Airpods или других устройств Apple.

I видели, как другие iOS приложения работают в фоновом режиме для устройств, включая Apple AirPods, поэтому должен быть способ добиться этого.

Ответы [ 2 ]

2 голосов
/ 08 июня 2020

Вы должны иметь возможность обнаруживать AirPods через уведомление об изменении маршрута AVAudioSession .

В частности, настройте категорию аудиосессии на playAndRecord и установите параметр на allowBluetoothA2DP.

Изменить: я сканировал пакеты bluetooth, когда вы открываете / закрываете AirPods (когда wunderfind находит их). Он показывает аудиошлюз громкой связи, поэтому, если вы еще не пробовали использовать AVAudioSession, чтобы узнать, получите ли вы уведомление newDeviceAvailable, которое может быть тем, как они выполняют обнаружение.

enter image description here

2 голосов
/ 26 мая 2020

Вы путаете идентификаторы устройств с идентификаторами услуг. UUID, который вы показали для iPad Pro, - это идентификатор, который был назначен Core Bluetooth на вашем устройстве для этого устройства. Все остальные устройства iOS в мире получат другой идентификатор для этого iPad.

Устройства могут рекламировать хорошо известные услуги GATT, такие как информация об аккумуляторах, информация об устройстве или «частные» услуги. Эти службы также идентифицируются по UUID. Это UUID, которые вы сканируете. Например, ваше приложение может сканировать устройства, рекламирующие услугу «монитор сердечного ритма».

Чтобы увидеть определенные c услуги в рекламе, вам необходимо приложение, работающее на устройстве, действующее как периферийное устройство и рекламирующее услугу.

Если ваше намерение состоит в том, чтобы понять, когда это конкретное устройство находится поблизости, тогда подход будет заключаться в том, чтобы попытаться сохранить соединение с ним.

Если вы connect подключитесь к устройству, вы получите обратный вызов делегата, когда он отключается (например, выходит за пределы допустимого диапазона). После этого вы можете сразу же оформить еще один connect. Это соединение будет отложено, пока устройство не вернется в зону действия. Затем iOS подключится повторно, и вы получите еще один обратный вызов делегата.

...