Что такое профиль Bluetooth iBeacon

150

Я хотел бы создать свой собственный iBeacon с некоторыми Bluetooth-комплектами для низкоэнергетических устройств. Apple еще не выпустила спецификацию для iBeacon, однако некоторые разработчики аппаратного обеспечения реверсировали проектирование iBeacon из образца кода AirLocate и начали продавать комплекты разработки iBeacon.

Итак, что такое профиль Bluetooth iBeacon?

Bluetooth Low Energy использует GATT для обнаружения службы профиля LE. Поэтому я думаю, что нам нужно знать дескриптор атрибута, тип атрибута, значение атрибута и, возможно, разрешения атрибута атрибута iBeacon. Таким образом, для iBeacon с UUID E2C56DB5-DFFB-48D2-B060-D0F5A71096E0 основным значением 1 и второстепенным значением 1 будет служба профиля Bluetooth GATT?

Вот некоторые предположения, которые я сделал из обсуждения на форумах Apple и в документах.

  1. Вам нужно только просмотреть службу профилей (GATT) периферийного устройства Bluetooth, чтобы узнать, что это iBeacon.

  2. Ключи Major и Minor кодируются где-то в этой службе профиля

Вот некоторые компании с iBeacon Dev Kits, которые, кажется, уже поняли это:

Надеюсь, со временем у нас на Bluetooth.org появится профиль, подобный следующему: https://www.bluetooth.org/en-us/specification/adopted-specifications

PaulWoodIII
источник
на самом деле, теперь я поняла, что такое 4 значения атрибута
PaulWoodIII
@ Dan1One Я реплицировал сервис с использованием Light Blue, затем с помощью образца кода Apple AirLocate. Я не смог установить диапазон для дублированного сервиса. Я думаю, что есть что-то большее, также у Light Blue нет
указателя
Вы ищете способ создания iBeacon с CBPeripheralManager (который работает в фоновом режиме), или другой частью (не iOS) программного или аппаратного обеспечения? Это приведет к необходимой детализации.
Wain
@Wain Я пытаюсь установить на собственное оборудование, как отмечает первый абзац. Но, как я отметил в связанном вопросе, он может быть полезен для ответа на связанный вопрос с использованием CBPeripheralManager, рекламирующего iBeacon на заднем плане
PaulWoodIII,
1
Большой! Можете ли вы поделиться этой документацией здесь для будущих программистов, когда я задал вопрос в 2013 году, он определенно еще не существовал
PaulWoodIII

Ответы:

228

Для iBeacon с ProximityUUID E2C56DB5-DFFB-48D2-B060-D0F5A71096E0, основной 0, вспомогательной 0и откалиброванной мощностью передачи -59RSSI переданный рекламный пакет BLE выглядит следующим образом:

d6 be 89 8e 40 24 05 a2 17 6e 3d 71 02 01 1a 1a ff 4c 00 02 15 e2 c5 6d b5 df fb 48 d2 b0 60 d0 f5 a7 10 96 e0 00 00 00 00 c5 52 ab 8d 38 a5

Этот пакет может быть разбит следующим образом:

d6 be 89 8e # Access address for advertising data (this is always the same fixed value)
40 # Advertising Channel PDU Header byte 0.  Contains: (type = 0), (tx add = 1), (rx add = 0)
24 # Advertising Channel PDU Header byte 1.  Contains:  (length = total bytes of the advertising payload + 6 bytes for the BLE mac address.)
05 a2 17 6e 3d 71 # Bluetooth Mac address (note this is a spoofed address)
02 01 1a 1a ff 4c 00 02 15 e2 c5 6d b5 df fb 48 d2 b0 60 d0 f5 a7 10 96 e0 00 00 00 00 c5 # Bluetooth advertisement
52 ab 8d 38 a5 # checksum

Ключевой частью этого пакета является реклама Bluetooth, которая может быть разбита следующим образом:

02 # Number of bytes that follow in first AD structure
01 # Flags AD type
1A # Flags value 0x1A = 000011010  
   bit 0 (OFF) LE Limited Discoverable Mode
   bit 1 (ON) LE General Discoverable Mode
   bit 2 (OFF) BR/EDR Not Supported
   bit 3 (ON) Simultaneous LE and BR/EDR to Same Device Capable (controller)
   bit 4 (ON) Simultaneous LE and BR/EDR to Same Device Capable (Host)
1A # Number of bytes that follow in second (and last) AD structure
FF # Manufacturer specific data AD type
4C 00 # Company identifier code (0x004C == Apple)
02 # Byte 0 of iBeacon advertisement indicator
15 # Byte 1 of iBeacon advertisement indicator
e2 c5 6d b5 df fb 48 d2 b0 60 d0 f5 a7 10 96 e0 # iBeacon proximity uuid
00 00 # major 
00 00 # minor 
c5 # The 2's complement of the calibrated Tx Power

Любое устройство Bluetooth LE, которое можно настроить для отправки определенного объявления, может генерировать вышеуказанный пакет. Я настроил компьютер Linux с помощью Bluez для отправки этого объявления, и устройства iOS7, на которых запущен тестовый код Apple AirLocate, выбирают его как iBeacon с полями, указанными выше. См. Использование стека BlueZ в качестве периферийного устройства (рекламодатель)

