0

零、LoRaWAN 协议入门

在讨论实现路线之前,先用通俗的方式理解 LoRaWAN 到底是什么、平台在其中的角色。本章是后续技术决策的认知基础。

0.1 一句话理解 LoRaWAN

这是什么

LoRaWAN 是一种 低功耗广域网(LPWAN)协议。它让分布在几公里范围内、靠电池供电的小型设备,能把少量数据(温度读数、表计数值、开关状态)传到云端。

三个关键词:远距离(公里级,能穿透建筑)· 低功耗(一节电池用几年)· 小数据(每次只发几十字节)。

适合 / 不适合

适合:水电气表抄读、温湿度/空气质量/噪声监测、电池供电传感器。不适合:视频、高频控制、实时性要求高或数据量大的场景。

0.2 LoRa 与 LoRaWAN 的区别

物理层 vs 网络协议
概念含义类比
LoRa物理层无线调制技术(怎么把信号发到空气中)「公路」
LoRaWAN建立在 LoRa 之上的网络协议(怎么组网、路由、加密)跑在公路上的「交通规则」

平台对接的是 LoRaWAN 这一层——不关心无线电波怎么传,只关心数据怎么组织与路由。

0.3 ChirpStack 网络架构:数据怎么从设备到平台

四层通信链路

LoRaWAN 通信不是设备直接连平台,而是经过多层中转。本平台对接的是开源网络服务器 ChirpStack:

角色职责归谁
终端设备采集数据、发射 LoRa 无线信号现场(电池供电)
网关 Gateway接收 LoRa 信号,转成 IP 报文转发给网络服务器现场(有源、联网)
ChirpStack NS网络服务器:去重、解码、管理设备入网与密钥第三方服务器
业务平台业务处理:建点、存值、展示、控制(驱动职责)OptiFSP(老平台) / EasyPro(新平台,待定)
关键点

无论新老平台,都不直接接触 LoRa 无线,一般也不直连网关。所有交互都经 ChirpStack 网络服务器中转。驱动的核心工作是「接收 NS 推来的上行数据 + 按物模型解码」,以及经 NS 下发控制指令。老平台 OptiFSP 已有这套对接,新平台 EasyPro 如何沿用或重构,是本文档的主题。

0.4 老平台已对接的 9 种 LoRaWAN 设备

设备覆盖范围(OptiFSP 现状,新平台需兼顾)

老平台 OptiFSP 的 LoRaWAN 驱动(ibms-driver-lorawan)已对接 9 种 LoRaWAN 产品类型,每种对应一套物模型(定义该类设备有哪些点位)。按楼宇物联网场景分组概览如下:

场景设备举例典型测点
能耗计量电表、水表电压/电流/功率/电量、累积流量
环境监测空气质量传感器、噪声传感器PM2.5/CO₂/温湿度、噪声分贝
暖通控制风机盘管温控器、分体空调控制器设定温度/模式/风速、电气参数
照明与开关智能插座、零火面板、单火面板开关、调光、电量

这是新平台对接时需要覆盖的设备广度。完整的 9 种产品编码与逐项测点清单见第八章 8.1——至于用什么技术方案实现这 9 种设备的对接,正是本文档后续要研究的。

0.5 上行与下行:数据的两个方向

新老平台都要面对的两个方向
方向路径难度
上行(设备→平台)设备 → 网关 → ChirpStack NS → HTTP 推送 → 平台较易:NS 主动推,平台被动收
下行(平台→设备)平台 → 调 NS API → NS → 网关 → LoRa → 设备较难:LoRa 设备大多休眠,下发需等设备唤醒窗口
移植现状

从老平台移植到新平台的代码(代号 alinkwise)现状不理想:下行实现 SendServiceImpl 整个文件被注释、且引用旧包名(com.alinkWise.driver.*),下行控制不可用;此外还存在定时任务误引用 secp 驱动的类、属性索引读取错误、设备类型硬编码等共 4 个代码 bug。这也是该驱动当前在新平台被 SPI 注释禁用、需要重新研究实现路线的直接原因(详见第一章背景与第八章 8.4)。

了解了 LoRaWAN 基础后,下面进入正题:老平台 OptiFSP 当初是怎么对接的、移植到新平台后暴露了哪些问题、新平台 EasyPro 该选哪条实现路线。

1

一、背景与目标

1.1 平台演进背景

1.1.1 从 OptiFSP 到 EasyPro:平台重写的战略决策

平台从 OptiFSP(1.4 系列)演进至 EasyPro(2.0 系列),完成了架构层面的全面重构:

维度 OptiFSP(旧,1.4 系列) EasyPro(新,2.0 系列)
产品名称 OptiFSP EasyPro
Maven 项目 ibms-cloud(groupId: com.sctech) OptiCloud(groupId: com.yc)
代码仓库 SVN Git (当前仓库)
基础框架 基于 RuoYi-Cloud 改造 自研单体架构
架构风格 分布式微服务(Spring Cloud + Nacos + Feign + Gateway) 单体架构(Spring Boot 单一应用)
技术栈 Java 8 / Spring Boot 2.5.5 / Spring Cloud 2020.0.4 Java 21 / Spring Boot 3.3.4
驱动框架 ibms-common-driver-sdk(独立 JAR,DriverCustomService 接口) 内嵌 drivers/sdk(DriverAccess SPI 加载)
驱动数量 20 个活跃模块 + 17 个历史目录 8 个内嵌驱动(含 1 个禁用:LoRaWAN)
部署方式 每个驱动独立 JAR + 微服务注册 单一 JAR(OptiCloudService.jar)
服务发现 Nacos 无(单体内直接调用)
远程调用 Feign Client(ibms-api 模块) 单体内方法调用

重写缘由:

  1. 部署环境限制:项目现场普遍采用单服务器部署,OptiFSP 的分布式架构(Nacos、Gateway、多微服务进程)资源开销过大,超出单台服务器承载能力
  2. 历史债务严重:OptiFSP 基于 RuoYi-Cloud 改造,经多轮人员交接,代码质量参差不齐,存在大量隐性 bug、不合理耦合和文档缺失,维护成本高
  3. 运维复杂度高:分布式架构依赖服务注册中心、网关、配置中心等基础设施,在单服务器环境下这些组件反而成为故障点
  4. 驱动升级困难:OptiFSP 包含 20+ 个驱动模块,每个驱动为独立 Spring Boot 应用,升级需重新打包、部署、注册,流程繁琐

EasyPro 的驱动移植进展:

目前已有多种驱动从 OptiFSP 成功移植到 EasyPro 并完成了升级重构,同时 EasyPro 也新增了部分 OptiFSP 不具备的驱动:

驱动 来源 状态 说明
Modbus TCP OptiFSP 移植 (ibms-driver-modbus-tcp) 已完成 重构为内嵌驱动,使用 modbus4j
KNX OptiFSP 移植 (ibms-driver-newknx) 已完成 重构为内嵌驱动,使用 knx-core
YCBox OptiFSP 移植 (ibms-driver-ycbox) 已完成 MQTT 网关驱动
RCP OptiFSP 移植 (ibms-driver-rcp) 已完成
SECP OptiFSP 移植 (ibms-driver-secp-new) 已完成 Socket 协议驱动
LoRaWAN (alinkwise) OptiFSP 移植 (ibms-driver-lorawan) 部分完成,已禁用 代码已移植但存在多个 bug,且受 ChirpStack 平台问题制约
BACnet/IP EasyPro 新增 已完成 OptiFSP 无此驱动,EasyPro 全新开发,使用 BACnet4J,支持 COV 订阅
MQTT EasyPro 新增 已完成 OptiFSP 无此驱动,EasyPro 全新开发,通用 MQTT 网关驱动
1.1.2 LoRaWAN 驱动的特殊困境

LoRaWAN 驱动是所有驱动中移植进展最慢的,其原因不仅限于代码层面,更涉及第三方平台的系统性问题:

① 双平台协同:ChirpStack 配置 + 平台自动同步

LoRaWAN 设备接入涉及两个平台,但并非两边都要手动配置。老平台 OptiFSP 的驱动已实现「ChirpStack 配置 → 平台侧自动建模」的自动化流程:

ChirpStack 平台
第三方 LoRaWAN NS · 需手动配置
1. 创建 Application
2. 注册网关
3. 注册终端设备(DevEUI/密钥)
4. 配置设备编解码器
驱动自动同步
业务平台
驱动自动完成 · 无需手动建点
① 自动创建设备类型(含物模型属性)
② 自动创建设备
③ 自动建点 + 绑点(反射物模型)
④ 增量同步(增/改/删设备类型)
平台侧建模全自动;真正的人工负担在 ChirpStack 侧的设备注册

