Рекламируйте услугу Bluetooth LE с помощью HCITool
Я экспериментирую с созданием периферийного устройства с низким энергопотреблением Bluetooth на моем компьютере с Linux (цель состоит в том, чтобы отправлять данные через Bluetooth с iPhone). Я в настоящее время использую инструменты hciconfig
, hcitool
а также hcidump
,
Мой текущий эксперимент состоит в том, чтобы рекламировать Сервис с определенным UUID, который подберет библиотека iOS CoreBluetooth. (Примечание: я не пытаюсь создать iBeacon).
Прямо сейчас, это на самом деле так же просто, как One Single Command, которая меня беспокоит.
hcitool -i hci0 cmd 0x08 0x0008 15 02 01 1a 11 07 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50
Я думаю, что это должно сделать следующее:
- 0x08: установка группы в BLE
- 0x0008: установка команды для HCI_LE_Set_Advertising_Data
- 0x15: установка длины значащих байтов в заголовке равной 21. (3 байта для пакета флага, 18 байтов для структуры службы)
- 0x02: установка структуры длины флагов в 2 байта
- 0x01: установка типа структуры на флаги AD
0x1a: Значение флага:
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)
(Конец флага)
- 0x11 Установка длины структуры обслуживания на 17 байт
- 0x07 Установка типа структуры на 128-битный полный список UUID службы
- 0x41 ... 0x50 Установка UUID службы тестирования на ABCDEFGHIJKLMNOP
Насколько я могу видеть с hcidump
, он выполнен правильно и выглядит так, как я хотел. Но это отклонено с ошибкой:
LE Set Advertising Data (0x08|0x0008) ncmd 1
status 0x12
Error: Invalid HCI Command Parameters
И я провел целый день, пытаясь понять это правильно. Кто-нибудь опытный видит, что я сделал неправильно? И это правильный способ рекламировать Сервис?
(Контекст для Заинтересованного читателя: я успешно выполнил то, что хочу сделать, используя библиотеку Bleno в NodeJ. Однако это не вписывается в общую картину в нашей Системе. Использование HCITool напрямую для рекламы только для экспериментов и будет написано в питоне позже)
1 ответ
Длина полезной нагрузки HCI_LE_Set_Advertising_Data должна составлять ровно 32 байта. Попробуйте обнулить команду до 32 байтов:
hcitool -i hci0 cmd 0x08 0x0008 15 02 01 1a 11 07 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 00 00 00 00 00 00 00 00 00 00
Вы можете получить больше понимания, используя hcidump --raw.
Сравните вывод исходной команды:
$hcidump --raw
HCI sniffer - Bluetooth packet analyzer ver 5.30
device: hci0 snap_len: 1500 filter: 0xffffffffffffffff
< 01 08 20 16 15 02 01 1A 11 07 41 42 43 44 45 46 47 48 49 4A
4B 4C 4D 4E 4F 50
> 04 0E 04 01 08 2
С добавленным нулем:
HCI sniffer - Bluetooth packet analyzer ver 5.30
device: hci0 snap_len: 1500 filter: 0xffffffffffffffff
< 01 08 20 20 15 02 01 1A 11 07 41 42 43 44 45 46 47 48 49 4A
4B 4C 4D 4E 4F 50 00 00 00 00 00 00 00 00 00 00
> 04 0E 04 01 08 20 00
Еще один способ получить больше понимания, это запустить hciconfig hci0 leadv
и использовать hcidump --raw
проверить полезную нагрузку команды SET_ADVERTISING_PARAMETERS, отправленной hciconfig.
Кстати, я заметил, что иногда команда, отличная от нуля, также работает, это может зависеть от используемой вами версии bluez.