RPyC调用树莓派Bleak时Asyncio事件循环异常求助
远程树莓派上通过RPyC运行Bleak(依赖asyncio)的问题
我正在搭建一套PC与树莓派相连的系统,通过RPyC和Paramiko实现远程连接,多数Python模块均可正常运行。但现在需要集成Bleak进行BLE通信,而Bleak依赖asyncio运行,遇到了如下问题:
第一次尝试:在本地PC创建asyncio事件循环
执行以下代码:
loop = asyncio.new_event_loop() asyncio.set_event_loop(loop) loop.run_until_complete(self.establish_connection(communication_address))
其中establish_connection函数定义:
async def establish_connection(self, communication_address: str): self.client = self._conn.modules.bleak.BleakClient(communication_address, loop=self.loop, winrt=dict(use_cached_services=False)) await self.client.connect()
出现报错:
E E ========= Remote Traceback (1) ========= E Traceback (most recent call last): E File "/tmp/tmp.kCmsm4m4Xz/rpyc/core/protocol.py", line 359, in _dispatch_request E res = self._HANDLERS[handler](self, *args) E File "/tmp/tmp.kCmsm4m4Xz/rpyc/core/protocol.py", line 863, in _handle_callattr E return self._handle_call(obj, args, kwargs) E File "/tmp/tmp.kCmsm4m4Xz/rpyc/core/protocol.py", line 837, in _handle_call E return obj(*args, **dict(kwargs)) E File "/home/pi/.local/lib/python3.9/site-packages/bleak/__init__.py", line 471, in connect E return await self._backend.connect(**kwargs) E File "/home/pi/.local/lib/python3.9/site-packages/bleak/backends/bluezdbus/client.py", line 108, in connect E device = await BleakScanner.find_device_by_address( E File "/home/pi/.local/lib/python3.9/site-packages/bleak/__init__.py", line 286, in find_device_by_address E return await cls.find_device_by_filter( E File "/home/pi/.local/lib/python3.9/site-packages/bleak/__init__.py", line 323, in find_device_by_filter E async with cls(detection_callback=apply_filter, **kwargs): E File "/home/pi/.local/lib/python3.9/site-packages/bleak/__init__.py", line 126, in __aenter__ E await self._backend.start() E File "/home/pi/.local/lib/python3.9/site-packages/bleak/backends/bluezdbus/scanner.py", line 174, in start E manager = await get_global_bluez_manager() E File "/home/pi/.local/lib/python3.9/site-packages/bleak/backends/bluezdbus/manager.py", line 890, in get_global_bluez_manager E loop = asyncio.get_running_loop() E RuntimeError: no running event loop
第二次尝试:在树莓派端创建asyncio事件循环
修改代码为:
loop = self._conn.modules.asyncio.new_event_loop() self._conn.modules.asyncio.set_event_loop(loop) loop.run_until_complete(self.establish_connection(communication_address))
出现新报错:
E ========= Remote Traceback (1) ========= E Traceback (most recent call last): E File "/tmp/tmp.m2HkW3qnwb/rpyc/core/protocol.py", line 359, in _dispatch_request E res = self._HANDLERS[handler](self, *args) E File "/tmp/tmp.m2HkW3qnwb/rpyc/core/protocol.py", line 837, in _handle_call E return obj(*args, **dict(kwargs)) E File "/usr/local/lib/python3.9/asyncio/base_events.py", line 626, in run_until_complete E future = tasks.ensure_future(future, loop=self) E File "/usr/local/lib/python3.9/asyncio/tasks.py", line 662, in ensure_future E if coroutines.iscoroutine(coro_or_future): E File "/usr/local/lib/python3.9/asyncio/coroutines.py", line 182, in iscoroutine E if isinstance(obj, _COROUTINE_TYPES): E File "/usr/local/lib/python3.9/abc.py", line 119, in __instancecheck__ E return _abc_instancecheck(cls, instance) E File "/usr/local/lib/python3.9/abc.py", line 123, in __subclasscheck__ E return _abc_subclasscheck(cls, subclass) E TypeError: issubclass() arg 1 must be a class
请问有人遇到过类似问题吗?或者有什么方法能让Bleak在远程树莓派上正确运行asyncio?
内容的提问来源于stack exchange,提问作者Linda Ednarsson
相关产品推荐
相关产品推荐