具体而言,驱动(AlinkwiseManager.initDriverInstance)会从 ChirpStack 拉取 Application 下的设备类型与设备清单,调用 PointAttributeBuild.buildPoints 反射物模型属性类(@ProductAttribute 注解)自动生成点位,并通过 platformClient.saveDeviceType/saveDeviceBatch 落库;每次同步还会与平台已有数据做 diff,自动新增、更新、删除设备类型。

② 驱动已部分移植但存在 4 个代码 bug + SPI 被禁用

EasyPro 中的 alinkwise 驱动(drivers/inline/alinkwise/)已从 OptiFSP 移植了核心代码,但存在以下问题:

  • •SendServiceImpl 完全注释,点值推送功能缺失
  • •CheckInstanceAliveTask import 来源错误(引用了 secp 包的类)
  • •checkInstanceAliveTask() 属性索引全部使用 get(0),端口/用户名/密码读取错误
  • •dataDownbyEUI() 硬编码设备类型为 FCU,其他设备下行失效
  • •驱动在 SPI 配置中被注释禁用,从未正式启用

③ ChirpStack 平台的系统性问题

即使驱动代码完美,底层 ChirpStack 平台的问题也会导致:

  • •下行控制失败(撞包、缺多下行 ACK)
  • •状态同步延迟(缺网关元数据缓存刷新)
  • •数据完整性无法保证(无报文 retention)

④ 接入流程的真正痛点与组播设备

虽然平台侧建模是自动的,但接入流程仍有真实痛点,且涉及一类特殊设备——组播设备:

  • •ChirpStack 侧配置负担:每个终端设备的 DevEUI、入网密钥、编解码器仍需在 NS 手工注册,设备多时工作量大
  • •组播设备的特殊设定:FCU(风机盘管温控器)等设备支持组播(Multicast)控制——一条下行指令可同时发给一组设备(如某区域全部空调统一调温)。组播需在 ChirpStack 配置组播组(Multicast Group,GET /api/multicast-groups),平台侧通过 BuildRemoteParams.buidGroupParam 按 groupId + fport 构建组播下行载荷。但组播下发无逐设备 ACK 反馈,无法直接知道哪些设备未执行,需靠超时检测 + 重试兜底(详见第八章)
  • •双平台信息对应:ChirpStack 的 DevEUI/Application 需与平台设备编码对应,配置变更时若只改一侧会导致数据路由或控制失效

结论:LoRaWAN 驱动的升级改造不能仅停留在代码层面,需要同步治理第三方平台、简化接入流程、修复驱动 bug,才能从根本上解决问题。

1.1.3 第三方 LoRaWAN 平台现状

当前 EasyPro 使用的 LoRaWAN 网络服务器为 ChirpStack v3 系列(Windows 一体包,内部版本号 v2.1.10),底层组件版本为:

组件 当前版本 上游最新 v3 上游最新 (含v4)
chirpstack-network-server v3.9.0 (2020-03) v3.16.7 (2023-04) — (v4 合并为单一二进制)
chirpstack-application-server v3.10.0 (2020-07) v3.17.7 (2022-08) —
chirpstack-gateway-bridge v3.8.1 (2020) v3.14.3 (2022-09) v4.1.2 (2026-07)
ChirpStack 整体 v3 三件套 v3 三件套 v4.19.0 (2026-07) 单一二进制
1.1.4 现场运行问题(核心驱动力)

OptiFSP 平台在实际项目中暴露出严重的可用性问题,直接影响了业务正常运行,这是本次重写 LoRaWAN 体系的核心驱动力:

① 下行控制成功率低

  • •设备控制指令(如空调开关、面板调光、插座通断等)下发后经常无响应或超时
  • •下行指令通过 ChirpStack 的队列 API(/api/devices/{eui}/queue)入队后,实际空口发送成功率不稳定
  • •影响场景:空调面板 FCU 控制、智能插座开关、风机盘管调速等实时控制类业务

② 设备状态同步不及时

  • •设备上线/离线状态变化后,平台上长时间无法感知,仍显示旧状态
  • •上行数据(如传感器采集值、电表读数)存在延迟或丢失,导致数据不一致
  • •设备状态点位更新依赖定时轮询(15 秒),加上 ChirpStack 本身的状态回调不稳定,实际延迟可达分钟级

③ 下行撞包/丢包

  • •撞包:多个设备同时下发时,ChirpStack v3.9.0 的下行调度器缺少防撞机制(v3.13.0 才加入 Class-C 调度锁和多下行 ACK),导致同一网关的下行时隙冲突
  • •丢包:下行帧在 RX1/RX2 窗口内未能成功发送,或网关返回的 tx 确认数不足但仍标记为成功
  • •多下行命令不支持:当前版本(v3.9.0)不支持一次下发 RX1+RX2 双窗口重发(v3.10.0 才支持),下行可靠性进一步降低

④ 根因分析

经技术调研确认,上述问题的根因在于 ChirpStack 版本过旧(落后上游 6 年),关键缺陷如下:

问题 根因 引入修复的版本 当前版本
下行撞包 缺少 Class-C/A 调度锁 v3.13.0 (2021-05) v3.9.0
下行丢包后无重发 不支持多下行命令(RX1+RX2) v3.10.0 (2020-07) v3.9.0
弱网下行不鲁棒 不允许 tx 确认数少于下发条目数 v3.15.1 (2022-01) v3.9.0
OTAA 入网并发问题 幽灵 OTAA 包并发处理缺陷 v3.16.2 (2022-09) v3.9.0
状态同步慢 网关元数据缓存刷新缺失 v3.16.3 (2022-10) v3.9.0
PG 报文无限增长 无 retention 配置 v4.0.0 (2022-12) v3.9.0
配置项实际不生效 toml 配置了 v3.13+ 的 key,但旧二进制不识别 — v3.9.0

结论:仅靠驱动层面的优化无法解决上述问题,必须从 LoRaWAN 网络服务器层面进行治理。

1.2 改造目标
目标层级 目标 具体指标
业务层 解决现场可用性问题 下行控制成功率 > 99%、状态同步延迟 < 30 秒、消除撞包/丢包
平台层 升级 LoRaWAN 网络服务器 部署 ChirpStack v4 替代现有 v3.9.0
驱动层 完成驱动移植并修复 bug 9 种设备类型全部可用,修复已知问题
监测层 新增设备通信健康监测 自动识别错误报文、频繁上报等异常设备
体验层 简化接入流程 减少跨平台配置步骤
可持续性 长期可维护 跟上 LoRaWAN 协议规范发展,平台持续更新
1.3 已有资产
资产 说明 状态
OptiFSP LoRaWAN 驱动 OptiFSP 平台中的 LoRaWAN 驱动模块,SVN 仓库 完整可用,9 种设备类型
EasyPro alinkwise 驱动 EasyPro 中已移植的 alinkwise 驱动 部分移植,已禁用,存在 4 个代码 bug
ChirpStack v3 包 当前现场运行的 LoRaWAN 网络服务器 运行中,版本老旧(v3.9.0)
版本调研报告 ChirpStack 版本对比分析 已完成
已完成的驱动移植 Modbus/KNX/YCBox/RCP/SECP 等(从 OptiFSP 移植)、BACnet/MQTT(EasyPro 新增) 已完成,可作为 LoRaWAN 驱动移植的参考模式
LoRaWAN 设备调试联系人 张家辉 设备调试、测试联调均可联系
2026 年 OptiFSP LoRaWAN 驱动优化记录

2026 年以来,OptiFSP LoRaWAN 驱动已完成多轮优化,主要解决了以下现场问题:

