【问题标题】:BlueZ Bluetooth API and distance calibration precisionBlueZ 蓝牙 API 和距离校准精度
【发布时间】:2015-07-13 13:03:37
【问题描述】:

我正在使用 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;
}

【问题讨论】:

    标签: c bluetooth bluetooth-lowenergy bluez


    【解决方案1】:

    hci_read_rssi 可能不是你想要的。这不是实际的远程 RSSI。来自描述 HCI_Read_RSSI 命令的 BT 规范部分:

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

    我相信您想要的值是查询/扫描中包含的值。我知道有一种方法可以实现,但不确定您是否可以接受或是否是最好的方法。

    bluez dbus 设备 API 具有 RSSI 作为属性之一。 api文档可以在here找到。

    更新:我自己没有尝试过,但看起来 pybluez 支持获取查询 RSSI。见this pybluez example

    这是 bluez4 的一个简单示例:

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

    【讨论】:

    • 您有任何从基于查询/扫描的 API 获取 RSSI 值的代码示例吗?你能分享更多细节吗?
    • 您使用的是哪个版本的 Bluez?我目前没有一个独立的例子可以分享。但是我不会花很长时间来写一个基本的例子。我将在一天左右的时间内通过代码链接更新答案。但请注意,我使用 glib 的 dbus 绑定,因此您需要安装该库。如果这不可接受,请立即告诉我,这样我就不会花时间在上面了。
    • 我在 Ubuntu 14.04 上使用 4.101 Bluez 版本。 TBH,我是全新的,我所了解的都是通过可用的开放示例。现在,我已经从可用示例中编写了一个 c++ 类(也发布在原始帖子中)。所以,我相信,拥有 glib /dbus 绑定应该没问题,只要它允许我更新我当前的 c++ 类。谢谢你的帮助。
    • 您的 Bluez 是什么版本?我正在使用 5。我问是因为 4 和 5 之间有显着的 dbus api 变化。所以我想确保该示例适用于您的环境。
    • @ZuzooVn 该技术与 bluez5 相同。只是 API 略有不同。如果您有具体的困难是您不理解的问题(在 cmets 中很难回答),请发布一个新问题。
    猜你喜欢
    • 1970-01-01
    • 2015-02-02
    • 2016-05-18
    • 2013-12-22
    • 2017-03-20
    • 2022-01-12
    • 2014-10-25
    • 2017-03-29
    • 2012-07-06
    相关资源
    最近更新 更多