From 1887570d7ae5f3ac3b354f913db955b2e638ab03 Mon Sep 17 00:00:00 2001 From: agent Date: Wed, 29 Jul 2026 03:06:12 +0000 Subject: [PATCH] =?UTF-8?q?feat(bridge):=20build=207=20OTA=20=E5=88=86?= =?UTF-8?q?=E9=98=B6=E6=AE=B5=E4=BA=8B=E4=BB=B6+=E5=86=99=E8=B6=85?= =?UTF-8?q?=E6=97=B6=EF=BC=88=E5=AE=9A=E4=BD=8D=E9=A6=96=E5=9D=97=E5=89=8D?= =?UTF-8?q?=E5=8D=A1=E7=82=B9=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tools/bridge_server.py | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/tools/bridge_server.py b/tools/bridge_server.py index ba85228..9fb550e 100644 --- a/tools/bridge_server.py +++ b/tools/bridge_server.py @@ -27,7 +27,7 @@ import platform import sys PROTOCOL_VERSION = 1 -SERVER_BUILD = 6 # 2026-07-29: read 增加 dis_model/dis_fw/spota_mem_info/spota_status_ro(SUOTA 审慎测试基线) +SERVER_BUILD = 7 # 2026-07-29: OTA 分阶段事件(mem_dev/gpio_map/block_sent/status)+写超时,定位卡点 EPD_SERVICE_UUID = "13187b10-eba9-a3ba-044e-83d3217d9a38" EPD_CHAR_UUID = "4b646063-6264-f3a7-8941-e65356ea82fe" @@ -163,23 +163,29 @@ class BleSession: payload = image + bytes([acc]) blocks = [payload[i:i + BLOCK_SIZE] for i in range(0, len(payload), BLOCK_SIZE)] + async def w(char, data, to=15.0): + await asyncio.wait_for( + self.client.write_gatt_char(char, data, response=True), to) + await self.client.start_notify(SPOTA_SERV_STATUS_UUID, _on_status) - events = [] try: - await self.client.write_gatt_char(SPOTA_MEM_DEV_UUID, MEM_DEV_SPI_FLASH, response=True) - await self.client.write_gatt_char(SPOTA_GPIO_MAP_UUID, GPIO_MAP_DEFAULT, response=True) + await w(SPOTA_MEM_DEV_UUID, MEM_DEV_SPI_FLASH) + yield {"event": "ota_stage", "stage": "mem_dev_ok"} + await w(SPOTA_GPIO_MAP_UUID, GPIO_MAP_DEFAULT) + yield {"event": "ota_stage", "stage": "gpio_map_ok"} for idx, block in enumerate(blocks, 1): - await self.client.write_gatt_char(SPOTA_PATCH_LEN_UUID, - len(block).to_bytes(2, "little"), response=True) + await w(SPOTA_PATCH_LEN_UUID, len(block).to_bytes(2, "little")) for i in range(0, len(block), WRITE_CHUNK): await self.client.write_gatt_char(SPOTA_PATCH_DATA_UUID, block[i:i + WRITE_CHUNK], response=False) + yield {"event": "ota_block_sent", "block": idx, "total": len(blocks)} await wait_ok(f"块 {idx}/{len(blocks)}") - events.append({"block": idx, "total": len(blocks)}) yield {"event": "ota_progress", "block": idx, "total": len(blocks)} - await self.client.write_gatt_char(SPOTA_MEM_DEV_UUID, END_SIGNAL, response=True) + await w(SPOTA_MEM_DEV_UUID, END_SIGNAL) + yield {"event": "ota_stage", "stage": "end_signal_ok"} await wait_ok("镜像校验") - await self.client.write_gatt_char(SPOTA_MEM_DEV_UUID, REBOOT_SIGNAL, response=True) + await w(SPOTA_MEM_DEV_UUID, REBOOT_SIGNAL) + yield {"event": "ota_stage", "stage": "reboot_sent"} finally: try: await self.client.stop_notify(SPOTA_SERV_STATUS_UUID)