问题 解决方案 业务价值
上行解析崩溃:/uplink 接口因心跳/ACK 等短数据包触发 ArrayIndexOutOfBoundsException,累计崩溃 10k+ 次 LorawanController 增加全局 try-catch 和 OperationService 空指针防护;9 种 OperationService 增加字节数组长度校验和解析循环异常捕获 消除生产环境频繁崩溃,系统稳定性大幅提升
下行发送无反馈:dataDownbyEUI 发送失败时返回 URL 而非错误码,上层无法判断发送是否成功 RemoteCallServer 重构返回值逻辑:失败时返回 "500",成功时返回响应内容;移除旧的 20 秒限流和延迟队列逻辑 下行控制结果可准确判定,异常情况可及时告警
驱动重启后设备丢失:重启后 DRIVER_INSTANCE_MAP 和 DEVICE_VALUE 缓存未清理,设备无法重新同步 initial() 方法中主动清除两个缓存 Map 驱动重启后设备自动恢复同步
下行控制成功率低:原实现单次发送,LoRaWAN 平台丢包后无重试 write() 方法重构为重发循环:最多尝试 30 次,每轮需成功 2-3 次(按设备类型区分单播/组播),每次间隔 500ms 控制成功率从单次发送提升到多次重发保障
温控器控制结果始终返回失败:原实现未正确解析 Modbus 06 写返回报文,导致控制结果判定错误 TemperatureControlServiceImpl 从 227 行扩展到 1324 行:新增 Modbus 功能码常量定义、按 03/06 功能码区分读返回和写返回解析、实现 0106 写返回报文的完整校验及温度值转换 温控器控制结果准确反馈,运维可确认指令是否到达设备
组播控制无超时检测:组播设备控制后无反馈机制,不知道哪些设备未执行 新增 getTerminalByGroup 方法查询组播组成员;设计超时检测机制(3+x*n 秒)和设备重试队列(最大 5 次+随机延迟) 组播场景下可定位未响应设备并自动重试
控制后无法回读设备状态:写成功后不发读请求,无法确认设备实际执行结果 单播设备写成功后异步发送读请求(0103000000070408)回读状态;组播设备 3 次写全部成功后也发送读请求 控制闭环,确保指令不仅到达而且被执行
设备状态点位缺失:设备在线/离线状态无法在平台上体现 新增 DEVICE_STATUS_IDENTIFIER 常量;bindDeviceStatusPoints 方法实现状态点位自动创建和绑定;设备状态变化时同步更新点位值;驱动离线时批量将所有设备状态置为离线 运维人员可实时掌握设备在线状态
设备 EUI 变更后无法识别:设备更换 EUI 后,平台因 nickname 冲突无法创建新设备 dealDevice 新增 nickname 冲突检测,EUI 变更时自动删除旧设备记录再创建 设备更换后无需手动清理,自动适配
物模型发布失败阻塞设备创建:publishThingModel 失败时整个同步流程中断 物模型发布失败仅记录 warn 日志,不阻塞后续设备创建和绑点流程 单个产品物模型异常不影响其他产品正常同步
多设备并发上报卡死:大量设备同时上报时,主线程阻塞导致程序无响应 调度线程池管理超时检测任务,单播和组播超时检测分离到独立线程 支撑大规模设备并发场景,程序不再卡死
日志信息不可用:大量 info 日志导致生产环境日志量过大,关键信息难以定位 日志级别从 info 调整为 debug;关键操作(同步、绑点、控制)保留 info 级别日志;物模型未匹配属性增加 error 日志 生产环境日志量大幅减少,问题定位更高效

2026 年优化重点总结:

优化方向 核心改动 业务效果
下行可靠性 重发机制(30 次尝试 × 2-3 次成功要求)+ 超时检测 + 设备重试队列 控制成功率显著提升
系统稳定性 全局异常捕获、字节数组校验、线程池隔离、并发冲突修复 消除生产环境崩溃和卡死
设备状态管理 状态点位自动创建/绑定/同步,离线批量处理 设备状态实时可观
温控设备深度适配 Modbus 03/06 报文解析、寄存器常量定义、写反馈完整链路 温控器控制闭环可靠
2

二、方案概述

方案 A:升级到最新版 ChirpStack v4

将第三方 LoRaWAN 网络服务器升级到 ChirpStack 最新版本(v4.19.0),驱动层做 API 适配。

方案 B:Java 改写,融入当前平台

用 Java 实现 LoRaWAN Network Server 核心功能,作为 EasyPro 的内嵌模块,消除外部依赖。

LoRaWAN 网络服务器选型全景

在确定方案前,对市面上主流 LoRaWAN 网络服务器进行了调研:

平台 语言 开源 架构 活跃度 适用场景 备注
ChirpStack v4 Rust Apache-2.0 单一二进制 ⭐⭐⭐⭐⭐ (2026-07 仍在更新) 生产环境首选 社区最大,文档最全
ChirpStack v3 Go MIT 三件套 ⭐⭐ (已停更,最后 2023) 已有部署维护 不建议新项目使用
The Things Network (TTN/TTI) Go 部分开源 微服务 ⭐⭐⭐⭐ 运营商级/公有云 v3 开源,v4 商业化;自托管复杂
LNS (by brocaar) Go MIT 单体 ⭐ (已归档) — ChirpStack 前身,已废弃
Basic Station (Semtech) C 网关侧 ⭐⭐⭐ 网关固件 仅网关协议,不含 NS
AWS IoT Core for LoRaWAN — 商业 云服务 ⭐⭐⭐⭐ AWS 生态 厂商锁定,按量付费
Azure IoT Hub Device Provisioning — 商业 云服务 ⭐⭐⭐ Azure 生态 LoRaWAN 支持有限
腾讯云物联网开发平台 — 商业 云服务 ⭐⭐⭐ 国内项目 有 LoRaWAN 支持
自研 (Java 改写) Java 自有 内嵌 — 深度定制 本报告方案 B

研究结论:在开源可自托管方案中,ChirpStack v4 是目前唯一仍在活跃维护且功能完善的选择。TTN/TTI 自托管部署复杂度高且核心趋向商业化。商业云平台存在厂商锁定和持续费用问题。基于上述分析,建议优先考虑方案 A(ChirpStack v4),方案 B(Java 自研)作为特殊需求下的备选(最终选型待评审确认)。

3

三、方案 A:升级到 ChirpStack v4

3.1 ChirpStack v4 架构变化

ChirpStack v4 是一次 不兼容的重大重写:

维度 v3 v4
架构 三件套(NS + AS + GW-Bridge) 单一二进制(All-in-One)
实现语言 Go Rust(核心) + TypeScript(Web UI)
数据库 PostgreSQL + Redis PostgreSQL(默认)或 SQLite(可选)
API gRPC + REST(v3 风格) gRPC + REST(全新 API 定义)
配置 3 个 TOML 文件 1 个 TOML 文件
部署 多进程 单进程(可选嵌入 PostgreSQL/Redis)
Web UI 内置 Angular 内置 React/TypeScript
最新版本 v3.17.7 (2022-08) v4.19.0 (2026-07)
3.2 对驱动移植的影响

API 不兼容,必须适配:

对接项 v3 API v4 API 影响
登录认证 POST /api/internal/login POST /api/internal/login 基本兼容
应用列表 GET /api/applications GET /api/applications 字段有变化
设备列表 GET /api/devices GET /api/devices 分页/字段变化
设备队列 POST /api/devices/{eui}/queue POST /api/devices/{eui}/queue 请求体变化
组播组 GET /api/multicast-groups GET /api/multicast-groups 字段变化
Webhook AS 配置 HTTP integration Application 集成配置 配置方式变化
JWT 格式 HS256 HS256/RS256 需确认兼容性

结论:OptiFSP 驱动中的 RemoteCallServer 需要针对 v4 API 进行适配修改,但改动量可控(主要在 HTTP 调用参数和响应解析)。

3.3 优势
  1. 持续维护:v4 是活跃开发分支,2026 年仍在更新(最新 v4.19.0,2026-07-09)
  2. 功能完善:支持 LoRaWAN 1.0.4/1.1、LR-FHSS、2.4GHz、Passive Roaming、Class-B/C 优化、报文 retention 配置等
  3. 架构简化:单一二进制部署,配置简单,资源占用更低
  4. 数据库灵活:支持 SQLite(适合边缘/轻量部署)和 PostgreSQL(适合生产环境)
  5. 安全性提升:Rust 实现,内存安全;支持 TLS、mTLS、OIDC 认证
  6. 社区生态:活跃社区,丰富的集成(MQTT、HTTP、gRPC、Kafka、AWS/Azure/GCP)
  7. 部署方式多样:支持 Docker、Linux 二进制、Nix 构建
3.4 劣势与风险
  1. 全新部署成本:EasyPro 不继承 OptiFSP 的设备和数据,需全新配置:ChirpStack v4 部署、驱动 API 适配、设备/网关重新注册
  2. Windows 原生包不可用:上游仅发布 Linux 二进制和 Docker 镜像,无官方 Windows 原生包,需自行从源码交叉编译
  3. 安装包集成:EasyPro 采用单 EXE 安装包一键部署,ChirpStack v4 需编译为 Windows 原生二进制后集成到安装包中
  4. Redis 依赖:v4 仍需 Redis 用于缓存和实时数据
  5. 网关兼容性:需确认现有 LoRaWAN 网关固件是否兼容 v4

建议技术路线:自行编译 Windows 原生二进制

从 ChirpStack v4 源码交叉编译 Windows 版本,集成到 EasyPro 安装包中,保持单安装包一键部署的体验。这与 OptiFSP 当年将 ChirpStack v3(Go)交叉编译为 Windows 版本的做法一致。

方案 说明 推荐度
自行编译 Windows 原生二进制 从 ChirpStack v4 源码交叉编译,集成到 EasyPro 安装包 ⭐⭐⭐⭐⭐ 推荐
Docker 作为前置依赖 要求用户自行安装 Docker Desktop ⭐⭐ 备选
Docker Desktop 内嵌 将 Docker Desktop 打包进安装包 ⭐ 不推荐(许可问题)
换用其他平台 如 The Things Stack 等 ⭐ 不推荐(需重新选型)

技术可行性分析:

ChirpStack v4 使用 Rust 语言开发,Rust 原生支持交叉编译到 Windows(x86_64-pc-windows-msvc / x86_64-pc-windows-gnu)。其核心依赖分析如下:

