更新lora逻辑
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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)} 个")
|
||||
|
||||
Reference in New Issue
Block a user