# java-iec104 **Repository Path**: yapengzhao/java-iec104 ## Basic Information - **Project Name**: java-iec104 - **Description**: iec104协议 解析遥测数据优化版 - **Primary Language**: Java - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 17 - **Created**: 2024-09-06 - **Last Updated**: 2024-09-06 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Iec 104 ## 目录 - [项目介绍](#项目介绍) - [使用](#使用) - [其他](#其他) - [感谢](#感谢) - [开源协议](#开源协议) ## 项目介绍 该项目基于Netty实现的底层网络通信,支持从站服务端、主站客户端的模式, 可以通过Master采集数据, 也可以通过Slave模拟终端。该项目已经支持: S帧、U帧、总召唤指令、沾包拆包等功能,由于104协议部分内容 存在可扩展性,因此本项目只完成通讯部分以及协议的解码和转码部分。在实际使用过程中需要按照硬件厂商提供 的点表再将消息部分装换成可识别的业务对象。 ## 使用 ### 主站 ``` // 创建一个配置文件 Iec104Config iec104Config = new Iec104Config(); // 指定收到多少帧就回复一个S帧 iec104Config.setFrameAmountMax((short) 1); // 终端地址需要和从站保持一致 iec104Config.setTerminnalAddress((short) 1); Iec104MasterFactory.createTcpClientMaster("127.0.0.1", 2404).setDataHandler(new MasterSysDataHandler()).setConfig(iec104Config).run(); ``` ### 从站 ``` // 创建一个配置文件 Iec104Config iec104Config = new Iec104Config(); // 指定收到多少帧就回复一个S帧 iec104Config.setFrameAmountMax((short) 1); // 终端地址 iec104Config.setTerminnalAddress((short) 1); Iec104SlaveFactory.createTcpServerSlave(2404).setDataHandler(new SysDataHandler()).setConfig(iec104Config).run(); ``` ### 自定义DataHandler ``` public class SysDataHandler implements DataHandler { @Override public void handlerAdded(ChannelHandler ctx) throws Exception { // 连接成功后 } @Override public void channelRead(ChannelHandler ctx, MessageDetail ruleDetail104) throws Exception { // 收到消息后 // 注意 往ctx.writeAndFlush中存放的应该是自己封装的 MessageDetail对象 ctx.writeAndFlush(BasicInstruction104.getEndGeneralCallRuleDetail104()); } ``` ### 知识点 1. 数据信息是在message里的 2. 遥测数据的值需要反转数组后按照类型转成目标值 ```java if(TypeIdentifierEnum.shortFloatingPointTelemetry.equals(ruleDetail104.getTypeIdentifier())){ //需要反转数组才能拿到真实值 String hexmsg = ByteUtil.byteArrayToHexString(ByteUtil.reByte(ruleDetail104.getMessages().get(i).getMessageInfos())); float f = Telemetry.Bytes2Float_IEEE754(hexmsg); log.info("遥测 address:{} , 数值:{}",ruleDetail104.getMessages().get(i).getMessageAddress(),f); } if(TypeIdentifierEnum.onePointTeleindication.equals(ruleDetail104.getTypeIdentifier())){ int x = ruleDetail104.getMessages().get(i).getMessageInfos()[0]; log.info("单点遥信 address:{} , 数值:{}",ruleDetail104.getMessages().get(i).getMessageAddress(),x); } ``` 3.遥信数据只有0和1代表开关,只需获取bytes[0] ### 运行项目 test代码里有主站和从站的启动代码!!!!!!!! ### 其他 项目相关的技术问题、缺陷报告、建议等信息请通过 Issue 发布 ## 感谢 感谢mujave提供的iec项目 https://github.com/mujave/iec ## 开源协议 [MIT](LICENSE) © Richard Littauer