Как реклама службы iOS работает в фоновом режиме?

Как работает запатентованная технология Apple для фоновой рекламы службы GATT на iOS?

Согласно документации Apple, когда приложение iOS, использующее CoreBluetooth для реализации периферийного устройства BLE, находится в фоновом режиме, UUID службы больше не объявляются, а вместо этого помещаются в специальную «область переполнения»:

Любые UUID службы, содержащиеся в значении ключа CBAdverticingDataServiceUUIDsKey, которые не помещаются в выделенное пространство, попадают в специальную область «переполнения». Эти службы могут быть обнаружены только устройством iOS, явно сканирующим их. Пока ваше приложение работает в фоновом режиме, локальное имя не объявляется, и все UUID служб находятся в области переполнения. - developer.apple.com

Но что это за «область переполнения»? Как это работает?

Я установил сниффер Bluetooth и записал обмен данными BLE, но не нашел ни одного сообщение этого UUID Сервиса. Второму устройству iOS на переднем плане неоднократно удавалось успешно обнаруживать рекламу службы на фоновом устройстве iOS, но захват пакета ни разу не зарегистрировал UUID службы.

Так, как это работает?

Если я смогу понять, как это работает, я хотел бы попробовать запрограммировать устройство Android на использование того же процесса.


person davidgyoung    schedule 02.05.2020    source источник
comment
Вы читали github.com/crownstone/bluenet-ios? -basic-localization / blob /? Кажется, что данные производителя содержат небольшой отпечаток / хэш набора услуг, чтобы его можно было кэшировать. Разве центральный центр iOS не обнаружил периферийное устройство? Вместо этого вы должны использовать сниффер nRF, его можно легко использовать с wirehark и обычно перехватить запросы на соединение на любом канале, потому что он переключается на ch 38, когда видит пакет adv на 37, а затем на ch 39 и затем обратно.   -  person Emil    schedule 02.05.2020
comment
Я не видел той записи. Очаровательный! В нем говорится, что реклама проприетарного производителя содержит хэш битовой карты, где 1 в любой позиции указывает, что рекламируется любой из подмножества UUIDS службы. Если это правда, это говорит о том, что объявленный uuid сервиса никогда не известен и не проверяется iOS. Центральный сервер получает обратный вызов обнаружения, если установлен бит для желаемого UUID службы, даже если реклама исходит от iPhone, объявляющего другой UUID службы, который также использует этот бит из-за хеш-коллизии. Я сделаю несколько тестов, чтобы подтвердить. Спасибо, Эмиль!   -  person davidgyoung    schedule 03.05.2020


Ответы (1)


Область переполнения - это реклама производителя, отправляемая с устройств iOS, когда хотя бы одно приложение iOS рекламирует службу CoreBluetooth в фоновом режиме. Это выглядит так:

ff 4c 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80

ff обозначает рекламу производителя, 4c 00 байта соответствуют присвоенному Apple коду производителя 0x004C по Bluetooth SIG. 01 идентифицирует это как рекламу области переполнения. Последние 16 байтов (128 бит) представляют собой хешированную битовую маску объявленных услуг.

Каждый UUID сервиса, который вы объявляете, приведет к тому, что ровно один из этих 128 бит будет установлен в 1. Существует взаимно однозначное соответствие между UUID сервиса и битовой позицией, которую он устанавливает в этой битовой маске. Это одинаково для всех устройств iOS. Преобразование UUID службы в битовую позицию в битовой маске - это некоторый проприетарный алгоритм хеширования Apple.

Поскольку существует огромное количество возможных 128-битных UUID - 2 ^ 128 (около 10 ^ 38) - несколько UUID служб имеют одну и ту же битовую позицию.

Поскольку многие служебные UUID совместно используют каждую битовую позицию в битовой маске области переполнения, коллизии неизбежны. iOS предоставит обратный вызов сканирования с конфликтующим, но другим UUID службы. Такое случается нечасто. Но программисты должны понимать, что они могут сканировать свою службу только для того, чтобы получить обратный вызов для обнаружения фонового устройства iOS, рекламирующего совершенно другую службу, которая случайно столкнулась с битовой маской области переполнения.

Интересно, что областью переполнения можно управлять, чтобы два фоновых приложения iOS могли обмениваться данными в фоновом режиме. Дополнительную информацию см. в моем сообщении в блоге.

person davidgyoung    schedule 08.05.2020