当前位置: 首页 > 面试题库 >

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

艾浩穰
2023-03-14
问题内容

我试图按照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是否有意义?还是与硬件相关,我应该尝试购买其他蓝牙软件狗?

更新3:
使用适用于David的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:
尝试使用其他硬件加密狗( 如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。

重要提示: 它不适bluez 5.26用于我,我现在正在使用bluez 5.21


问题答案:

两个问题:

首先,为了使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个字节为编码为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命令结合使用



 类似资料:
  • 问题内容: 我试图在Linux机器上使用BlueZ堆栈来创建具有自定义服务和特征的GATT服务器。最终目标是使用任何中央设备(例如iOS或Android设备)连接到GATT服务器,发现服务和特征,并操纵特征中的数据。 例: 具有1个服务的外围设备,其中包含3个特征。 服务uuid​​ = 0xFFFF Char 1 uuid = 0xAAAA,属性=可读 字符2 uuid = 0xBBBB,属性=

  • 问题内容: 目标 :使用BlueZ和Bluetooth 4LE加密狗创建一个外围设备,用于宣传与“ Hello World”类似的蓝牙。 我现在在哪里 :我已经安装并下载了BlueZ堆栈,我可以使用hci工具来识别并查看蓝牙加密狗。我已经修改过hciconfig leadv,但我只是不太了解它/了解发生了什么。 我认为我需要什么帮助 :我需要进行下一步。如果有人可以将我引向一个好的资源,或者带我逐

  • > 目标:使用BlueZ和蓝牙4LE加密狗创建一个外设,宣传蓝牙相当于“你好世界”。 我现在的位置:我目前已经安装并下载了BlueZ堆栈,我可以使用hci工具识别和查看蓝牙加密狗。我已经修补了hciconfig leadv,但我只是不太了解它/了解发生了什么。 我想我需要什么帮助:我需要让它进入下一步。如果有人能为我指出一个好的资源,带我走过这条路,或者做任何事情,我将不胜感激。如果我需要做额外的

  • 我有一个巨大的JSON文件作为RESTAPI调用的有效负载发布,用于测试目的。我试过这样的方法: 并将错误获取为: 我可以通过读取文件和传递身体作为字符串运行,但我看到我可以直接传递文件对象,这不起作用。 经过充分的研究,它似乎不起作用。我已经放心地提出了这个问题。https://github.com/jayway/rest-assured/issues/674

  • 如果我运行此代码,我会收到错误RangeError:超出最大调用堆栈大小。但为什么呢?当我用9调用它时就发生了,斐波那契在这么小的数字下应该不是问题。

  • 我正在使用WinSCP和Nginx来托管我的应用程序,但是当我检查pm2的日志时,我一直得到这个错误。我检查了我的WinSCP,它说它包含了所有的文件夹,所以它似乎没有丢失任何东西 null