使用BlueZ堆栈作为外设时错误的有效负载

时间:2015-02-01 08:53:44

标签: linux bluetooth raspberry-pi bluetooth-lowenergy bluez

我尝试按照this question中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

这是'scanner''的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

我错过了什么才能让它发挥作用?

更新
按照David的建议,我将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是否有意义?或者它可以与硬件相关,我应该尝试使用不同的蓝牙适配器?

更新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,正如David 所建议的那样),现在看起来很有希望!

使用此广告配置时:

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

正如您所看到的,有效负载几乎已完成,但缺少最后一个字符。通过将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 个答案:

答案 0 :(得分:5)

两个问题:

首先,为了让BlueZ做广告,您提供的字节序列必须包含有效的BLE通告标头,最少为8个字节。所以要做广告&#34; helloworld&#34;你实际上需要发送:

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个字节是字符串&#34; helloworld&#34;编码为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)

请注意,此标题包含两个不同的长度字段,如果您更改&#34; helloworld&#34;的长度,则必须调整这些字段。有效载荷。此外,出于实验目的,欢迎您使用任意两个字节作为您想要的公司标识符。

其次,您无法使用hcitool lescan命令查看检测到的广告的原始字节。要查看原始字节,您必须结合使用此命令hcidump命令。有关详细信息,请参阅此处:https://stackoverflow.com/a/21790504/1461050