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)