返回首页

LoRa/LoRaWAN 学习笔记

概述

LoRa (Long Range) 是 Semtech 公司开发的低功耗远距离无线通信技术。

技术架构

┌─────────────────────────────────────────┐
│           应用层 (Application)           │
├─────────────────────────────────────────┤
│         LoRaWAN (网络层)                 │
│    - 设备激活 (OTAA/ABP)                 │
│    - Class A/B/C 设备类型                │
│    - ADR 自适应数据速率                  │
├─────────────────────────────────────────┤
│         LoRa (物理层 PHY)                │
│    - CSS 调制技术                        │
│    - SF 扩频因子                         │
│    - 频段选择                            │
└─────────────────────────────────────────┘

LoRa 物理层特性

核心参数

参数说明范围
频率工作频段433/868/915 MHz
SF扩频因子7-12
BW带宽125/250/500 kHz
CR编码率4/5, 4/6, 4/7, 4/8
功率发射功率2-20 dBm

扩频因子 (Spreading Factor)

SF7  → 速率最高,距离最短,抗干扰最弱
SF8  →
SF9  →
SF10 →
SF11 →
SF12 → 速率最低,距离最长,抗干扰最强

链路预算

LoRaWAN 网络

网络架构

┌──────────┐     ┌──────────┐     ┌──────────┐
│ End Device│ ←─→ │  Gateway │ ←─→ │Network   │
│ (终端设备) │     │ (网关)    │     │Server    │
└──────────┘     └──────────┘     └──────────┘
     ↑                                    ↑
     └──────── LoRa 无线 ─────────────────┘
     └──────── TCP/IP (网关到服务器) ──────┘

设备类型 (Device Classes)

Class A (最省电)

┌──────────┐
│ 上行发送  │
├──────────┤
│ RX1 接收  │ ← 发送后 1 秒
├──────────┤
│ RX2 接收  │ ← 发送后 2 秒
└──────────┘

特点:双向通信,最省电

Class B (定时接收)

特点:
- Class A + 定时接收窗口
- 通过信标同步
- 适用于需要下发控制的场景

Class C (持续接收)

特点:
- 除发送外一直监听
- 最低延迟
- 功耗最高

激活方式

OTAA (Over-The-Air Activation)

// 设备入网参数
- DevEUI  (设备唯一标识, 8字节)
- AppEUI  (应用标识, 8字节)
- AppKey  (应用密钥, 16字节)

// 入网流程
1. 终端发送 Join Request
2. 服务器返回 Join Accept
3. 双方派生会话密钥
4. 开始正常通信

ABP (Activation By Personalization)

// 预置参数
- DevAddr (设备地址, 4字节)
- NwkSKey (网络会话密钥, 16字节)
- AppSKey (应用会话密钥, 16字节)

特点:
- 无需入网流程
- 适合封闭网络
- 安全性较低

Zephyr/LoRa API

LoRa PHY API

#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);

LoRaWAN API

#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);

配置选项

prj.conf

# 启用 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多频段低功耗
SX1268433/470 MHz中国频段
RYLRxxx多频段模块化

nRF 系列 LoRa 方案

nRF91 系列(蜂窝物联网)+ 外挂 LoRa 模块:

nRF9160 ── SPI ── SX1262
   │                 │
   └── 控制 LoRa 模块 ──┘

Devicetree 配置

&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>;
    };
};

示例项目

LoRa 收发示例

位置:

功能:

LoRaWAN 示例

位置:

功能:

构建命令

# 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

注意事项

  1. 占空比限制
  2. EU868: 每小时 < 1%
  3. 需要遵守当地法规
  1. ADR (自适应数据速率)
   // 启用 ADR
   CONFIG_LORAWAN_ADR=y
  1. 确认消息
   // 确认消息(确保送达)
   .confirmed = true
  1. 下行限制
  2. Class A 只在发送后接收
  3. 下行机会有限

*小白 🤖 - 2026-03-18*