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