Неправильная полезная нагрузка при использовании пакета BlueZ в качестве периферийного

Я попытался выполнить шаги, предоставленные davidgyoung в этом вопросе. Вот команды, которые я использую:

hciconfig hci0 up
hciconfig hci0 noleadv
hcitool -i hci0 cmd 0x08 0x0008 48 45 4c 4c 4f 57 4f 52 4c 44
hciconfig hci0 leadv

Что дает мне этот результат:

LE set advertise enable on hci0 returned status 12 
< HCI Command: ogf 0x08, ocf 0x0008, plen 10 
48 45 4C 4C 4F 57 4F 52 4C 44 
> HCI Event: 0x0e plen 4 
01 08 20 12 

Обратите внимание, что я не могу использовать запрошенную команду hciconfig hci0 leadv 0, потому что она выведет ошибку Warning: unknown command - "0".

Однако, когда я пытаюсь прочитать (например, с hcidump --raw) полезную нагрузку в объявленном пакете с другого устройства, я получаю такой вывод:

hcitool lescan -- duplicates выходной фрагмент (обе записи повторяются снова и снова, глядя на MAC-адрес, это должно быть одно и то же устройство):

00:1A:7D:DA:71:14 mint17-0
00:1A:7D:DA:71:14 (unknown)

соответствие hcidump --raw выходного фрагмента:

> 04 3E 16 02 01 04 00 14 71 DA 7D 1A 00 0A 09 09 6D 69 6E 74 31 37 2D 30 BE 
> 04 3E 12 02 01 00 00 14 71 DA 7D 1A 00 06 02 01 02 02 0A 08 AD     

Я использую ключи Bluez 5.26 и CSR4.0.
Это результат hciconfig рекламодателя:

hci0:   Type: BR/EDR  Bus: USB
    BD Address: 00:1A:7D:DA:71:14  ACL MTU: 310:10  SCO MTU: 64:8
    UP RUNNING PSCAN ISCAN 
    RX bytes:1242 acl:0 sco:0 events:77 errors:0
    TX bytes:2079 acl:0 sco:0 commands:77 errors:0

И это вывод hciconfig из "сканера":

hci0:   Type: BR/EDR  Bus: USB
    BD Address: 00:1A:7D:DA:71:13  ACL MTU: 310:10  SCO MTU: 64:8
    UP RUNNING PSCAN ISCAN 
    RX bytes:11753 acl:0 sco:0 events:552 errors:0
    TX bytes:1842 acl:0 sco:0 commands:75 errors:0

Что я пропустил, чтобы заставить его работать?

Update:
Следуя совету Дэвида, я изменил значения cmd на

hcitool -i hci0 cmd 0x08 0x0008 10 02 01 1a 0c ff 18 01 48 45 4c 4c 4f 57 4f 52 4c 44

получение этого выхода

< HCI Command: ogf 0x08, ocf 0x0008, plen 18
10 02 01 1A 0C FF 18 01 48 45 4C 4C 4F 57 4F 52 4C 44 
> HCI Event: 0x0e plen 4
01 08 20 12 

но все же тарабарщить полезную нагрузку (часть полезной нагрузки выхода hcidump --raw)

af:08:0a:02:02:01:02
b7:08:0a:02:02:01:02
be:08:0a:02:02:01:02
...

Обновление 2:
Следуя следующему совету, я попробовал добавить около 00 к полезной нагрузке:

< HCI Command: ogf 0x08, ocf 0x0008, plen 42
  10 02 01 1A 0C FF 18 01 48 45 4C 4C 4F 57 4F 52 4C 44 00 00 
  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  00 00 
> HCI Event: 0x0e plen 4
  01 08 20 12

И здесь hcidump --raw output

> 04 3E 16 02 01 04 00 14 71 DA 7D 1A 00 0A 09 09 6D 69 6E 74 
  31 37 2D 30 BF 
> 04 3E 12 02 01 00 00 14 71 DA 7D 1A 00 06 02 01 02 02 0A 08 
  AC 
> 04 3E 12 02 01 00 00 14 71 DA 7D 1A 00 06 02 01 02 02 0A 08 
  BF 
