Получить рекламные данные для BLE в iOS

Я создаю приложение, которое получает UUID всех устройств BLE в радиусе действия. Я отлично работал в Android, где он дает мне рекламные данные в виде байтового массива. Теперь я пытаюсь сделать то же самое в iOS.

Я запускаю проверку и обнаруживаю устройство, а в обратном вызове есть NSDictionary, называемый advertData. Но единственная информация в нем такова:

kCBAdvDataChannel = 39;
kCBAdvDataIsConnectable = 1;
kCBAdvDataLocalName = jaalee;
kCBAdvDataTxPowerLevel = 0;

Я прав, думая, что я должен получить весь рекламный пакет? Если нет, как я могу его получить?

Ответ 1

К сожалению, iOS не позволяет вам получить доступ к необработанным рекламным данным. Я написал сообщение в блоге, демонстрирующее это. Хотя этот пост специально посвящен iBeacons, он относится к любой рекламе BLE.

РЕДАКТИРОВАТЬ: Чтобы уточнить, вы можете прочитать необработанные байты данных производителя или сервисные байты рекламных объявлений, отличных от iBeacon. Только рекламные объявления iBeacon скрывают байты данных производителя CoreLocation. Смотрите здесь: Получение данных отклика Bluetooth LE на iOS

Эквивалентные методы MacOS CoreLocation позволяют это сделать, поэтому это, вероятно, преднамеренное ограничение безопасности или энергосбережения в iOS.

Ответ 2

Основываясь на официальной документации от Apple iOS и моем личном опыте:

ДА, iOS не позволяет вам получать доступ к рекламным данным RAW.

НО

Если вы намерены размещать информацию в рекламном пакете и читать их из приложения iOS без подключения к периферии, это можно сделать. Ниже описано, как:

1) в периферийной прошивке вам необходимо вставить данные вашего производителя в рекламный пакет с типом данных GAP_ADTYPE_MANUFACTURER_SPECIFIC (0xFF) Помните, что в Специфических данных производителя первые два октета содержат код идентификатора компании, за которым следуют дополнительные данные, относящиеся к конкретному производителю.

2) в iOS

- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI

Вы можете просмотреть данные, указанные изготовителем, в словаре рекламы. с ключом:

CBAdvertisementDataManufacturerDataKey

3), если вы хотите, чтобы в вашем приложении получало уведомление о обратном вызове каждый рекламный пакет, отправленный периферийным устройством в iOS, не забудьте изменить параметр проверки на ДА. Посмотрите на этот пост: Core Bluetooth - постоянные обновления RSSI на внутренних устройствах

В моем сообщении в блоге скоро появится учебник: http://www.megabri.com/