From 89335e0e8213f040a435a4c7d96e4bc81e3d6bfe Mon Sep 17 00:00:00 2001 From: agent Date: Tue, 28 Jul 2026 15:20:35 +0000 Subject: [PATCH] =?UTF-8?q?fix(bridge):=20connect=20=E6=94=B9=E6=89=AB?= =?UTF-8?q?=E6=8F=8F=E8=A7=A3=E6=9E=90=20BLEDevice=20=E5=86=8D=E8=BF=9E?= =?UTF-8?q?=EF=BC=88WinRT=20=E5=85=BC=E5=AE=B9=EF=BC=89+=20SERVER=5FBUILD?= =?UTF-8?q?=3D2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tools/bridge_server.py | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/tools/bridge_server.py b/tools/bridge_server.py index bae15ee..feb82fc 100644 --- a/tools/bridge_server.py +++ b/tools/bridge_server.py @@ -27,6 +27,7 @@ import platform import sys PROTOCOL_VERSION = 1 +SERVER_BUILD = 2 # 2026-07-28: connect 改为扫描解析 BLEDevice 后连接(WinRT 兼容) EPD_SERVICE_UUID = "13187b10-eba9-a3ba-044e-83d3217d9a38" EPD_CHAR_UUID = "4b646063-6264-f3a7-8941-e65356ea82fe" @@ -76,12 +77,25 @@ class BleSession: return {"devices": out} async def connect(self, address: str, timeout: float = 15.0): - from bleak import BleakClient + from bleak import BleakClient, BleakScanner await self.close() - self.client = BleakClient(address, timeout=timeout) + # Windows/WinRT 按地址直连常解析失败——先扫描拿到 BLEDevice(含地址类型/广播数据)再连 + deadline = asyncio.get_event_loop().time() + timeout + dev = None + while True: + remain = deadline - asyncio.get_event_loop().time() + if remain <= 0: + break + dev = await BleakScanner.find_device_by_address( + address, timeout=min(5.0, max(1.0, remain))) + if dev is not None: + break + if dev is None: + raise RuntimeError(f"设备解析失败(扫描未见 {address})") + self.client = BleakClient(dev, timeout=timeout) await self.client.connect() await self.client.start_notify(RXTX_CHAR_UUID, self._on_notify) - return {"address": address} + return {"address": address, "name": dev.name} def _on_notify(self, _sender, data: bytearray): self._id_buf.extend(data) @@ -199,6 +213,7 @@ class BridgeServer: async def _dispatch(self, op: str, req: dict): if op == "ping": return {"pong": True, "version": PROTOCOL_VERSION, + "build": SERVER_BUILD, "platform": platform.system()} if op == "scan": return await self.ble.scan(float(req.get("timeout", 5.0)))