fix(bridge): connect 改扫描解析 BLEDevice 再连(WinRT 兼容)+ SERVER_BUILD=2

This commit is contained in:
agent committed 2026-07-28 15:20:35 +00:00
1 parent 49b2010088
commit 89335e0e82
1 file changed
+18 -3
+18 -3
View File
@@ -27,6 +27,7 @@ import platform
import sys import sys
PROTOCOL_VERSION = 1 PROTOCOL_VERSION = 1
SERVER_BUILD = 2 # 2026-07-28: connect 改为扫描解析 BLEDevice 后连接(WinRT 兼容)
EPD_SERVICE_UUID = "13187b10-eba9-a3ba-044e-83d3217d9a38" EPD_SERVICE_UUID = "13187b10-eba9-a3ba-044e-83d3217d9a38"
EPD_CHAR_UUID = "4b646063-6264-f3a7-8941-e65356ea82fe" EPD_CHAR_UUID = "4b646063-6264-f3a7-8941-e65356ea82fe"
@@ -76,12 +77,25 @@ class BleSession:
return {"devices": out} return {"devices": out}
async def connect(self, address: str, timeout: float = 15.0): async def connect(self, address: str, timeout: float = 15.0):
from bleak import BleakClient from bleak import BleakClient, BleakScanner
await self.close() 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.connect()
await self.client.start_notify(RXTX_CHAR_UUID, self._on_notify) 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): def _on_notify(self, _sender, data: bytearray):
self._id_buf.extend(data) self._id_buf.extend(data)
@@ -199,6 +213,7 @@ class BridgeServer:
async def _dispatch(self, op: str, req: dict): async def _dispatch(self, op: str, req: dict):
if op == "ping": if op == "ping":
return {"pong": True, "version": PROTOCOL_VERSION, return {"pong": True, "version": PROTOCOL_VERSION,
"build": SERVER_BUILD,
"platform": platform.system()} "platform": platform.system()}
if op == "scan": if op == "scan":
return await self.ble.scan(float(req.get("timeout", 5.0))) return await self.ble.scan(float(req.get("timeout", 5.0)))