BlueZ蓝牙API和距离校准精度

我正在使用BlueZ C API来编程我的蓝牙鼠标来读取距离。 我已经设置了一个蓝牙加密狗。 目前,我必须将鼠标从笔记本电脑(蓝牙加密狗)移动至少5-10英尺才能获得一些RSSI读数。 低于这个距离,我得到的大部分读数为0。

有没有办法使用这个API来获得更准确的RSSI值,以便我们可以跟踪这个范围内的距离?

int8_t Bluetooth::read_rssi(int to) { int dd = hciSocket; struct hci_conn_info_req *cr; bdaddr_t bdaddr; int8_t rssi; str2ba(bt_addr, &bdaddr); if (dd bdaddr, &bdaddr); cr->type = ACL_LINK; if (ioctl(dd, HCIGETCONNINFO, (unsigned long) cr) conn_info->handle), &rssi, 1000) < 0) { perror("Read RSSI failed"); exit(1); } return rssi; } 

hci_read_rssi可能不是你想要的。 它不是真正的远程RSSI。 从描述HCI_Read_RSSI命令的BT规范部分:

RSSI参数返回测量的接收信号强度指示(RSSI)与另一个BR / EDR控制器的连接手柄的黄金接收功率范围限制之间的差值。 控制器返回的任何正RSSI值表示RSSI高于上限的dB数,任何负值表示RSSI低于下限的dB数。 零值表示RSSI在黄金接收功率范围内。

我相信你想要的价值是查询/扫描中包含的价值。 我知道一种方法可以达到但不确定它是否可以接受或者它是否是最佳方式。

bluez dbus设备API将RSSI作为其中一个属性。 api doc可以在这里找到。

更新:我自己没有尝试过,但看起来pybluez支持获取查询RSSI。 看到这个pybluez的例子 。

这是bluez4的一个简单示例:

https://bitbucket.org/kaylum/bluez-rssi-example/src