为了读取原始RSSI值,我们使用了一个名为Hcidump的实用程序,它可以监测蓝牙HCI数据。使用hcidump命令,我们可以在收到查询响应消息时读取原始RSSI值。为了获得每个响应数据包的RSSI值,我们首先将查询模式设置为inquiry With RSSI。为了读取原始RSSI值我们运行hcidump工具,然后使用适当的HCI用于启动定期查询。
我不知道如何使用hcidump只保存RSSI原始数据,也不知道如何开始定期查询。我看到了所有的操作,但我不能。
我使hcidump--raw获得原始数据,并试图解析这些数据以获得rssi,但我不知道哪个十六进制是rssi信息。
这就是我获得的
04 2F FF 01 AC A2 65 92 88 EC 01 00 0C 02 5A 2D 1F D2 08 09
4E 65 78 75 73 20 36 17 03 05 11 0A 11 0C 11 0E 11 12 11 15
11 16 11 1F 11 2F 11 00 12 32 11 01 05 01 07 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
现在我需要知道哪个是RSSI值。
您可以尝试使用sudo hcidump [-a]
,这将获得附近所有蓝牙设备的名称和RSSI值。您可以在此处查看您可以使用hcidump做什么。
我们可以通过检查hcidump
工具背后的源代码来了解这一点。它是官方Linux蓝牙堆栈BlueZ的一部分。您可以在此处下载BlueZ源代码,以进行后续操作。如果打开源代码并进入lib/
文件夹,您可以找到hci.h
,它具有BlueZ的HCI函数的结构定义。否则,您可以查看Linux系统的头文件。路径应该类似于:/usr/include/bluetooth/hci.h
。在这个头文件中,您将找到BlueZ的HCI功能的所有结构定义。具体来说,您可以找到inquiry_info_with_rssi
的结构定义。头文件有几千行长,所以你最好搜索头文件,而不是试图浏览它。从这个结构和下面的#define
中,你可以看到结构的大小是14字节。rssi值是结构的最后一个成员,只有1个字节,因此它应该是您计数的第14个字节。
typedef struct {
bdaddr_t bdaddr;
uint8_t pscan_rep_mode;
uint8_t pscan_period_mode;
uint8_t dev_class[3];
uint16_t clock_offset;
int8_t rssi;
} __attribute__ ((packed)) inquiry_info_with_rssi;
#define INQUIRY_INFO_WITH_RSSI_SIZE 14
值得注意的是,__attribute__ ((packed))
是一个编译器预处理器,指示它不要填充结构,因此保证了14字节的大小。