From 7e6e59aa162776a0ab37cfbc0c6c79d14100eb69 Mon Sep 17 00:00:00 2001 From: CZT <czt18638530771@163.com> Date: 星期六, 16 九月 2023 18:09:57 +0800 Subject: [PATCH] 增加DL/T645多功能电表协议 --- igds-protocol-es/src/main/java/com/ld/igds/protocol/es/dlt645/util/Dlt645Utils.java | 88 ++++++++ igds-core/src/main/java/com/ld/igds/io/constant/ProtocolEnum.java | 1 igds-protocol-es/src/main/java/com/ld/igds/protocol/es/dlt645/RemoteEsServiceImpl.java | 73 +++++++ igds-protocol-es/src/main/java/com/ld/igds/protocol/es/dlt645/client/ClientHandler.java | 63 ++++++ pom.xml | 3 igds-protocol-es/pom.xml | 56 +++++ igds-protocol-es/src/main/java/com/ld/igds/protocol/es/dlt645/builder/CommandBuild.java | 57 +++++ igds-es/src/main/java/com/ld/igds/es/service/HEsService.java | 2 igds-es/src/main/java/com/ld/igds/es/view/EsData.view.xml | 21 - igds-protocol-es/src/main/java/com/ld/igds/protocol/es/dlt645/analysis/AnalysisService.java | 99 +++++++++ igds-protocol-es/src/main/java/com/ld/igds/protocol/es/dlt645/client/Dlt645ClientEngine.java | 98 +++++++++ igds-protocol-es/src/main/java/com/ld/igds/protocol/es/dlt645/package-info.java | 7 igds-web/pom.xml | 17 + 13 files changed, 566 insertions(+), 19 deletions(-) diff --git a/igds-core/src/main/java/com/ld/igds/io/constant/ProtocolEnum.java b/igds-core/src/main/java/com/ld/igds/io/constant/ProtocolEnum.java index d22bf75..e89af33 100644 --- a/igds-core/src/main/java/com/ld/igds/io/constant/ProtocolEnum.java +++ b/igds-core/src/main/java/com/ld/igds/io/constant/ProtocolEnum.java @@ -32,6 +32,7 @@ TCP_BHZH_VERB_V2("TCP_BHZH_VERB_V2", "閭︽捣鎺у埗鏌滄櫤鑳芥湁绾跨増V2"), TCP_BHZH_INOUT_V1("TCP_BHZH_INOUT_V1", "閭︽捣鏅鸿兘鍑哄叆搴撴帶鍒跺櫒鍗忚"), TCP_BEIBO_GRAIN_V1("TCP_BEIBO_GRAIN_V1", "璐濆崥绮儏鍒嗘満鏈嶅姟绔崗璁�"), + TCP_ES_DLT645_V1("TCP_ES_DLT645_V1", "DL/T 645澶氬姛鑳界數琛ㄥ崗璁�"), FZZY_OPENAPI_HTTP("FZZY_OPENAPI_HTTP", "椋庢鑷磋繙API-HTTP鍗忚"), TCP_MODBUS("TCP_MODBUS", "Modbus-TCP鍗忚"); diff --git a/igds-es/src/main/java/com/ld/igds/es/service/HEsService.java b/igds-es/src/main/java/com/ld/igds/es/service/HEsService.java index c96e4fe..90e55c4 100644 --- a/igds-es/src/main/java/com/ld/igds/es/service/HEsService.java +++ b/igds-es/src/main/java/com/ld/igds/es/service/HEsService.java @@ -75,7 +75,7 @@ Date end = (Date) param.get("end"); if(null != end){ - start = DateUtil.getNextZero(end); + end = DateUtil.getNextZero(end); hql += " and updateTime <:end "; args.put("end", end); } diff --git a/igds-es/src/main/java/com/ld/igds/es/view/EsData.view.xml b/igds-es/src/main/java/com/ld/igds/es/view/EsData.view.xml index e5e0152..07c0f92 100644 --- a/igds-es/src/main/java/com/ld/igds/es/view/EsData.view.xml +++ b/igds-es/src/main/java/com/ld/igds/es/view/EsData.view.xml @@ -255,11 +255,6 @@ <Property name="property">deviceName</Property> <Property name="align">center</Property> </DataColumn> - <DataColumn name="updateTime"> - <Property name="property">updateTime</Property> - <Property name="align">center</Property> - <Property name="width">130</Property> - </DataColumn> <ColumnGroup> <Property name="caption">涓夌浉鐢靛帇</Property> <DataColumn name="ua"> @@ -296,21 +291,11 @@ <Property name="caption">C鐩�</Property> </DataColumn> </ColumnGroup> - <DataColumn name="f"> - <Property name="property">f</Property> - <Property name="align">center</Property> - <Property name="width">60</Property> - </DataColumn> <ColumnGroup> <Property name="caption">鐢佃兘锛堢數琛ㄥ�硷級</Property> <DataColumn name="ep"> <Property name="property">ep</Property> <Property name="caption">鏈夊姛</Property> - <Property name="align">center</Property> - </DataColumn> - <DataColumn name="eq"> - <Property name="property">eq</Property> - <Property name="caption">鏃犲姛</Property> <Property name="align">center</Property> </DataColumn> <DataColumn name="es"> @@ -319,10 +304,10 @@ <Property name="caption">鎬荤數鑳�</Property> </DataColumn> </ColumnGroup> - <DataColumn name="esInc"> - <Property name="property">esInc</Property> + <DataColumn name="updateTime"> + <Property name="property">updateTime</Property> <Property name="align">center</Property> - <Property name="caption">灏忔椂鐢ㄨ兘</Property> + <Property name="width">150</Property> </DataColumn> </DataGrid> </Container> diff --git a/igds-protocol-es/pom.xml b/igds-protocol-es/pom.xml new file mode 100644 index 0000000..849b1f4 --- /dev/null +++ b/igds-protocol-es/pom.xml @@ -0,0 +1,56 @@ +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + <modelVersion>4.0.0</modelVersion> + <groupId>com.ld.igds</groupId> + <artifactId>igds-protocol-es</artifactId> + <version>4.0.0-RELEASE</version> + <packaging>jar</packaging> + + <properties> + <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> + <java.version>1.8</java.version> + <igds.version>4.0.0-RELEASE</igds.version> + </properties> + + <dependencies> + + <!-- 寮曞叆涔夊姟鏍稿績鍖� --> + <dependency> + <groupId>com.ld.igds</groupId> + <artifactId>igds-core</artifactId> + <version>${igds.version}</version> + </dependency> + + <!-- 寮曞叆鑳借�楀寘 --> + <dependency> + <groupId>com.ld.igds</groupId> + <artifactId>igds-es</artifactId> + <version>${igds.version}</version> + </dependency> + + <!-- 寮曞叆IO鍖� --> + <dependency> + <groupId>com.ld.base.io</groupId> + <artifactId>base-io-netty</artifactId> + <version>1.0.0-SNAPSHOT</version> + </dependency> + + </dependencies> + + <build> + <plugins> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-compiler-plugin</artifactId> + <configuration> + <source>1.8</source> + <target>1.8</target> + <compilerArguments> + <extdirs>src\main\webapp\WEB-INF\lib</extdirs> + </compilerArguments> + </configuration> + </plugin> + </plugins> + </build> + +</project> \ No newline at end of file diff --git a/igds-protocol-es/src/main/java/com/ld/igds/protocol/es/dlt645/RemoteEsServiceImpl.java b/igds-protocol-es/src/main/java/com/ld/igds/protocol/es/dlt645/RemoteEsServiceImpl.java new file mode 100644 index 0000000..99754d1 --- /dev/null +++ b/igds-protocol-es/src/main/java/com/ld/igds/protocol/es/dlt645/RemoteEsServiceImpl.java @@ -0,0 +1,73 @@ +package com.ld.igds.protocol.es.dlt645; + +import com.ld.igds.constant.RedisConst; +import com.ld.igds.io.RemoteEsService; +import com.ld.igds.io.constant.OrderRespEnum; +import com.ld.igds.io.constant.ProtocolEnum; +import com.ld.igds.io.request.BaseRequest; +import com.ld.igds.io.response.BaseResponse; +import com.ld.igds.io.response.GrainResponse; +import com.ld.igds.protocol.es.dlt645.builder.CommandBuild; +import com.ld.igds.protocol.es.dlt645.client.Dlt645ClientEngine; +import com.ld.igds.util.BytesUtil; +import com.ld.igds.util.RedisUtil; +import com.ld.io.api.InvokeResult; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +/** + * 褰撳墠鍗忚瀹炵幇锛岃兘鑰楀崗璁� + * + * @author czt + */ +@Slf4j +@Component(RemoteEsServiceImpl.BEAN_ID) +public class RemoteEsServiceImpl implements RemoteEsService { + + public static final String BEAN_ID = "dlt645.remoteEsServiceImpl"; + + @Autowired + private RedisUtil redisUtil; + @Override + public String getProtocol() { + return ProtocolEnum.TCP_ES_DLT645_V1.getCode(); + } + + @Override + public BaseResponse checkEs(BaseRequest request) { + + try { + log.info("DL/T645澶氬姛鑳界數琛ㄥ垎鏈哄紑濮嬫娴嬶紝鍒嗘満{}鐨処P={},绔彛={}",request.getSerId(),request.getIp(),request.getPort()); + + Dlt645ClientEngine clientEngine = new Dlt645ClientEngine(request.getIp(), request.getPort()); + clientEngine.start(); + Thread.sleep(1000); + + //閲囬泦鍛戒护瀛樺叆缂撳瓨锛岃В鏋愭椂鍒嗚鲸鏄摢涓粨鐨勮兘鑰楋紝鏃舵晥5鍒嗛挓 + String key = RedisConst.buildKey(request.getCompanyId(), "ES-DLT645", request.getSerId()); + redisUtil.set(key, request.getDepotId(), 60*5); + + //鐢熸垚鍛戒护-鏌ヨ鎬荤數鑳界殑鍛戒护 + String hexStr = CommandBuild.getInstance().getMsgCheck(request.getSerId()); + + InvokeResult result = clientEngine.send(BytesUtil.hexStrToBytes(hexStr)); + + log.info("result=" +result.getMessage()); + + // 灏佽杩斿洖淇℃伅 + if (InvokeResult.SUCCESS == result) { + return new GrainResponse(OrderRespEnum.ORDER_SUCCESS.getCode(), + "鑳借�楀懡浠ゅ彂閫佹垚鍔燂紒"); + } else { + log.error("骞冲彴------>>>>鑳借�楀垎鏈猴細鑳借�楁娴�-澶辫触{}", result.getMessage()); + return new GrainResponse(OrderRespEnum.ORDER_ERROR.getCode(), + "鍛戒护鍙戦�佸紓甯革細" + result.getMessage()); + } + + } catch (Exception e) { + log.error("鑳借�楁娴嬪紓甯革細{}", e); + return new BaseResponse(OrderRespEnum.ORDER_ERROR.getCode(), "鍚庣寮傚父锛�" + e.getMessage()); + } + } +} diff --git a/igds-protocol-es/src/main/java/com/ld/igds/protocol/es/dlt645/analysis/AnalysisService.java b/igds-protocol-es/src/main/java/com/ld/igds/protocol/es/dlt645/analysis/AnalysisService.java new file mode 100644 index 0000000..be01020 --- /dev/null +++ b/igds-protocol-es/src/main/java/com/ld/igds/protocol/es/dlt645/analysis/AnalysisService.java @@ -0,0 +1,99 @@ +package com.ld.igds.protocol.es.dlt645.analysis; + +import com.ld.igds.common.CoreSerService; +import com.ld.igds.constant.RedisConst; +import com.ld.igds.es.dto.EsData; +import com.ld.igds.es.service.CoreEsService; +import com.ld.igds.models.DeviceSer; +import com.ld.igds.protocol.es.dlt645.util.Dlt645Utils; +import com.ld.igds.util.ContextUtil; +import com.ld.igds.util.RedisUtil; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import java.util.Date; + +/** + * DLT645鐢佃〃鍗忚瑙f瀽 + * + * @author czt + */ +@Slf4j +@Component(AnalysisService.BEAN_ID) +public class AnalysisService { + + + public static final String BEAN_ID = "dlt645.analysisService"; + + @Autowired + private RedisUtil redisUtil; + @Autowired + private CoreSerService coreSerService; + @Autowired + private CoreEsService esService; + + /** + * + * @param result + */ + public void analysis(String result){ + log.info("鑳借�楀垎鏈�------->>骞冲彴锛氫俊鎭姤鏂�={}", result); + if(!result.startsWith(Dlt645Utils.MSG_START)){ + log.error("鑳借�楀垎鏈�------->>骞冲彴锛岃В鏋愯兘鑰楀け璐ワ細鎶ユ枃璧峰绗﹂敊璇紝涓嶈В鏋�"); + return; + } + //鍘婚櫎璧峰绗� + result = result.substring(8); + //鑾峰彇鏍¢獙浣� + String oldCheck = result.substring(result.length() - 4, result.length() - 2); + String check = Dlt645Utils.makeCheck(result.substring(0, result.length() - 4)); + + if(!check.equals(oldCheck)){ + log.error("鑳借�楀垎鏈�------->>骞冲彴锛岃В鏋愯兘鑰楀け璐ワ細鏍¢獙浣嶄笉瀵癸紝涓嶈В鏋�"); + return; + } + analysisGrain(result); + } + + + private void analysisGrain(String result) { + try { + + //鑾峰彇鑳借�楀垎鏈哄湴鍧� + String serId = Dlt645Utils.addrToString(result.substring(2, 14)); + + //鏍规嵁鍒嗘満鍦板潃鑾峰彇鍒嗘満淇℃伅 + DeviceSer ser = coreSerService.getCacheSer(ContextUtil.getDefaultCompanyId(), serId); + if (ser == null) { + log.error("鑳借�楀垎鏈�-------->>骞冲彴锛岃В鏋愯兘鑰楀け璐ワ紝鏈幏鍙栧埌绯荤粺鑳借�椾富鏈洪厤缃細" + serId); + return; + } + + String key = RedisConst.buildKey(ser.getCompanyId(), "ES-DLT645", ser.getId()); + String depotId = (String) redisUtil.get(key); + if(null == depotId){ + log.error("鑳借�楀垎鏈�-------->>骞冲彴锛岃В鏋愯兘鑰楀け璐ワ紝鏈幏鍙栧埌浠撳簱淇℃伅锛�" + depotId); + return; + } + + //瑙f瀽鎬昏兘鑰楁暟鎹� + String dataStr = result.substring(28, 36); + + Double esNum = Dlt645Utils.parseData(dataStr); + EsData esData = new EsData(); + esData.setDeviceName("鐢佃〃"); + esData.setCompanyId(ser.getCompanyId()); + esData.setDepotId(depotId); + esData.setUpdateTime(new Date()); + + esData.setEp(esNum); + esData.setEs(esNum); + + log.info("DLT645鐢佃〃----->>>骞冲彴锛氳兘鑰楁暟鎹В鏋愬畬鎴�-浠撳簱={}", esData.getDepotId()); + esService.saveAndUpdateInc(esData); + + } catch (Exception e) { + log.error(e.getMessage(), e); + } + } +} diff --git a/igds-protocol-es/src/main/java/com/ld/igds/protocol/es/dlt645/builder/CommandBuild.java b/igds-protocol-es/src/main/java/com/ld/igds/protocol/es/dlt645/builder/CommandBuild.java new file mode 100644 index 0000000..de915b6 --- /dev/null +++ b/igds-protocol-es/src/main/java/com/ld/igds/protocol/es/dlt645/builder/CommandBuild.java @@ -0,0 +1,57 @@ +package com.ld.igds.protocol.es.dlt645.builder; + +import com.ld.igds.protocol.es.dlt645.util.Dlt645Utils; + +/** + * 鐢佃〃鍛戒护鐢熸垚 + * + * @author czt + */ +public class CommandBuild { + + private final static CommandBuild instance = new CommandBuild(); + + private CommandBuild() { + } + + public static CommandBuild getInstance() { + return instance; + } + + /** + * 鑳借�楅噰闆嗗懡浠� + * + * @param esAddr 鐢佃〃鍦板潃 + * @return + */ + public static String getMsgCheck(String esAddr) { + + //鑾峰彇鍛戒护 + StringBuffer sb = new StringBuffer(); + + //甯ц捣濮嬬 + sb.append("68"); + //鍦板煙鍩燂紝鍙嶅悜鎷兼帴 + sb.append(Dlt645Utils.addrToString(esAddr)); + //甯ц捣濮嬬 + sb.append("68"); + //鎺у埗鐮佸強 + sb.append("11"); + //鏁版嵁鍩熼暱搴� + sb.append("04"); + //鏁版嵁鍩� + sb.append("33333433"); + //鏍¢獙鐮� + String checkNum = Dlt645Utils.makeCheck(sb.toString()); + sb.append(checkNum); + + StringBuffer sb0 = new StringBuffer(); + //璧峰绗� + sb0.append(Dlt645Utils.MSG_START); + sb0.append(sb); + //缁撳熬绗� + sb0.append(Dlt645Utils.MSG_END); + + return sb0.toString(); + } +} diff --git a/igds-protocol-es/src/main/java/com/ld/igds/protocol/es/dlt645/client/ClientHandler.java b/igds-protocol-es/src/main/java/com/ld/igds/protocol/es/dlt645/client/ClientHandler.java new file mode 100644 index 0000000..c1895ea --- /dev/null +++ b/igds-protocol-es/src/main/java/com/ld/igds/protocol/es/dlt645/client/ClientHandler.java @@ -0,0 +1,63 @@ +package com.ld.igds.protocol.es.dlt645.client; + +import com.ld.igds.protocol.es.dlt645.analysis.AnalysisService; +import com.ld.igds.util.BytesUtil; +import com.ld.igds.util.SpringUtil; +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.SimpleChannelInboundHandler; +import io.netty.util.internal.logging.InternalLogger; +import io.netty.util.internal.logging.InternalLoggerFactory; +import org.springframework.stereotype.Component; +import java.net.InetSocketAddress; + + +/** + * Handles a client-side channel. + */ +public class ClientHandler extends SimpleChannelInboundHandler<Object> { + + + private AnalysisService analysisService; + + private final InternalLogger log = InternalLoggerFactory.getInstance(this.getClass()); + @Override + public void channelActive(ChannelHandlerContext ctx) { + InetSocketAddress insocket = (InetSocketAddress) ctx.channel() + .remoteAddress(); + log.info("鐢佃〃鏈嶅姟鍣ㄦ垚鍔熻繛鎺ワ紝IP={},port={}", insocket.getAddress() + .getHostAddress(), insocket.getPort()); + } + + @Override + public void channelInactive(ChannelHandlerContext ctx) throws Exception { + super.channelInactive(ctx); + + InetSocketAddress insocket = (InetSocketAddress) ctx.channel() + .remoteAddress(); + + log.info("鐢佃〃鏈嶅姟鍣ㄦ柇寮�杩炴帴锛孖P={},port={}", insocket.getAddress(),insocket.getPort()); + } + + @Override + public void channelRead0(ChannelHandlerContext ctx, Object msg) + throws Exception { + byte[] bytes = (byte[]) msg; + String result = BytesUtil.bytesToString(bytes); + log.info("鐢佃〃鏈嶅姟鍣ㄥ垎鏈鸿繑鍥炰俊鎭�=" + result); + +// InetSocketAddress insocket = (InetSocketAddress) ctx.channel().remoteAddress(); + + //瑙f瀽 + //璋冪敤瑙f瀽鎺ュ彛寮�濮嬭В鏋� + if (null == analysisService) { + analysisService = (AnalysisService) SpringUtil.getBean(AnalysisService.BEAN_ID); + } + analysisService.analysis(result); + } + + @Override + public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) { + ctx.close(); + } + +} diff --git a/igds-protocol-es/src/main/java/com/ld/igds/protocol/es/dlt645/client/Dlt645ClientEngine.java b/igds-protocol-es/src/main/java/com/ld/igds/protocol/es/dlt645/client/Dlt645ClientEngine.java new file mode 100644 index 0000000..ae11036 --- /dev/null +++ b/igds-protocol-es/src/main/java/com/ld/igds/protocol/es/dlt645/client/Dlt645ClientEngine.java @@ -0,0 +1,98 @@ +package com.ld.igds.protocol.es.dlt645.client; + +import com.ld.io.api.InvokeResult; +import io.netty.bootstrap.Bootstrap; +import io.netty.buffer.Unpooled; +import io.netty.channel.*; +import io.netty.channel.oio.OioEventLoopGroup; +import io.netty.channel.socket.SocketChannel; +import io.netty.channel.socket.oio.OioSocketChannel; +import io.netty.handler.codec.bytes.ByteArrayDecoder; +import io.netty.handler.codec.bytes.ByteArrayEncoder; +import lombok.extern.slf4j.Slf4j; + +/** + * DL/T 645-2007澶氬姛鑳界數琛� + * + * @author czt + */ +@Slf4j +public class Dlt645ClientEngine implements Runnable { + + private String host; + private int port; + + public Channel channel; + + public Dlt645ClientEngine(String host, int port) { + this.host = host; + this.port = port; + } + public void start() { + Thread thread = new Thread(this); + thread.start(); + } + + @Override + public void run() { + try { + startRun(); + } catch (Exception e) { + e.printStackTrace(); + } + } + + public void startRun() throws Exception { + EventLoopGroup group = new OioEventLoopGroup(); + Bootstrap b = new Bootstrap(); + // b.option(ChannelOption.SO_KEEPALIVE, true); + b.group(group).channel(OioSocketChannel.class) + .handler(new ChannelInitializer<SocketChannel>() { + @Override + protected void initChannel(SocketChannel ch) + throws Exception { + ChannelPipeline p = ch.pipeline(); + // 瀛楃涓茶В鐮� 鍜� 缂栫爜 + p.addLast("decoder", new ByteArrayDecoder()); + p.addLast("encoder", new ByteArrayEncoder()); + // 鑷繁鐨勯�昏緫Handler + p.addLast("handler", new ClientHandler()); + } + }); + + // 鍙戣捣寮傛杩炴帴璇锋眰锛岀粦瀹氳繛鎺ョ鍙e拰host淇℃伅 + ChannelFuture channelFuture = b.connect(host, port); + this.channel = channelFuture.channel(); + // channelFuture.channel().closeFuture().sync(); + + channelFuture.addListener(new ChannelFutureListener() { + @Override + public void operationComplete(ChannelFuture arg0) throws Exception { + if (channelFuture.isSuccess()) { + log.info("-----杩炴帴鐢佃〃鏈嶅姟鍣ㄦ垚鍔燂紝IP={}锛孭ORT={}", host, port); + } else { + log.info("-----杩炴帴鐢佃〃鏈嶅姟鍣ㄥけ璐ワ紝IP={}锛孭ORT={}", host, port); + channelFuture.cause().printStackTrace(); + group.shutdownGracefully(); // 鍏抽棴绾跨▼缁� + } + } + }); + } + + public InvokeResult send(byte[] array) throws InterruptedException { + if (null == channel) { + return InvokeResult.SOCKET_NOT_CREATE; + } + if (!channel.isActive()) { + return InvokeResult.CHANNEL_CLOSED; + } + channel.writeAndFlush(Unpooled.copiedBuffer(array)).sync(); + + return InvokeResult.SUCCESS; + } + + public Channel getChannel() { + return channel; + } + +} diff --git a/igds-protocol-es/src/main/java/com/ld/igds/protocol/es/dlt645/package-info.java b/igds-protocol-es/src/main/java/com/ld/igds/protocol/es/dlt645/package-info.java new file mode 100644 index 0000000..9fc7e9a --- /dev/null +++ b/igds-protocol-es/src/main/java/com/ld/igds/protocol/es/dlt645/package-info.java @@ -0,0 +1,7 @@ + + +/** + * @Desc: DL/T 645澶氬姛鑳界數琛� + * @author: czt + */ +package com.ld.igds.protocol.bhzn; \ No newline at end of file diff --git a/igds-protocol-es/src/main/java/com/ld/igds/protocol/es/dlt645/util/Dlt645Utils.java b/igds-protocol-es/src/main/java/com/ld/igds/protocol/es/dlt645/util/Dlt645Utils.java new file mode 100644 index 0000000..fa404a8 --- /dev/null +++ b/igds-protocol-es/src/main/java/com/ld/igds/protocol/es/dlt645/util/Dlt645Utils.java @@ -0,0 +1,88 @@ +package com.ld.igds.protocol.es.dlt645.util; + +/** + * 宸ュ叿绫� + * + * @author czt + */ +public class Dlt645Utils { + + + public static String MSG_START = "FEFEFEFE"; //璧峰绗� + public static String MSG_END = "16"; //缁撳熬绗� + + public static void main(String[] args) { + String s = makeCheck("6857141222000068110433333433"); + System.out.println(s); + } + + /** + * 灏�6涓瓧鑺傜殑鍦板潃鍩燂紝姣忓瓧鑺�2浣� BCD鐮�,杞崲涓�12浣�10杩涘埗鏁� + */ + public static String addrToString(String str) { + byte[] bytes = stringToBytes(str); + return String.format("%02x%02x%02x%02x%02x%02x", bytes[5], bytes[4], bytes[3], bytes[2], bytes[1], bytes[0]); + } + + /** + * DLT645鏍¢獙鐮� + */ + public static String makeCheck(String data) { + + if (data == null || data.equals("")) { + return ""; + } + int total = 0; + int len = data.length(); + int num = 0; + while (num < len) { + String s = data.substring(num, num + 2); + total += Integer.parseInt(s, 16); + num = num + 2; + } + /** + * 鐢�256姹備綑鏈�澶ф槸255锛屽嵆16杩涘埗鐨凢F + */ + int mod = total % 256; + String hex = Integer.toHexString(mod); + len = hex.length(); + // 濡傛灉涓嶅鏍¢獙浣嶇殑闀垮害锛岃ˉ0,杩欓噷鐢ㄧ殑鏄袱浣嶆牎楠� + if (len < 2) { + hex = "0" + hex; + } + return hex.toUpperCase(); + } + + /** + * 灏哠tring绫诲瀷杞崲鎴恇yte鏁扮粍 + */ + public static byte[] stringToBytes(String str) { + if (str == null || str.equals("")) { + return null; + } + byte[] bytes = new byte[str.length() / 2]; + for (int i = 0; i < bytes.length; i++) { + String subStr = str.substring(i * 2, i * 2 + 2); + bytes[i] = (byte) Integer.parseInt(subStr, 16); + } + return bytes; + } + + /** + * 瑙f瀽杩斿洖鐨勫叿浣撴暟鎹� + */ + public static Double parseData(String dataStr) { + byte[] data = stringToBytes(dataStr); + // 姣忎釜瀛楄妭-33H澶勭悊 + for (int i = 0; i < data.length; i++) { + data[i] = (byte) (data[i] - 0x33); + } + StringBuilder str = new StringBuilder(); + // BCD鐮佽浆鎹㈡垚10杩涘埗 + for (byte b : data) { + str.insert(0, String.format("%02x", b)); + } + return Double.parseDouble(str.toString()) * 0.01; + } + +} diff --git a/igds-web/pom.xml b/igds-web/pom.xml index 52d0223..0ba6140 100644 --- a/igds-web/pom.xml +++ b/igds-web/pom.xml @@ -222,6 +222,23 @@ </exclusions> </dependency>--> + <!-- 绉佹湁鍗忚-DLT645鐢佃〃鍗忚--> + <dependency> + <groupId>com.ld.igds</groupId> + <artifactId>igds-protocol-es</artifactId> + <version>${igds.version}</version> + <exclusions> + <exclusion> + <artifactId>slf4j-log4j12</artifactId> + <groupId>org.slf4j</groupId> + </exclusion> + <exclusion> + <artifactId>log4j</artifactId> + <groupId>log4j</groupId> + </exclusion> + </exclusions> + </dependency> + <!-- 绉佹湁鍗忚-閭︽捣鏅鸿兘 <dependency> <groupId>com.ld.igds</groupId> diff --git a/pom.xml b/pom.xml index f500421..f8b6cd3 100644 --- a/pom.xml +++ b/pom.xml @@ -43,6 +43,8 @@ <module>igds-protocol-zldz</module> <!--璐濆崥绮儏鍗忚--> <module>igds-protocol-beibo</module> + <!--鐢佃〃--> + <module>igds-protocol-es</module> <!--鐗╄仈缃戞嫇灞曡澶囧寘--> <module>igds-protocol-iot</module> @@ -52,6 +54,7 @@ <!--modbus-tcp--> <module>igds-protocol-modbus</module> + <!-- 鎵嬫満鍖� --> <module>igds-api-phone</module> <!-- 鎺ュ彛鍖咃紝鍖呮嫭涓夌淮鎺ュ彛 --> -- Gitblit v1.9.3