如何使用python中的pygatt从BLE设备获取通知?

2024-04-29 13:52:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用python开发一个Linux应用程序,它将连接到我的BLE设备并通过通知characteristic获取数据。我正在使用pygatt进行BLE通信。我可以成功地连接和绑定到设备以及读/写特性。即使我可以订阅notify characteristic,但问题是,我的BLE设备是一个自定义机器,它内部有4个计数器,每次计数器的一个数据更改时,它都会设置相应的通知标志,因此,使用类似onDataChanged的方法,我可以从reading characteristic读取计数器的数据。在使用pygatt的Python中,我可以使用以下命令订阅notify characteristic:

class_name.device.subscribe(uuid.UUID(notify_characteristic),callback=notifyBle)

通知人是:

def notifyBle(self,handle,data):
    read_data = class_name.device.char_read(uuid.UUID(read_characteristic))
    print(read_data)

当我运行程序时,首先我扫描设备并连接到我的设备并与之绑定,然后我发现特征并列出它们。一切都是成功的。在列出特征之后,我写写特征来清除通知标志,它也很成功。最后我订阅通知特征它是成功的。

在所有这些过程之后,我物理地增加了设备的计数器(设备上有增加计数器的按钮)。当我按下按钮时,程序转到notifyBle方法,并给出错误,即:

Exception in thread Thread-3:
Traceback (most recent call last):
  File "/usr/lib/python3.5/threading.py", line 914, in _bootstrap_inner
    self.run()
  File "/usr/local/lib/python3.5/dist-packages/pygatt/backends/gatttool/gatttool.py", line 137, in run
    event["callback"](event)
  File "/usr/local/lib/python3.5/dist-packages/pygatt/backends/gatttool/gatttool.py", line 479, in _handle_notification_string
    self._connected_device.receive_notification(handle, values)
  File "/usr/local/lib/python3.5/dist-packages/pygatt/device.py", line 226, in receive_notification
    callback(handle, value)
  File "/home/acd/Masaüstü/python_workspace/ble.py", line 54, in notifyBle
    read_data = bleFunctions.dev.char_read(uuid.UUID(bleFunctions.read_characteristic))
  File "/usr/local/lib/python3.5/dist-packages/pygatt/backends/gatttool/device.py", line 17, in wrapper
    return func(self, *args, **kwargs)
  File "/usr/local/lib/python3.5/dist-packages/pygatt/backends/gatttool/device.py", line 40, in char_read
    return self._backend.char_read(self, uuid, *args, **kwargs)
  File "/usr/local/lib/python3.5/dist-packages/pygatt/backends/gatttool/gatttool.py", line 53, in wrapper
    return func(self, *args, **kwargs)
  File "/usr/local/lib/python3.5/dist-packages/pygatt/backends/gatttool/gatttool.py", line 519, in char_read
    self.sendline('char-read-uuid %s' % uuid)
  File "/usr/lib/python3.5/contextlib.py", line 66, in __exit__
    next(self.gen)
  File "/usr/local/lib/python3.5/dist-packages/pygatt/backends/gatttool/gatttool.py", line 180, in event
    self.wait(event, timeout)
  File "/usr/local/lib/python3.5/dist-packages/pygatt/backends/gatttool/gatttool.py", line 154, in wait
    raise NotificationTimeout()
pygatt.exceptions.NotificationTimeout

任何帮助都将不胜感激。

注:我在Android和Windows UWP中编写了完全相同的程序。对于python,我的目标是在覆盆子pi 3上运行这个。

PSS:我使用安装了Ubuntu Mate的覆盆子pi 3在python中开发这个程序。


Tags: inpyselfreadlibpackagesusrlocal