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

Bluetooth 如何在Raspberry Pi上设置gatttool的BLE连接超时?,bluetooth,raspberry-pi,bluetooth-lowenergy,gatt,Bluetooth,Raspberry Pi,Bluetooth Lowenergy,Gatt,我使用以下命令连接到蓝牙le外设: gatttool-t random-bxx:xx:xx:xx:xx-I 连接 如果给定的MAC地址存在,我没有问题 如果给定的MAC地址不存在,gatttool将尝试连接约40秒,直到gatttool响应为错误:连接错误:连接被拒绝111 我的问题是,如何以及在何处更改gatttool的40秒连接超时 不幸的是,除非您想更改gatttool代码,否则我认为无论如何都没有办法做到这一点。我之前看过,在代码中可以看到gatttool执行阻塞套接字连接调用。连接超时

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

gatttool-t random-bxx:xx:xx:xx:xx-I 连接 如果给定的MAC地址存在,我没有问题

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


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

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

连接超时在Linux内核的蓝牙模块中定义,无法在用户空间中更改。还有一个常数,但我不认为它是用于这个目的的。但是,我相信如果您关闭连接或终止进程,内核应该发送适当的LE Create connection Cancel命令,以便您可以在此后不久连接到其他人。

如果您准备更改GATTOOL代码,则需要在Bluez中的连接套接字上添加超时

我在写代码时也不得不做同样的变通,以避免阻止重试

您可以在此提交中看到我的更改:

但主要的变化是以下几行:

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

更改GATTOOL代码没有问题,但我找不到必须更改的参数。您能告诉我需要更改什么吗?请检查此项,这将有助于提高您的内容质量。我正在使用DBUS Bluez API,如果BLE设备在几秒钟内没有回复,内核似乎会发送LE Create Connection Cancel请求。为了使Bluetooth正常工作,需要更改哪些内容?您的问题解决了吗?