用hcidump获取RSSI

为了读取原始的RSSI值,我们使用一个名为Hcidump的实用程序来监视蓝牙HCI数据。 使用hcidump命令,当收到查询响应消息时,我们可以读取原始的RSSI值。 为了获得每个响应分组的RSSI值,我们首先将查询模式设置为使用RSSI进行查询。为了读取原始RSSI值,我们运行hcidump工具,然后使用适当的HCI函数开始周期性查询。

我不知道如何使用hcidump只包含RSSI原始数据或者如何启动定期查询。 我看到所有的观点,但我不能。

我让hcidump –raw获取原始数据,并试图parsing这个数据来获取rssi,但是我不知道这个是什么hex是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字节的大小。