Неправильная полезная нагрузка при использовании стека 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

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

Обновить:
Следуя совету Дэвида, я изменил значения 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, который работает для David.

Вот фрагмент 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

Как видите, полезная нагрузка почти завершена, но последний символ отсутствует. Изменяя атрибут длины на 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 команда. Подробности смотрите здесь: /questions/47616186/mozhet-li-raspberrypi-s-ble-dongle-obnaruzhivat-ibeacons/47616200#47616200

Другие вопросы по тегам