依赖组件 Rust crate 跨平台性 Windows 编译难度
gRPC 服务端 tonic 纯 Rust 实现 低
gRPC 代理 tonic-gRPC 纯 Rust 实现 低
Redis 客户端 redis-rs 纯 Rust 实现 低
MQTT 客户端 rumqttc 纯 Rust 实现 低
HTTP 客户端 reqwest 纯 Rust 实现 低
JSON 处理 serde / serde_json 纯 Rust 实现 低
PostgreSQL 客户端 tokio-postgres 纯 Rust 实现 低
SQLite(可选) rusqlite C 绑定(libsqlite3) 中
加密 rust-crypto 纯 Rust 实现 低
异步运行时 tokio 纯 Rust 实现 低

结论:ChirpStack v4 的核心依赖大部分为纯 Rust 实现,天然支持跨平台编译。主要难点在于:

  1. 构建工具链配置:官方使用 Nix + cross-rs 进行交叉编译,需搭建对应的 Windows 交叉编译环境
  2. SQLite C 绑定(如使用 SQLite 模式):需要 C 编译工具链
  3. 官方未提供 Windows 编译的 Makefile/target,需自行适配

参考:ChirpStack v3(Go 语言)已由 OptiFSP 成功交叉编译为 Windows 版本,v4(Rust)的交叉编译原理相同,仅工具链不同。

3.5 实施要点
  • •ChirpStack v4 编译与部署:从源码交叉编译 Windows 原生二进制,完成全新配置
  • •驱动 API 适配:修改 RemoteCallServer 的 HTTP 调用参数和响应解析
  • •Webhook 集成:配置上行数据回调地址
  • •联调测试:9 种设备类型逐一验证
4

四、方案 B:Java 改写,融入当前平台

4.1 LoRaWAN Network Server 核心功能分析

一个完整的 LoRaWAN Network Server 需要实现以下核心功能:

功能模块 复杂度 说明
LoRaWAN MAC 层 ⭐⭐⭐⭐⭐ MAC 命令处理(ADR、ADRReq/Ans、LinkCheck、DevStatus、NewChannel 等)、帧计数器管理、MIC 计算验证
OTAA 入网流程 ⭐⭐⭐⭐ JoinReq/JoinAccept 处理、DevNonce 管理、AppKey/NwkKey 加解密、会话密钥派生
ABP 设备管理 ⭐⭐⭐ 预配置会话、帧计数器持久化
上行处理 ⭐⭐⭐⭐ 物理层解调参数处理、去重(多网关)、重传检测、ADR 状态机
下行调度 ⭐⭐⭐⭐⭐ RX1/RX2 窗口精确时序、Class-A/B/C 调度、组播调度、下行队列管理、防撞机制
频段/区域参数 ⭐⭐⭐ EU868/US915/CN470/AS923 等多频段支持、占空比限制、频率/数据速率映射
网关通信 ⭐⭐⭐ Semtech UDP 协议、Basic Station 协议、网关统计、多网关管理
安全 ⭐⭐⭐⭐ AES-128 加解密(AppSKey/NwkSKey)、MIC 计算、LoRaWAN 1.1 双密钥模型、重放攻击防护
数据集成 ⭐⭐ MQTT/HTTP/gRPC 上行推送、下行 API
设备/应用管理 ⭐⭐⭐ 设备档案、Service Profile、Device Profile、Multicast Group 管理
漫游 ⭐⭐⭐⭐ LoRaWAN Backend Interfaces、被动/主动漫游(可选)
帧日志/监控 ⭐⭐ 实时帧日志、指标采集、健康检查

总代码量估算:

ChirpStack v3(Go)约 15-20 万行核心代码(不含 UI 和第三方库)。

用 Java 改写预计 20-30 万行(Java 通常比 Go 更冗长)。

4.2 技术可行性分析
维度 评估 说明
协议标准 公开 LoRaWAN 规范由 LoRa Alliance 发布(TS001-1.0.4, RP002 等),可免费下载
参考实现 有 ChirpStack(Go/Rust)、LoRa Server(Go)、Semtech Reference(C)等开源实现
Java 加密库 成熟 BouncyCastle 支持 AES-128-ECB/CBC/CMAC,可实现 LoRaWAN 安全要求
时序精度 挑战 RX1/RX2 接收窗口仅 1-2 秒,Java GC 可能导致时序抖动
已有 Java 库 有限 无成熟的 Java LoRaWAN MAC 层库,需自行实现或移植
4.3 优势
  1. 消除外部依赖:不再需要独立部署 ChirpStack,减少运维复杂度
  2. 统一技术栈:全 Java/Spring Boot,团队熟悉,降低维护成本
  3. 深度集成:与 EasyPro 共享数据库、缓存、认证、用户体系
  4. 定制灵活:可完全按业务需求定制功能,不受第三方约束
  5. 部署简化:无需额外的 PostgreSQL/Redis/Mosquitto 服务
  6. 数据主权:所有数据完全自控,无外部组件安全风险
4.4 劣势与风险
  1. 工作量巨大:
    ↳ 核心 MAC 层实现:3-6 个月(需深入理解 LoRaWAN 协议细节)
    ↳ 频段/区域参数:1-2 个月
    ↳ 下行调度引擎:2-3 个月(时序精度要求高)
    ↳ 安全模块:1-2 个月
    ↳ 网关通信协议:1-2 个月
    ↳ 管理界面/API:1-2 个月
    ↳ 测试验证:2-3 个月(需与真实网关/设备联调)
    ↳ 总计:12-20 个月(2-3 人团队)
  1. 技术风险高:
    ↳ LoRaWAN 协议细节繁多,自行实现容易出现兼容性问题
    ↳ 时序敏感操作(RX 窗口)在 JVM 上难以保证精度
    ↳ 缺乏 Java 生态的 LoRaWAN 参考实现,出错时无成熟方案可参考
    ↳ 需要与多种网关(Semtech UDP、Basic Station)兼容测试
  1. 维护成本持续:
    ↳ LoRaWAN 规范持续演进(1.0.4 → 1.1 → 1.2),需持续跟进
    ↳ 新频段、新设备类型的支持需持续开发
    ↳ 安全漏洞修复需自行负责
  1. 功能完整性难以保证:
    ↳ 漫游、FUOTA、Class-B 等高级功能实现难度极大
    ↳ 与商业 LoRaWAN 平台的互操作性需大量测试
  1. 机会成本:
    ↳ 团队精力投入 LoRaWAN 底层协议,会挤占业务功能开发
4.5 实施规模

Java 改写 LoRaWAN Network Server 涉及以下核心模块,整体规模远超方案 A:

  • •核心 MAC 层:LoRaWAN 帧解析/构建、MIC 计算、OTAA 入网、ADR 状态机、20+ 种 MAC 命令处理
  • •上下行引擎:上行去重/重传检测、RX1/RX2 精确时序调度、Class-B/C 调度、组播支持
  • •网关与安全:Semtech UDP 协议、Basic Station 协议、多频段区域参数、AES 加解密、重放防护
  • •管理与集成:设备/应用管理 API、MQTT/HTTP 数据集成、管理界面
  • •测试与验证:单元测试、多厂商网关联调、多种设备类型兼容性测试

ChirpStack v3 核心代码约 15-20 万行(Go),用 Java 改写预计 20-30 万行。

5

五、方案对比

5.1 综合对比矩阵
评估维度 方案 A (ChirpStack v4) 方案 B (Java 改写)
开发周期 3-4.5 周 12-20 个月
技术风险 中 高
运维复杂度 中(需维护外部服务) 低(内嵌)
功能完整性 ⭐⭐⭐⭐⭐ ⭐⭐⭐(初期)
长期可维护性 ⭐⭐⭐⭐⭐ ⭐⭐⭐
协议兼容性 ⭐⭐⭐⭐⭐ ⭐⭐⭐(需持续验证)
定制灵活性 ⭐⭐⭐ ⭐⭐⭐⭐⭐
团队技能匹配 ⭐⭐⭐⭐ ⭐⭐⭐⭐⭐
部署要求 Windows 原生(需自行编译) 无额外要求
成本 低 高
适用场景 生产环境首选 有特殊定制需求
5.2 加权评分矩阵(定量评估)

基于新平台的首要目标(解决现场可用性问题),对各维度进行加权评分:

评估维度 权重 方案 A (ChirpStack v4) 方案 B (Java 改写) 说明
现场问题修复能力 25% 9 7 v4 从根本上解决撞包/丢包/状态同步问题
下行可靠性 20% 9 6 v4 有完整防撞+多下行+retention
开发周期 15% 7 2 v4 中等(3-4.5 周);Java 改写极慢(12-20 月)
长期可维护性 15% 9 6 v4 活跃维护;Java 需自行维护协议演进
技术风险 10% 7 3 Java 改写风险最高(协议复杂度+JVM 时序)
运维成本 8% 6 9 Java 内嵌运维最简;v4 需维护外部服务
团队技能匹配 7% 7 9 Java 改写最匹配团队技能
加权总分 100% 9.10 5.59

