如何在Raspberry Pi上设置gatttool的BLE连接超时?

时间:2015-02-03 12:28:49

标签: bluetooth raspberry-pi bluetooth-lowenergy gatt

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

  • gatttool -t random -b xx:xx:xx:xx:xx:xx -I
  • 并连接

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

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

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

3 个答案:

答案 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感兴趣。