如何在树莓派上设置 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 双极驱动电机