Files
lora_route_py/docs/algorithm_doc.md
sinlatansen d357a25076 只有hello包实现多跳,还没加入业务数据
具体的还要看opencode和gpt记录接着优化
2026-02-24 17:17:45 +08:00

11 KiB
Raw Permalink Blame History

LoRa多跳网络仿真系统技术文档

1. 系统概述

本仿真系统实现了一个基于梯度路由Gradient Routing的LoRa多跳网络仿真平台使用Python和SimPy离散事件仿真框架开发。系统旨在验证LoRa网络在多跳场景下的可靠性和性能为后续STM32WL硬件移植提供理论依据和算法验证。

1.1 主要特性

  • 梯度路由协议: 基于成本cost的分布式路由算法节点通过HELLO消息发现邻居并建立到Sink的路由
  • 可靠MAC层: 实现CSMA类退避算法和ACK确认机制支持数据包重传
  • 无线信道模型: 基于自由空间路径损耗的RSSI计算支持碰撞检测
  • 可观测性框架: 完整的路由收敛分析、跳数分布统计、信道利用率监测、丢包率分析

1.2 项目结构

lora_route_py/
├── sim/
│   ├── config.py           # 配置参数
│   ├── main.py             # 仿真主入口
│   ├── core/
│   │   ├── packet.py       # 数据包定义
│   │   └── metrics.py      # 指标收集系统
│   ├── routing/
│   │   └── gradient_routing.py  # 梯度路由协议
│   ├── mac/
│   │   └── reliable_mac.py     # 可靠MAC层
│   ├── radio/
│   │   ├── channel.py          # 无线信道
│   │   ├── propagation.py       # 传播模型
│   │   └── airtime.py          # 空口时间计算
│   ├── node/
│   │   └── node.py              # 节点实现
│   ├── analysis_tools/         # 分析工具
│   │   ├── topology.py
│   │   ├── convergence.py
│   │   ├── channel_analysis.py
│   │   └── reliability_analysis.py
│   └── tests/                  # 单元测试
│       ├── test_multihop_exists.py
│       ├── test_convergence.py
│       ├── test_reliability.py
│       ├── test_route_stability.py
│       ├── test_collision.py
│       └── test_channel_not_saturated.py
└── docs/
    └── algorithm_doc.md        # 本文档

2. 算法原理

2.1 梯度路由协议Gradient Routing

梯度路由是一种分布式、自组织的路由协议,灵感来源于蚂蚁觅食行为和自然梯度场。每个节点维护一个"成本"值cost表示到Sink节点的估计距离跳数+链路惩罚)。

2.1.1 成本计算

节点的成本由两部分组成:

  1. 跳数成本: 邻居节点的跳数 + 1
  2. 链路惩罚: 基于RSSI接收信号强度指示器计算
new_cost = neighbor_cost + 1 + link_penalty
link_penalty = max(0, (RSSI_THRESHOLD - RSSI) / LINK_PENALTY_SCALE)

其中:

  • RSSI_THRESHOLD = -105 dBm: 接收灵敏度阈值
  • LINK_PENALTY_SCALE = 8.0: 链路惩罚缩放因子

链路惩罚机制使得信号质量更好的链路具有更低的成本,从而优先选择高质量链路。

2.1.2 HELLO消息机制

每个节点定期默认8秒广播HELLO消息包含

  • 源节点ID
  • 当前成本值
  • 序列号

邻居节点收到HELLO后

  1. 解析发送方的成本
  2. 计算通过该邻居到Sink的成本
  3. 如果新成本更低,则更新父节点和成本

2.1.3 路由收敛

初始时只有Sink节点成本为0其他节点成本为∞。随着HELLO消息的传播网络逐渐收敛。每个节点最终选择成本最低的邻居作为父节点形成以Sink为根的树形拓扑。

2.1.4 数据转发

当节点需要发送数据时:

  1. 检查是否有有效路由(父节点非空)
  2. 将数据包发送到父节点
  3. 父节点继续转发直到到达Sink

