我使用以下命令连接到蓝牙文件外设:
如果给定的MAC地址存在,我没有问题。
如果给定的MAC地址不存在,则gatttool尝试连接大约40秒,直到gatttool响应为"错误:连接错误:连接被拒绝(111)"。
我的问题是,如何以及在哪里可以更改gatttool的40秒连接超时?
答案 0 :(得分:3)
连接超时是在Linux内核的蓝牙模块(L2CAP_CONN_TIMEOUT)中定义的,并且无法在用户空间中更改它。 (还有另一个常量HCI_LE_CONN_TIMEOUT,但我不认为这是用于此目的。)但是,我相信如果你关闭连接或终止进程,内核应该发送正确的LE Create Connection Cancel命令这样你很快就可以联系到其他人。
答案 1 :(得分:1)
不幸的是,除非您想要更改gatttool代码,否则我认为无论如何都不会这样做。我之前看过,可以在代码中看到gatttool阻塞套接字“连接”调用。
答案 2 :(得分:0)
如果您准备更改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
感兴趣。