背景
物联网项目中,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
踩坑记录
- 频率干扰 — 433MHz 容易被对讲机干扰,实际选了 470MHz(国内微功率免许可)
- 天线匹配 — 弹簧天线谐振点要和载波频率对齐,否则 SWR 高得离谱
- 低功耗 — 接收模式功耗 12mA,用定时唤醒策略,95% 时间进入 sleep 模式
- 路由收敛慢 — 节点移动时路由更新有延迟,实测最大 8 秒
扩展方向
- 加 GPS 模块实现节点定位
- 用 ESP32 做个网关,接入 WiFi 往云端传数据
- 加太阳能电池板,真正实现免维护部署