
一、背景公司有个项目是要按照IEC104协议采集电力数据。考虑到要带没有开发基础的同学所以写这篇文章尽量详细一点。代码仅仅是简单学习之用不足之处请见谅。二、名词1. IEC104IEC104IEC 60870-5-104是电力系统主流远动通信协议基于 TCP/IP默认端口 2404由 IEC 制定是 IEC101 的网络扩展版。它采用主从架构支持遥测、遥信、遥控、遥调等核心功能通过 I/S/U 帧机制保障可靠传输与实时交互。广泛用于电网调度、变电站自动化与工业电力监控具备长连接、毫秒级时标、数据主动上送等特点是电力 SCADA 系统的标准通信方案。2.mavenMaven 是 Java 生态主流的项目构建与依赖管理工具由 Apache 基金会开发。它通过统一的pom.xml配置文件自动管理第三方库jar 包的下载、版本控制与依赖传递省去手动导包的繁琐。Maven 提供标准化项目结构、编译、测试、打包、发布等一站式构建生命周期支持多模块项目管理一般口语说的父子工程、私服仓库与插件扩展极大提升 Java 项目开发效率与协作规范性是企业级 Java、SpringBoot 开发必备工具。背后我们还创建了依赖的私库nexus私库没有的才到互联网库下载这里就过多描述了。3.j60870j60870 是纯 Java 实现的IEC104IEC 60870-5-104协议客户端 / 服务端开发库由 OpenMUC 开源社区维护适配 TCP/IP默认 2404 端口。支持主站客户端、从站服务端双向通信完整实现遥测、遥信、遥控、遥调、总召唤、对时等核心功能。提供 Maven 依赖引入API 简洁可快速集成到 SpringBoot 等 Java 项目广泛用于电网调度、变电站自动化、SCADA 系统等电力物联网场景。maven的依赖配置如下dependency groupIdorg.openmuc/groupId artifactIdj60870/artifactId version1.7.2/version /dependency4.oceanbaseOceanBase 是蚂蚁集团完全自研的国产原生分布式数据库2010 年起步于支付宝核心历经十余年 “双 11” 高并发验证。采用一体化分布式架构兼顾分布式扩展性与集中式性能一套引擎同时支撑 OLTP/OLAP 混合负载HTAP。金融级高可用首创 “三地五中心” 容灾满足 RPO0、RTO8s高度兼容 MySQL/Oracle迁移成本低支持在线水平扩展单集群可达数千节点、PB 级数据基于 LSM-Tree 高压缩引擎存储成本显著降低广泛用于金融、政务、运营商、工业物联网等核心场景。我们用的是公司技术部门在内网搭建的OB。5.IEC104主站主站Client主动读数据就是你写的代码运行的机器。6.IEC104从站从站Server设备端端口2404,就是你程序监听的地址现实中这个地址可以是一个汇聚的机器也可以是一个网关设备。7.IEC104总召唤主站发总召唤C_IC_NA_1请求全量数据。从站回总召唤确认 → 上送所有遥信 / 遥测 → 总召唤结束。简单说就你的主程序向电表要一次全量数据。8.IEC104数据类型遥信DI开关状态单点 / 双点。遥测AI电压、电流、功率等模拟量浮点数 / 归一化值。电度PI累计电能。控制DO/AO遥控、遥调写操作三、上手1.gitcode创建项目1创建项目2输入新建项目相关的信息3.gitignore文件不希望提交一堆代码无关的文件信息到代码库按照eclipse的常见文件编写了忽略的文件及文件夹。建议的内容可以在gitcode中打开文件点击编辑后提交target/ *.classpath *.project .settings/ logs/4复制你项目的git地址5在eclipse中打开GitRepositories创建并克隆项目这里应该有个默认的向导没有就自己去安装eclipse的插件。6导入到eclipse作为工程7把工程转化为maven项目因为开始我们在代码仓库创建的就是一个空壳并没有maven的pom等文件eclipse并不知道是一个maven工程。8输入maven工程的关键信息主要就是GroupId我一般认为是你团队或者个人的标识ArtifactId一般就是工程的名称。9给主项目的pom文件加入parent和propertiesproject xmlnshttp://maven.apache.org/POM/4.0.0 xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd modelVersion4.0.0/modelVersion parent groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-parent/artifactId version2.7.18/version relativePath / /parent groupIdcn.potato/groupId artifactIdiec104-master/artifactId version1.0.0/version packagingpom/packaging properties maven.compiler.source11/maven.compiler.source maven.compiler.target11/maven.compiler.target /properties /project2.创建子工程1子工程规划我问AI我准备用maven的母子工程来做我的想法就是有多个从站我作为主站读取数据然后存储到OB数据库。当然未来我可能存储到不同的地方。基于这个考虑你觉得我应该创建哪几个子模块好一些我的主站名称是iec104-master子模块参考这个命名方式AI的核心回答iec104-master (父工程)├── iec104-master-common # 公共工具、常量、模型├── iec104-master-core # IEC104 协议核心连接、采集、解析├── iec104-master-storage # 存储抽象层 各种存储实现OB/MySQL...├── iec104-master-service # 业务逻辑调度、任务、多从站管理└── iec104-master-boot # 启动入口、配置、SpringBoot 主程序2依次创建5个子工程打开主pom文件点击modules中的Create过程简单勾选简单创建输入模块名称就好了。3.代码实现1AI生成代码我问AI我用的eclipse,配置文件使用application.properties 你按照刚刚沟通的工程结构重新帮我生成相关的代码吧AI回答的内容我这里就不一一罗列了。问题还是很多的主要是我也是第一次做IEC104数据采集很不熟悉给AI提出的要求太少。4.AI代码生成过程中的一些问题1代码编译错误主要的问题应该还是j60870版本不同出现了一些编译错误。在eclipse中按住ctrl鼠标点击对应的对象包括第三方包中的对象一般都可以看到对象的源代码。直接复制给AI再复制编译错误行的代码告诉AI编译错误一般都能找到具体替代的方法。2配置文件中iec104.slave.list读取失败一个是utf-8的问题我修改了这个文件的字符集也修改了eclipse的默认字符集。具体修改方法自己问AI这里就不多说了。还有个怪问题是编译问题暂时没有解决应该是我eclipse插件安装多了的一些问题。现象是iec104-master-boot/target目录classes文件夹下面没有iec104-master-boot/src/main/resources下面的application.properties文件。通过mvn命令是正常的在eclipse下面点击子项目iec104-master-boot选择maven的update project是正常的但是点击父工程iec104-master选择maven的update project就不能把application.properties文件编译到对应的目录下。3IEC104总召唤报文构造错误因为没有详细去读和理解协议的文件直接用的第三方的包(j60870)所以AI生成的代码的时候没有考虑清楚。导致我运行的时候刚连接就断开了。// // 正确总召唤带 20 询问限定词104 标准 // ASdu asdu new ASdu( ASduType.C_IC_NA_1, false, CauseOfTransmission.ACTIVATION, false, false, 0, commonAddr, new InformationObject(0, new IeQualifierOfInterrogation(20)) // 关键 ); connection.send(asdu);4多线程我们作为主站跟从站之间一般都是1个从站就是1个连接实际中可能一个从站有多个IP端口主地址可能有多个主地址。我写代码时要给AI强调我们是一个地址就产生1个连接需要考虑多线程不要做成单线程了。5断网重连我默认是没有要求断网重连的实际生产环境必须具备的后面我跟AI对话让她添加了断网重连的功能。实际中断网重连还有一套规则这里就简单的5S一次了。6一部分从站仅支持1个连接的问题因为特殊原因我们网络架构使用到了happynet这个工具。我这边出现了1个现象就是开发的时候我们2个同事同时运行程序有的从站可以有的从站只能同时只有1个人连接。原因还没有找到先这样吧四、最终代码库1.公开代码库主页iec104-master_demo2.公开代码库的git地址可直接克隆代码库https://gitcode.com/qq_37372909/iec104-master_demo.git五、总结整个过程耗时4个小时左右主要还是得益于跟AI合作和同事的支持。我们要继续坚持体系化的去使用AI而不是上来就让AI写代码。最好是先了解业务知识业界一般的架构。写代码是最简单的核心还是业务知识与设计。本次代码仅供参考实际应用中很多需要考虑的后续逐步完善。