加权总分计算:

  • •方案 A:9×0.25 + 9×0.20 + 7×0.15 + 9×0.15 + 7×0.10 + 6×0.08 + 7×0.07 = 9.10
  • •方案 B:7×0.25 + 6×0.20 + 2×0.15 + 6×0.15 + 3×0.10 + 9×0.08 + 9×0.07 = 5.59

结论:方案 A(ChirpStack v4)综合评分明显优于方案 B(Java 改写)。

5.3 驱动移植工作量

无论选择方案 A 还是方案 B,驱动移植到 EasyPro 都是 共同的基础工作:

  • •适配 EasyPro DriverAccess SDK(将 OptiFSP 的 DriverCustomService 适配到 EasyPro 的 DriverAccess)
  • •9 种设备类型移植(OperationService 适配、ThingModel 映射)
  • •自动创建/同步逻辑移植(AutoCreateService → AlinkwiseManager)
  • •上行数据处理移植(LorawanController + SendService)
  • •下行控制逻辑移植(write/read 逻辑、队列管理)
  • •修复已知 bug(SendServiceImpl、CheckInstanceAliveTask、RemoteCallServer 等)
  • •SPI 注册与启用
6

六、推荐方案

6.1 推荐方案(研究结论,待评审确认)

OptiFSP 的 LoRaWAN 体系基于 ChirpStack v3,已严重落后且不再维护。综合前述加权评分与分析,初步倾向采用 ChirpStack v4 作为新平台 EasyPro 的 LoRaWAN 网络服务器,同时完成驱动移植、bug 修复和健康监测功能(最终方案以评审立项为准)。

核心工作内容:

  • •从源码交叉编译 ChirpStack v4 为 Windows 原生二进制,集成到 EasyPro 安装包
  • •从 OptiFSP 移植 LoRaWAN 驱动到 EasyPro,修复已知 bug,适配 v4 API
  • •按优先级验证 9 种设备类型
  • •新增设备通信健康监测功能
6.2 推荐理由
  1. 一步到位:EasyPro 是全新平台,不继承 OptiFSP 的技术债务,直接使用 ChirpStack 最新版本
  2. 现场问题彻底解决:v4 原生支持下行防撞、多下行 ACK、报文 retention,从根本上解决撞包/丢包/状态同步问题
  3. 长期可维护:v4 持续更新(2026 年仍在活跃开发),无需担心版本过时
  4. Windows 原生部署:从源码交叉编译 Windows 二进制,集成到 EasyPro 安装包,保持统一部署体验
  5. 新增健康监测:在驱动移植过程中同步实现设备通信健康监测,提升运维效率
6.3 验收标准与 KPI
KPI 目标值 验证方法
下行控制成功率 ≥ 99% 连续 14 天统计,成功率 ≥ 99%
设备状态同步延迟 ≤ 30 秒 设备上下线后,平台状态更新延迟 ≤ 30 秒
上行数据完整率 ≥ 98% 对比网关日志与平台接收数据,丢包率 ≤ 2%
设备类型覆盖率 100%(9/9) 所有 9 种设备类型的上行解析和下行控制均验证通过
驱动启动成功率 100% SPI 加载、实例初始化、自动创建均正常
健康监测功能 已启用 错误报文检测、频率异常检测、信号质量监测均正常工作
并发下行能力 ≥ 50 设备/分钟 批量控制 50 台设备,全部在 1 分钟内完成
系统可用性 ≥ 99.5% ChirpStack 服务连续运行 30 天无异常
报文存储可控 有 retention 配置 30 天自动清理,磁盘占用稳定
无 P0 级 bug 0 个 无下行控制失效、无数据丢失、无驱动崩溃
6.4 方案 B(Java 改写)暂不推荐的理由
因素 说明
投入产出比 12-20 个月的开发 vs. 直接使用成熟的开源方案
协议复杂度 LoRaWAN MAC 层涉及 20+ 种 MAC 命令、精确时序、多安全模型,自行实现极易出错
生态验证 ChirpStack 已经过数千种网关/设备的兼容性验证,自研无法达到同等水平
持续演进 LoRaWAN 规范持续更新,自研需持续跟进维护
JVM 时序 RX1/RX2 窗口仅 1-2 秒,JVM GC 暂停可能导致丢包
团队精力 占用大量开发资源,影响业务功能迭代
7

七、验证方案(POC:先验证再实施)

在投入完整的驱动移植(第八章)之前,先用最小成本做一次端到端 POC(概念验证),把最大风险——「ChirpStack v4 能否在 Windows 环境编译部署、能否正常接入 LoRaWAN 设备、其 API 能否满足平台需求、能否解决现场痛点」——提前验证清楚。POC 通过才进入正式移植,不通过则回头评估方案 B 或其他路线。

POC 总目标

用一台 Windows 测试机,独立完成 ChirpStack v4 的编译部署、真实 LoRaWAN 设备接入、关键 API 调用、痛点复现与验证。不依赖 EasyPro 平台、不改动现有代码,纯验证 v4 网络服务器自身能力。

POC-1:Windows 环境编译部署 ChirpStack v4

目标:在 Windows 上跑起来 v4

验证内容:从 ChirpStack v4 源码交叉编译 Windows 原生二进制(核心依赖多为纯 Rust),连同 PostgreSQL、Redis 一并部署到 Windows 测试机,确认服务能正常启动、Web 控制台可访问。

步骤动作预期结果
1. 编译Rust 工具链编译 chirpstack-network-server,产出 Windows .exe编译成功,无阻断性依赖(验证 R7 编译风险)
2. 部署配置 PostgreSQL + Redis + chirpstack.toml,启动服务服务启动,监听 8080(Web)/8000(gRPC)等端口
3. 自检访问 Web 控制台,检查服务状态、版本号 v4.x控制台可登录,显示 v4 版本,无报错
通过标准

v4 能在 Windows 独立运行,Web 控制台正常。若编译失败,则退回 Docker 方案作为过渡,并重新评估原生部署路线。

POC-2:接入真实 LoRaWAN 设备

目标:设备数据能上来

验证内容:用现网真实网关 + 几台 LoRaWAN 设备(至少覆盖 P0 类型:电表/水表/FCU 温控),完成 OTAA 入网、上行数据采集,确认 v4 能正确接收并解码设备数据。

步骤动作预期结果
1. 配网关在 v4 注册现有 LoRaWAN 网关,确认网关在线网关状态 Connected(验证 R4 网关兼容性)
2. 配设备创建 Application,注册终端设备(DevEUI/密钥/编解码器)设备 OTAA 入网成功
3. 验上行设备上报数据,观察 v4 的设备事件/Live Data收到上行帧,payload 被正确解码为业务字段
通过标准

至少 3 种 P0 设备的上行数据稳定接收且解码正确。这是后续一切对接的前提——若设备接不进来,v4 选型就要重新论证。

POC-3:v4 API 接口验证

目标:API 能满足平台集成需求

验证内容:ChirpStack v4 对外提供 gRPC + REST API。本步逐一调用平台集成所需的接口,确认其能力覆盖老平台依赖的全部场景(上行接收、设备/应用/组播组管理、下行控制等)。

API 类别关键接口验证点
上行接收Webhook / Integration HTTP 回调能否把上行数据推给自建接收端(替代旧 /lorawan/uplink)
设备管理/api/devices 增删改查能否查询设备清单、自动同步建设备(验证自动建模可行性)
组播组/api/multicast-groups能否查询/创建组播组,支持组播下行(验证组播设定)
下行控制设备下行队列 DeviceQueue能否下发单播/组播指令(验证下行能力)
网关/应用/api/gateways / /api/applications能否管理网关与应用
重点确认

v3→v4 的 API 有重大变化(gRPC 为主、REST 路径不同)。逐一核对老平台用到的接口在 v4 是否有对应实现或替代方案,无替代的接口要在此步暴露出来,避免移植到一半才发现缺口。

POC-4:痛点处理验证

目标:现场老大难问题是否被 v4 解决

验证内容:针对第一章列出的现场痛点(撞包、下行失败、状态不同步、组播无反馈),在 v4 环境复现并观察是否改善。这是评估「升级 v4 到底有没有实际收益」的关键。

痛点(v3 现状)POC 验证方法期望(v4)
下行控制失败(撞包、缺 ACK)连续下发单播指令,统计成功率成功率显著提升
组播下发无反馈组播下发后,查组播组成员状态/下行队列能查询组内成员、定位未响应设备
状态同步延迟设备上下电,观察状态变化时延状态变更及时(验证 R6)
数据无 retention查 v4 是否内置历史存储/事件留痕有报文留存或可对接时序库
通过标准