> 04 3E 16 02 01 04 00 14 71 DA 7D 1A 00 0A 09 09 6D 69 6E 74 
  31 37 2D 30 BF 
> 04 3E 12 02 01 00 00 14 71 DA 7D 1A 00 06 02 01 02 02 0A 08 
  AD 

Так что до сих пор нет радости.
Было бы целесообразно попробовать другую (возможно, более старую) версию bluez? Или это может быть связано с оборудованием, и я должен попытаться получить разные ключи Bluetooth?

Обновление 3:
Пробовал то же самое с bluez 5.21, который работает для Дэвида.

Здесь фрагмент вывода hcidump --raw

> 04 3E 0C 02 01 04 00 14 71 DA 7D 1A 00 00 D7 
> 04 3E 22 02 01 00 00 14 71 DA 7D 1A 00 16 02 01 0A 02 0A 08 
  0F 09 72 73 73 6D 74 2D 63 6C 69 65 6E 74 2D 30 D4 
> 04 3E 0C 02 01 04 00 14 71 DA 7D 1A 00 00 D4 
> 04 3E 22 02 01 00 00 14 71 DA 7D 1A 00 16 02 01 0A 02 0A 08 
  0F 09 72 73 73 6D 74 2D 63 6C 69 65 6E 74 2D 30 D2

Имя хоста изменилось (проверено на третьей машине до сих пор), поэтому выход немного отличается, но я до сих пор не вижу "hello world".

В этот момент любые идеи более чем приветствуются!

Обновление 4:
Пробовал другой аппаратный ключ (IOGEAR GBU521W6, как предложил Дэвид), и это выглядит очень многообещающим сейчас!

При использовании этой рекламной конфигурации:

hcitool -i hci0 cmd 0x08 0x0008 10 02 01 1a 0c ff 18 01 48 45 4c 4c 4f 57 4f 52 4c 44

Я получаю этот вывод hcidump --raw:

> 04 3E 1C 02 01 00 00 BA D0 63 70 F3 5C 10 02 01 1A 0C FF 18 01 48 45 4C 4C 4F 57 4F 52 4C B5

Как вы видите, полезная нагрузка почти завершена, но последний char отсутствует. Изменяя атрибут length на 11, я получаю полную полезную нагрузку:

hcitool -i hci0 cmd 0x08 0x0008 11 02 01 1a 0c ff 18 01 48 45 4c 4c 4f 57 4f 52 4c 44
----
> 04 3E 1D 02 01 00 00 BA D0 63 70 F3 5C 11 02 01 1A 0C FF 18 01 48 45 4C 4C 4F 57 4F 52 4C 44 AB

Итак, для будущего (и разных полезных нагрузок): требуемая длина, по-видимому, является байтами полезной нагрузки (без атрибута длины) - 17 в этом случае.

Важно: Это не работает с bluez 5.26 для меня, теперь я использую bluez 5.21.

Ответ 1

Два вопроса:

Во-первых, чтобы получить BlueZ для рекламы, последовательность байтов, которую вы поставляете, должна включать в себя действительный заголовок рекламы BLE, который составляет не менее 8 байт. Поэтому для рекламы "helloworld" вам действительно нужно отправить:

sudo hcitool -i hci0 cmd 0x08 0x0008 10 02 01 1a 0c ff 18 01 48 45 4c 4c 4f 57 4f 52 4c 44

Первые 8 байтов - это заголовок, а следующие 10 байтов - строка "helloworld" , закодированная как 8-разрядная ASCII.

Первые 8 байтов можно разбить следующим образом:

10 # Total length of the advertising packet
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)
0C # Number of bytes that follow in second (and last) AD structure
FF # Manufacturer specific data AD type
18 01 # Company identifier code (0x0118 == Radius Networks)

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

Во-вторых, вы не можете видеть необработанные байты обнаруженного объявления с помощью команды hcitool lescan. Чтобы просмотреть необработанные байты, вы должны использовать эту команду в комбинации с hcidump команда. Подробнее см. Здесь: fooobar.com/info/43564/...