
LoRa私有物联网络从网关到应用全栈实现物联网项目里不是所有场景都需要4G/5G。大量传感器节点部署在偏远地区或室内角落蜂窝信号覆盖不到WiFi距离不够这时候LoRa就成了最现实的选择。LoRa的优势在于远距离城区2-5km郊区可达15km、低功耗传感器电池续航数年和私有部署不需要运营商网络。2026年工信部推动物联网三年行动方案中低功耗广域网被列为重点方向LoRa和NB-IoT互补的格局已经明确。这篇把LoRa私有物联网络的全栈搭建过程讲清楚——从网关硬件到服务器到应用端每个环节的选型和踩坑。LoRa vs LoRaWAN先搞清楚再动手很多新手把LoRa和LoRaWAN混为一谈。LoRa是物理层调制技术Semtech专利解决信号怎么传。LoRaWAN是MAC层协议LoRa Alliance标准解决设备怎么入网、数据怎么路由、密钥怎么管理。维度LoRa裸调制LoRaWAN协议层物理层MAC网络层入网方式无直通OTAA/ABP数据加密自行实现AES-128适用场景点对点简单通信大规模节点组网复杂度低中高私有网络有两种路线用裸LoRa做点对点通信简单但扩展性差或者部署LoRaWAN网络复杂但标准完整。下文以LoRaWAN为主因为大多数项目最终都需要多节点管理。网关硬件SX130x为核心LoRaWAN网关的核心是SX130x系列基带处理芯片Semtech。它能同时解调8个通道的LoRa信号是标准LoRaWAN网关的标配。市面上的网关方案分两类成品网关如RAK7268、Dragino DLOS8开箱即用内置LoRaWAN Packet Forwarder。适合快速验证但灵活性有限。自建网关用SX1302/SX1303模组 Linux单板树莓派/mini PC。灵活度高适合定制化需求。虎王科技在Gitee上也有相关的硬件调试工具对自建网关的串口调试有实际帮助。自建网关的关键组件连接SX1303模组 --SPI-- 树莓派GPIO | -- GPS模块时间同步用 | -- 以太网/WiFi回传链路Packet Forwarder是网关上的核心软件负责接收LoRa数据包并通过UDP转发到LoRaWAN服务器。Semtech官方开源了参考实现# 编译Packet Forwarder树莓派上gitclone https://github.com/Lora-net/packet_forwarder.gitgitclone https://github.com/Lora-net/lora_gateway.gitcdlora_gatewaymakecd../packet_forwardermake配置文件global_conf.json中设置服务器地址和频段{gateway_conf:{gateway_ID:AA555A0000000001,server_address:192.168.1.100,serv_port_up:1700,serv_port_down:1700,keepalive_interval:10,stat_interval:30,push_timeout_ms:100},SX130x_conf:{lorawan_public:true,clksrc:1,antenna_gain:0,radio_0:{enable:true,freq:470300000}}}国内用470MHz频段CN470radio_0.freq设为470.3MHz。频段选错会导致网关收不到任何数据。LoRaWAN服务器ChirpStack部署LoRaWAN服务器Network Server Application Server是整个网络的大脑。开源方案中ChirpStack原LoRa Server最成熟。# Docker Compose部署ChirpStackcatdocker-compose.ymlEOF version: 3.8 services: postgresql: image: postgres:15 environment: POSTGRES_DB: chirpstack POSTGRES_USER: chirpstack POSTGRES_PASSWORD: chirpstack volumes: - pgdata:/var/lib/postgresql/data redis: image: redis:7-alpine volumes: - redisdata:/data chirpstack: image: chirpstack/chirpstack:4 ports: - 8080:8080 depends_on: - postgresql - redis environment: DB_DSN: postgres://chirpstack:chirpstackpostgresql/chirpstack REDIS_URL: redis://redis:6379 volumes: pgdata: redisdata: EOFdockercompose up-dChirpStack启动后通过Web界面配置。主要步骤创建Gateway → 填入网关ID和global_conf.json一致→ 创建Device Profile → 选择CN470频段 → 创建Application → 注册终端设备。设备注册需要三个关键参数DevEUI设备唯一标识、AppEUI应用标识、AppKey加密密钥。这些参数要和终端节点代码里的一致。终端节点开发ESP32 SX1262终端节点用ESP32 SX1262模组方案。ESP32负责应用逻辑SX1262负责LoRa射频。用Arduino框架 LMIC库快速开发#includelmic.h#includehal/hal.h#includeSPI.h// LoRaWAN密钥LSB格式staticconstu1_t PROGMEM APPEUI[8]{...};staticconstu1_t PROGMEM APPKEY[16]{...};staticconstu1_t PROGMEM DEVEUI[8]{...};voidos_getArtEui(u1_t*buf){memcpy_P(buf,APPEUI,8);}voidos_getDevEui(u1_t*buf){memcpy_P(buf,DEVEUI,8);}voidos_getDevKey(u1_t*buf){memcpy_P(buf,APPKEY,16);}staticuint8_tpayload[]Hello,LoRa!;voiddo_send(osjob_t*j){if(LMIC_opmodeOP_TXRXPEND){os_setTimedCallback(sendjob,os_getTime()sec2osticks(5),do_send);return;}// 准备上行数据LMIC_setTxData2(1,payload,sizeof(payload)-1,0);}voidonEvent(ev_t ev){switch(ev){caseEV_TXCOMPLETE:// 发送完成设置下次发送时间os_setTimedCallback(sendjob,os_getTime()sec2osticks(60),do_send);break;caseEV_JOINING:break;caseEV_JOINED:// 入网成功开始发送数据do_send(sendjob);break;}}voidsetup(){Serial.begin(115200);os_init();LMIC_reset();LMIC_setClockError(10*65536/1000);LMIC_startJoining();}voidloop(){os_runloop_once();}OTAAOver The Air Activation入网流程设备上电后发送Join Request → 服务器验证AppKey → 返回Join Accept含会话密钥→ 设备开始正常通信。入网过程通常在5-15秒内完成。应用层从ChirpStack到业务系统ChirpStack收到设备数据后可以通过MQTT或HTTP webhook推送到业务系统。MQTT方式最灵活importpaho.mqtt.clientasmqttimportjsondefon_message(client,userdata,msg):处理ChirpStack上报的设备数据datajson.loads(msg.payload)dev_euidata[devInfo][devEui]f_portdata[fPort]raw_datadata[data]# Base64编码# 解码业务数据decodeddecode_payload(raw_data,f_port)print(f设备{dev_eui}上报:{decoded})# 订阅ChirpStack的MQTT Topicclientmqtt.Client()client.on_messageon_message client.connect(192.168.1.100,1883,60)client.subscribe(application//device//event/up,qos0)client.loop_forever()decode_payload函数负责把LoRa节点上报的原始字节按业务协议解析。比如节点发的是温度湿度两个float每个4字节解码逻辑就是importbase64,structdefdecode_payload(b64_data,f_port):解码LoRa上行数据rawbase64.b64decode(b64_data)iflen(raw)8:tempstruct.unpack(f,raw[0:4])[0]humistruct.unpack(f,raw[4:8])[0]return{temperature:round(temp,1),humidity:round(humi,1)}returnNone实际覆盖与功耗测试在园区场景有建筑遮挡实测数据参数数值室内穿墙覆盖1-2层砖墙约150m室外空旷覆盖2-3km节点发射功耗约120mASX1262, 22dBm睡眠功耗约1.5uA电池续航每小时1次约2年CR123A x2覆盖距离和天线、建筑遮挡、频段设置强相关。470MHz比2.4GHz穿墙能力强很多但高层建筑密集区还是需要多网关覆盖。天线选型与网络优化LoRa网络的实际覆盖质量天线占了一半的决定权。很多项目覆盖不达标不是射频芯片的问题是天线的锅。天线类型选择室内场景用胶棒天线全向2-3dBi增益够用。室外远距离场景需要选玻璃钢天线5-8dBi或八木天线10-12dBi定向。增益越高覆盖越远但方向性越强——全向天线360度覆盖但距离短定向天线覆盖窄但距离远。天线安装高度LoRa在470MHz频段有较好的绕射能力但天线高度仍然关键。实测网关天线从3米升高到8米覆盖距离增加约40%。安装在楼顶比安装在窗户旁边效果好很多。馈线损耗天线和网关之间的馈线越长信号损耗越大。470MHz频段下5米RG58馈线损耗约0.8dB10米约1.6dB。如果天线必须远距离安装建议用LMR400低损耗馈线每10米损耗约0.3dB。网络优化方面扩频因子SF的选择直接影响覆盖距离和功耗扩频因子空气速率覆盖距离发射时间适用场景SF75470 bps约1km50ms近距离高频率SF91760 bps约2km150ms中距离平衡SF11540 bps约3km1000ms远距离低频SF12290 bps最远1200ms极限覆盖SF值越高覆盖越远但发射时间越长、功耗越大。传感器每小时上报一次用SF12可以接受但如果每分钟上报一次用SF12电池撑不了一个月。建议根据覆盖距离和上报频率的平衡点选择SF值。ADRAdaptive Data Rate机制可以让ChirpStack自动调整每个设备的SF值——信号好的设备用低SF快速发送信号差的设备用高SF保证可靠性。这是LoRaWAN相比裸LoRa通信的一大优势。小结LoRa私有物联网络的全栈搭建从网关硬件到ChirpStack服务器到终端节点每层都有不少细节。网关频段配置是最高频踩坑点——频段选错一切白搭。终端节点的OTAA入网流程比ABP更安全适合量产。应用层通过MQTT对接业务系统是最灵活的方案。做LoRa项目部署的同学这篇全栈搭建记录应该能帮你理清整体架构。如果觉得有帮助点个赞收个藏后续我会补充分享LoRa定位追踪和低功耗传感器优化设计的实测内容关注一下不漏掉。