gatttool 和 bluepy 断开连接,bluetoothctl 没有问题

Posted

技术标签:

【中文标题】gatttool 和 bluepy 断开连接,bluetoothctl 没有问题【英文标题】:gatttool and bluepy disconnections, no issues in bluetoothctl 【发布时间】:2019-03-12 07:57:40 【问题描述】:

目前在 OH1 心率传感器上使用 (tiny.cc/mom03y)

我希望使用 bluepy 订阅 HR 通知。我的通知工作正常,但 OH1 设备在 bluepy 和 gatttool(远程用户终止)中大约 20-30 秒后断开连接,但在 bluetoothctl 中没有。

在 rasbian 4.14 上使用 bluez 5.50 和 bluepy 1.30 寻找连接在 bluetoothctl 而不是 bluepy 或 gatttool、code 和 hcidump 中保持活动的原因。

Bluepy


#packet count
packets = 0

class hrCallback(btle.DefaultDelegate):
    def __init__(self):
        btle.DefaultDelegate.__init__(self)

    def handleNotification(self, cHandle, data):
        global packets 
        packets += 1
        print("packet: %s Handle: %s HR (bpm): %s " % (packets, cHandle, data[1]))

#connect to OH1
mac = "a0:9e:1a:4f:ef:8b"
oh1 = btle.Peripheral( mac )
oh1.setDelegate( hrCallback() )

#start hr notification
oh1.writeCharacteristic(38, b"\x01\x00", True)

#listen for notifications
while True:
    try:
        if oh1.waitForNotifications(1.0):
            continue
    except btle.BTLEDisconnectError:
            pass

hcidump

> HCI Event: Command Complete (0x0e) plen 4
    LE Set Scan Parameters (0x08|0x000b) ncmd 1
    status 0x00
> HCI Event: Command Complete (0x0e) plen 4
    LE Set Scan Enable (0x08|0x000c) ncmd 1
    status 0x00
> HCI Event: Command Complete (0x0e) plen 4
    LE Set Scan Enable (0x08|0x000c) ncmd 1
    status 0x00
> HCI Event: Command Status (0x0f) plen 4
    LE Create Connection (0x08|0x000d) status 0x00 ncmd 1
> HCI Event: Command Status (0x0f) plen 4
    LE Read Remote Used Features (0x08|0x0016) status 0x00 ncmd 1
> HCI Event: Disconn Complete (0x05) plen 4
    status 0x00 handle 64 reason 0x13
    Reason: Remote User Terminated Connection

【问题讨论】:

使用 btmon 代替 hcidump。 bluetoothctlgattool 有区别吗? 感谢建议,btmon肯定提供了更好的调试工具,bluetoothctllink和gatttoollink日志不同。当前配置中的gatttool 似乎与ACL 数据包(行:113)有问题,需要深入调查以了解原因吗?你有什么建议吗? 【参考方案1】:

您使用的是哪个版本的 BlueZ?一些工具(例如 gatttool、hcitool、hciconfig)已弃用并被 bluetoothctl 和 btmgmt 取代,BlueZ 团队的建议是改用新工具。请查看以下链接:-

Deprecated BlueZ Tools

新工具与旧工具的区别在于,旧工具可以直接与内核接口,而新工具则通过与 D-Bus 接口来执行操作。

因此,建议始终使用 bluetoothctl,因为旧工具未得到维护,这可能就是您看到此问题的原因。

【讨论】:

以上是关于gatttool 和 bluepy 断开连接,bluetoothctl 没有问题的主要内容,如果未能解决你的问题,请参考以下文章

Gatttool:限制为 5 个连接?

如何在树莓派上设置 gatttool 的 BLE 连接超时?

如何在 Linux x86 上使用 C 对蓝牙 LE 设备进行编程?

python调用蓝牙之前期调研测试

哪个工具取代了 bluez5 中的 gatttool?

蓝牙设备连接/断开时广播?