BlueZ Bluetooth API 和距离校准精度
BlueZ Bluetooth API and distance calibration precision
我正在使用 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 < 0) {
perror("HCI device open failed");
exit(1);
}
cr = (hci_conn_info_req *)(malloc(sizeof(*cr) + sizeof(struct hci_conn_info)));
if (!cr) {
perror("Can't allocate memory");
exit(1);
}
bacpy(&cr->bdaddr, &bdaddr);
cr->type = ACL_LINK;
if (ioctl(dd, HCIGETCONNINFO, (unsigned long) cr) < 0) {
perror("Get connection info failed");
exit(1);
}
if (hci_read_rssi(dd, htobs(cr->conn_info->handle), &rssi, 1000) < 0) {
perror("Read RSSI failed");
exit(1);
}
return rssi;
}
hci_read_rssi
可能不是您想要的。这不是实际的远程 RSSI。来自描述 HCI_Read_RSSI 命令的 BT 规范部分:
The RSSI parameter returns the difference between the measured
Received Signal Strength Indication (RSSI) and the limits of the
Golden Receive Power Range for a Connection Handle to another BR/EDR
Controller. Any positive RSSI value returned by the Controller
indicates how many dB the RSSI is above the upper limit, any negative
value indicates how many dB the RSSI is below the lower limit. The
value zero indicates that the RSSI is inside the Golden Receive Power
Range.
我相信您想要的值是 inquiry/scan 中包含的值。我知道有一种方法可以做到这一点,但不确定您是否可以接受或者是否是最好的方法。
bluez dbus 设备 API 将 RSSI 作为属性之一。 api 文档可以在 here.
中找到
更新:我自己还没有尝试过,但看起来 pybluez 支持获取查询 RSSI。参见 this pybluez example。
这是 bluez4 的一个简单示例:
我正在使用 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 < 0) {
perror("HCI device open failed");
exit(1);
}
cr = (hci_conn_info_req *)(malloc(sizeof(*cr) + sizeof(struct hci_conn_info)));
if (!cr) {
perror("Can't allocate memory");
exit(1);
}
bacpy(&cr->bdaddr, &bdaddr);
cr->type = ACL_LINK;
if (ioctl(dd, HCIGETCONNINFO, (unsigned long) cr) < 0) {
perror("Get connection info failed");
exit(1);
}
if (hci_read_rssi(dd, htobs(cr->conn_info->handle), &rssi, 1000) < 0) {
perror("Read RSSI failed");
exit(1);
}
return rssi;
}
hci_read_rssi
可能不是您想要的。这不是实际的远程 RSSI。来自描述 HCI_Read_RSSI 命令的 BT 规范部分:
The RSSI parameter returns the difference between the measured Received Signal Strength Indication (RSSI) and the limits of the Golden Receive Power Range for a Connection Handle to another BR/EDR Controller. Any positive RSSI value returned by the Controller indicates how many dB the RSSI is above the upper limit, any negative value indicates how many dB the RSSI is below the lower limit. The value zero indicates that the RSSI is inside the Golden Receive Power Range.
我相信您想要的值是 inquiry/scan 中包含的值。我知道有一种方法可以做到这一点,但不确定您是否可以接受或者是否是最好的方法。
bluez dbus 设备 API 将 RSSI 作为属性之一。 api 文档可以在 here.
中找到更新:我自己还没有尝试过,但看起来 pybluez 支持获取查询 RSSI。参见 this pybluez example。
这是 bluez4 的一个简单示例: