我使用以下命令连接到蓝牙 le 外围设备:
- gatttool -t 随机 -b xx:xx:xx:xx:xx:xx -I
- 并连接
如果给定的 MAC 地址存在,我没有问题。
如果给定的 MAC 地址不存在,gatttool 会尝试连接大约 40 秒,直到 gatttool 响应为“错误:连接错误:连接被拒绝 (111)”。
我的问题是,我如何以及在哪里可以更改 gatttool 的 40 秒连接超时?
我使用以下命令连接到蓝牙 le 外围设备:
如果给定的 MAC 地址存在,我没有问题。
如果给定的 MAC 地址不存在,gatttool 会尝试连接大约 40 秒,直到 gatttool 响应为“错误:连接错误:连接被拒绝 (111)”。
我的问题是,我如何以及在哪里可以更改 gatttool 的 40 秒连接超时?
连接超时在 Linux 内核的蓝牙模块 ( L2CAP_CONN_TIMEOUT ) 中定义,无法在用户空间更改。(还有另一个常量HCI_LE_CONN_TIMEOUT,但我不认为它用于此目的。)但是,我相信如果您关闭连接或终止进程,内核应该发送正确的 LE Create Connection Cancel 命令,以便您可以此后不久与其他人联系。
不幸的是,除非您想更改 gatttool 代码,否则我认为无论如何都不会这样做。我之前看过,可以在代码中看到 gatttool 执行阻塞套接字“连接”调用。
如果您准备好更改 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;
}
ble_scan
如果您想编写自己的代码,您可能会对 GattLib 示例感兴趣。