背景

物联网项目中,WiFi 和蓝牙的通信距离太短(通常几十米),而 4G 模块又贵又费电。LoRa 正好填补这个空白——低功耗 + 远距离 + 低成本,非常适合郊区农 业传感器、环境监测这类场景。

硬件选型

  • MCU: STM32F103C8T6(蓝丸最小系统板)
  • LoRa 模块: SX1276(星型发射模块,SPI 接口)
  • 天线: 3dBi 弹簧天线
  • 电源: 3.7V 锂电池 + LM1117 稳压

通信协议设计

LoRa 默认点对点模式,实际项目中我们需要 Mesh 自组网。协议栈分层:

应用层    → 数据帧(温度/湿度/电量)
网络层    → 路由表、跳数、下一跳节点
MAC 层    → 重传机制、确认应答
物理层    → SX1276 配置(频率/扩频/带宽)

关键参数配置

// LoRa 无线参数
#define RF_FREQUENCY        433000000   // 433MHz(非门控频段)
#define LORA_SPREADING_FACTOR  SF7       // 扩频因子,越大距离越远但速度越慢
#define LORA_BANDWIDTH       BW_125KHZ   // 125KHz 带宽
#define LORA_CODINGRATE      CR_4_5      // 编码率
#define LORA_PREAMBLE_LENGTH  8           // 前导码
#define LORA_TX_POWER        17          // 发射功率 dBm(max 20dBm)

Mesh 路由算法

用简单的 AODV(Ad-hoc On-demand Distance Vector)改进版:

// 路由表结构
typedef struct {
    uint16_t node_id;      // 节点 ID
    uint16_t next_hop;     // 下一跳
    uint8_t  hop_count;    // 跳数
    uint32_t last_seen;    // 最后通信时间
} route_entry_t;

// 路由发现
void route_discovery(uint16_t target_id) {
    broadcast(RREQ, source_id, target_id, seq_num);
    // 中间节点记录上游节点,反向建立路由
    // 目标节点收到后回复 RREP
}

实测数据

测试场景:郊区农田,节点间距 500 米,7 个节点 Mesh 组网。

指标 数据
最大通信距离(空旷) 3.2 km
丢包率(3跳) 5.2%
平均延迟 420 ms
电池续航(1次/5分钟) 约 8 个月

代码结构

/LoRaMesh
├── Core/
│   ├── sx1276.c/h        // 驱动
│   ├── mac.c/h           // MAC 协议
│   ├── routing.c/h       // 路由算法
│   └── app.c/h           // 应用层
├── RadioLib/             // 无线库
└── main.c

踩坑记录

  1. 频率干扰 — 433MHz 容易被对讲机干扰,实际选了 470MHz(国内微功率免许可)
  2. 天线匹配 — 弹簧天线谐振点要和载波频率对齐,否则 SWR 高得离谱
  3. 低功耗 — 接收模式功耗 12mA,用定时唤醒策略,95% 时间进入 sleep 模式
  4. 路由收敛慢 — 节点移动时路由更新有延迟,实测最大 8 秒

扩展方向

  • 加 GPS 模块实现节点定位
  • 用 ESP32 做个网关,接入 WiFi 往云端传数据
  • 加太阳能电池板,真正实现免维护部署