LoRa (Long Range) 是 Semtech 公司开发的低功耗远距离无线通信技术。
┌─────────────────────────────────────────┐
│ 应用层 (Application) │
├─────────────────────────────────────────┤
│ LoRaWAN (网络层) │
│ - 设备激活 (OTAA/ABP) │
│ - Class A/B/C 设备类型 │
│ - ADR 自适应数据速率 │
├─────────────────────────────────────────┤
│ LoRa (物理层 PHY) │
│ - CSS 调制技术 │
│ - SF 扩频因子 │
│ - 频段选择 │
└─────────────────────────────────────────┘
| 参数 | 说明 | 范围 |
|---|---|---|
| 频率 | 工作频段 | 433/868/915 MHz |
| SF | 扩频因子 | 7-12 |
| BW | 带宽 | 125/250/500 kHz |
| CR | 编码率 | 4/5, 4/6, 4/7, 4/8 |
| 功率 | 发射功率 | 2-20 dBm |
SF7 → 速率最高,距离最短,抗干扰最弱
SF8 →
SF9 →
SF10 →
SF11 →
SF12 → 速率最低,距离最长,抗干扰最强
┌──────────┐ ┌──────────┐ ┌──────────┐
│ End Device│ ←─→ │ Gateway │ ←─→ │Network │
│ (终端设备) │ │ (网关) │ │Server │
└──────────┘ └──────────┘ └──────────┘
↑ ↑
└──────── LoRa 无线 ─────────────────┘
└──────── TCP/IP (网关到服务器) ──────┘
┌──────────┐
│ 上行发送 │
├──────────┤
│ RX1 接收 │ ← 发送后 1 秒
├──────────┤
│ RX2 接收 │ ← 发送后 2 秒
└──────────┘
特点:双向通信,最省电
特点:
- Class A + 定时接收窗口
- 通过信标同步
- 适用于需要下发控制的场景
特点:
- 除发送外一直监听
- 最低延迟
- 功耗最高
// 设备入网参数
- DevEUI (设备唯一标识, 8字节)
- AppEUI (应用标识, 8字节)
- AppKey (应用密钥, 16字节)
// 入网流程
1. 终端发送 Join Request
2. 服务器返回 Join Accept
3. 双方派生会话密钥
4. 开始正常通信
// 预置参数
- DevAddr (设备地址, 4字节)
- NwkSKey (网络会话密钥, 16字节)
- AppSKey (应用会话密钥, 16字节)
特点:
- 无需入网流程
- 适合封闭网络
- 安全性较低
#include <zephyr/drivers/lora.h>
// 配置参数
struct lora_modem_config config = {
.frequency = 868300000, // 频率
.bandwidth = BW_125_KHZ, // 带宽
.datarate = SF_9, // 扩频因子
.coding_rate = CR_4_5, // 编码率
.preamble_len = 8,
.tx_power = 14, // 发射功率 (dBm)
.tx = true,
};
// 发送数据
lora_send(dev, &config, data, len);
// 接收数据 (异步)
lora_recv_async(dev, &config, recv_callback, NULL);
#include <zephyr/lorawan/lorawan.h>
// 入网参数 (OTAA)
static struct lorawan_join_config join_cfg = {
.dev_eui = dev_eui,
.join_eui = join_eui,
.nwk_key = nwk_key,
};
// 初始化
lorawan_start();
// 入网
int ret = lorawan_join(&join_cfg);
// 发送数据
struct lorawan_uplink_params tx_params = {
.data = data,
.data_len = len,
.port = 2,
.confirmed = true,
};
lorawan_send(&tx_params);
// 接收回调
static void dl_callback(uint8_t port, bool confirmed,
uint8_t *data, uint16_t len) {
// 处理下行数据
}
// 注册下行回调
lorawan_set_downlink_callback(dl_callback);
# 启用 LoRa
CONFIG_LORA=y
CONFIG_LORA_SHELL=y
# 启用 LoRaWAN
CONFIG_LORAWAN=y
# 选择区域
CONFIG_LORAWAN_REGION_EU868=y
# CONFIG_LORAWAN_REGION_US915=y
# CONFIG_LORAWAN_REGION_AS923=y
# 设备类
CONFIG_LORAWAN_CLASS_A=y
# CONFIG_LORAWAN_CLASS_B=y
# CONFIG_LORAWAN_CLASS_C=y
# 调试
CONFIG_LORAWAN_LOG_LEVEL_DBG=y
| 芯片 | 频段 | 特点 |
|---|---|---|
| SX1272/SX1276 | 多频段 | 经典款 |
| SX1261/SX1262 | 多频段 | 低功耗 |
| SX1268 | 433/470 MHz | 中国频段 |
| RYLRxxx | 多频段 | 模块化 |
nRF91 系列(蜂窝物联网)+ 外挂 LoRa 模块:
nRF9160 ── SPI ── SX1262
│ │
└── 控制 LoRa 模块 ──┘
&spi1 {
status = "okay";
sck-pin = <...>;
mosi-pin = <...>;
miso-pin = <...>;
lora: sx1262@0 {
compatible = "semtech,sx1262";
reg = <0>;
spi-max-frequency = <1000000>;
reset-gpios = <&gpio0 5 GPIO_ACTIVE_LOW>;
busy-gpios = <&gpio0 6 GPIO_ACTIVE_HIGH>;
dio1-gpios = <&gpio0 7 GPIO_ACTIVE_HIGH>;
};
};
位置:
zephyr/samples/drivers/lora/sendzephyr/samples/drivers/lora/receive功能:
位置:
zephyr/samples/subsys/lorawan/class_azephyr/samples/subsys/lorawan/fuota功能:
# LoRa 收发示例
west build -b <board> zephyr/samples/drivers/lora/send
# 或
west build -b <board> zephyr/samples/drivers/lora/receive
# LoRaWAN 示例
west build -b <board> zephyr/samples/subsys/lorawan/class_a
| 应用 | 描述 | 推荐配置 |
|---|---|---|
| 智能农业 | 土壤监测 | SF10-12, Class A |
| 智能抄表 | 水/气表 | SF9, Class A |
| 智慧城市 | 路灯控制 | SF8, Class C |
| 资产追踪 | 位置上报 | SF7-9, Class A |
// 启用 ADR
CONFIG_LORAWAN_ADR=y
// 确认消息(确保送达)
.confirmed = true
*小白 🤖 - 2026-03-18*