IBeacons, сгенерированные под Mavericks OSX, но имеют несколько разных байтов от iOS

Я следую этому образцу проекта BeaconEmitter под OSX для создания образцов iBeacons для разработки приложения на iPhone. Приложение BeaconEmitter основано на учебнике от Мэтью Робинсон, и пока Apple не решит внедрить поддержку iBeacon в Core Location для OSX, единственная возможность генерировать iBeacon должен создать рекламный пакет с нуля с помощью IO Bluetooth Framework.

НО... это не работает!

Я также, конечно же, изучил код учебника AirLocate от Apple на iOS, да и между устройствами iOS, которые работают нормально. Но если вы попытаетесь создать iBeacon с OSX (BeaconEmitter) и получить его с устройством iOS (AirLocate), которое не работает.

У меня есть BLE RF Sniffer, основанный на чипе CC2540 TI, и с программным обеспечением TI сниффера в Windows. Поэтому я наблюдаю, что пакет iBeacons генерируется из AirLocate и из BeaconEmitter был немного другим.

Это iBeacon, созданный с помощью AirLocate: enter image description here

Thah is ibeacon, сгенерированный BeaconEmitter: enter image description here

После обратного инженера, сделанного в этом сообщении (потому что Apple еще не выпустила спецификации iBeacons), можно увидеть, что Adv PDU Header отличается от двух случаев. В OSX Type = 2 и TxAdd = 0, в iOS Type = 0 и TxAdd = 1.

Почему это различие?

В witch можно заставить OSX отправить тот же самый заголовок PDU Advout iOS?

Похоже, что и в первых 5 байтах AdvData два пакета не равны:

OSX: 02 01 06 1A FF

iOS: 02 01 1A 1A FF

Остальная часть полезной нагрузки AdvData соответствует сообщению обратной инженерии, указанному выше.

Опять же, почему эти байты отличаются?

Я не нашел, из какой части кода в выборке OSX это зависит.

ОБНОВЛЕНИЕ: ЭТО РАБОТАЕТ

Основная причина, по которой iBeacon, генерируемый BeaconEmitter, не была распознана AirLocate, является моей ошибкой. Я не понял, что AirLocate фильтрует некоторый конкретный пример UUID, то есть: E2C56DB5-DFFB-48D2-B060-D0F5A71096E0 или 5A4BCFCE-174E-4BAC-A814-092E77F6B7E5 или 74278BDA-B644-4520-8F0C-720EAF059935 не каждое значение UUID.

Таким образом, случайный UUID, сгенерированный BeaconEmitter, наверняка не совпадает с предварительно написанным UUID в AirLocate.

Если вы можете "заставить" UUID от BeaconEmitter с хорошим значением, AirLocate может его распознать:

BeaconEmitter

Итак, это успешное испытание в примере приложения iOS AirLocate:

AirLocate

Сохраняет различия в тех же байтах, которые описаны выше... что только сниффер может видеть:).

Ответ 1

Кажется, вы говорите об идентификаторе связи bluetooth между двумя конкретными устройствами. Он не случайный, потому что он всегда одинаковый для каждой пары устройств.

Он будет отличаться для разных пар устройств.

В любом случае, если у вас есть проблемы с маяками, вы можете использовать базовый bluetooth, который является более сложным, но он также достаточно старый и поддерживается большим диапазоном устройств и ОС