中间节点使用路径追踪机制避免路由环路:

  • 每个数据包维护path列表记录经过的节点ID
  • 节点收到数据包时检查自身ID是否已在路径中
  • 如果已存在,则丢弃该数据包(防止无限循环)

2.2 可靠MAC层

采用类似传统CSMA的机制但针对LoRa特性进行了简化。

2.2.1 发送流程

1. 数据包入队
2. 等待随机退避时间 (0~2秒)
3. 发送数据包
4. 等待ACK确认
5. 若超时未收到ACK重传最多3次
6. 超过最大重传次数后丢弃

2.2.2 关键参数

参数 默认值 说明
BACKOFF_MAX 2.0s 最大退避时间
MAX_RETRY 3 最大重传次数
ACK_TIMEOUT_FACTOR 2.5 ACK超时倍数

2.3 无线信道模型

2.3.1 RSSI计算

采用自由空间路径损耗模型:

RSSI = TX_POWER - 10*n*log10(d) + Gaussian_noise

参数说明:

  • TX_POWER = 14 dBm: 发射功率
  • n = 2.7: 路径损耗指数(城市环境典型值)
  • d: 距离(米)
  • Gaussian_noise ~ N(0, 3dB): 高斯噪声

2.3.2 碰撞检测

当两个数据包传输时间重叠时,判定为碰撞,接收方丢弃所有参与碰撞的数据包。


3. 可观测性框架

3.1 指标体系

系统实现了完整的指标收集和分析框架,主要包括:

3.1.1 基本性能指标

指标 说明
total_sent 节点生成的数据包总数
total_received Sink成功接收的数据包数
total_forwarded 中间节点转发的数据包数
pdr 数据包交付率 (PDR = received / sent)

3.1.2 多跳路由指标

指标 说明
max_hop 数据包经历的最大跳数
avg_hop 平均跳数
hop_histogram 跳数分布直方图
MULTIHOP_FORMED 是否形成多跳 (max_hop ≥ 2)

3.1.3 路由稳定性指标

指标 说明
route_changes 路由变化总次数
route_change_rate 路由变化率 (次/秒)
convergence_time 路由收敛时间

3.1.4 信道利用指标

指标 说明
channel_utilization 信道利用率 (%)
collisions 碰撞次数

3.1.5 丢包分类

指标 说明
loss_collision 因碰撞丢包
loss_no_route 因无路由丢包
loss_retry_exceeded 因重传超限丢包
loss_channel_busy 因信道繁忙丢包

3.2 关键验证点

3.2.1 多跳路由验证(最重要)

验证目标: 证明数据包确实通过多跳传输而非直接从源到Sink。

验证方法:

  • max_hop >= 2: 最大跳数≥2证明存在多跳
  • hop_histogram: 跳数分布反映网络拓扑深度
  • path追踪: 记录每个数据包经过的节点序列

3.2.2 路由收敛验证

验证目标: 证明网络能够自组织形成稳定的路由树。

验证方法:

  • 路由收敛时间测量
  • 无路由环路证明
  • 路由变化率在合理范围

3.2.3 可靠性验证

验证目标: 证明网络在给定条件下能够可靠传输数据。

验证方法:

  • PDR > 50%(默认阈值)
  • 平均重传次数合理
  • 无因协议缺陷导致的系统性丢包

4. 测试方法

4.1 运行测试

# 运行所有测试
python -m pytest sim/tests/ -v

# 运行特定测试
python -m pytest sim/tests/test_multihop_exists.py -v

# 运行并显示详细输出
python -m pytest sim/tests/ -v -s

4.2 测试套件说明

测试文件 测试数量 验证内容
test_multihop_exists.py 2 多跳路由是否形成
test_convergence.py 3 路由收敛性
test_reliability.py 3 网络可靠性
test_route_stability.py 2 路由稳定性
test_collision.py 2 碰撞检测
test_channel_not_saturated.py 2 信道利用率