下行成功率、组播可控性、状态同步至少一项有明显改善,证明升级 v4 有实际收益。若痛点依旧,需分析是 v4 本身能力问题还是配置/网关问题。

POC 结论与决策门

四步全过 → 进入正式移植
flowchart TD S(["开始 POC"]) --> P1["POC-1
Win 编译部署 v4"] P1 -->|"失败"| F1["退回 Docker
否则重评方案 B"] P1 -->|"通过"| P2["POC-2
接入真实设备"] P2 -->|"失败"| F2["排查网关/频段/密钥
不兼容则重论证选型"] P2 -->|"通过"| P3["POC-3
v4 API 验证"] P3 -->|"失败"| F3["评估自研适配层
或回退方案"] P3 -->|"通过"| P4["POC-4
痛点处理验证"] P4 -->|"失败"| F4["收益不足
重评是否投入"] P4 -->|"通过"| OK(["✓ 风险可控
进入第八章正式移植"]) style S fill:#e8f0fe,stroke:#007aff,color:#1c1c1e style P1 fill:#fff4e8,stroke:#ff9500,color:#1c1c1e style P2 fill:#fff4e8,stroke:#ff9500,color:#1c1c1e style P3 fill:#fff4e8,stroke:#ff9500,color:#1c1c1e style P4 fill:#fff4e8,stroke:#ff9500,color:#1c1c1e style OK fill:#e8f8f0,stroke:#34c759,stroke-width:2px,color:#1c1c1e style F1 fill:#fdecee,stroke:#ff3b30,color:#1c1c1e style F2 fill:#fdecee,stroke:#ff3b30,color:#1c1c1e style F3 fill:#fdecee,stroke:#ff3b30,color:#1c1c1e style F4 fill:#fdecee,stroke:#ff3b30,color:#1c1c1e

上图:POC 四步串联验证与失败回退决策;下表为各情形的详细应对

POC 结果决策
POC-1~4 全部通过风险已验证可控,进入第八章正式驱动移植
编译/部署受阻(POC-1 失败)退回 Docker 过渡方案;若 Docker 也不可接受,重新评估方案 B
设备接不入(POC-2 失败)排查网关/频段/密钥;若确属 v4 不兼容,重新论证选型
API 有不可替代缺口(POC-3 失败)评估自研适配层成本,或回退方案
痛点无改善(POC-4 失败)升级 v4 收益不足,需重新评估是否值得投入
预计周期
1-2 周
所需资源
1台Win测试机
网关+3种P0设备
产出物
POC报告(含
编译包/数据/结论)

价值:用 1-2 周的低成本验证,规避 12-20 个月的方案 B 风险,也为方案 A 的正式移植扫清技术盲区。POC 是整个行动计划的第一阶段(见第十一章)。

8

八、驱动移植技术方案

8.1 设备类型清单

LoRaWAN 驱动需支持以下 9 种设备类型,每种设备类型对应一个 OperationService 实现:

序号 产品编码 设备类型 上行数据 下行控制 优先级
1 FCU_001_LRW 风机盘管温控器 温度、模式、风速、开关状态 温度设定、模式切换、风速调节(支持单播+组播) P0
2 SAC_001_LRW 分体空调控制器 温度、运行状态、模式 开关、温度、模式控制 P0
3 AQS_001_LRW 空气质量多合一传感器 PM2.5、CO2、温度、湿度、TVOC —(只读) P1
4 WOP_001_LRW 智能插座 开关状态、功率、电量 通断控制 P1
5 NLP_001_LRW 零火面板 开关状态 开关控制 P1
6 SPP_001_LRW 单火面板 开关状态 开关控制 P1
7 DE53LR 电表 电压、电流、功率、电量 —(只读) P2
8 DW30LE-LXSY 水表 累计流量 —(只读) P2
9 NS_001_LRW 噪声传感器 噪声值(dB) —(只读) P2

8.2 数据流时序图

上行数据流(设备 → 平台)
上行数据流(设备 → 平台)
LoRa 设备
LoRa帧
网关
UDP
ChirpStack
HTTP
EasyPro
EasyPro 处理流程
LorawanController 解析 Base64 OperationService.analysis() 提取点值 PlatformClient.pushPointValue() 写入数据库
下行控制流(平台 → 设备)
下行控制流(平台 → 设备)
EasyPro
HTTP API
API
ChirpStack
下行调度
RX1/RX2
网关
LoRa帧
LoRa 设备
返回路径(ACK)
设备执行 上行 ACK 网关 ChirpStack tx ack
8.3 架构映射
OptiFSP(分布式微服务)
ibms-cloud (Spring Cloud)
ibms-driver-lorawan
独立 Spring Boot 应用
DriverCustomService (SDK JAR)
不再需要
Nacos
Feign
RabbitMQ
EasyPro(单体架构)
OptiCloud (Spring Boot)
drivers/inline/alinkwise/
单体内嵌驱动
DriverAccess (SPI 加载)
直接调用
单体内方法级调用 · PlatformClient

参考:Modbus、KNX、YCBox、RCP、SECP 等驱动已按上述模式从 OptiFSP 成功移植到 EasyPro,BACnet、MQTT 为 EasyPro 全新开发,LoRaWAN 驱动可复用相同的移植模式。

8.4 已有 bug 修复清单(4 个代码 bug)

EasyPro 中的 alinkwise 驱动在从 OptiFSP 移植过程中遗留了以下 4 个代码 bug,需在本次改造中一并修复:

Bug 文件 修复方案
SendServiceImpl 完全注释 service/impl/SendServiceImpl.java 用 PlatformClient 重写或删除
CheckInstanceAliveTask import 错误 access/AlinkwiseAccess.java 改为 alinkwise 包内的 task
checkInstanceAliveTask() 属性索引错误 base/AlinkwiseManager.java:203-207 修正为 get(0/1/2/3)
dataDownbyEUI() 硬编码设备类型 service/RemoteCallServer.java:241 移除硬编码,按实际设备类型处理

此外,该驱动当前在 SPI 配置文件(META-INF/services/...DriverAccess)中被注释禁用,从未正式启用——这是配置状态(非代码 bug),修复上述 bug 后需在 SPI 中重新启用。

8.5 关键适配点
适配项 OptiFSP 实现 EasyPro 实现 改动说明
驱动入口 DriverCustomService DriverAccess 接口方法映射
生命周期 initial() / driverInstanceOffline() openDriverInstance() / closeDriverInstance() 方法签名变化
定时任务 Quartz Job ScheduleCallback 改为 SDK 回调方式
HTTP 回调 独立 @RestController HttpApiCallBack 可选,也可保留独立 Controller
平台交互 Feign Client (IotDriverInterfaceService) PlatformClient SDK 提供的统一客户端
点值推送 DriverService.pointRealValueSender() PlatformClient.pushPointValue() SDK 方法映射
事件推送 DriverService.deviceEventSender() PlatformClient 对应方法 SDK 方法映射
依赖注入 @Autowired + Reflections 扫描 Spring @Service + Map 已有 OperationServiceProvider

8.6 新增功能:设备通信健康监测

8.6.1 功能背景

现场运行中发现部分 LoRaWAN 设备存在以下异常行为,会导致平台资源浪费、数据混乱甚至影响其他设备正常通信:

异常类型 具体表现 影响
错误报文 设备发送的上行数据无法解析(payload 格式错误、校验失败、FPort 不匹配等) 产生大量无效数据,污染点位值
频繁上报 设备在短时间内高频发送上行数据(如正常应 5 分钟一次,实际每秒都在发) 占用 ChirpStack 上行通道、增加数据库写入压力、加速设备电量消耗
异常重入网 设备频繁发起 OTAA 入网请求(正常应仅首次入网) 占用 Join Server 资源、产生大量无效 JoinReq
信号异常 设备 RSSI/SNR 突变或持续异常低 可能存在硬件故障或天线问题
8.6.2 功能设计

功能目标:在驱动层实现设备通信健康监测,自动识别存在故障风险的设备,并在平台上提供告警和统计视图。

核心能力:

设备通信健康监测架构
上行报文解析校验
频率异常检测
信号质量监测
健康评分引擎
综合评分 0-100 · 4 档等级
告警推送
统计报表
设备标记
8.6.3 检测规则
规则编号 检测项 触发条件 告警等级 说明
R1 报文解析失败 同一设备 10 分钟内解析失败 ≥ 3 次 警告 payload 格式错误、Base64 解码失败等
R2 报文解析失败 同一设备 1 小时内解析失败 ≥ 20 次 严重 设备可能持续发送错误数据
R3 上报频率异常 同一设备 1 分钟内上行 ≥ 10 次(正常频率的 5 倍以上) 警告 可能设备固件异常或配置错误
R4 上报频率异常 同一设备持续 10 分钟高频上报 严重 需要现场排查设备状态
R5 异常重入网 同一设备 1 小时内 OTAA 入网 ≥ 5 次 警告 DevNonce 耗尽或设备重启循环
R6 信号质量异常 RSSI < -130 dBm 且 SNR < -10 dB 警告 信号极弱,可能硬件故障
R7 信号突变 RSSI 在 5 分钟内变化 > 30 dB 警告 可能天线松动或环境变化
R8 设备无响应 下行控制后 3 次重试均无上行 ACK 警告 设备可能离线或信号丢失
8.6.4 健康评分模型
健康评分 = 100 - 各项扣分

扣分项:
  • 报文解析失败率 > 10%    → 扣 30 分
  • 报文解析失败率 5%-10%   → 扣 15 分
  • 上报频率超限            → 扣 20 分
  • 异常重入网              → 扣 20 分
  • 信号质量异常            → 扣 15 分
  • 下行无响应              → 扣 15 分

健康等级:
  90-100 分  →   健康
  70-89 分   →   亚健康(需关注)
  50-69 分   →   告警(需排查)
  0-49 分    →   故障(需处理)
8.6.5 数据模型
/**
 * 设备通信健康记录
 */
public class DeviceHealthRecord {
    private String devEUI;           // 设备 EUI
    private String deviceName;       // 设备名称
    private String applicationName;  // 所属应用
    private int healthScore;         // 健康评分(0-100)
    private String healthLevel;      // 健康等级(HEALTHY/WARNING/ALERT/FAULT)
    private int parseFailCount;      // 统计周期内解析失败次数
    private int uplinkCount;         // 统计周期内上行次数
    private double uplinkFrequency;  // 上行频率(次/分钟)
    private int otaaJoinCount;       // 统计周期内入网次数
    private Integer rssi;            // 最近一次 RSSI
    private Integer snr;             // 最近一次 SNR
    private int downlinkFailCount;   // 统计周期内下行失败次数
    private LocalDateTime lastUplinkTime;   // 最近一次上行时间
    private LocalDateTime lastAlertTime;    // 最近一次告警时间
    private List<String> activeAlerts;      // 当前活跃告警列表
    private LocalDateTime statisticsStart;  // 统计窗口起始时间
    private LocalDateTime statisticsEnd;    // 统计窗口结束时间
}
8.6.6 集成方式
集成点 说明
上行数据流 在 OperationService.analysis() 中嵌入健康检测逻辑,每次上行都更新健康记录
定时统计 通过 ScheduleCallback 每 5 分钟执行一次健康评分计算
告警推送 通过 PlatformClient.deviceEventSender() 推送设备健康事件
数据存储 健康记录存储在内存缓存中(保留最近 24 小时),关键告警持久化到数据库
前端展示 建议在设备详情页增加"通信健康"标签页,展示评分、告警、趋势图
8.6.7 实施要点
  • •健康检测引擎:规则引擎 + 评分模型
  • •上行数据流嵌入:在 analysis() 中添加检测逻辑
  • •定时统计任务:ScheduleCallback 实现
  • •告警推送集成:对接 PlatformClient 事件接口
  • •数据模型 + 缓存:DeviceHealthRecord + 内存缓存
  • •前端展示(可选):设备详情页健康标签页
9

九、ChirpStack v4 部署方案

9.1 推荐部署架构(Windows 原生部署)
Windows 原生部署架构
Windows Server
EasyPro 安装包
alinkwise
ChirpStack v4
PostgreSQL
Redis
UDP/1700 (Semtech) 或 TCP/3001
LoRaWAN 网关
9.2 ChirpStack v4 Windows 编译要点

ChirpStack v4 使用 Rust 开发,编译为 Windows 原生二进制的基本流程:

编译环境准备:

  • •安装 Rust 工具链(rustup),选择 stable-x86_64-pc-windows-msvc target
  • •安装 Visual Studio Build Tools(C/C++ 编译工具链)
  • •安装 PostgreSQL 开发库(libpq,用于 tokio-postgres 的 SSL 支持)

编译步骤:

# 1. 克隆源码
git clone https://github.com/chirpstack/chirpstack.git
cd chirpstack

# 2. 编译(Windows 原生)
cargo build --release --target x86_64-pc-windows-msvc

# 3. 产物位置
# target/x86_64-pc-windows-msvc/release/chirpstack.exe

需要验证的关键点:

  • •所有 Rust crate 在 Windows target 下是否编译通过
  • •gRPC 服务(tonic)在 Windows 下是否正常监听和响应
  • •UDP 监听(网关通信)在 Windows 下是否正常工作
  • •PostgreSQL/Redis/Mosquitto 的 Windows 版本是否可独立打包

备选方案:若自行编译难度过大,可使用 Docker Desktop for Windows 作为过渡方案,后续再优化为原生部署。

9.3 安装包集成清单
组件 Windows 版本 打包方式 说明
EasyPro Java JAR 安装包内嵌 已有
ChirpStack v4 Rust 交叉编译 安装包内嵌 需自行编译
PostgreSQL 15+ 安装包内嵌 已有
Redis 7+ 安装包内嵌 已有
Mosquitto 2.x 安装包内嵌 可选,按需集成
10

十、风险与缓解措施

10.1 风险矩阵
风险矩阵
低概率中概率高概率
高影响
③
网关不兼容
⑥
编译难度
④
Java 失控
中影响
①
v4 部署
②
⑦
⑤
运维不熟悉
① v4 部署配置 · ② 设备缺失 · ③ 网关不兼容 · ④ Java 失控 · ⑤ 运维不熟悉 · ⑥ 编译难度 · ⑦ 端口冲突
与下方登记册对应:①=R1/R6/R9 · ②=R2 · ③=R4 · ④=R3 · ⑤=R5 · ⑥=R7 · ⑦=R8
10.2 详细风险登记册
ID 风险 概率 影响 等级 缓解措施 应急预案 责任人
R1 v4 部署配置问题 低 中 提前在测试环境验证原生部署 检查端口冲突、服务配置 运维
R2 驱动实现后设备类型缺失 中 中 按优先级分批实现(P0→P1→P2),每批验证 优先实现 P0 设备类型,P1/P2 后续跟进 开发
R3 ChirpStack v4 API 变化超出预期 低 中 提前阅读 v4 API 文档,编写抽象适配层 逐个 API 验证,分步适配 开发
R4 现有网关不兼容 ChirpStack v4 低 高 提前测试网关固件版本,必要时升级固件 联系网关厂商确认兼容性 现场
R5 团队对 ChirpStack 运维不熟悉 中 低 编写运维手册,培训关键人员,录制操作视频 联系 ChirpStack 社区或厂商支持 运维
R6 v4 部署后现场问题未改善 低 高 部署后立即进行下行控制和状态同步测试 排查 ChirpStack 配置或网关固件问题 技术负责人
R7 ChirpStack v4 Windows 编译 中 高 优先完成编译技术验证(核心依赖多为纯 Rust,可行性较高) 退而求其次,Docker 作为过渡方案 开发
R8 ChirpStack 与现有服务端口冲突 低 中 提前规划端口分配,避免与 EasyPro 端口冲突 调整 ChirpStack 或 EasyPro 的端口配置 运维
R9 ChirpStack v4 配置错误导致服务不可用 低 中 部署前在测试环境充分验证配置 参考官方文档排查,重新配置 运维
10.3 回滚策略
回滚策略
回滚方案
1
停止 ChirpStack v4 服务
2
驱动层切换为离线模式
3
排查问题原因
4
修复后重启服务
5
验证设备通信恢复正常
预计回滚时间:15 分钟
11

十一、结论与行动计划

11.1 总结

LoRaWAN 驱动是 EasyPro 中唯一未完成移植的核心驱动,其改造面临三重挑战:

行动起点:先做 POC

鉴于改造周期长、依赖第三方平台,建议以第七章的 POC 验证作为第一步(1-2 周),用最小成本确认 v4 可行性后再全面铺开。POC 是下方功能清单的第 0 项前置关卡。

挑战 说明 解决路径
第三方平台老化 ChirpStack v3.9.0 落后上游 6 年,导致撞包、丢包、状态不同步 拟采用 ChirpStack v4(研究结论,待立项确认)
驱动代码质量 alinkwise 驱动存在 4 个代码 bug + SPI 被禁用,从未正式启用 基于 OptiFSP 源码重新移植并修复
接入流程繁琐 ChirpStack 侧需逐台手工注册设备/组播组,双平台信息需对应 驱动层自动同步建模,探索 ChirpStack 侧批量导入

与其他已移植驱动(Modbus、KNX、YCBox)和全新驱动(BACnet、MQTT)相比,LoRaWAN 驱动的特殊之处在于依赖外部第三方平台(ChirpStack),这是其他协议驱动不具备的额外复杂度。

11.2 功能清单
序号 功能模块 功能项 说明
0 POC 验证(前置关卡) v4 编译部署 + 设备接入 + API 验证 + 痛点验证 详见第七章、验证方案;通过后方可进入下列正式工作
1 ChirpStack v4 编译部署 Windows 原生编译 从源码交叉编译 ChirpStack v4 为 Windows 可执行文件
2 频段/网关配置 配置 CN470 频段、注册网关
3 Webhook 集成 配置上行数据回调到 EasyPro
4 安装包集成 将 ChirpStack v4 及依赖组件集成到 EasyPro 安装包
5 驱动移植 SDK 接口适配 DriverCustomService → DriverAccess 适配
6 9 种设备类型实现 OperationService 逐设备实现(P0→P1→P2)
7 自动创建/同步逻辑 AutoCreateService → AlinkwiseManager 适配
8 上行数据处理 LorawanController + 点值推送实现
9 下行控制逻辑 write/read 逻辑、队列管理实现
10 Bug 修复 SendServiceImpl 修复 用 PlatformClient 重写点值推送
11 CheckInstanceAliveTask 修复 修正 import 来源和属性索引
12 RemoteCallServer 修复 移除硬编码设备类型
13 v4 API 适配 RemoteCallServer 调整 适配 v4 的 HTTP API 参数和响应格式
14 健康监测 报文解析校验 检测错误报文、格式异常
15 频率异常检测 检测设备短时间内高频上报
16 信号质量监测 检测 RSSI/SNR 异常和突变
17 健康评分引擎 综合评分模型(100 分制,4 档等级)
18 告警推送 通过 PlatformClient 推送健康事件
19 联调测试 设备类型逐项验证 9 种设备上行/下行功能验证
20 稳定性测试 24 小时连续运行 + 健康监测验证
12

十二、附录

附录 A:LoRaWAN 协议栈简介
LoRaWAN 协议栈
应用层
Application Payload (FPort + FRMPayload)
MAC 层 (LoRaWAN Layer 2)
MHDR | FHDR | FPort | FRMPayload | MIC
MAC 命令 20+ 种 · AES-128 加密
物理层 (LoRa RF)
CN470 / EU868 / US915 / AS923
DR0-DR15(SF12~SF7)
125kHz / 250kHz / 500kHz

关键概念:

  • •OTAA (Over-The-Air Activation):设备通过 JoinReq/JoinAccept 流程动态获取会话密钥,安全性更高
  • •ABP (Activation By Personalization):设备预配置会话密钥和地址,无需入网流程,但安全性较低
  • •Class-A:最低功耗,每次上行后开两个短暂的下行接收窗口(RX1/RX2)
  • •Class-B:在 Class-A 基础上,周期性打开接收窗口(Beacon + PingSlot)
  • •Class-C:持续监听下行(仅发送时暂停),适合需要实时下发的设备
  • •ADR (Adaptive Data Rate):网络服务器根据链路质量自动调整设备的数据速率和发射功率
附录 B:术语表
术语 全称 说明
LoRa Long Range Semtech 公司的低功耗广域网物理层调制技术
LoRaWAN LoRa Wide Area Network 基于 LoRa 的 MAC 层协议规范,由 LoRa Alliance 制定
ChirpStack — 开源 LoRaWAN 网络服务器(前身为 loraserver)
NS Network Server LoRaWAN 网络服务器,负责 MAC 层处理、下行调度
AS Application Server LoRaWAN 应用服务器,负责数据集成和设备管理
GW-Bridge Gateway Bridge 网关桥接,将网关原生协议转换为 MQTT/gRPC
OTAA Over-The-Air Activation 空中入网,设备动态获取会话密钥
ABP Activation By Personalization 预配置激活,设备预写入会话密钥
ADR Adaptive Data Rate 自适应数据速率,根据链路质量优化速率和功率
MIC Message Integrity Code 消息完整性校验码,防篡改
EUI Extended Unique Identifier 64 位唯一标识符(DevEUI=设备,AppEUI=应用,GatewayEUI=网关)
DevAddr Device Address 32 位设备网络地址(动态分配)
RX1/RX2 Receive Window 1/2 Class-A 设备上行后打开的两个下行接收窗口
Class-A/B/C — LoRaWAN 设备功耗模式(A 最省电,C 最实时)
FPort Frame Port 帧端口号,区分 MAC 命令(FPort=0)和应用数据(FPort>0)
FRMPayload Frame Payload 帧负载,加密的应用数据
DR Data Rate 数据速率,由扩频因子(SF)和带宽(BW)决定
SF Spreading Factor 扩频因子(SF7~SF12),越大速率越低但距离越远
RSSI Received Signal Strength Indicator 接收信号强度
SNR Signal-to-Noise Ratio 信噪比
FUOTA Firmware Update Over-The-Air 空中固件升级
LR-FHSS Long Range - Frequency Hopping Spread Spectrum 长距离跳频扩频,LoRaWAN 新物理层
mTLS Mutual TLS 双向 TLS 认证
OIDC OpenID Connect 基于 OAuth 2.0 的身份认证协议

附录 C:现场问题验证 Checklist

在驱动移植和 ChirpStack v4 部署完成后,使用以下 Checklist 逐项验证现场问题是否已解决:

C.1 下行控制验证
# 测试项 测试方法 预期结果 通过
1 单设备控制-空调面板 对 FCU_001_LRW 设备发送开关指令 设备在 5 秒内响应
2 单设备控制-智能插座 对 WOP_001_LRW 设备发送通断指令 设备在 5 秒内响应
3 单设备控制-面板 对 NLP_001_LRW 设备发送开关指令 设备在 5 秒内响应
4 批量控制(5台) 同时对 5 台不同设备发送控制指令 全部在 10 秒内响应
5 批量控制(20台) 同时对 20 台不同设备发送控制指令 ≥ 19 台在 15 秒内响应
6 连续控制(快速操作) 对同一设备在 30 秒内连续发送 3 次指令 全部成功,无撞包
7 组播控制 对 FCU 组播组发送温度设定指令 组内全部设备在 10 秒内响应
8 弱网设备控制 对信号较弱(RSSI < -120dBm)的设备发送指令 成功率 ≥ 90%
C.2 状态同步验证
# 测试项 测试方法 预期结果 通过
11 设备上线检测 关闭设备后重新上电 平台在 60 秒内显示在线
12 设备离线检测 关闭设备电源 平台在 120 秒内显示离线
13 传感器数据同步 读取传感器当前值与平台显示值 一致,延迟 ≤ 30 秒
14 电表数据同步 读取电表当前电量与平台显示值 一致,延迟 ≤ 60 秒
15 控制后状态回读 发送控制指令后检查状态点位 状态在 30 秒内更新为新值
C.3 健康监测验证
# 测试项 测试方法 预期结果 通过
16 错误报文检测 模拟发送格式错误的 payload 系统在 10 分钟内识别并告警
17 频率异常检测 模拟设备每秒发送一次数据 系统在 1 分钟内识别并告警
18 健康评分 运行 24 小时后查看设备健康评分 正常设备评分 ≥ 90,异常设备评分 < 70
19 告警推送 触发一条告警事件 平台收到设备健康事件推送
C.4 稳定性验证
# 测试项 测试方法 预期结果 通过
20 24 小时连续运行 驱动连续运行 24 小时 无异常退出、无内存泄漏
21 ChirpStack 服务稳定 ChirpStack 连续运行 24 小时 无崩溃、无异常重启
22 下行成功率统计 统计 24 小时内所有下行指令成功率 ≥ 95%
23 上行数据完整率 对比网关日志与平台数据 丢包率 ≤ 2%
附录 D:关键文件清单

OptiFSP LoRaWAN 驱动(SVN 仓库):

  • •入口:LorawanDriverApplication.java
  • •上行:controller/LorawanController.java
  • •主服务:service/impl/DriverLorawanCustomServiceImpl.java
  • •API 客户端:service/RemoteCallServer.java
  • •自动创建:service/impl/AutoCreateServiceImpl.java
  • •设备映射:domain/ThingModelTransForm.java

EasyPro 驱动框架:

  • •SDK 接口:drivers/sdk/DriverAccess.java
  • •SPI 配置:resources/META-INF/services/com.sctech.opti.cloud.drivers.sdk.DriverAccess
  • •驱动加载:drivers/access/DriverAccessLoader.java
  • •alinkwise 驱动:drivers/inline/alinkwise/

ChirpStack 版本调研报告:见本文档第一章

附录 E:ChirpStack v4 相关链接
  • •GitHub:https://github.com/chirpstack/chirpstack
  • •文档:https://www.chirpstack.io/docs/
  • •Docker Hub:https://hub.docker.com/r/chirpstack/chirpstack
  • •下载:https://www.chirpstack.io/docs/downloads.html
附录 F:LoRaWAN 规范参考
  • •LoRaWAN L2 1.0.4:TS001-1.0.4
  • •LoRaWAN L2 1.1:TS001-1.1
  • •区域参数:RP002-1.0.3
  • •Backend Interfaces:TS002-1.0.0(漫游)