Linux 将BlueZ堆栈用作外围设备时的有效负载错误

Linux 将BlueZ堆栈用作外围设备时的有效负载错误,linux,bluetooth,raspberry-pi,bluetooth-lowenergy,bluez,Linux,Bluetooth,Raspberry Pi,Bluetooth Lowenergy,Bluez,我试着按照戴维德格林提供的步骤去做。以下是我使用的命令: 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 0x

我试着按照戴维德格林提供的步骤去做。以下是我使用的命令:

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 
匹配
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
我错过了什么让它工作

更新:
按照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 
更新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
所以还是没有快乐。
尝试一个不同(可能更旧)版本的bluez有意义吗?或者它可能与硬件相关,我应该尝试使用不同的蓝牙加密狗

更新3:
在适用于David的Bluez5.21上尝试了同样的方法

下面是
hcidump--raw
输出的一个片段

af:08:0a:02:02:01:02
b7:08:0a:02:02:01:02
be:08:0a:02:02:01:02
...
> 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:
尝试了不同的硬件加密狗(如David所建议的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
正如您所看到的,负载几乎完成了,但是缺少最后一个字符。通过将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
因此,对于未来(以及不同的有效负载):所需的长度似乎是有效负载的字节(不带length属性)——在本例中为17

重要提示:它不适用于
bluez5.26
对于我来说,我现在正在使用
bluez5.21

两个问题:

首先,为了让BlueZ播发,您提供的字节序列必须包含有效的BLE播发头,这至少是8个字节。因此,要宣传“helloworld”,您实际上需要发送:

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

前8个字节是头,后10个字节是编码为8位ASCII的字符串“helloworld”

前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
命令结合使用。请参见此处了解详细信息:

谢谢,这很有意义,但仍然没有收到我想要发送的内容(请参见更新的问题)。请参见我的更新答案,以及如何在扫描时查看原始字节的说明。我已经在使用
hcidump--raw
(在OP的更新中删除了非有效负载信息,应该可以更好地说明这一点)。我检查了你链接的问题,但除了过滤,我认为第二个步骤,一旦我可以有有效载荷出现在任何地方,我没有看到任何其他步骤,我错过了。试着在你的广告结尾加上十几个额外的00字节。我见过BlueZ有时拒绝拍摄广告。此外,这些指令已在GBU521加密狗上进行了测试。不同的加密狗可能无法完全与BlueZ配合使用。你用的是哪一款?你可以尝试的另一件事是使用不同的检测器应用程序(Android和iOS都有很多),这样你就可以看到是发射机还是接收机导致了问题。
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
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)