Использование hcitool для установки пакетов объявлений

Существует известное сообщение в блоге о том, как установить USB-ключ usb bluetooth для iBeacon. Это сводится к этой магической команде:

sudo hcitool -i hci0 cmd 0x08 0x0008 1e 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 00 00 00 00 00 00 00 00 00 00 00 00 00

Проблема с этим примером заключается в том, что это настолько непрозрачно, что трудно использовать его в более общем формате. Мне удалось немного разбить его:

sudo hcitool -i hci0 cmd

отправляет команду hci на устройство hci0

0x08 0x0008 

просто волшебство для установки рекламного пакета, другие команды stackoverflow сказали "просто используйте его, не спрашивайте

1e

- это длина ВСЕГО следующего пакета данных в байтах

02 01 1a 1a

Есть флаги для настройки пакета объявлений (подробности по запросу)

ff 4c 00 ...

- это "данные компании", которые кодируют информацию iBeacon

То, что я пытался сделать, это заменить байты "FF..." на коды операций для установки параметра NAME "04 09 41 42 43" (который должен установить его на ABC), но это не работает.

Я удивлен, что hcitool не дает нам некоторых примеров того, как установить пакет объявлений, поскольку это было бы очень полезно при настройке всех других параметров (например, TEMP или POWER). Кто-нибудь еще имел опыт использования hcitool для установки таких вещей, как NAME?

Ответ 1

Поздний ответ, но кто-то может найти это полезным. Я нашел это, когда сам искал решения при использовании hcitool.

Если вы используете hcitool cmd --help, он скажет вам что-то вроде этого cmd <ogf> <ocf> .... Это помогает посмотреть Спецификация Bluetooth Core, чтобы узнать, какие 0x08 и 0x0008 будут для OGF и OCF. В частности, Vol. 2, часть E, 7.8

Для команд контроллера LE код OGF определяется как 0x08

и для OCF 0x0008

Advertising_Data_Length, Advertising_Data​​p >

Итак, в основном, с 0x08 0x0008 вы говорите, что вы устанавливаете (в контроллере LE) длину отправляемых данных. Что касается имени, так как длина рекламного пакета BLE составляет 31 байт (1E), вам необходимо отправить целых 31 байт. Поэтому, если у вас есть только ABC в качестве имени, установка 04 09 41 42 43 верна, но это всего пять байтов. Для 31 вам нужно добавить 00 26 раз. Просто будьте осторожны, вы не добавляете слишком много или слишком мало.

Кроме того, у меня не сложилось впечатление, что объявление BLE. пакеты имеют фиксированный размер в 31 байт, но они, по крайней мере, для hcitool. Это не работает, когда вы специально устанавливаете исходящий размер на меньшее, чем 1E.

Ответ 2

Нет. Ни один из этих ответов не является правильным и чистым. 1) У BLE есть отдельный набор команд. Команда LE Set Advertising Data должна использоваться (см. 7.8.7 vol 2 часть E).

2) LE Set Advertising Data намного сложнее, чем описано выше. Есть по крайней мере 2 поля длиной 1 октет, пакет должен быть длиной 32 байта, ноль заполнен, но первый байт длины не должен быть 0x1e (31), а длина значительной части, содержащей один или несколько заголовков. Каждый заголовок по-прежнему содержит длину, один байт типа AS (0x09 для локального имени) и имя.

SET LE LOCAL NAME:

hciconfig hci0 down
hciconfig hci0 up
hcitool -i hci0 cmd 0x08 0x0008 0c 0b 09 6c 69 6e 6b 6d 6f 74 69 6f 6e 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
hciconfig hci0 leadv 0

0x0c: длина следующей группы заголовков 0x0b: длина этого заголовка 0x09: AD Тип для полного имени rest 0x0a length - это имя

Ответ 3

Отправьте этот ответ на аналогичный вопрос. В основном описывается, как вы можете скачать гигантский документ Bluetooth Spec Spec и прочитать все команды, которые он вам предлагает. Вы можете использовать команду hcitool для выполнения любой из этих команд, если вы можете просто определить правильный формат (и выяснить, что на самом деле делают команды!)

Основная оговорка: я не пробовал самостоятельно указывать имя, но, взглянув на спецификацию, похоже, что это описано на стр. 482 спецификации в разделе "7.3.11 Write Local Name Command". В соответствии с этим команда состоит из:

OCF: 0x0013
Name (up to 248 bytes)

Итак, я бы попробовал такую ​​команду:

hcitool -i hci0 cmd 0x08 0x0013 41 42 43

Еще один совет: когда вы выдаете такие команды, попробуйте запустить hcidump &, чтобы команда выполнялась в фоновом режиме. Затем вы можете ввести экспериментальные команды hcitool (или даже команды hciconfig) и просмотреть аннотированные сведения о выполняемых командах (человеческих читаемых) и о том, какие ошибки произошли, если они есть.

Используя вышеприведенный совет, вы также можете попробовать выполнить hciconfig name abc, чтобы установить локальное имя, используя этот инструмент командной строки, в то время как вы выполняете hcidump & в фоновом режиме. Это должно показать вам правильные значения команд hcitool для использования.

Ответ 4

Похоже, вам нужно использовать две команды, а не одну. Данные iBeacon содержатся в данных "LE Set Advertising Data" и упомянуты в другом месте этой публикации. Чтобы увидеть дружественное имя BLE, вы можете использовать дополнительную команду "LE Set Scan Response Data", для этого требуется, чтобы ресивер сканировал ваше устройство (а не пассивно читал рекламный пакет). Таким образом, вы можете комбинировать пример Angelo с этим, чтобы установить устройство как iBeacon и установить "дружественное имя", которое является данными сканирования Response

sudo hcitool -i hci0 cmd 0x08 0x0008 1E 02 01 1A 1A FF 4C 00 02 15 E2 0A 39 F4 73 F5 4B C4 A1 2F 17 D1 AD 07 A9 61 00 00 00 00 C8 00
sudo hcitool -i hci0 cmd 0x08 0x0009 0c 0b 09 6c 69 6e 6b 6d 6f 74 69 6f 6e 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

Это сработало для меня, используя ящик Ubuntu с ключом BLE, а затем сканировав маяк, используя это приложение android BLE