1

为了读取原始 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 值。

4

2 回答 2

2

您可以尝试使用它来获取附近所有蓝牙设备的名称和 RSSI 值。您可以在此处sudo hcidump [-a]查看您可以使用 hcidump 做什么。

于 2017-05-08T05:36:15.917 回答
0

我们可以通过检查工具背后的源代码来解决这个问题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 字节的大小。

于 2016-07-27T21:01:20.973 回答