总计: 14个测试用例全部通过表示仿真系统验证完成。

4.3 运行仿真

from sim.main import run_simulation

# 默认配置运行
results = run_simulation()

# 自定义参数运行
results = run_simulation(
    num_nodes=20,      # 节点数量
    area_size=1000,   # 部署区域大小(米)
    sim_time=500,     # 仿真时间(秒)
    seed=42           # 随机种子(可复现)
)

# 访问结果
metrics = results["metrics"]
topology = results["topology"]

4.4 结果解读

仿真完成后,系统输出以下关键指标:

{
    "total_sent": 92,           # 发送数据包数
    "total_received": 61,       # 接收数据包数
    "pdr": 66.3,                # 交付率(%)
    "max_hop": 11,              # 最大跳数
    "avg_hop": 6.5,             # 平均跳数
    "hop_histogram": {4:5, 6:5, 7:5, 9:7, ...},  # 跳数分布
    "MULTIHOP_FORMED": True,     # 多跳形成标志
    "route_changes": 3,          # 路由变化次数
    "channel_utilization": 5.2,  # 信道利用率(%)
    "collisions": 19,            # 碰撞次数
}

5. 科研论文引用指南

5.1 仿真参数配置

发表论文时,建议在正文中说明以下参数配置:

网络规模: N = 12 节点
部署区域: 800m × 800m
Sink位置: 区域中心
仿真时间: 200-300秒
随机种子: 42可复现

LoRa物理层:
- 发射功率: 14 dBm
- 扩频因子: SF9
- 带宽: 125 kHz
- 编码率: 4/5

路由协议:
- HELLO周期: 8秒
- 链路惩罚因子: 8.0
- 路由更新阈值: 1.0

5.2 关键结果展示

建议在论文中重点展示以下结果:

  1. 多跳形成证明

    • max_hop ≥ 2
    • hop_histogram显示多级跳数分布
  2. 网络可靠性

    • PDR > 50%
    • 平均重传次数 < 1.5
  3. 路由稳定性

    • 收敛时间 < 30秒
    • 路由变化率 < 0.05/秒
  4. 信道健康度

    • 信道利用率 < 20%
    • 碰撞率 < 10%

5.3 图表生成

可使用分析工具生成可视化图表:

# 拓扑分析
from sim.analysis_tools.topology import analyze_topology

# 收敛分析  
from sim.analysis_tools.convergence import analyze_convergence

# 信道分析
from sim.analysis_tools.channel_analysis import analyze_channel

# 可靠性分析
from sim.analysis_tools.reliability_analysis import analyze_reliability

6. 扩展与定制

6.1 修改网络规模

编辑 sim/config.py:

NODE_COUNT = 20      # 增加节点数
AREA_SIZE = 1200     # 扩大区域

6.2 修改物理层参数

# 更激进的配置(更长距离)
SF = 10              # 更大扩频因子
TX_POWER = 20       # 更高发射功率

# 更保守的配置(更短距离)
SF = 7
RSSI_THRESHOLD = -100

6.3 添加新指标

sim/core/metrics.py 中的 SimulationMetrics 类添加新字段,并在相应位置调用 record_xxx() 方法记录数据。


7. 参考文献

本仿真系统基于以下经典算法和模型:

  1. 梯度路由: 基于RPLRouting Protocol for Low-Power and Lossy Networks的Distance-Vector思想
  2. 路径损耗模型: 自由空间路径损耗Free-Space Path Loss, FSPL
  3. CSMA/CA: 载波侦听多路访问/冲突避免机制
  4. SimPy: Python离散事件仿真框架

8. 结论

本仿真系统成功验证了LoRa多跳网络的以下关键特性

✓ 分布式路由自组织能力
✓ 多跳数据转发机制
✓ 网络可靠传输性能
✓ 路由稳定性
✓ 信道资源利用率

14项测试全部通过证明该系统可以作为STM32WL硬件移植的算法基础和研究验证工具。