Этот блог содержит полную информацию о процессе обратного инжиниринга.

davidgyoung
источник
Это круто! Именно то, что я искал. Но кто-нибудь может объяснить, как я могу вычислить контрольную сумму?
Бенджамин Грюнер,
У меня есть еще один вопрос для вас, чтобы помочь нам завершить спецификацию немного больше. Какой правильный интервал вещания в мс? Я заметил, что использование кода техасских инструментов, которое я использую в качестве основы для своего iBeacon, делает приложение Apple Airlocate несколько непонятным при отображении списка ближайших iBeacon.
PaulWoodIII
Является ли UUID / desireUUID профилем BLE, специфичным для iBeacon, или это зависит от производителя устройства? Каков предпочтительный способ различения устройств iBeacon: MAC-адрес BT, UUID или основные / второстепенные значения?
Nickaknudson
Дэвид, вам удалось настроить устройство iOS с определенным рекламным пакетом при использовании API Core Bluetooth GATT? Я не мог найти вариант. Вы можете определить пользовательские UUID для сервисов и характеристик, но не для рекламы.
Мигель
1
@ReinaldoJunior AD = Рекламные данные. Смотрите ссылки в ответ от slackhappy.
RenniePet
47

Похоже, на основе рекламных данных, в частности, данные производителя:

4C00 02 15 585CDE931B0142CC9A1325009BEDC65E 0000 0000 C5

<company identifier (2 bytes)> <type (1 byte)> <data length (1 byte)>
    <uuid (16 bytes)> <major (2 bytes)> <minor (2 bytes)> <RSSI @ 1m>
  • Идентификатор компании Apple (Little Endian), 0x004c
  • тип данных, 0x02 => iBeacon
  • длина данных, 0x15 = 21
  • uuid: 585CDE931B0142CC9A1325009BEDC65E
  • майор: 0000
  • несовершеннолетний: 0000
  • Измеренная мощность на 1 метре: 0xc5 = -59

У меня есть скрипт node.js, работающий в Linux с примером приложения AirLocate.

sandeepmistry
источник
К сожалению, скрипт больше не доступен. Не могли бы вы поделиться этим снова?
Thomaschaaf
@Thomaschaaf извините, я удалил здесь ссылку на старую версию в Github. Я также обновил bleacon, чтобы он не требовал порождения hcitool / hciconfig.
sandeepmistry
"Измеренная мощность на 1 метре: 0xc5 = -59", как вы рассчитываете от 0xc5 до -59?
andreasbecker.de
@ andreasbecker.de вы принимаете дополнение двух
sandeepmistry
@sandeepmistry ссылка на скрипт node.js теперь не работает.
Тедью
20

Просто чтобы согласовать разницу между ответом sandeepmistry и davidgyoung:

02 01 1a 1a ff 4C 00

Является частью спецификации формата рекламных данных [1]

  02 # length of following AD structure
  01 # <<Flags>> AD Structure [2]
  1a # read as b00011010. 
     # In this case, LE General Discoverable,
     # and simultaneous BR/EDR but this may vary by device!

  1a # length of following AD structure
  FF # Manufacturer specific data [3]
4C00 # Apple Inc [4]
0215 # ?? some 2-byte header

В AD отсутствует определение службы [5]. Я думаю, что сам протокол iBeacon не имеет отношения к GATT и обнаружению стандартных сервисов. Если вы скачаете программу iBeacon от RedBearLab, вы увидите, что они используют GATT для настройки параметров рекламы, но, похоже, это зависит от их реализации, а не от спецификации. Программа AirLocate, кажется, не использует GATT для конфигурации, например, в соответствии с LightBlue и другими подобными программами, которые я пробовал.

Ссылки:

  1. Базовый Bluetooth Spec v4, том 3, часть C, 11
  2. Том 3, Часть С, 18.1
  3. Том 3, Часть С, 18.11
  4. https://www.bluetooth.org/en-us/specification/assigned-numbers/company-identifiers
  5. Том 3, Часть С, 18.2
slackhappy
источник
Спасибо @slackhappy, я обновил свой ответ. 2-байтовый заголовок имеет тип данных 0x02, 0x15 = 21 длина данных.
sandeepmistry
спасибо @slackhappy это хорошо, но я могу задать глупый вопрос? Если бы я хотел отослать какое-нибудь сообщение типа «Приходи на бесплатный кофе» или что-то в этом роде, я бы просто заменил FFв вашем примере значение HEX моей строки? (а также обновить длину структуры AD до набора?)
Марк
6

Если причина, по которой вы задаете этот вопрос, заключается в том, что вы хотите использовать Core Bluetooth для рекламы в качестве iBeacon вместо стандартного API, вы можете легко сделать это, объявив NSDictionary, например:

{
    kCBAdvDataAppleBeaconKey = <a7c4c5fa a8dd4ba1 b9a8a240 584f02d3 00040fa0 c5>;
}

Смотрите этот ответ для получения дополнительной информации.

Senseful
источник
0

Профиль iBeacon содержит 31 байт, включая следующие

  1. Префикс - 9 байт - который включает в себя данные adv и данные производителя.
  2. UUID - 16 байт
  3. Major - 2 байта
  4. Незначительный - 2 байта
  5. TxPower - 1 байт

введите описание изображения здесь

Ambi
источник