如何在树莓派上设置 gatttool 的 BLE 连接超时?

Posted

技术标签:

【中文标题】如何在树莓派上设置 gatttool 的 BLE 连接超时?【英文标题】:How can I set the BLE connection timeout of gatttool on Raspberry Pi? 【发布时间】:2015-02-03 12:28:49 【问题描述】:

我使用以下命令连接到蓝牙文件外围设备:

gatttool -t 随机 -b xx:xx:xx:xx:xx:xx -I 并连接

如果给定的 MAC 地址存在,我没有问题。

如果给定的 MAC 地址不存在,gatttool 会尝试连接大约 40 秒,直到 gatttool 响应为“错误:连接错误:连接被拒绝 (111)”。

我的问题是,我如何以及在哪里可以更改 gatttool 的 40 秒连接超时?

【问题讨论】:

你的问题解决了吗? 【参考方案1】:

连接超时是在Linux内核的蓝牙模块(L2CAP_CONN_TIMEOUT)中定义的,在用户空间是无法改变的。 (还有另一个常量HCI_LE_CONN_TIMEOUT,但我不认为它用于此目的。)但是,我相信如果您关闭连接或终止进程,内核应该发送正确的 LE 创建连接取消命令,以便此后不久,您就可以与其他人联系。

【讨论】:

我正在使用 DBUS Bluez API,如果 BLE 设备在几秒钟内没有回复,看起来内核会发送 LE 创建连接取消请求。需要更改哪些内容才能使蓝牙正常工作【参考方案2】:

不幸的是,除非您想更改 gatttool 代码,否则我认为没有办法这样做。我之前看过,可以在代码中看到 gatttool 执行阻塞套接字“连接”调用。

【讨论】:

改gatttool代码没问题,但是找不到要改的参数。你能告诉我我需要改变什么吗?【参考方案3】:

如果您准备好更改 gatttool 代码,则需要在 Bluez 中的连接套接字上添加超时。

当我写 GattLib 时,我不得不做同样的解决方法以避免阻止重试。

您可以在此提交中看到我的更改:https://github.com/labapart/gattlib/commit/ee58e4cb64af6c698dea1fabb5b6d5e0fc174883

但主要的变化是以下几行:

    if (setsockopt (sock, SOL_SOCKET, SO_RCVTIMEO, (char *)&timeout, sizeof(timeout)) < 0) 
        fprintf(stderr, "l2cap_connect: Failed to setsockopt for receive timeout.\n");
        return -1;
    

    if (setsockopt (sock, SOL_SOCKET, SO_SNDTIMEO, (char *)&timeout, sizeof(timeout)) < 0) 
        fprintf(stderr, "l2cap_connect: Failed to setsockopt for sending timeout.\n");
        return -1;
    

如果您想编写自己的代码,您可能会对 GattLib 示例 ble_scan 感兴趣。

【讨论】:

请查看URL,它将有助于您提高内容质量

以上是关于如何在树莓派上设置 gatttool 的 BLE 连接超时?的主要内容,如果未能解决你的问题,请参考以下文章

在树莓派上设置 Leadshine DM860 双极驱动电机

在树莓派上设置无线静态IP

Windows 10 IoT Serials 4 - 如何在树莓派上使用Cortana语音助手

如何在树莓派上禁用睡眠

如何在树莓派上安装Android 6.0系统

如何在树莓派上安装python和GPIO库