更新lora逻辑

This commit is contained in:
2025-10-10 15:00:01 +08:00
parent c3d4531870
commit 961b0c170b
2 changed files with 11 additions and 5 deletions

View File

@@ -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

View File

@@ -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)}")