From 961b0c170bdbc050ddd7cd46810771bdfa0319c8 Mon Sep 17 00:00:00 2001 From: huang <1724659546@qq.com> Date: Fri, 10 Oct 2025 15:00:01 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0lora=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main/config/config.py | 8 ++++---- main/lora/lora_mesh_uart_passthrough_manager.py | 8 +++++++- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/main/config/config.py b/main/config/config.py index eaecc18..2874503 100644 --- a/main/config/config.py +++ b/main/config/config.py @@ -32,10 +32,10 @@ LORA_CONFIG = { # e.g. 发送: EC 05 02 01 48 65 6c 6c 6f # (EC + 05(消息长度) + 0201(地址) + "Hello"(消息本体)) # 接收: 48 65 6c 6c 6f ("Hello") - # ED: 接收端会接收完整数据包,包含请求头 - # e.g. 发送: ED 05 02 01 48 65 6c 6c 6f - # (ED + 05(消息长度) + 0201(地址) + "Hello"(消息本体)) - # 接收: ED 05 02 01 48 65 6c 6c 6f + # ED: 接收端会接收完整数据包,包含自定义协议头和地址信息。 + # e.g. 发送: ED 05 12 34 01 00 01 02 03 + # (ED(帧头) + 05(Length, 即 1(总包数)+1(当前包序号)+3(数据块)) + 12 34(目标地址) + 01(总包数) + 00(当前包序号) + 01 02 03(数据块)) + # 接收: ED 05 12 34 01 00 01 02 03 56 78(56 78 是发送方地址,会自动拼接到消息末尾) 'lora_mesh_mode': 'ED', # 单包最大用户数据数据长度, 模块限制240, 去掉两位自定义包头, 还剩238 diff --git a/main/lora/lora_mesh_uart_passthrough_manager.py b/main/lora/lora_mesh_uart_passthrough_manager.py index af22405..31a58dc 100644 --- a/main/lora/lora_mesh_uart_passthrough_manager.py +++ b/main/lora/lora_mesh_uart_passthrough_manager.py @@ -135,7 +135,8 @@ class LoRaMeshUartPassthroughManager(ILoraManager): addr = int.from_bytes(packet[2:4], 'big') total_chunks = packet[4] current_chunk = packet[5] - chunk_data = packet[6:] + # 提取数据块,排除末尾的2字节源地址 + chunk_data = packet[6:-2] # --- 长度反向校验 --- # 根据协议,Length字段 = 2 (自定义头) + N (数据块) @@ -151,10 +152,15 @@ class LoRaMeshUartPassthroughManager(ILoraManager): log(f"LoRa: 收到单包消息,来自地址 {addr},长度 {len(chunk_data)}") return chunk_data + # 对于多包消息,只有当收到第一个分片时才清空缓存并设置期望分片数 if current_chunk == 0: log(f"LoRa: 开始接收新的多包会话 ({total_chunks}个分片)...") self._reassembly_cache.clear() self._expected_chunks = total_chunks + elif not self._reassembly_cache and self._expected_chunks == 0: + # 如果不是第一个分片,但缓存是空的,说明错过了第一个分片,丢弃当前分片 + log(f"LoRa: 收到非首个分片 {current_chunk},但未检测到会话开始,已丢弃。") + continue self._reassembly_cache[current_chunk] = chunk_data log(f"LoRa: 收到分片 {current_chunk + 1}/{self._expected_chunks},已缓存 {len(self._reassembly_cache)} 个")