Я следую этому образцу проекта 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:
Thah is ibeacon, сгенерированный BeaconEmitter:
После обратного инженера, сделанного в этом сообщении (потому что 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 может его распознать:
Итак, это успешное испытание в примере приложения iOS AirLocate:
Сохраняет различия в тех же байтах, которые описаны выше... что только сниффер может видеть:).