2

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

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

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

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

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

4

3 回答 3

3

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

于 2015-02-08T18:30:12.297 回答
1

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

于 2015-02-03T21:56:23.627 回答
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;
    }

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

于 2016-05-02T22:54:08.877 回答