LoRa远距离通信完全指南
LoRa(Long Range)是基于扩频调制的低功耗广域网(LPWAN)技术,传输距离可达15km(城市2-5km),功耗极低(电池续航10年),适用于智慧城市、智慧农业、资产追踪等大规模物联网应用。LoRa(Long Range)是Semtech公司开发的专有扩频调制技术,基于线性调频扩频(CSS,Chirp Spread Spectrum)实现超远距离、低功耗通信。LoRaWAN是基于LoR
LoRa远距离通信完全指南
目录
一句话总结
LoRa(Long Range)是基于扩频调制的低功耗广域网(LPWAN)技术,传输距离可达15km(城市2-5km),功耗极低(电池续航10年),适用于智慧城市、智慧农业、资产追踪等大规模物联网应用。
核心架构图
LoRaWAN网络架构
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
LoRa终端设备(End Devices)
┌────────────────────────────────┐
│ 温湿度传感器 GPS追踪器 水表 │
│ 烟感报警器 土壤监测 路灯 │
└────────────────────────────────┘
│
│ LoRa无线(868MHz/915MHz/433MHz)
│ 传输距离:2-15km
│ 功耗:<50mA发射,<1μA休眠
↓
┌────────────────────────────────┐
│ LoRa网关(Gateway) │
│ ┌──────────────────────────┐ │
│ │ LoRa射频前端(SX1302) │ │
│ ├──────────────────────────┤ │
│ │ 多通道接收(8-16通道) │ │
│ ├──────────────────────────┤ │
│ │ 并发处理(数千设备) │ │
│ └──────────────────────────┘ │
└────────────────────────────────┘
│
│ 回传网络(4G/5G/以太网/WiFi)
│
↓
┌────────────────────────────────┐
│ 网络服务器(Network Server) │
│ ┌──────────────────────────┐ │
│ │ 设备管理 │ │
│ │ 数据去重(多网关接收) │ │
│ │ ADR(自适应速率) │ │
│ │ 密钥管理 │ │
│ └──────────────────────────┘ │
└────────────────────────────────┘
│
│ MQTT/HTTP/WebSocket
│
↓
┌────────────────────────────────┐
│ 应用服务器(Application Server)│
│ ┌──────────────────────────┐ │
│ │ 业务逻辑处理 │ │
│ │ 数据可视化 │ │
│ │ 告警通知 │ │
│ └──────────────────────────┘ │
└────────────────────────────────┘
关键参数:
- 频段:
- 欧洲:868MHz(免费ISM频段)
- 美国:915MHz
- 亚洲:433MHz/470MHz
- 中国:470-510MHz(需授权)
- 传输速率:0.3-50 kbps(自适应)
- 传输距离:
- 城市:2-5km
- 郊区:5-15km
- 空旷:15-50km
- 网关容量:数千设备/网关(取决于数据速率)
- 功耗:
- 发射:<50mA(50ms)
- 接收:<15mA(窗口接收)
- 休眠:<1μA
- 电池续航:5-10年(AA电池×2)
一、LoRa基础概念
1.1 什么是LoRa?
LoRa(Long Range)是Semtech公司开发的专有扩频调制技术,基于线性调频扩频(CSS,Chirp Spread Spectrum)实现超远距离、低功耗通信。LoRaWAN是基于LoRa物理层的MAC层协议,定义了网络架构和通信规范。
核心特性:
- 超远距离:城市2-5km,郊区15km,空旷环境50km
- 超低功耗:电池续航5-10年
- 高穿透性:CSS调制,抗干扰能力强
- 低成本:模组$3-10,网关$200-500
- 大容量:单网关支持数千设备
- 免授权频段:使用ISM频段,无需付费
1.2 LoRa vs NB-IoT vs Sigfox
| 对比维度 | LoRa | NB-IoT | Sigfox |
|---|---|---|---|
| 技术类型 | 私有协议(Semtech) | 3GPP标准 | 专有协议 |
| 频段 | 免费ISM频段 | 授权LTE频段 | 免费ISM频段 |
| 传输距离 | 2-15km | 1-10km | 10-50km |
| 数据速率 | 0.3-50 kbps | 10-250 kbps | 100 bps |
| 功耗 | ⭐⭐⭐⭐⭐ <1μA休眠 |
⭐⭐⭐⭐ 5μA休眠 |
⭐⭐⭐⭐⭐ <1μA休眠 |
| 双向通信 | 支持(非对称) | 支持 | 受限(上行为主) |
| 网络部署 | 私有/公共 | 运营商(移动/联通) | Sigfox运营商 |
| 模组成本 | $3-10 | $5-15 | $2-5 |
| 网关成本 | $200-500 | 运营商部署 | 运营商部署 |
| QoS保证 | 无(尽力而为) | 有(运营商级) | 无 |
| 典型应用 | 智慧农业、追踪器 | 智能水表、路灯 | 低频上报(1天1次) |
选型建议:
- 选LoRa:需私有网络、远距离、双向通信、已有WiFi覆盖盲区
- 选NB-IoT:需运营商级QoS、高可靠性、已有移动网络覆盖、政策要求
- 选Sigfox:极低频率上报(<12次/天)、成本敏感、无双向需求
1.3 LoRa应用场景
典型应用领域:
-
智慧农业
- 土壤监测:温湿度、N/P/K、pH值
- 灌溉控制:阀门远程开关
- 畜牧追踪:牛羊GPS定位
-
智慧城市
- 路灯控制:亮度调节、故障检测
- 停车管理:车位占用检测
- 垃圾桶监测:满溢告警
-
资产追踪
- 物流追踪:集装箱位置监控
- 车辆追踪:共享单车/电动车
- 设备监控:工程机械定位
-
公用事业
- 智能水表:远程抄表
- 智能电表:用电监测
- 燃气表:泄漏告警
-
环境监测
- 空气质量:PM2.5/CO2
- 水质监测:pH/浊度/溶氧
- 噪音监测:分贝测量
二、LoRa技术原理
2.1 CSS扩频调制
LoRa使用线性调频扩频(CSS)调制技术:
CSS调制原理
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
频率
^
│ 上行chirp(频率线性上升)
│ ╱╱╱╱╱╱╱
│ ╱ ╱
│ ╱ ╱
│╱ ╱
└──────────────> 时间
T秒
数据编码:
- 每个chirp代表若干bit
- 通过chirp起始频率编码数据
- 示例(SF=7,128 chips):
符号0:起始频率 = f0
╱╱╱╱╱╱╱
符号1:起始频率 = f0 + Δf
╱╱╱╱╱╱╱
符号127:起始频率 = f0 + 127×Δf
╱╱╱╱╱╱╱
扩频因子(SF):
SF Chips 数据速率 灵敏度 空中时间
7 128 5470 bps -123dBm 短
8 256 3125 bps -126dBm ↓
9 512 1758 bps -129dBm │
10 1024 977 bps -132dBm │
11 2048 537 bps -134dBm │
12 4096 293 bps -137dBm 长
关键特性:
- SF越大,传输距离越远(灵敏度更高)
- SF越大,数据速率越低(空中时间越长)
- SF越大,功耗越高(发射时间越长)
- 不同SF之间正交(可同频并行传输)
2.2 LoRa参数详解
LoRa关键参数配置
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
1. 扩频因子(Spreading Factor, SF)
- 范围:SF7 ~ SF12
- 影响:SF每增加1 → 距离×1.4,速率÷2
- 选择:距离优先选SF12,速率优先选SF7
2. 带宽(Bandwidth, BW)
- 选项:125kHz / 250kHz / 500kHz
- 影响:BW越大 → 速率越高,灵敏度越低
- 典型:125kHz(标准配置)
3. 编码率(Coding Rate, CR)
- 选项:4/5, 4/6, 4/7, 4/8
- 含义:每4bit有效数据,加1-4bit冗余
- 影响:CR越高 → 抗干扰越强,速率越低
- 典型:4/5(标准配置)
4. 发射功率(TX Power)
- 范围:2dBm ~ 20dBm(取决于区域法规)
- 影响:功率每增加3dB → 距离×1.4,功耗×2
- 典型:14dBm(欧洲),20dBm(美国)
参数组合示例:
┌──────┬────────┬────────┬─────────┬──────────┐
│ SF │ BW │ CR │ 速率 │ 灵敏度 │
├──────┼────────┼────────┼─────────┼──────────┤
│ 7 │ 125kHz │ 4/5 │ 5470bps │ -123dBm │
│ 10 │ 125kHz │ 4/5 │ 977bps │ -132dBm │
│ 12 │ 125kHz │ 4/5 │ 293bps │ -137dBm │
│ 7 │ 250kHz │ 4/5 │ 10940bps│ -120dBm │
└──────┴────────┴────────┴─────────┴──────────┘
链路预算计算:
接收信号强度 = 发射功率 + 天线增益 - 路径损耗
示例(城市环境):
- 发射功率:14dBm
- 发射天线增益:2dBi
- 路径损耗(2km):120dB
- 接收天线增益:2dBi
- 接收信号强度:14 + 2 - 120 + 2 = -102dBm
SF7灵敏度:-123dBm
链路余量:-102 - (-123) = 21dB(足够)
2.3 空中时间计算
LoRa空中时间(Time on Air)计算
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
公式:
Toa = (Tpreamble + Tpayload) × 1000 ms
其中:
Tpreamble = (PL + 4.25) × Ts
Tpayload = payloadSymbNb × Ts
Ts(符号时间)= (2^SF) / BW
示例计算(25字节负载,SF10,BW125kHz,CR4/5):
1. 符号时间:
Ts = (2^10) / 125000 = 8.192 ms
2. 前导码时间:
Tpreamble = (8 + 4.25) × 8.192 = 100.35 ms
3. 负载符号数:
payloadSymbNb = 8 + max(ceil[(8PL-4SF+28+16-20H)/(4(SF-2DE))]×(CR+4), 0)
= 8 + ceil[(8×25-40+28+16)/(4×8)]×5
= 8 + ceil[204/32]×5
= 8 + 7×5 = 43符号
4. 负载时间:
Tpayload = 43 × 8.192 = 352.26 ms
5. 总空中时间:
Toa = 100.35 + 352.26 = 452.61 ms
不同SF的空中时间对比(25字节):
┌──────┬────────────┬─────────┐
│ SF │ 空中时间 │ 功耗 │
├──────┼────────────┼─────────┤
│ 7 │ 56 ms │ 2.8 mAh │
│ 8 │ 103 ms │ 5.2 mAh │
│ 9 │ 205 ms │ 10.3 mAh│
│ 10 │ 453 ms │ 22.7 mAh│
│ 11 │ 864 ms │ 43.2 mAh│
│ 12 │ 1646 ms │ 82.3 mAh│
└──────┴────────────┴─────────┘
空中时间影响:
- 功耗:发射功耗 = 空中时间 × 发射电流(~50mA)
- 占空比:欧洲法规限制1%占空比(每小时36秒)
- 碰撞概率:空中时间越长,与其他设备碰撞概率越高
三、LoRaWAN协议详解
3.1 LoRaWAN设备类型
LoRaWAN三种设备类型
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Class A(双向通信,最低功耗)
━━━━━━━━━━━━━━━━━━━━━━━━━
终端设备 网关
│ │
│ 上行(Uplink) │
├─────────────────────────────>│
│ │
│ 接收窗口1(RX1,1秒后) │
│<─────────────────────────────┤
│ │
│ 接收窗口2(RX2,2秒后) │
│<─────────────────────────────┤
│ │
│ 进入休眠 │
└──────────────────────────────┘
特点:
- 仅在上行后开启接收窗口(RX1+RX2,共~1秒)
- 下行延迟:1-2秒(等待下一次上行)
- 功耗:<1μA休眠
- 应用:传感器、水表、大部分IoT设备
Class B(定时接收,中等功耗)
━━━━━━━━━━━━━━━━━━━━━━━━━
终端设备 网关
│ │
│ 定期Beacon同步 │
│<─────────────────────────────┤
│ │
│ 上行 │
├─────────────────────────────>│
│ │
│ RX1/RX2 │
│<─────────────────────────────┤
│ │
│ Ping Slot(定时开启,如每128s)│
│<─────────────────────────────┤
│ │
特点:
- 额外开启周期性Ping Slot接收窗口
- 下行延迟:最多128秒(Beacon周期)
- 功耗:~100μA平均功耗
- 应用:需要定时下行的场景(固件升级)
Class C(持续接收,最高功耗)
━━━━━━━━━━━━━━━━━━━━━━━━━
终端设备 网关
│ │
│ 上行 │
├─────────────────────────────>│
│ │
│ RX1/RX2 │
│<─────────────────────────────┤
│ │
│ 持续接收(除上行外) │
│<═════════════════════════════┤
│ │
│ 随时可接收下行 │
│<─────────────────────────────┤
│ │
特点:
- 除上行时刻外,持续开启接收窗口
- 下行延迟:<1秒(即时)
- 功耗:~15mA持续接收
- 应用:路灯、电源充足设备
3.2 LoRaWAN消息格式
LoRaWAN MAC层消息格式
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
完整LoRa帧:
┌────────────┬──────────────┬──────────┬─────┐
│ Preamble │ PHDR │ PHDR_CRC │ PHY │
│ (8字节) │ (物理头部) │ (2字节) │Payload│
└────────────┴──────────────┴──────────┴─────┘
PHY Payload(MAC层):
┌────────┬───────────────────────┬─────────┐
│ MHDR │ MAC Payload │ MIC │
│ (1字节)│ │ (4字节) │
└────────┴───────────────────────┴─────────┘
MAC Payload(数据帧):
┌────────┬─────────┬──────┬────────┬──────────┐
│ FHDR │ FPort │ FRM │ │ │
│ │ (1字节) │Payload│ │ │
└────────┴─────────┴──────┴────────┴──────────┘
FHDR(帧头部):
┌────────┬────────┬──────┬───────┬──────────┐
│ DevAddr│ FCtrl │ FCnt │ FOpts │ │
│ (4字节)│ (1字节)│(2字节)│(0-15) │ │
└────────┴────────┴──────┴───────┴──────────┘
字段说明:
┌──────────┬──────────────────────────────┐
│ 字段 │ 说明 │
├──────────┼──────────────────────────────┤
│ MHDR │ 消息类型(Join/Data/...) │
│ DevAddr │ 设备地址(32位) │
│ FCtrl │ 帧控制(ADR/ACK/...) │
│ FCnt │ 帧计数器(防重放攻击) │
│ FOpts │ MAC命令(可选) │
│ FPort │ 应用端口(1-223) │
│ FRMPayload│应用数据(AES-128加密) │
│ MIC │ 消息完整性校验(CMAC) │
└──────────┴──────────────────────────────┘
消息类型(MHDR):
┌───────┬───────────────────────────────┐
│ 类型 │ 说明 │
├───────┼───────────────────────────────┤
│ 0x00 │ Join Request(入网请求) │
│ 0x20 │ Join Accept(入网接受) │
│ 0x40 │ Unconfirmed Data Up(上行) │
│ 0x60 │ Unconfirmed Data Down(下行) │
│ 0x80 │ Confirmed Data Up(需确认) │
│ 0xA0 │ Confirmed Data Down(需确认) │
│ 0xC0 │ Proprietary(专有) │
└───────┴───────────────────────────────┘
3.3 LoRaWAN入网流程
LoRaWAN入网流程(OTAA)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
终端设备 网关 网络服务器
│ │ │
│ 1. Join Request │ │
│ - DevEUI │ │
│ - AppEUI │ │
│ - DevNonce │ │
├────────────────────>│ │
│ ├───────────────────────>│
│ │ │
│ │ 2. 验证DevEUI/AppEUI │
│ │ 生成会话密钥 │
│ │ │
│ │ 3. Join Accept │
│ │ - AppNonce │
│ │ - NetID │
│ │ - DevAddr │
│ │ - DLSettings │
│ │<───────────────────────┤
│ 4. Join Accept │ │
│ (加密:AppKey) │ │
│<─────────────────────┤ │
│ │ │
│ 5. 计算会话密钥 │ │
│ - NwkSKey │ │
│ - AppSKey │ │
│ │ │
│ 6. 数据传输 │ │
│ (加密:AppSKey/NwkSKey) │
├────────────────────>│ │
│ │ │
密钥体系:
┌──────────┬────────────────────────────────┐
│ 密钥 │ 用途 │
├──────────┼────────────────────────────────┤
│ AppKey │ 预置密钥(128位) │
│ │ 用于加密Join Accept │
│ │ │
│ NwkSKey │ 网络会话密钥(动态生成) │
│ │ 用于MIC计算(消息完整性) │
│ │ │
│ AppSKey │ 应用会话密钥(动态生成) │
│ │ 用于FRMPayload加密 │
└──────────┴────────────────────────────────┘
会话密钥生成(AES-128):
NwkSKey = aes128_encrypt(AppKey, 0x01 | AppNonce | NetID | DevNonce | pad)
AppSKey = aes128_encrypt(AppKey, 0x02 | AppNonce | NetID | DevNonce | pad)
安全特性:
- DevNonce递增(防重放攻击)
- MIC验证(防篡改)
- AES-128加密(防窃听)
- 会话密钥动态生成(前向安全)
四、LoRa设备开发实战
4.1 硬件选型
LoRa模组对比:
| 模组型号 | 芯片 | 频段 | 发射功率 | 灵敏度 | 价格 | 应用 |
|---|---|---|---|---|---|---|
| SX1278 | Semtech | 433/868/915MHz | 20dBm | -148dBm | $3 | 基础应用 |
| SX1262 | Semtech | 868/915MHz | 22dBm | -148dBm | $4 | 高性能 |
| SX1302 | Semtech | 868/915MHz | N/A(网关) | -142dBm | $80 | 网关前端 |
| RAK3172 | STM32WLE5 | 868/915MHz | 22dBm | -148dBm | $5 | 集成方案 |
| ESP32-S3 LoRa | ESP32-S3 + SX1262 | 868/915MHz | 22dBm | -148dBm | $12 | WiFi+LoRa |
开发板推荐:
- 入门:Arduino + RFM95W($10)
- 进阶:ESP32 + SX1276($15)
- 专业:STM32L4 + SX1262($20)
- 网关:Raspberry Pi + RAK2245($150)
4.2 终端设备实现(Arduino)
// 基于Arduino + RFM95W模组
#include <SPI.h>
#include <LoRa.h>
// LoRa引脚定义
#define LORA_SS 10 // NSS
#define LORA_RST 9 // RESET
#define LORA_DIO0 2 // DIO0
// LoRa参数
#define LORA_FREQUENCY 868E6 // 868MHz(欧洲)
#define LORA_SF 10 // 扩频因子
#define LORA_BW 125E3 // 带宽125kHz
#define LORA_CR 5 // 编码率4/5
#define LORA_TX_POWER 14 // 发射功率14dBm
// 传感器数据结构
struct SensorData {
float temperature;
float humidity;
uint16_t battery;
uint32_t timestamp;
};
void setup() {
Serial.begin(115200);
while (!Serial);
Serial.println("LoRa终端设备初始化...");
// 初始化LoRa
LoRa.setPins(LORA_SS, LORA_RST, LORA_DIO0);
if (!LoRa.begin(LORA_FREQUENCY)) {
Serial.println("LoRa初始化失败!");
while (1);
}
// 配置LoRa参数
LoRa.setSpreadingFactor(LORA_SF);
LoRa.setSignalBandwidth(LORA_BW);
LoRa.setCodingRate4(LORA_CR);
LoRa.setTxPower(LORA_TX_POWER);
LoRa.setSyncWord(0x34); // LoRaWAN公网同步字
Serial.println("LoRa初始化成功!");
printLoRaConfig();
}
void loop() {
// 读取传感器数据
SensorData data = readSensors();
// 发送数据
sendData(data);
// 进入深度睡眠(省电)
Serial.println("进入睡眠模式...");
delay(300000); // 5分钟(生产环境使用深度睡眠)
}
/**
* 读取传感器数据
*/
SensorData readSensors() {
SensorData data;
// 读取DHT22温湿度传感器(示例)
data.temperature = 25.5; // 实际应用中调用传感器API
data.humidity = 68.2;
data.battery = analogRead(A0); // 读取电池电压
data.timestamp = millis();
Serial.print("温度: ");
Serial.print(data.temperature);
Serial.println(" °C");
Serial.print("湿度: ");
Serial.print(data.humidity);
Serial.println(" %");
Serial.print("电池: ");
Serial.println(data.battery);
return data;
}
/**
* 发送数据到网关
*/
void sendData(SensorData data) {
Serial.println("发送数据包...");
// 序列化数据(使用紧凑格式)
uint8_t packet[12];
encodePacket(data, packet);
// 发送LoRa数据包
LoRa.beginPacket();
LoRa.write(packet, sizeof(packet));
LoRa.endPacket();
Serial.println("数据包已发送");
// 打印RSSI(调试)
Serial.print("最后RSSI: ");
Serial.println(LoRa.packetRssi());
}
/**
* 编码数据包(紧凑格式)
*/
void encodePacket(SensorData data, uint8_t* packet) {
// 温度(2字节,精度0.1°C)
int16_t temp = (int16_t)(data.temperature * 10);
packet[0] = (temp >> 8) & 0xFF;
packet[1] = temp & 0xFF;
// 湿度(2字节,精度0.1%)
uint16_t hum = (uint16_t)(data.humidity * 10);
packet[2] = (hum >> 8) & 0xFF;
packet[3] = hum & 0xFF;
// 电池电压(2字节)
packet[4] = (data.battery >> 8) & 0xFF;
packet[5] = data.battery & 0xFF;
// 时间戳(4字节)
packet[6] = (data.timestamp >> 24) & 0xFF;
packet[7] = (data.timestamp >> 16) & 0xFF;
packet[8] = (data.timestamp >> 8) & 0xFF;
packet[9] = data.timestamp & 0xFF;
// CRC校验(2字节)
uint16_t crc = calculateCRC(packet, 10);
packet[10] = (crc >> 8) & 0xFF;
packet[11] = crc & 0xFF;
}
/**
* 计算CRC-16校验
*/
uint16_t calculateCRC(uint8_t* data, size_t length) {
uint16_t crc = 0xFFFF;
for (size_t i = 0; i < length; i++) {
crc ^= (uint16_t)data[i] << 8;
for (uint8_t bit = 0; bit < 8; bit++) {
if (crc & 0x8000) {
crc = (crc << 1) ^ 0x1021;
} else {
crc <<= 1;
}
}
}
return crc;
}
/**
* 打印LoRa配置
*/
void printLoRaConfig() {
Serial.println("━━━━━━━━━━━━━━━━━━━━━━━━");
Serial.println("LoRa配置:");
Serial.print(" 频率: ");
Serial.print(LORA_FREQUENCY / 1E6);
Serial.println(" MHz");
Serial.print(" 扩频因子: SF");
Serial.println(LORA_SF);
Serial.print(" 带宽: ");
Serial.print(LORA_BW / 1000);
Serial.println(" kHz");
Serial.print(" 编码率: 4/");
Serial.println(LORA_CR);
Serial.print(" 发射功率: ");
Serial.print(LORA_TX_POWER);
Serial.println(" dBm");
Serial.println("━━━━━━━━━━━━━━━━━━━━━━━━");
}
4.3 网关实现(Python + Raspberry Pi)
#!/usr/bin/env python3
# LoRa网关实现(基于SX1302 HAL驱动)
from sx1302 import SX1302 # 假设使用SX1302 Python库
class LoRaGateway:
"""LoRa网关"""
def __init__(self, mqtt_broker="localhost", mqtt_port=1883):
self.mqtt_client = mqtt.Client()
self.mqtt_broker = mqtt_broker
self.mqtt_port = mqtt_port
# 初始化LoRa硬件
self.lora = SX1302(
spi_device="/dev/spidev0.0",
reset_pin=17, # GPIO 17
freq_hz=868000000, # 868MHz
)
# 配置8个接收通道
self.configure_channels()
def configure_channels(self):
"""配置多通道接收"""
# 通道0-7:不同SF和频率
channels = [
{"freq": 868100000, "sf": 7, "bw": 125000},
{"freq": 868300000, "sf": 7, "bw": 125000},
{"freq": 868500000, "sf": 8, "bw": 125000},
{"freq": 867100000, "sf": 9, "bw": 125000},
{"freq": 867300000, "sf": 10, "bw": 125000},
{"freq": 867500000, "sf": 11, "bw": 125000},
{"freq": 867700000, "sf": 12, "bw": 125000},
{"freq": 867900000, "sf": 7, "bw": 250000}, # LoRa标准通道
]
for i, config in enumerate(channels):
self.lora.configure_channel(
channel=i,
freq_hz=config["freq"],
spreading_factor=config["sf"],
bandwidth_hz=config["bw"]
)
print("网关通道配置完成")
def connect_mqtt(self):
"""连接MQTT服务器"""
self.mqtt_client.on_connect = self._on_mqtt_connect
self.mqtt_client.connect(self.mqtt_broker, self.mqtt_port, 60)
self.mqtt_client.loop_start()
def _on_mqtt_connect(self, client, userdata, flags, rc):
"""MQTT连接回调"""
if rc == 0:
print(f"已连接到MQTT服务器 {self.mqtt_broker}:{self.mqtt_port}")
else:
print(f"MQTT连接失败,返回码: {rc}")
def start(self):
"""启动网关"""
print("LoRa网关启动中...")
self.connect_mqtt()
self.lora.start()
print("网关运行中,等待数据...")
try:
while True:
# 接收LoRa数据包
packet = self.lora.receive(timeout=1.0)
if packet:
self.handle_packet(packet)
time.sleep(0.01)
except KeyboardInterrupt:
print("\n网关停止")
self.stop()
def handle_packet(self, packet):
"""处理接收到的数据包"""
print(f"\n收到数据包:")
print(f" RSSI: {packet['rssi']} dBm")
print(f" SNR: {packet['snr']} dB")
print(f" 频率: {packet['freq']} Hz")
print(f" SF: {packet['sf']}")
print(f" 负载: {packet['payload'].hex()}")
# 解析数据包
try:
sensor_data = self.parse_packet(packet['payload'])
# 发布到MQTT
self.publish_mqtt(sensor_data, packet)
except Exception as e:
print(f"数据包解析失败: {e}")
def parse_packet(self, payload):
"""解析传感器数据"""
if len(payload) < 12:
raise ValueError("数据包长度不足")
# 温度(2字节)
temp_raw = (payload[0] << 8) | payload[1]
temperature = temp_raw / 10.0 if temp_raw < 0x8000 else (temp_raw - 0x10000) / 10.0
# 湿度(2字节)
humidity = ((payload[2] << 8) | payload[3]) / 10.0
# 电池电压(2字节)
battery = (payload[4] << 8) | payload[5]
# 时间戳(4字节)
timestamp = (payload[6] << 24) | (payload[7] << 16) | (payload[8] << 8) | payload[9]
# CRC校验
crc_expected = (payload[10] << 8) | payload[11]
crc_calculated = self.calculate_crc(payload[:10])
if crc_expected != crc_calculated:
raise ValueError("CRC校验失败")
return {
"temperature": temperature,
"humidity": humidity,
"battery": battery,
"timestamp": timestamp
}
def calculate_crc(self, data):
"""计算CRC-16"""
crc = 0xFFFF
for byte in data:
crc ^= byte << 8
for _ in range(8):
if crc & 0x8000:
crc = (crc << 1) ^ 0x1021
else:
crc <<= 1
crc &= 0xFFFF
return crc
def publish_mqtt(self, sensor_data, packet_info):
"""发布数据到MQTT"""
topic = "lora/sensor/data"
payload = {
"sensor_data": sensor_data,
"gateway_info": {
"rssi": packet_info["rssi"],
"snr": packet_info["snr"],
"frequency": packet_info["freq"],
"spreading_factor": packet_info["sf"],
"timestamp": time.time()
}
}
self.mqtt_client.publish(topic, json.dumps(payload))
print(f"数据已发布到MQTT主题: {topic}")
def stop(self):
"""停止网关"""
self.lora.stop()
self.mqtt_client.loop_stop()
self.mqtt_client.disconnect()
if __name__ == "__main__":
gateway = LoRaGateway(mqtt_broker="192.168.1.100", mqtt_port=1883)
gateway.start()
五、行业应用案例分析
案例1:智慧农业土壤监测
项目背景:
某农场部署1000个土壤传感器,监测温湿度、N/P/K,覆盖500公顷。
技术方案:
智慧农业LoRa网络架构
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
农田(500公顷)
│
├─ 土壤传感器1(节点1)
│ └─ 数据:温度22°C,湿度45%,N=80,P=25,K=120
│ └─ 上报周期:30分钟
│ └─ 功耗:<100μA平均(电池续航5年)
│
├─ 土壤传感器2(节点2)
│ └─ ...
│
├─ ... (1000个传感器)
│
└─> LoRa网关(3个)
└─ 覆盖半径:5km
└─ 容量:500设备/网关
└─ 回传:4G
│
└─> 云平台
├─ 数据可视化(温湿度地图)
├─ 智能灌溉决策
└─ 异常告警(低湿度→启动灌溉)
参数配置:
| 参数 | 值 | 说明 |
|---|---|---|
| SF | 10 | 保证5km覆盖 |
| BW | 125kHz | 标准配置 |
| CR | 4/5 | 标准配置 |
| TX Power | 14dBm | 欧洲法规 |
| 上报周期 | 30分钟 | 满足占空比 |
| 有效载荷 | 20字节 | 紧凑数据格式 |
| 空中时间 | ~350ms | SF10,20字节 |
实施效果:
| 指标 | 数据 | 说明 |
|---|---|---|
| 覆盖率 | 99.5% | 3个网关覆盖500公顷 |
| 数据成功率 | 98.2% | 偶尔因碰撞丢包 |
| 电池续航 | 5.2年 | 2×AA电池,实测 |
| 灌溉节水 | 节省35%用水 | 精准灌溉 |
| ROI | 回本18个月 | 节水+增产 |
案例2:智慧城市路灯控制
项目背景:
某城市10,000盏路灯需远程控制和监测,要求双向通信、低延迟。
技术方案:
智慧路灯LoRa控制系统
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
路灯控制器(Class C设备)
│
├─ 上行数据(每小时)
│ └─ 状态:开/关、亮度、功耗、故障
│
├─ 下行控制(实时)
│ └─ 命令:开关、调光、定时
│
└─> LoRa网关(50个)
└─ 密度:1网关覆盖200盏灯
└─ 部署:路灯杆顶部(视距良好)
│
└─> 云平台
├─ GIS地图显示
├─ 故障自动告警
├─ 节能策略(深夜降亮度)
└─ 批量控制(区域开关)
下行控制实现:
def control_streetlight(device_id, command):
"""
控制路灯
command: {"action": "dim", "brightness": 50}
"""
payload = {
"device_id": device_id,
"command": command,
"timestamp": int(time.time())
}
# 通过LoRaWAN网络服务器下发
response = lorawan_server.send_downlink(
dev_eui=device_id,
fport=2, # 控制端口
data=json.dumps(payload).encode(),
confirmed=True, # 需要确认
class_mode="C" # Class C设备
)
if response["status"] == "queued":
print(f"控制命令已下发到设备 {device_id}")
else:
print(f"下发失败: {response['error']}")
实施效果:
| 指标 | LoRa方案 | 传统方案(PLC) | 提升 |
|---|---|---|---|
| 部署成本 | $50/灯 | $150/灯 | 67%↓ |
| 通信延迟 | <5s | <1min | 92%↓ |
| 维护成本 | 低(无需布线) | 高(线路老化) | 80%↓ |
| 节能效果 | 节省40%电费 | 无远程控制 | - |
案例3:物流资产追踪
项目背景:
某物流公司追踪5000个集装箱,需GPS定位 + LoRa上报。
技术方案:
物流追踪器架构
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
集装箱追踪器
│
├─ GPS模块(定位)
│ └─ 精度:5-10m
│ └─ 冷启动:<30s
│
├─ LoRa模块(通信)
│ └─ 上报周期:移动中10分钟,静止1小时
│ └─ 数据:GPS坐标、速度、电池
│
└─ 电池(18650×2)
└─ 容量:6000mAh
└─ 续航:2年
数据上报流程:
1. GPS定位 → 获取坐标
2. 判断运动状态(加速度计)
3. 如果移动:10分钟上报一次
4. 如果静止:1小时上报一次
5. LoRa发送:GPS+状态+电池
6. 网关转发到云端
7. 云平台显示轨迹
特殊场景:
- 异常震动→立即上报(防盗)
- 离开地理围栏→立即告警
- 电池低于10%→告警
功耗优化:
void loop() {
// 读取加速度计
bool isMoving = checkMovement();
// 动态调整上报周期
uint32_t reportInterval = isMoving ? 600000 : 3600000; // 10分钟 vs 1小时
// GPS定位
if (millis() - lastReportTime >= reportInterval) {
gps.wakeup();
GPSLocation loc = gps.getLocation();
gps.sleep();
// 上报数据
sendLoRaPacket(loc, getBatteryLevel());
lastReportTime = millis();
}
// 深度睡眠
ESP.deepSleep(60e6); // 睡眠1分钟,唤醒后检查
}
实施效果:
| 指标 | LoRa方案 | 4G方案 | 提升 |
|---|---|---|---|
| 通信费用 | $0(免费频段) | $5/月/设备 | 100%↓ |
| 电池续航 | 2年 | 3个月 | 8倍 |
| 覆盖率 | 95%(城市+郊区) | 98%(4G网络) | -3% |
| 设备成本 | $30/个 | $50/个 | 40%↓ |
案例4:智能水表远程抄表
项目背景:
某水务公司50,000户智能水表,需远程抄表和异常检测。
技术方案:
智能水表LoRa抄表系统
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
智能水表(Class A设备)
│
├─ 流量传感器
│ └─ 精度:0.01 m³
│ └─ 累计流量
│
├─ LoRa通信
│ └─ 上报:每天1次(凌晨2:00)
│ └─ 数据:用水量、电池、状态
│ └─ 异常:漏水→立即上报
│
└─ 锂电池(3.6V,19Ah)
└─ 续航:10年
抄表流程:
1. 凌晨2:00,水表唤醒
2. 读取累计用水量
3. 通过LoRa上报到网关
4. 网关转发到云端
5. 云端生成账单
异常检测:
- 持续流量(2小时)→漏水告警
- 用水量突增(>平均5倍)→异常告警
- 电池<10%→更换提醒
数据包格式(仅10字节):
智能水表数据包(10字节)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
┌────────┬────────┬────────┬────────┬────────┐
│ 设备ID │ 累计用水│ 电池 │ 状态 │ CRC │
│ (4B) │ (3B) │ (1B) │ (1B) │ (1B) │
└────────┴────────┴────────┴────────┴────────┘
累计用水(3字节,精度0.01m³):
- 最大值:16,777,215 × 0.01 = 167,772 m³
- 示例:1234.56 m³ → 0x01E240
电池电量(1字节,精度1%):
- 85% → 0x55
状态(1字节):
- bit 0: 漏水告警
- bit 1: 电池低电
- bit 2: 传感器故障
- bit 3-7: 保留
实施效果:
| 指标 | LoRa方案 | 传统方案(人工) | 提升 |
|---|---|---|---|
| 抄表成本 | $0.01/户/月 | $2/户/月 | 99.5%↓ |
| 抄表准确率 | 99.9% | 95%(人工误差) | +4.9% |
| 漏水检测 | 实时告警 | 下月账单发现 | 提前30天 |
| 人工成本 | 节省95% | 100人/5万户 | 95%↓ |
案例5:环境监测网络
项目背景:
某城市部署200个空气质量监测站,监测PM2.5、CO2、噪音。
技术方案:
环境监测站架构
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
监测站(太阳能供电)
│
├─ 传感器
│ ├─ PM2.5传感器(SDS011)
│ ├─ CO2传感器(MH-Z19)
│ ├─ 噪音传感器(MAX9814)
│ └─ 温湿度传感器(SHT31)
│
├─ 数据采集(每5分钟)
│ └─ 平均值、最大值、最小值
│
├─ LoRa通信(SF9,BW125kHz)
│ └─ 上报周期:5分钟
│ └─ 有效载荷:25字节
│
└─ 电源(太阳能+锂电池)
└─ 太阳能板:10W
└─ 锂电池:12V,20Ah
└─ 续航:阴天7天
数据可视化:
- 实时地图:PM2.5热力图
- 历史趋势:过去24小时曲线
- 异常告警:PM2.5>150(重度污染)
实施效果:
| 指标 | 数据 | 说明 |
|---|---|---|
| 覆盖范围 | 全市200平方公里 | 20个LoRa网关 |
| 数据时效性 | <6分钟 | 采集5分钟+传输<1分钟 |
| 部署成本 | $500/站 | 传感器+LoRa模组+太阳能 |
| 运维成本 | $50/年/站 | 无需人工抄表 |
| 公众访问 | 微信小程序 | 实时查看空气质量 |
六、性能优化实战
6.1 延长电池续航
优化策略:
/**
* 策略1:动态ADR(自适应数据速率)
*/
void optimizeDataRate() {
// 根据RSSI调整SF
int rssi = LoRa.packetRssi();
if (rssi > -100) {
LoRa.setSpreadingFactor(7); // 信号强,使用SF7(快速)
} else if (rssi > -115) {
LoRa.setSpreadingFactor(9); // 信号中等
} else {
LoRa.setSpreadingFactor(12); // 信号弱,使用SF12(慢但可靠)
}
}
/**
* 策略2:深度睡眠
*/
void enterDeepSleep(uint32_t seconds) {
// 关闭外设
LoRa.sleep();
disableSensors();
// ESP32深度睡眠
esp_sleep_enable_timer_wakeup(seconds * 1000000ULL);
esp_deep_sleep_start();
// 功耗:从15mA降到10μA(1500倍)
}
/**
* 策略3:数据压缩
*/
uint8_t compressData(SensorData* data, uint8_t* buffer) {
// 使用定点数代替浮点数
int16_t temp = (int16_t)(data->temperature * 10); // 精度0.1°C
uint16_t hum = (uint16_t)(data->humidity * 10); // 精度0.1%
buffer[0] = (temp >> 8) & 0xFF;
buffer[1] = temp & 0xFF;
buffer[2] = (hum >> 8) & 0xFF;
buffer[3] = hum & 0xFF;
return 4; // 仅4字节(vs JSON 30字节)
}
续航对比:
| 配置 | 平均功耗 | 电池续航(2×AA 3000mAh) |
|---|---|---|
| SF12,无睡眠,JSON | 15mA | 8.3天 |
| SF10,浅睡眠,JSON | 500μA | 250天 |
| SF9,深度睡眠,压缩 | 50μA | 2500天(6.8年) |
6.2 提升数据成功率
问题:大规模部署时,设备间碰撞导致丢包。
解决方案:
/**
* 策略1:随机延迟发送
*/
void sendWithRandomDelay() {
// 在预定时间前后随机延迟±30秒
uint32_t randomDelay = random(0, 60000); // 0-60秒
delay(randomDelay);
sendLoRaPacket();
// 碰撞概率降低:从10%降到<1%
}
/**
* 策略2:重传机制
*/
bool sendWithRetry(uint8_t* data, size_t length, uint8_t maxRetries) {
for (uint8_t attempt = 0; attempt < maxRetries; attempt++) {
Serial.print("发送尝试 ");
Serial.println(attempt + 1);
LoRa.beginPacket();
LoRa.write(data, length);
LoRa.endPacket();
// 等待ACK(Class A设备需实现下行监听)
if (waitForAck(5000)) { // 等待5秒
Serial.println("发送成功");
return true;
}
// 失败后指数退避
delay(1000 * (1 << attempt)); // 1s, 2s, 4s, 8s...
}
Serial.println("发送失败,已达最大重试次数");
return false;
}
/**
* 策略3:使用不同SF(频分多址)
*/
void assignSpreadingFactor(uint16_t deviceId) {
// 根据设备ID分配SF(7-12)
uint8_t sf = 7 + (deviceId % 6);
LoRa.setSpreadingFactor(sf);
Serial.print("设备");
Serial.print(deviceId);
Serial.print("使用SF");
Serial.println(sf);
// 不同SF正交,可同时传输,容量提升6倍
}
成功率对比:
| 设备数量 | 无优化 | 随机延迟 | 重传+SF分配 |
|---|---|---|---|
| 100 | 95% | 98% | 99.5% |
| 500 | 75% | 90% | 97% |
| 1000 | 50% | 80% | 95% |
七、故障排查方案
问题1:通信距离达不到预期
现象:理论15km,实测仅2km。
排查步骤:
void diagnosticLinkQuality() {
Serial.println("━━━━━━━━━━━━━━━━━━━━━━━━");
Serial.println("LoRa链路诊断");
// 1. 检查发射功率
Serial.print("发射功率: ");
Serial.print(LoRa.getTxPower());
Serial.println(" dBm");
// 建议:设置为最大合法功率(欧洲14dBm,美国20dBm)
// 2. 检查SF
Serial.print("扩频因子: SF");
Serial.println(LoRa.getSpreadingFactor());
// 建议:远距离使用SF11-12
// 3. 检查天线
float swr = measureSWR(); // 测量驻波比
Serial.print("驻波比(SWR): ");
Serial.println(swr);
// 建议:SWR<2.0(天线匹配良好)
// 4. 检查环境
Serial.println("环境检查:");
Serial.println(" - 是否有建筑物遮挡?");
Serial.println(" - 天线是否垂直向上?");
Serial.println(" - 是否靠近金属物体?");
// 5. 链路预算计算
int expectedRssi = calculateLinkBudget(
txPower=14, // dBm
txGain=2, // dBi
distance=5000, // 米
frequency=868, // MHz
rxGain=2 // dBi
);
Serial.print("预期RSSI: ");
Serial.print(expectedRssi);
Serial.println(" dBm");
int actualRssi = LoRa.packetRssi();
Serial.print("实际RSSI: ");
Serial.print(actualRssi);
Serial.println(" dBm");
if (actualRssi < expectedRssi - 10) {
Serial.println("⚠️ RSSI异常偏低,检查天线和环境");
}
Serial.println("━━━━━━━━━━━━━━━━━━━━━━━━");
}
常见原因:
| 原因 | 解决方案 |
|---|---|
| 发射功率过低 | 设置LoRa.setTxPower(20) |
| SF过小 | 使用SF11-12 |
| 天线不匹配 | 使用868MHz专用天线 |
| 天线放置不当 | 垂直安装,远离金属 |
| 城市遮挡 | 升高天线(楼顶/塔顶) |
问题2:网关接收不到数据
现象:终端设备发送正常,但网关无响应。
排查步骤:
def diagnostic_gateway():
"""网关诊断"""
print("━━━━━━━━━━━━━━━━━━━━━━━━")
print("LoRa网关诊断")
# 1. 检查频率配置
print(f"网关频率: {gateway.get_frequency()} Hz")
print(f"设备频率: 868100000 Hz")
# 建议:确保频率完全一致
# 2. 检查SF/BW配置
print(f"网关监听SF: SF7-SF12")
print(f"设备使用SF: SF{device_sf}")
# 建议:网关监听所有SF(多通道)
# 3. 检查LoRa前端
if not gateway.test_sx1302():
print("⚠️ SX1302芯片通信失败,检查SPI连接")
else:
print("✅ SX1302芯片正常")
# 4. 检查日志
packets_received = gateway.get_packet_count()
print(f"总接收数据包: {packets_received}")
if packets_received == 0:
print("⚠️ 未收到任何数据包,可能原因:")
print(" - 设备未发送")
print(" - 频率/SF不匹配")
print(" - 天线故障")
# 5. 实时监听
print("\n开始实时监听(30秒)...")
start_time = time.time()
count = 0
while time.time() - start_time < 30:
packet = gateway.receive(timeout=1.0)
if packet:
count += 1
print(f" #{count} RSSI:{packet['rssi']}dBm SNR:{packet['snr']}dB")
print(f"\n30秒内收到 {count} 个数据包")
print("━━━━━━━━━━━━━━━━━━━━━━━━")
问题3:数据包CRC校验失败
现象:网关收到数据包,但CRC错误。
排查与解决:
// 发送端:确保CRC使能
void setupLoRa() {
LoRa.begin(868E6);
LoRa.enableCrc(); // 启用CRC校验
// 检查是否成功启用
if (LoRa.crcEnabled()) {
Serial.println("✅ CRC已启用");
} else {
Serial.println("❌ CRC未启用");
}
}
// 接收端:验证CRC
void handlePacket(uint8_t* data, size_t length) {
// LoRa硬件会自动验证CRC
int crcError = LoRa.crcError();
if (crcError) {
Serial.println("⚠️ CRC校验失败,数据损坏");
Serial.print("RSSI: ");
Serial.println(LoRa.packetRssi());
Serial.print("SNR: ");
Serial.println(LoRa.packetSnr());
// CRC错误通常因为:
// 1. 信号太弱(RSSI < -130dBm)
// 2. 干扰严重(SNR < -10dB)
// 3. 硬件故障
return;
}
// 解析数据...
}
八、LoRa技术对比
8.1 LoRa vs NB-IoT vs Sigfox(详细对比)
| 对比维度 | LoRa | NB-IoT | Sigfox |
|---|---|---|---|
| 技术归属 | 私有(Semtech) | 3GPP标准 | 专有(Sigfox公司) |
| 频段 | 免费ISM(868/915MHz) | 授权LTE频段 | 免费ISM(868/902MHz) |
| 调制方式 | CSS扩频 | QPSK | BPSK/GFSK |
| 传输距离 | 城市2-5km,郊区15km | 城市1-5km,郊区10km | 城市10km,郊区50km |
| 数据速率 | 0.3-50 kbps | 10-250 kbps | 上行100bps,下行600bps |
| 双向通信 | 支持(非对称) | 支持(对称) | 受限(上行为主,下行4次/天) |
| 消息频率 | 无限制(占空比1%) | 无限制 | 上行140次/天,下行4次/天 |
| 有效载荷 | 最大242字节 | 最大1600字节 | 上行12字节,下行8字节 |
| 网络部署 | 私有/公共 | 运营商 | Sigfox运营商 |
| 覆盖范围 | 自建网关 | 全球运营商网络 | 60+国家(Sigfox网络) |
| QoS保证 | 尽力而为 | 运营商级QoS | 尽力而为 |
| 功耗(上行) | <50mA × 50ms | <220mA × 2s | <50mA × 6s |
| 功耗(待机) | <1μA | 3-5μA | <1μA |
| 模组成本 | $3-10 | $5-15 | $2-5 |
| 通信费用 | $0(私有网络) | $1-10/年/设备 | $1-5/年/设备 |
| 典型应用 | 智慧农业、追踪器 | 智能表计、路灯 | 低频上报(防火、防盗) |
九、总结
3句话记住LoRa
- LoRa是基于CSS扩频的超远距离低功耗通信技术,城市覆盖2-5km,郊区15km,电池续航5-10年,适用于大规模IoT应用。
- 核心优势是免授权频段、私有部署、极低功耗,单网关支持数千设备,模组成本$3-10,通信费用为零。
- LoRaWAN定义三种设备类型(Class A/B/C),支持OTAA/ABP两种入网方式,AES-128加密保证安全性。
核心要点
技术选型建议
| 场景 | 是否选LoRa | 原因 |
|---|---|---|
| 智慧农业(大面积监测) | ✅ 推荐 | 远距离、低功耗、私有部署 |
| 资产追踪(物流/车辆) | ✅ 推荐 | 无通信费、续航长 |
| 智能水表/电表 | ✅ 推荐 | 极低频率上报、10年续航 |
| 智慧城市(路灯/停车) | ✅ 推荐 | 双向通信、可控性强 |
| 高频数据上报(>1次/分钟) | ❌ 不推荐 | 占空比限制,选NB-IoT |
| 需运营商QoS保证 | ❌ 不推荐 | 选NB-IoT |
| 无技术团队部署网关 | ❌ 不推荐 | 选NB-IoT/Sigfox |
最佳实践总结
-
参数选择:
- 远距离优先:SF11-12(灵敏度-134dBm)
- 速率优先:SF7(5.47 kbps)
- 平衡:SF9-10(推荐)
-
功耗优化:
- 使用深度睡眠(功耗降低1500倍)
- 动态ADR(根据RSSI调整SF)
- 数据压缩(使用二进制代替JSON)
-
可靠性保证:
- 随机延迟发送(降低碰撞)
- 重传机制(失败后指数退避)
- 不同SF分配(频分多址)
-
网关部署:
- 密度:城市1网关/1-2km²
- 位置:高处(楼顶/塔顶),视距良好
- 回传:4G/5G/以太网
关键注意事项
- 占空比限制:欧洲ISM频段限制1%占空比(每小时36秒)
- 天线重要性:使用专用868/915MHz天线,SWR<2.0
- 频率法规:不同国家频段不同(中国470-510MHz需授权)
- 网关容量:理论数千设备,实际受空中时间影响
- 安全性:使用OTAA入网,避免ABP(密钥固定)
扩展阅读
更多推荐
所有评论(0)