【发布时间】:2017-12-11 09:43:13
【问题描述】:
我正在使用 python 开发一个 Linux 应用程序,它将连接到我的 BLE 设备并通过通知特征来获取数据。我正在使用 pygatt 进行 BLE 通信。我可以成功连接并绑定到设备并读取/写入特征。即使我可以订阅通知特性,但问题是,我的 BLE 设备是一台定制机器,里面有 4 个计数器,每次计数器的数据发生变化时,它都会设置相应的通知标志,因此,使用 onDataChanged-像方法一样,我可以从读取特性中读取计数器的数据。在使用 pygatt 的 Python 中,我可以通过以下方式订阅通知特性:
class_name.device.subscribe(uuid.UUID(notify_characteristic),callback=notifyBle)
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
任何帮助将不胜感激。
PS:我在 Android 和 Windows UWP 中编写了完全相同的程序。使用 python,我的目标是在树莓派 3 上运行它。
PSS:我正在使用安装了 Ubuntu Mate 的 raspberry pi 3 在 python 中开发这个程序。
【问题讨论】:
-
查看 pygatt 的测试代码,我看到 BLEDevice 类有一个 receive_notification 函数。请参阅 github.com/peplin/pygatt/blob/master/pygatt/device.py 和 github.com/peplin/pygatt/blob/master/tests/test_device.py。从错误跟踪中,我认为问题在于在更改测试设备后尝试从设备读取时模块超时。进行更改后,您的设备是否正确列出了其特征?
-
@BoboDarph 我没试过,既然你让我试试,现在我试了一下,它说特征发现失败,当它点击 notifyBle 方法时。
-
你能检查一下你的设备的UUID在你修改的时候没有改变吗?或者您的设备在您更改后可以立即使用相同的 UUID 进行发现?这将是一个非常有趣的发现。如果是这样,那么很可能 self._save_charecteristic_callback 将失败并遇到 AttributeError 异常,可能是因为您设备的旧 UUID 不可用于查询。
-
@BoboDarph 设备的 UUID 是什么意思?服务和特性具有 UUID,可以通过 eeprom 内部的核心代码进行更改。
-
从您的代码中,我了解到您正在尝试通过从您的 read_characteristic 生成的 UUID 进行读取。从您列出的 pygatt 实现和错误中,我推断调用可能会失败,因为 UUID 要么不存在,要么在您拨动开关时以某种方式被更改。抱歉,如果我不能提供更多帮助。
标签: python python-3.x bluez