一块 SBC 变身 LoRaWAN 网关:T113‑i 一体化 ChirpStack 本地部署

发布时间:2026/10/16 3:14:50
一块 SBC 变身 LoRaWAN 网关:T113‑i 一体化 ChirpStack 本地部署
一、为什么把网关 服务器塞进一块板子常规 LoRaWAN 组网是这样的LoRaWAN 网关 ──▶ 云服务器上的 ChirpStack ──▶ 业务应用网关负责收无线电ChirpStack 负责解密和分发两者通常分处两地中间依赖公网。在中小规模工业现场可以把 ChirpStack 直接部署在网关板子上无需额外配置独立服务器断网时本地仍能采集、判断、显示网络恢复后补传调试链路完全在本地不依赖公网环境本文的方案就是后者一块板 射频网关 Gateway Bridge ChirpStack MQTT 搭配配套软件搭建可落地的LoRaWan网关。二、硬件与软件清单硬件项目说明主机SBC2332全志 T113-i双核 A71GB DDR316GB eMMC系统Ubuntu 20.04无线模块MiniPCIe LoRaWAN 网关模块天线与模块频段匹配本例 868MHz网络千兆网口用于 SSH 和 Web 访问节点可选LoRaWAN 节点模块 传感器无节点也能先验证网关软件与端口组件版本/端口作用ChirpStack4.19.xLoRaWAN 网络服务器NS 应用服务器ASChirpStack Gateway BridgeUDP1700接收网关的 Semtech UDP 包ChirpStack Web UITCP8080管理后台MQTT BrokermosquittoTCP1883网关与平台、平台与应用之间的消息总线PostgreSQL / Redis—ChirpStack 的存储与缓存钡铼技术网关程序/LoRaWan网关配置上位机—负责驱动射频模块/获取配置服务器连接参数三、部署 ChirpStackChirpStack是一个著名的开源LoRaWAN服务器官方提供安装方法Ubuntu 20.04 直接照做即可# 参考官方文档https://www.chirpstack.io/docs/getting-started/debian-ubuntu.html # 1 安装依赖ChirpStack 本体不带这些 apt install -y mosquitto mosquitto-clients redis-server redis-tools postgresql # 2 建库建角色psql 内执行 su postgres -c psql create role chirpstack with login password chirpstack; create database chirpstack with owner chirpstack; \c chirpstack create extension pg_trgm; create extension pgcrypto; -- PostgreSQL 12 必加PG13 起内置缺它迁移全停 \q # 3 添加软件源keyring 方式 mkdir -p /etc/apt/keyrings/ wget -q -O - https://artifacts.chirpstack.io/packages/chirpstack.key | gpg --dearmor /etc/apt/keyrings/chirpstack.gpg echo deb [signed-by/etc/apt/keyrings/chirpstack.gpg] https://artifacts.chirpstack.io/packages/4.x/deb stable main /etc/apt/sources.list.d/chirpstack.list apt update # 4 安装并启动 apt install -y chirpstack chirpstack-gateway-bridge systemctl enable --now chirpstack chirpstack-gateway-bridge编辑/etc/chirpstack-gateway-bridge/chirpstack-gateway-bridge.toml把[integration.mqtt]段改成[integration.mqtt] event_topic_templateeu868/gateway/{{ .GatewayID }}/event/{{ .EventType }} command_topic_templateeu868/gateway/{{ .GatewayID }}/command/# systemctl restart chirpstack-gateway-bridge验证systemctl is-active chirpstack chirpstack-gateway-bridge mosquitto postgresql redis-server # 期望全部输出 active ss -tlnp | grep -E :(8080|1883|1700)四、 注册网关与设备1. 给设备安装LoRaWan软件1. 打开设备后等待系统进入后使用ssh等工具将安包传输设备2. 使用解压命令解压缩安装包tar -zxf install.tar.gz3. 进入解压后的软件目录执行里面的安装脚本./install.sh2. 使用LoRaWan配置上位机连接1. 解压缩上位机软件如图出现3个文件2. 运行LoRaWanConfigurator.exe这个软件即可打开3. 在配置上位机上输入对应的IP地址进行连接4. 点击连接5. 网关注册浏览器访问 http://localhost:8080用默认账号 admin / admin 登录。登录后按顺序配置以 ABP 激活为例Tenants → Gateways → Add gateway字段值Gateway nameSBC2332-GWGateway ID网关模块的 EUI6. 设备ProfileDevice profiles → Add device profile字段值Nameenv-node-abpRegionEU868与你的模块频段一致MAC versionLoRaWAN 1.0.3ActivationABP7. 应用与设备Applications → Add application名字env-monitor → 进入应用 →Devices → Add device字段值Nameenv-node-01Device EUI0011223344556677Device-profileenv-node-abp8.填写ABP密钥设备页 →Activation标签字段值DevAddr01D4C2A8NwkSKey2B7E151628AED2A6ABF7158809CF4F3CAppSKey3B7E151628AED2A6ABF7158809CF4F3DFCnt Up / Down0 / 0DevAddr 相当于节点的IPNwkSKey 用于校验帧完整性MICAppSKey 用于解密业务数据。这三个值必须与节点端完全一致否则数据进不来。9. 网关上线1.网关配置软件直接点击读取下位机2. 请根据实际情况填写下面的内容例如我使用的开源LoRaWan服务器chirpstack上行端口是1700下行端口是1700服务器请填写自己服务器的地址EUI请使用识别到的EUI3. 添加连接的服务器4. 改完配置后请点击发送配置看操作日志可以发现配置已经写入成功了现在只需点击重启网关等待片刻就可以连接到服务器。五、没有真实节点先跑一个模拟节点网关调好后最尴尬的情况是节点还没到货无法验证链路到底通不通。这时可以写一个脚本扮演无线节点直接往 Gateway Bridge 注入数据包。从 ChirpStack 的角度看它和真实节点发来的数据别无二致。我们实测的完整链路就是用这个方法打通的——网关环节是真硬件模块在线、芯片应答节点环节由脚本顶替以后接上真实节点软件侧一行都不用改。1. Semtech UDP 协议要点网关和服务器之间用 Semtech 包转发器协议UDP帧结构[协议版本 1B] [Token 2B] [类型 1B] [网关 MAC 8B] [JSON]类型值含义0x00PUSH_DATA网关 → 服务器0x01PUSH_ACK0x02PULL_DATA0x03PULL_RESP协议版本号必须是 0x02PUSH_DATA 是 0x00。写成 0x01 会被当成 PUSH_ACK 拒收。2. 两类包、两套时间格式// stat网关心跳—— 让平台显示在线时间用传统格式 {stat:{time:2026-10-14 08:44:52 GMT,rxnb:0,rxok:0,rxfw:0,ackr:100,dwnb:0,txnb:0}} // rxpk节点上行—— 真正的业务数据时间用 RFC3339 {rxpk:[{time:2026-10-14T08:44:52.025Z,freq:868.1,modu:LORA, datr:SF7BW125,codr:4/5,rssi:-42,lsnr:9.8,size:18,data:base64}]}ChirpStack Gateway Bridge 对两种包用两套时间解析器——心跳要YYYY-MM-DD HH:MM:SS GMT上行要 ISO 8601。3. 拼装 LoRaWAN 物理帧rxpk.data里是一整帧 LoRaWAN 物理层数据需要按协议拼装MHDR(1) FHDR(7) FPort(1) FRMPayload(加密) MIC(4)两个加密环节是最容易写错的地方FRMPayload 加密用 AppSKey 做 AES-128构造 A 块0x01 | 0x00×4 | Dir | DevAddr | FCnt | 0x00 | iMIC 计算用 NwkSKey 做AES-CMAC构造 B0 块后取前 4 字节写 AES-CMAC 时必须把子密钥 K1/K2 异或进最后一个数据块再加密。A 块和 B0 块里的DevAddr 和 FCnt 都是小端LSB first。用大端写表现为 MIC 校验失败。4. 运行效果此时打开 ChirpStackGateway 页面显示 OnlineDevice 页面 → Events / LoRaWAN frames里能看到每一条上行帧5. 排障利器tcpdump链路不通时先抓包确认 UDP 层有没有数据进出tcpdump -i any port 1700 -vv有进有出 → 问题在应用层密钥/MIC/帧计数器只有出没有进 → 网关没发或发错地址检查 server_address六、应用侧对接订阅 MQTT数据到了 ChirpStack 之后业务应用不需要调任何 REST 接口只要订阅 MQTT 主题application//device//event/up在嵌入式端用 libmosquitto 起一个线程轮询即可示例为 Cmosquitto_subscribe(mq, NULL, application//device//event/up, 0); /* 收到消息后从 JSON 提取 data 字段 → base64 解码 → 按约定解析 */ int16_t t (int16_t)((bin[0] 8) | bin[1]); /* 温度 ×10 ℃ */ int16_t h (int16_t)((bin[2] 8) | bin[3]); /* 湿度 ×10 %RH */ uint8_t b bin[4]; /* 电量 % */本例约定的应用负载FPort2共 5 字节大端偏移类型含义0–1int16 BE温度 ×10 ℃2–3int16 BE湿度 ×10 %RH4uint8节点电量 %解析完写入本地数据模型既能驱动 HMI 显示也能通过 MQTT 转发到云平台如华为云 IoTDA、或者写数据库都可以——边缘侧闭环采集 上云两不误。七、延伸边缘自闭环把分析决策放在网关板上只把结果上云能大幅节省流量并降低响应延迟。多节点组网同一网关可接入数百个节点“无线环境监测可以平滑扩展到无线振动监测”“无线表计抄读”。协议透明业务层只认 MQTT 主题和 payload 约定射频方案的升级SX1302→SX1303、LoRaWAN 1.0.3→1.1不会波及上层代码。八、总结本次实操在 SBC2332 单板上搭建一体化 LoRaWAN 网关将射频网关与 ChirpStack 网络服务器部署在同一板子实现断网可用的边缘自治采集。使用 SX1302 网关硬件搭配脚本模拟 ABP 节点完成 Semtech UDP 协议、LoRaWAN 帧加密校验、MQTT 业务数据解析全链路验证。为中小工业现场的本地化 LoRaWAN 部署提供工程方案。