From 46203ee88249d9a4046f3d453deb41edc562cf6c Mon Sep 17 00:00:00 2001
From: jiazx0107@163.com <jiazx0107@163.com>
Date: 星期二, 12 十二月 2023 12:36:53 +0800
Subject: [PATCH] 提交网关心跳和设备状态

---
 src/main/java/com/fzzy/protocol/fzzy/server/SessionListener.java               |   21 
 src/main/java/com/fzzy/gateway/util/GatewayHttpUtil.java                       |    2 
 src/main/java/com/fzzy/gateway/service/GatewayDeviceService.java               |   70 +
 src/main/java/com/fzzy/gateway/hx2023/util/Base64Utils.java                    |  275 ++++++++
 src/main/java/com/fzzy/gateway/GatewayUtils.java                               |   40 +
 src/main/java/com/fzzy/gateway/hx2023/ScConstant.java                          |   21 
 pom.xml                                                                        |    8 
 src/main/resources/application-devGatewayCommon.yml                            |    1 
 src/main/java/com/fzzy/protocol/fzzy/analysis/AnalysisSystem.java              |   10 
 src/main/java/com/fzzy/gateway/hx2023/data/DeviceStatusData.java               |   34 +
 src/main/java/com/fzzy/api/utils/MyMD5Util.java                                |   14 
 src/main/resources/application-devGateway.yml                                  |    2 
 src/main/resources/application-dev.yml                                         |    2 
 src/main/java/com/fzzy/gateway/GatewayTimerScheduled.java                      |    2 
 src/main/java/com/fzzy/protocol/sdkhk/common/LPRCallBask_V31.java              |    1 
 src/main/java/com/fzzy/gateway/hx2023/util/OpenApiSignatureUtils.java          |  206 ++++++
 src/main/java/com/fzzy/gateway/hx2023/service/HxGatewayRemoteServiceImpl.java  |  201 +++---
 src/main/java/com/fzzy/protocol/weightyh/MessageConsumer.java                  |    1 
 src/main/java/com/fzzy/gateway/api/GatewayRemoteService.java                   |    7 
 src/main/java/com/fzzy/api/Constant.java                                       |   45 
 /dev/null                                                                      |  367 -----------
 src/main/java/com/fzzy/gateway/hx2023/service/HxGatewayRemoteServiceImpl2.java |  205 ++++++
 src/main/java/com/fzzy/gateway/hx2023/util/OpenApiRsaSigner.java               |  283 +++++++++
 src/main/resources/application-proGateway.yml                                  |    1 
 src/main/java/com/fzzy/gateway/GatewayRunner.java                              |    8 
 src/main/java/com/fzzy/gateway/hx2023/data/HeartBeatData.java                  |   31 +
 26 files changed, 1,309 insertions(+), 549 deletions(-)

diff --git a/pom.xml b/pom.xml
index 5deaec3..cccd79b 100644
--- a/pom.xml
+++ b/pom.xml
@@ -250,8 +250,12 @@
 			<version>3.0.9</version>
 		</dependency>
 
-
-
+		<!-- hutool鍔犲瘑瑙e瘑宸ュ叿绫� -->
+		<dependency>
+			<groupId>cn.hutool</groupId>
+			<artifactId>hutool-all</artifactId>
+			<version>5.0.7</version>
+		</dependency>
 
 		<!-- 闆嗘垚httpclient -->
 		<dependency>
diff --git a/src/main/java/com/fzzy/api/Constant.java b/src/main/java/com/fzzy/api/Constant.java
index b38f697..6c17aee 100644
--- a/src/main/java/com/fzzy/api/Constant.java
+++ b/src/main/java/com/fzzy/api/Constant.java
@@ -324,38 +324,31 @@
         return contextDeviceMap.get(sn);
     }
 
-    public static void updateCacheOnline(String sn, String ip, Integer port, boolean isCreate) {
-        ApiCommonDevice device = getCommonDeviceCache(sn);
-        if (null == device && isCreate) {
-            device = new ApiCommonDevice();
+    public static ApiCommonDevice getCommonDeviceCacheByIp(String ip) {
+        if (null == ip) return null;
+
+        if (contextDeviceMap.isEmpty()) return null;
+
+        for (ApiCommonDevice device : contextDeviceMap.values()) {
+            if (ip.equals(device)) return device;
         }
-        if (null != device) {
-            device.setIp(ip);
-            device.setPort(port);
-            device.setStatus(Constant.YN_Y);
-            device.setCode("SUCCESS");
-            device.setMsg("璁惧鍦ㄧ嚎");
-            device.setSn(ip);
-            contextDeviceMap.put(device.getSn(), device);
-        }
+        return null;
     }
 
-    public static void updateCacheOffline(String sn, String ip, Integer port, boolean isCreate) {
-        ApiCommonDevice device = getCommonDeviceCache(sn);
+    public static ApiCommonDevice updateCacheOffline(String ip, Integer port) {
+        ApiCommonDevice device = getCommonDeviceCacheByIp(ip);
 
-        if (null == device && isCreate) {
-            device = new ApiCommonDevice();
+        if (null == device) {
+            return null;
         }
+        device.setIp(ip);
+        device.setPort(port);
+        device.setStatus(Constant.YN_N);
+        device.setCode("ERROR");
+        device.setMsg("璁惧绂荤嚎");
+        contextDeviceMap.put(device.getSn(), device);
 
-        if (null != device) {
-            device.setIp(ip);
-            device.setPort(port);
-            device.setStatus(Constant.YN_N);
-            device.setCode("ERROR");
-            device.setMsg("璁惧绂荤嚎");
-
-            contextDeviceMap.put(device.getSn(), device);
-        }
+        return device;
     }
 
     public static void updateCache(ApiCommonDevice device) {
diff --git a/src/main/java/com/fzzy/api/utils/MyMD5Util.java b/src/main/java/com/fzzy/api/utils/MyMD5Util.java
index 403a9b0..af33f80 100644
--- a/src/main/java/com/fzzy/api/utils/MyMD5Util.java
+++ b/src/main/java/com/fzzy/api/utils/MyMD5Util.java
@@ -1,6 +1,8 @@
 package com.fzzy.api.utils;
 
 import org.springframework.util.DigestUtils;
+
+import java.io.UnsupportedEncodingException;
 import java.nio.charset.StandardCharsets;
 import java.security.MessageDigest;
 
@@ -9,6 +11,10 @@
  *
  */
 public class MyMD5Util {
+
+
+
+    public static String charset = "UTF-8";
 
     /**
      * 1.java鍘熺敓鐢ㄦ硶
@@ -19,7 +25,7 @@
     public static String encrypt(String dataStr) {
         try {
             MessageDigest m = MessageDigest.getInstance("MD5");
-            m.update(dataStr.getBytes(StandardCharsets.UTF_8));
+            m.update(dataStr.getBytes(charset));
             byte[] s = m.digest();
             StringBuilder result = new StringBuilder();
             for (byte b : s) {
@@ -38,17 +44,17 @@
      *
      * @return
      */
-    public static String getMD5(String str) {
-        String md5 = DigestUtils.md5DigestAsHex(str.getBytes());
+    public static String getMD5(String str) throws Exception{
+        String md5 = DigestUtils.md5DigestAsHex(str.getBytes(charset));
         return md5;
     }
+
 
     public static void main(String[] args) throws Exception {
         String data = AESUtils.decrypt("QG5j4Ihk04GTNSzbsvNmttCBQCLbC57si3lGric1bpVyRv2Fjiy+JG2W1G4r8pYwOUkGFdAu7Ou2Xcz/3C4w9rk8mJtva92ZOdYD1kJxDF9MxKC9LDTHo3XRIPfD5w5Hg38CHzamDcL1pMu8b8d4gOppa0EgWzC28rp+iedNnbY+4Zwu9ANRdW/1d0FYNjSFY3/2Oa8AqA4ufbsDp4U28mBpxQ9hxM6LzTFnbMSXe2xr12+LbyDtkvDaxDGyojZKEGKq+VItw4j8kKx5uD5TGPa+7jienfuiKbdkYFOkzZKY0nokqhqRMBCkJ4xx4aSbZjyP3l5VzB0z1WqKEocD0PNdI3PML9M8tt+AGjd9TWUgklhOl6v+yLorX815Wp9A08nsbDJK1klVlx84vc2dSHyR4u8ITYRlH74PmfeshxR3WGBB4OhD8/GVMUgPd4q8grW8vZoqqzqFrQcoVDc70P5t+Fsqz8BlxDtbwssVhpbF3/iuX2i+VrXKFtUQ1nIHLWJEZIf87BE/DtHrbm1epRJvsZlEWtQf63jydaM+gsnb18Mn5yUnEnESD4OtlgkbSvOdzxk3MKHsUoka9fn0h5y55hLy6EQGm4zlQopvxa0=","a34de38afad2fff932f569e4434fed35");
         System.out.println(getMD5(data));
         System.out.println(encrypt("{\"bgdh\":\"0754-88843381\",\"cfs\":17,\"czbz\":\"u\",\"czhm\":\"0754-88323996\",\"dwdm\":\"91440500190354212L\",\"dwlx\":\"19\",\"dwmc\":\"姹曞ご甯傜伯椋熶紒涓氶泦鍥㈠叕鍙竆",\"dzyx\":\"lsjtccb@163.com\",\"fddbr\":\"鏋楄壇蹇燶",\"frlxfs\":\"0754-88626738\",\"frsfzh\":\"511131196308124236\",\"jd\":116.73651,\"kqs\":3,\"qylxr\":\"鏋楁吵鐢焅",\"wd\":23.37235,\"xzqhdm\":\"440500\",\"ygs\":0,\"yzbm\":\"515000\",\"zcdz\":\"姹曞ご甯傜彔姹犺矾33鍙穃",\"zcrq\":\"1992-12-10\",\"zczb\":2328.0,\"zcze\":7524.71,\"zhgxsj\":\"2022-10-20 18:42:51\"}"));
         System.out.println(getMD5( "{\\\"bgdh\\\":\\\"0754-88843381\\\",\\\"cfs\\\":17,\\\"czbz\\\":\\\"u\\\",\\\"czhm\\\":\\\"0754-88323996\\\",\\\"dwdm\\\":\\\"91440500190354212L\\\",\\\"dwlx\\\":\\\"19\\\",\\\"dwmc\\\":\\\"姹曞ご甯傜伯椋熶紒涓氶泦鍥㈠叕鍙竆\\",\\\"dzyx\\\":\\\"lsjtccb@163.com\\\",\\\"fddbr\\\":\\\"鏋楄壇蹇燶\\",\\\"frlxfs\\\":\\\"0754-88626738\\\",\\\"frsfzh\\\":\\\"511131196308124236\\\",\\\"jd\\\":116.73651,\\\"kqs\\\":3,\\\"qylxr\\\":\\\"鏋楁吵鐢焅\\",\\\"wd\\\":23.37235,\\\"xzqhdm\\\":\\\"440500\\\",\\\"ygs\\\":0,\\\"yzbm\\\":\\\"515000\\\",\\\"zcdz\\\":\\\"姹曞ご甯傜彔姹犺矾33鍙穃\\",\\\"zcrq\\\":\\\"1992-12-10\\\",\\\"zczb\\\":2328.0,\\\"zcze\\\":7524.71,\\\"zhgxsj\\\":\\\"2022-10-20 18:42:51\\\"}"));
-
     }
 }
 
diff --git a/src/main/java/com/fzzy/gateway/GatewayRunner.java b/src/main/java/com/fzzy/gateway/GatewayRunner.java
index 8f25135..5c257ee 100644
--- a/src/main/java/com/fzzy/gateway/GatewayRunner.java
+++ b/src/main/java/com/fzzy/gateway/GatewayRunner.java
@@ -29,8 +29,12 @@
 
     @Override
     public void run(String... args) throws Exception {
+
+        log.info("---------MQTT鍒濆鍖�--------------");
         mqttPublishService.init();
-        //鎵ц鍒濆鍖栨柟妗�
+
+        //缃戝叧鍒濆鍖�
+        log.info("---------缃戝叧璁惧鍒濆鍖�--------------");
         apiInitService.init();
 
 
@@ -38,9 +42,11 @@
         scheduled.doWeatherExe();
 
         //鏇存柊璁惧缂撳瓨
+        log.info("---------璁惧缂撳瓨鍒濆鍖�--------------");
         apiInitService.updateDeviceCache();
 
         //鍒濆鍖栬溅鐗岃瘑鍒�
+        log.info("---------杞︾墝璇嗗埆鍒濆鍖�--------------");
         apiInitService.initAllLpr();
     }
 
diff --git a/src/main/java/com/fzzy/gateway/GatewayTimerScheduled.java b/src/main/java/com/fzzy/gateway/GatewayTimerScheduled.java
index 0257ad6..a2b54d3 100644
--- a/src/main/java/com/fzzy/gateway/GatewayTimerScheduled.java
+++ b/src/main/java/com/fzzy/gateway/GatewayTimerScheduled.java
@@ -55,7 +55,7 @@
      * <p>
      * 鍥哄畾鏃堕棿锛氭瘡闂撮殧10鍒嗛挓鎵ц涓�娆�
      */
-    @Scheduled(cron = "0 0/10 * * * ?")
+    @Scheduled(cron = "0 0/1 * * * ?")
     public void scheduled() {
 
         //缃戝叧鐨勫績璺虫墽琛�
diff --git a/src/main/java/com/fzzy/gateway/GatewayUtils.java b/src/main/java/com/fzzy/gateway/GatewayUtils.java
index b87a207..e7da33c 100644
--- a/src/main/java/com/fzzy/gateway/GatewayUtils.java
+++ b/src/main/java/com/fzzy/gateway/GatewayUtils.java
@@ -21,11 +21,6 @@
     public static Map<String, GatewayDevice> cacheMapDeviceId = new HashMap<>();
 
     /**
-     * 璁惧缂撳瓨
-     */
-    public static Map<String, GatewayDevice> cacheMapDeviceSn = new HashMap<>();
-
-    /**
      * 璁惧缂撳瓨-鍙拡瀵�
      */
     public static Map<String, GatewayDevice> cacheMapDeviceWeight = new HashMap<>();
@@ -33,12 +28,14 @@
 
     public static void add2Cache(GatewayDevice device) {
         cacheMapDeviceId.put(device.getDeviceId(), device);
-        cacheMapDeviceSn.put(device.getDeviceSn(), device);
-
         //淇濆瓨鍦扮
         if (GatewayDeviceType.TYPE_01.getCode().equals(device.getType())) {
             cacheMapDeviceWeight.put(device.getDeviceId(), device);
         }
+    }
+
+    public static Collection<GatewayDevice> allCacheDevice() {
+        return cacheMapDeviceId.values();
     }
 
     public static GatewayDevice getCacheByDeviceId(String deviceId) {
@@ -46,8 +43,33 @@
     }
 
     public static GatewayDevice getCacheByDeviceSn(String deviceSn) {
-        return cacheMapDeviceSn.get(deviceSn);
+        Collection<GatewayDevice> list = allCacheDevice();
+        if (null == list || list.isEmpty()) return null;
+
+        for (GatewayDevice device : list) {
+            if (deviceSn.equals(device.getDeviceSn())) return device;
+        }
+
+        return null;
     }
+
+    /**
+     * 閽堝涓�涓�氳鍒嗘満瀵瑰涓粨鎯呭喌
+     *
+     * @param deviceSn
+     * @return
+     */
+    public static List<GatewayDevice> getCacheByDeviceSn2(String deviceSn) {
+        Collection<GatewayDevice> list = allCacheDevice();
+        if (null == list || list.isEmpty()) return null;
+
+        List<GatewayDevice> result = new ArrayList<>();
+        for (GatewayDevice device : list) {
+            if (deviceSn.equals(device.getDeviceSn())) result.add(device);
+        }
+        return result;
+    }
+
 
     public static List<GatewayDevice> getCacheByDeviceType(String deviceType) {
         List<GatewayDevice> result = new ArrayList<>();
@@ -67,7 +89,7 @@
 
     public static void removeCache(GatewayDevice data) {
         cacheMapDeviceId.remove(data.getDeviceId());
-        cacheMapDeviceSn.remove(data.getDeviceSn());
+        //cacheMapDeviceSn.remove(data.getDeviceSn());
     }
 
     public static String getStatus(String sn) {
diff --git a/src/main/java/com/fzzy/gateway/api/GatewayRemoteService.java b/src/main/java/com/fzzy/gateway/api/GatewayRemoteService.java
index d187dc4..9664524 100644
--- a/src/main/java/com/fzzy/gateway/api/GatewayRemoteService.java
+++ b/src/main/java/com/fzzy/gateway/api/GatewayRemoteService.java
@@ -31,4 +31,11 @@
      * @param gatewayConf
      */
     void pushInfo(GatewayConf gatewayConf);
+
+
+    /**
+     * 鑾峰彇褰撳墠缃戝叧涓嬬殑璁惧鍒楄〃锛屽苟涓婃姤璁惧鐘舵��
+     * @param gatewayConf
+     */
+    void pushDeviceStatus(GatewayConf gatewayConf);
 }
diff --git a/src/main/java/com/fzzy/gateway/hx2023/ScConstant.java b/src/main/java/com/fzzy/gateway/hx2023/ScConstant.java
index dc64702..dc8a7fe 100644
--- a/src/main/java/com/fzzy/gateway/hx2023/ScConstant.java
+++ b/src/main/java/com/fzzy/gateway/hx2023/ScConstant.java
@@ -18,6 +18,8 @@
 
     public static String MESSAGE_TYPE_INVOKE_FUNCTION = "INVOKE_FUNCTION";
 
+
+
     /**
      * 绮儏閲囨寚浠�
      */
@@ -32,10 +34,13 @@
         return UUID.randomUUID().toString().replaceAll("-", "");
     }
 
-//    public static String getMd5MessageId() {
-//        return MyMD5Util.getMD5(getUUID());
-//    }
 
+
+
+    //API_SOURCE-蹇冭烦
+    public static String API_SOURCE_TARGET_EQUIPMENT_HEARTBEAT = "TARGET_EQUIPMENT_HEARTBEAT";
+    //API_SOURCE-缃戝叧璁惧鐘舵�佹秷鎭殑
+    public static String API_SOURCE_TARGET_EQUIPMENT_STATUS = "TARGET_EQUIPMENT_STATUS";
 
     /**
      * 涓嬪彂鎸囦护鍥炲鎶ユ枃topic
@@ -47,4 +52,14 @@
      */
     public static String TOPIC_MESSAGE_REPORT = "/device/${productId}/${deviceId}/message/property/report";
 
+
+    /**
+     * 缃戝叧璁惧鐘舵�佹秷鎭秷鎭� topic锛歍OPIC_EQUIPMENT_HEARTBEAT_{搴撶偣缂栫爜}
+     */
+    public static String TOPIC_EQUIPMENT_HEARTBEAT = "TOPIC_EQUIPMENT_HEARTBEAT_{kqdm}";
+
+    /**
+     * 缃戝叧璁惧鐘舵�佹秷鎭秷鎭� topic锛歍OPIC_EQUIPMENT_STATUS_{搴撶偣缂栫爜}
+     */
+    public static String TOPIC_EQUIPMENT_STATUS = "TOPIC_EQUIPMENT_STATUS_{kqdm}";
 }
diff --git a/src/main/java/com/fzzy/gateway/hx2023/data/DeviceStatusData.java b/src/main/java/com/fzzy/gateway/hx2023/data/DeviceStatusData.java
new file mode 100644
index 0000000..6fadde4
--- /dev/null
+++ b/src/main/java/com/fzzy/gateway/hx2023/data/DeviceStatusData.java
@@ -0,0 +1,34 @@
+package com.fzzy.gateway.hx2023.data;
+
+import lombok.Data;
+
+@Data
+public class DeviceStatusData {
+
+    //UUID,娑堟伅缂栧彿
+    private String messageId;
+
+    //妯″潡璇嗗埆鐮�
+    private String apISource;
+
+    //缃戝叧 ID
+    private String gatewayId;
+
+    //缃戝叧 IP
+    private String gatewayIp;
+
+    //浜у搧 ID
+    private String productId;
+
+    //璁惧缂栧彿
+    private String equipId;
+
+    //0 浠h〃璁惧涓嶅湪绾� 1锛�1 浠h〃璁惧鍦ㄧ嚎
+    private int status = 1;
+
+    //涓婃姤鏃堕棿 yyyy-MM-dd hh:mm:ss
+    private String reportTime;
+
+    //涓婃姤淇℃伅涓�浜涜鏄�
+    private String memo;
+}
diff --git a/src/main/java/com/fzzy/gateway/hx2023/data/HeartBeatData.java b/src/main/java/com/fzzy/gateway/hx2023/data/HeartBeatData.java
new file mode 100644
index 0000000..3bcaa35
--- /dev/null
+++ b/src/main/java/com/fzzy/gateway/hx2023/data/HeartBeatData.java
@@ -0,0 +1,31 @@
+package com.fzzy.gateway.hx2023.data;
+
+import lombok.Data;
+
+@Data
+public class HeartBeatData {
+
+    //UUID,娑堟伅缂栧彿
+    private String messageId;
+
+    //妯″潡璇嗗埆鐮�
+    private String apISource;
+
+    //缃戝叧 ID
+    private String gatewayId;
+
+    //缃戝叧 IP
+    private String gatewayIp;
+
+    //缃戝叧 mac 鍦板潃
+    private String gatewayMac;
+
+    //heartbeat 榛樿 1
+    private int heartbeat = 1;
+
+    //涓婃姤鏃堕棿 yyyy-MM-dd hh:mm:ss
+    private String reportTime;
+
+    //涓婃姤淇℃伅涓�浜涜鏄�
+    private String memo;
+}
diff --git a/src/main/java/com/fzzy/gateway/hx2023/service/HxGatewayRemoteServiceImpl.java b/src/main/java/com/fzzy/gateway/hx2023/service/HxGatewayRemoteServiceImpl.java
index 13c0715..f8b3c0a 100644
--- a/src/main/java/com/fzzy/gateway/hx2023/service/HxGatewayRemoteServiceImpl.java
+++ b/src/main/java/com/fzzy/gateway/hx2023/service/HxGatewayRemoteServiceImpl.java
@@ -1,28 +1,35 @@
 package com.fzzy.gateway.hx2023.service;
 
 import com.alibaba.fastjson2.JSONObject;
+import com.fzzy.api.Constant;
+import com.fzzy.api.data.GatewayDeviceType;
 import com.fzzy.api.data.PushProtocol;
-import com.fzzy.api.utils.*;
+import com.fzzy.api.utils.ContextUtil;
 import com.fzzy.api.view.repository.ApiLogRep;
-import com.fzzy.gateway.data.BaseResp;
-import com.fzzy.gateway.service.GatewayConfService;
-import com.fzzy.gateway.util.GatewayHttpUtil;
+import com.fzzy.gateway.GatewayUtils;
 import com.fzzy.gateway.api.GatewayRemoteService;
+import com.fzzy.gateway.data.BaseResp;
 import com.fzzy.gateway.entity.GatewayConf;
+import com.fzzy.gateway.entity.GatewayDevice;
 import com.fzzy.gateway.hx2023.ScConstant;
 import com.fzzy.gateway.hx2023.data.CloudResp;
-import com.fzzy.gateway.util.GatewayRSAUtils;
+import com.fzzy.gateway.hx2023.data.DeviceStatusData;
+import com.fzzy.gateway.hx2023.data.HeartBeatData;
+import com.fzzy.gateway.hx2023.kafka.KafkaDeviceReportService;
+import com.fzzy.gateway.hx2023.util.OpenApiSignatureUtils;
+import com.fzzy.gateway.service.GatewayConfService;
+import com.fzzy.gateway.util.GatewayHttpUtil;
 import lombok.Data;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang.time.DateFormatUtils;
 import org.springframework.stereotype.Component;
 
 import javax.annotation.Resource;
-import java.io.UnsupportedEncodingException;
-import java.util.Comparator;
+import java.util.Collection;
+import java.util.Date;
 import java.util.HashMap;
 import java.util.Map;
-import java.util.TreeMap;
 
 
 @Slf4j
@@ -31,11 +38,15 @@
 public class HxGatewayRemoteServiceImpl implements GatewayRemoteService {
 
 
+    String charset = "utf-8";
+
     @Resource
     private ApiLogRep apiLogRep;
 
     @Resource
     private GatewayConfService gatewayConfService;
+    @Resource
+    private KafkaDeviceReportService kafkaDeviceReportService;
 
 
     @Override
@@ -73,9 +84,10 @@
 
 
             //鑾峰彇 AccessToken 鎺ュ彛
-            String sign = getSign(params, gatewayConf.getPrivateKey());
+            String sign = getSign(params, gatewayConf);
             params.put("sign", sign);
             url = gatewayConf.getApiUrl() + "reserver/api/token/apply";
+
             jsonStr = GatewayHttpUtil.doGet(url, params);
             log.info("---鑾峰彇AccessToken鎺ュ彛-杩斿洖---{}", jsonStr);
             CloudResp respToken = JSONObject.parseObject(jsonStr, CloudResp.class);
@@ -98,34 +110,42 @@
 
     @Override
     public void heartbeat(GatewayConf gatewayConf) {
+
+        log.info("------------瀹氭椂蹇冭烦鎵ц---------{}", gatewayConf.getKqmc());
+
         try {
 
-            if (StringUtils.isEmpty(gatewayConf.getApiUrl())) {
-                return;
-            }
 
             gatewayConf = getCacheConf(gatewayConf.getKqdm());
-            //缃戝叧蹇冭烦鎺ュ彛
-            Map<String, String> params = new HashMap<>();
-            params.put("token", gatewayConf.getAccessToken());
-            params.put("gatewayId", gatewayConf.getGatewayId());
-            params.put("gatewayIp", gatewayConf.getGatewayIp());
-            params.put("gatewayMac", gatewayConf.getGatewayMac());
-            params.put("heartbeat", "1");
-            params.put("timestamp", System.currentTimeMillis() + "");
 
-            String sign = getSign(params, gatewayConf.getPrivateKey());
-            params.put("sign", sign);
 
-            String url = gatewayConf.getApiUrl() + "reserver/api/iot/equipment/heartbeat";
+            HeartBeatData heartBeatData = new HeartBeatData();
 
-            String jsonStr = GatewayHttpUtil.doGet(url, params);
-           // log.info("---缃戝叧蹇冭烦鎺ュ彛-杩斿洖---{}", jsonStr);
+            heartBeatData.setMessageId(ContextUtil.getUUID());
+            heartBeatData.setApISource(ScConstant.API_SOURCE_TARGET_EQUIPMENT_HEARTBEAT);
+            heartBeatData.setGatewayId(gatewayConf.getGatewayId());
+            heartBeatData.setGatewayIp(gatewayConf.getGatewayIp());
+            heartBeatData.setGatewayMac(null == gatewayConf.getGatewayMac() ? "鏃�" : gatewayConf.getGatewayMac());
+            heartBeatData.setHeartbeat(1);
+            heartBeatData.setReportTime(DateFormatUtils.format(new Date(), "yyyy-MM-dd hh:mm:ss"));
+            heartBeatData.setMemo("FZZY");
+
+            String topic = ScConstant.TOPIC_EQUIPMENT_HEARTBEAT;
+            topic = topic.replace("{kqdm}", gatewayConf.getKqdm());
+
+            String messageInfo = JSONObject.toJSONString(heartBeatData);
+
+            log.info("---缃戝叧蹇冭烦鎺ㄩ��--{}-{}", topic, messageInfo);
+
+            kafkaDeviceReportService.publishWithTopic(messageInfo, topic);
+
 
         } catch (Exception e) {
             log.error("------缃戝叧蹇冭烦鎺ュ彛--鎵ц澶辫触-----{}", e);
         }
 
+        //鎵ц褰撳墠缃戝叧鐨勮澶囩姸鎬佹帹閫�
+        pushDeviceStatus(gatewayConf);
     }
 
     @Override
@@ -142,13 +162,13 @@
             params.put("token", gatewayConf.getAccessToken());
             params.put("gatewayId", gatewayConf.getGatewayId());
             params.put("gatewayIp", gatewayConf.getGatewayIp());
-            params.put("gatewayMac", gatewayConf.getGatewayMac());
-            params.put("gatewayCPU", gatewayConf.getGatewayCPU());
-            params.put("gatewayMem", gatewayConf.getGatewayMem());
-            params.put("gatewayHardDisk", gatewayConf.getGatewayHardDisk());
+            params.put("gatewayMac", null == gatewayConf.getGatewayMac() ? "鏃�" : gatewayConf.getGatewayMac());
+            params.put("gatewayCPU", null == gatewayConf.getGatewayCPU() ? "鏃�" : gatewayConf.getGatewayCPU());
+            params.put("gatewayMem", null == gatewayConf.getGatewayMem() ? "鏃�" : gatewayConf.getGatewayMem());
+            params.put("gatewayHardDisk", null == gatewayConf.getGatewayHardDisk() ? "鏃�" : gatewayConf.getGatewayHardDisk());
             params.put("timestamp", System.currentTimeMillis() + "");
 
-            String sign = getSign(params, gatewayConf.getPrivateKey());
+            String sign = getSign(params, gatewayConf);
             params.put("sign", sign);
 
             String url = gatewayConf.getApiUrl() + "reserver/api/iot/equipment/heartbeat";
@@ -162,47 +182,62 @@
     }
 
 
-    public String getSign(Map<String, String> parames, String priKey) {
-        //鍙傛暟鎷兼帴
-        String msg = "";
-        parames = sortMapKey(parames);
-        for (Map.Entry<String, String> param : parames.entrySet()) {
-            msg += param.getKey() + "=" + param.getValue() + "&";
+    @Override
+    public void pushDeviceStatus(GatewayConf gatewayConf) {
+
+        //鑾峰彇璁惧鍒楄〃
+        Collection<GatewayDevice> list = GatewayUtils.allCacheDevice();
+        if (null == list || list.isEmpty()) {
+            log.info("--------绯荤粺鏈幏鍙栧埌褰撳墠绯荤粺璁惧鍒楄〃锛屼笉鎵ц鐘舵�佹帹閫�-----");
+            return;
         }
-        msg = msg.substring(0, msg.length() - 1);
 
-        log.debug("------寰呭姞瀵嗕俊鎭�-----{}", msg);
+        //灏佽璁惧鎶ユ枃淇℃伅
+        DeviceStatusData statusData;
+        String messageInfo;
+        String topic = ScConstant.TOPIC_EQUIPMENT_STATUS;
+        topic = topic.replace("{kqdm}", gatewayConf.getKqdm());
 
-        //MD5鍔犲瘑
-        String md5sign = MyMD5Util.getMD5(msg);
-        log.debug("------md5鍔犲瘑-----{}", md5sign);
+        for (GatewayDevice device : list) {
+            //濡傛灉璁惧娌℃湁閰嶇疆productId鐩存帴璺宠繃
+            if (StringUtils.isEmpty(device.getProductId())) continue;
+            statusData = new DeviceStatusData();
+            statusData.setMessageId(ContextUtil.getUUID());
+            statusData.setApISource(ScConstant.API_SOURCE_TARGET_EQUIPMENT_STATUS);
+            statusData.setGatewayId(gatewayConf.getGatewayId());
+            statusData.setGatewayIp(gatewayConf.getGatewayIp());
+            statusData.setProductId(device.getProductId());
+            statusData.setEquipId(device.getDeviceId());
+            statusData.setReportTime(DateFormatUtils.format(new Date(), "yyyy-MM-dd hh:mm:ss"));
+            statusData.setMemo("FZZY");
 
-        //RSA鍔犲瘑
-        String result = GatewayRSAUtils.encryptByPrivate(md5sign, priKey);
-        log.debug("------RSA鍔犲瘑-----{}", result);
+            //閽堝绮儏璁惧
+            if (GatewayDeviceType.TYPE_07.getCode().equals(device.getType())) {
+                if (Constant.YN_N.equals(device.getStatus())) statusData.setStatus(0);
+            }
 
-        return result;
+            messageInfo = JSONObject.toJSONString(statusData);
+            //鎺ㄩ�佽澶囩姸鎬�
+            kafkaDeviceReportService.publishWithTopic(messageInfo, topic);
+
+        }
     }
-    public static String getSign2(Map<String, String> parames, String priKey) {
-        //鍙傛暟鎷兼帴
-        String msg = "";
-        parames = sortMapKey(parames);
-        for (Map.Entry<String, String> param : parames.entrySet()) {
-            msg += param.getKey() + "=" + param.getValue() + "&";
-        }
-        msg = msg.substring(0, msg.length() - 1);
 
-        log.debug("------寰呭姞瀵嗕俊鎭�-----{}", msg);
+
+    public String getSign(Map<String, String> parames, GatewayConf gatewayConf) throws Exception {
+
+        //鍙傛暟璋冩暣
+        String signContent = OpenApiSignatureUtils.getSignContent(parames);
+        log.debug("------寰呭姞瀵嗕俊鎭�-----{}", signContent);
 
         //MD5鍔犲瘑
-        String md5sign = MyMD5Util.getMD5(msg);
-        log.debug("------md5鍔犲瘑-----{}", md5sign);
+        String md5sign = OpenApiSignatureUtils.getMd5Content(signContent, charset);
 
         //RSA鍔犲瘑
-        String result = GatewayRSAUtils.encryptByPrivate(md5sign, priKey);
-        log.debug("------RSA鍔犲瘑-----{}", result);
+        String singValue = OpenApiSignatureUtils.doSignByHex(gatewayConf.getGatewayId(), md5sign, charset, gatewayConf.getPublicKey(), gatewayConf.getPrivateKey());
+        log.debug("------RSA鍔犲瘑绛惧悕-----{}", singValue);
 
-        return result;
+        return singValue;
     }
 
     /**
@@ -214,56 +249,8 @@
     }
 
     private void updateAuthToken(GatewayConf conf) {
-
         gatewayConfService.updateCache(conf);
-
     }
 
-    private static Map<String, String> sortMapKey(Map<String, String> map){
-        if(map == null || map.isEmpty()){
-            return  null;
-        }
-
-
-        Map<String, String> sortMap = new TreeMap<>(new Comparator<String>() {
-            @Override
-            public int compare(String o1, String o2) {
-                return o1.compareTo(o2);
-            }
-        });
-        sortMap.putAll(map);
-        return sortMap;
-    }
-
-
-    public static void main(String[] args) throws UnsupportedEncodingException {
-        //缃戝叧蹇冭烦鎺ュ彛
-//        Map<String, String> params = new HashMap<>();
-//        //params.put("token", "");
-//        params.put("gatewayId", "6e3d92ff71b911eea5e50250f2000002");
-//        params.put("gatewayIp", "123");
-//        params.put("gatewayMac", "123");
-//        params.put("gatewayCPU","123");
-//        params.put("gatewayMem", "123");
-//        params.put("gatewayHardDisk", "123");
-//        params.put("timestamp", "2023-10-31 12:12:12");
-//        String sign = getSign2(params,"MIIBVQIBADANBgkqhkiG9w0BAQEFAASCAT8wggE7AgEAAkEA0lg35sJGRyUFEDzt\np9pWvc0JD+0+SmiZIgMbUaEM5gqBsvUJ9LnzB0rpMTbuqAxAFbUH1Nw4qXdJVnKS\nRYfPgQIDAQABAkBPkxIq2Uou9gFRYEtkGcSA70VDYjQTgDiWVmiKXAv+JkEJmOno\\nMrHYQGAiP0q4xW66F+CLNCrGPVJns2ywMxwxAiEA/vyNX5M0/t+RHAxpMp484i9T\nb5Qf+HvepOV3c0UGZx0CIQDTLj4+qgoXGOLCM9/dzVJZ04VIjK6u546z22hXFWgI\ntQIhAMWFP8JMlx3kc1UF7Cuw1jrkLD7fwJBM7CBSPODHFHmlAiEAhv4Hcf02B/+z\nbBrG3rzSCHOKvo6XV1zTvqrhLtGTOAUCIGmoaIDgTuS0ZF71+c9mYvPVNL0T02GQ\nE8Y3ExreQphx");
-//        params.put("sign", sign);
-//
-//        System.out.println(sign);
-        byte[] encryptedData = GatewayRSAUtils.decryptBase64("yx7jNj9DGS7AkH/sXo5IrwaGNCSUnAZFmjXwWovMBfvYGVQur1RELXUu4fqIMZZ/ck6CAA3ESOJCS+aCD0aVdA==");
-        StringBuilder hexString = new StringBuilder();
-        for (byte b : encryptedData) {
-            String hex = Integer.toHexString(0xFF & b);
-            if (hex.length() == 1) {
-                hexString.append('0');
-            }
-            hexString.append(hex);
-        }
-        String hexStringResult = hexString.toString();
-        System.out.println(hexStringResult);
-        System.out.println(BytesUtil.bytesToString(GatewayRSAUtils.decryptBase64("mgtJOOn5iZBvmQI3hzvaw2J4BiZUcXhLTsgLk8++Ig2iIZcPaky7V+ylkA+BAYxIBS5ovHXjRo4w26TTEq9k7Q==")));
-
-    }
 
 }
diff --git a/src/main/java/com/fzzy/gateway/hx2023/service/HxGatewayRemoteServiceImpl2.java b/src/main/java/com/fzzy/gateway/hx2023/service/HxGatewayRemoteServiceImpl2.java
new file mode 100644
index 0000000..323fd68
--- /dev/null
+++ b/src/main/java/com/fzzy/gateway/hx2023/service/HxGatewayRemoteServiceImpl2.java
@@ -0,0 +1,205 @@
+package com.fzzy.gateway.hx2023.service;
+
+import com.alibaba.fastjson2.JSONObject;
+import com.fzzy.api.data.PushProtocol;
+import com.fzzy.api.view.repository.ApiLogRep;
+import com.fzzy.gateway.api.GatewayRemoteService;
+import com.fzzy.gateway.data.BaseResp;
+import com.fzzy.gateway.entity.GatewayConf;
+import com.fzzy.gateway.hx2023.data.CloudResp;
+import com.fzzy.gateway.hx2023.util.OpenApiSignatureUtils;
+import com.fzzy.gateway.service.GatewayConfService;
+import com.fzzy.gateway.util.GatewayHttpUtil;
+import lombok.Data;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang.StringUtils;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+import java.util.HashMap;
+import java.util.Map;
+
+
+@Slf4j
+@Data
+@Component
+public class HxGatewayRemoteServiceImpl2 implements GatewayRemoteService {
+
+
+    String charset = "utf-8";
+
+    @Resource
+    private ApiLogRep apiLogRep;
+
+    @Resource
+    private GatewayConfService gatewayConfService;
+
+
+    @Override
+    public String getProtocol() {
+        //return PushProtocol.GATEWAY_SC_2023.getCode();
+        return "GATEWAY_SC_2023-鏆傚仠浣跨敤";
+    }
+
+    @Override
+    public void init(GatewayConf gatewayConf) {
+        try {
+
+            if (StringUtils.isEmpty(gatewayConf.getApiUrl())) {
+                return;
+            }
+
+            //鑾峰彇鍏閽ユ帴鍙�
+            Map<String, String> params = new HashMap<>();
+            params.put("appId", gatewayConf.getGatewayId());
+
+            String url = gatewayConf.getApiUrl() + "reserver/api/key/apply";
+            String jsonStr = GatewayHttpUtil.doGet(url, params);
+
+            log.info("---鑾峰彇鍏閽ユ帴鍙�-杩斿洖---{}", jsonStr);
+
+            CloudResp respKey = JSONObject.parseObject(jsonStr, CloudResp.class);
+
+            if (BaseResp.CODE_200 == respKey.getCode()) {
+                JSONObject object = respKey.getData();
+                String pubKey = (String) object.get("pubKey");
+                String priKey = (String) object.get("priKey");
+
+                gatewayConf.setPublicKey(pubKey);
+                gatewayConf.setPrivateKey(priKey);
+            }
+
+
+            //鑾峰彇 AccessToken 鎺ュ彛
+            String sign = getSign(params, gatewayConf);
+            params.put("sign", sign);
+            url = gatewayConf.getApiUrl() + "reserver/api/token/apply";
+
+            jsonStr = GatewayHttpUtil.doGet(url, params);
+            log.info("---鑾峰彇AccessToken鎺ュ彛-杩斿洖---{}", jsonStr);
+            CloudResp respToken = JSONObject.parseObject(jsonStr, CloudResp.class);
+
+            if (BaseResp.CODE_200 == respToken.getCode()) {
+                JSONObject object = respKey.getData();
+                if (null != object) {
+                    String token = (String) object.get("token");
+                    gatewayConf.setAccessToken(token);
+                }
+            }
+
+            //鏇存柊缂撳瓨
+            updateAuthToken(gatewayConf);
+
+        } catch (Exception e) {
+            log.error("------鍒濆鍖栧け璐�-----{}", e);
+        }
+    }
+
+    @Override
+    public void heartbeat(GatewayConf gatewayConf) {
+
+        log.info("------------瀹氭椂蹇冭烦鎵ц---------{}", gatewayConf.getKqmc());
+
+        try {
+
+            if (StringUtils.isEmpty(gatewayConf.getApiUrl())) {
+                return;
+            }
+
+            gatewayConf = getCacheConf(gatewayConf.getKqdm());
+            //缃戝叧蹇冭烦鎺ュ彛
+            Map<String, String> params = new HashMap<>();
+            params.put("token", gatewayConf.getAccessToken());
+            params.put("gatewayId", gatewayConf.getGatewayId());
+            params.put("gatewayIp", gatewayConf.getGatewayIp());
+            params.put("gatewayMac", gatewayConf.getGatewayMac());
+
+            params.put("heartbeat", "1");
+
+            params.put("timestamp", System.currentTimeMillis() + "");
+
+            //鑾峰彇绛惧悕淇℃伅
+
+            String sign = getSign(params, gatewayConf);
+            params.put("sign", sign);
+
+            String url = gatewayConf.getApiUrl() + "reserver/api/iot/equipment/heartbeat";
+
+            String jsonStr = GatewayHttpUtil.doGet(url, params);
+            log.info("---缃戝叧蹇冭烦鎺ュ彛-杩斿洖---{}", jsonStr);
+
+        } catch (Exception e) {
+            log.error("------缃戝叧蹇冭烦鎺ュ彛--鎵ц澶辫触-----{}", e);
+        }
+
+    }
+
+    @Override
+    public void pushInfo(GatewayConf gatewayConf) {
+        try {
+
+            if (StringUtils.isEmpty(gatewayConf.getApiUrl())) {
+                return;
+            }
+
+            gatewayConf = getCacheConf(gatewayConf.getKqdm());
+            //缃戝叧蹇冭烦鎺ュ彛
+            Map<String, String> params = new HashMap<>();
+            params.put("token", gatewayConf.getAccessToken());
+            params.put("gatewayId", gatewayConf.getGatewayId());
+            params.put("gatewayIp", gatewayConf.getGatewayIp());
+            params.put("gatewayMac", gatewayConf.getGatewayMac());
+            params.put("gatewayCPU", gatewayConf.getGatewayCPU());
+            params.put("gatewayMem", gatewayConf.getGatewayMem());
+            params.put("gatewayHardDisk", gatewayConf.getGatewayHardDisk());
+            params.put("timestamp", System.currentTimeMillis() + "");
+
+            String sign = getSign(params, gatewayConf);
+            params.put("sign", sign);
+
+            String url = gatewayConf.getApiUrl() + "reserver/api/iot/equipment/heartbeat";
+
+            String jsonStr = GatewayHttpUtil.doGet(url, params);
+            log.info("---鎺ㄩ�佺綉鍏充俊鎭�-杩斿洖---{}", jsonStr);
+
+        } catch (Exception e) {
+            log.error("------鎺ㄩ�佺綉鍏充俊鎭�--鎵ц澶辫触-----{}", e);
+        }
+    }
+
+    @Override
+    public void pushDeviceStatus(GatewayConf gatewayConf) {
+
+    }
+
+
+    public String getSign(Map<String, String> parames, GatewayConf gatewayConf) throws Exception {
+
+        //鍙傛暟璋冩暣
+        String signContent = OpenApiSignatureUtils.getSignContent(parames);
+        log.debug("------寰呭姞瀵嗕俊鎭�-----{}", signContent);
+
+        //MD5鍔犲瘑
+        String md5sign = OpenApiSignatureUtils.getMd5Content(signContent, charset);
+
+        //RSA鍔犲瘑
+        String singValue = OpenApiSignatureUtils.doSignByHex(gatewayConf.getGatewayId(), md5sign, charset, gatewayConf.getPublicKey(), gatewayConf.getPrivateKey());
+        log.debug("------RSA鍔犲瘑绛惧悕-----{}", singValue);
+
+        return singValue;
+    }
+
+    /**
+     * @param kqdm
+     * @return
+     */
+    public GatewayConf getCacheConf(String kqdm) {
+        return gatewayConfService.getCacheConf(kqdm);
+    }
+
+    private void updateAuthToken(GatewayConf conf) {
+        gatewayConfService.updateCache(conf);
+    }
+
+
+}
diff --git a/src/main/java/com/fzzy/gateway/hx2023/util/Base64Utils.java b/src/main/java/com/fzzy/gateway/hx2023/util/Base64Utils.java
new file mode 100644
index 0000000..7282a90
--- /dev/null
+++ b/src/main/java/com/fzzy/gateway/hx2023/util/Base64Utils.java
@@ -0,0 +1,275 @@
+package com.fzzy.gateway.hx2023.util;
+
+/**
+ * Base64Utils
+ */
+public class Base64Utils {
+    static private final int     BASELENGTH           = 128;
+    static private final int     LOOKUPLENGTH         = 64;
+    static private final int     TWENTYFOURBITGROUP   = 24;
+    static private final int     EIGHTBIT             = 8;
+    static private final int     SIXTEENBIT           = 16;
+    static private final int     FOURBYTE             = 4;
+    static private final int     SIGN                 = -128;
+    static private final char    PAD                  = '=';
+    static private final boolean fDebug               = false;
+    static final private byte[]  base64Alphabet       = new byte[BASELENGTH];
+    static final private char[]  lookUpBase64Alphabet = new char[LOOKUPLENGTH];
+
+    static {
+        for (int i = 0; i < BASELENGTH; ++i) {
+            base64Alphabet[i] = -1;
+        }
+        for (int i = 'Z'; i >= 'A'; i--) {
+            base64Alphabet[i] = (byte) (i - 'A');
+        }
+        for (int i = 'z'; i >= 'a'; i--) {
+            base64Alphabet[i] = (byte) (i - 'a' + 26);
+        }
+
+        for (int i = '9'; i >= '0'; i--) {
+            base64Alphabet[i] = (byte) (i - '0' + 52);
+        }
+
+        base64Alphabet['+'] = 62;
+        base64Alphabet['/'] = 63;
+
+        for (int i = 0; i <= 25; i++) {
+            lookUpBase64Alphabet[i] = (char) ('A' + i);
+        }
+
+        for (int i = 26, j = 0; i <= 51; i++, j++) {
+            lookUpBase64Alphabet[i] = (char) ('a' + j);
+        }
+
+        for (int i = 52, j = 0; i <= 61; i++, j++) {
+            lookUpBase64Alphabet[i] = (char) ('0' + j);
+        }
+        lookUpBase64Alphabet[62] = '+';
+        lookUpBase64Alphabet[63] = '/';
+
+    }
+
+    private static boolean isWhiteSpace(char octect) {
+        return (octect == 0x20 || octect == 0xd || octect == 0xa || octect == 0x9);
+    }
+
+    private static boolean isPad(char octect) {
+        return (octect == PAD);
+    }
+
+    private static boolean isData(char octect) {
+        return (octect < BASELENGTH && base64Alphabet[octect] != -1);
+    }
+
+    /**
+     * Encodes hex octects into Base64
+     *
+     * @param binaryData Array containing binaryData
+     * @return Encoded Base64 array
+     */
+    public static String encode(byte[] binaryData) {
+
+        if (binaryData == null) {
+            return null;
+        }
+
+        int lengthDataBits = binaryData.length * EIGHTBIT;
+        if (lengthDataBits == 0) {
+            return "";
+        }
+
+        int fewerThan24bits = lengthDataBits % TWENTYFOURBITGROUP;
+        int numberTriplets = lengthDataBits / TWENTYFOURBITGROUP;
+        int numberQuartet = fewerThan24bits != 0 ? numberTriplets + 1 : numberTriplets;
+        char[] encodedData = null;
+
+        encodedData = new char[numberQuartet * 4];
+
+        byte k = 0, l = 0, b1 = 0, b2 = 0, b3 = 0;
+
+        int encodedIndex = 0;
+        int dataIndex = 0;
+        if (fDebug) {
+            System.out.println("number of triplets = " + numberTriplets);
+        }
+
+        for (int i = 0; i < numberTriplets; i++) {
+            b1 = binaryData[dataIndex++];
+            b2 = binaryData[dataIndex++];
+            b3 = binaryData[dataIndex++];
+
+            if (fDebug) {
+                System.out.println("b1= " + b1 + ", b2= " + b2 + ", b3= " + b3);
+            }
+
+            l = (byte) (b2 & 0x0f);
+            k = (byte) (b1 & 0x03);
+
+            byte val1 = ((b1 & SIGN) == 0) ? (byte) (b1 >> 2) : (byte) ((b1) >> 2 ^ 0xc0);
+            byte val2 = ((b2 & SIGN) == 0) ? (byte) (b2 >> 4) : (byte) ((b2) >> 4 ^ 0xf0);
+            byte val3 = ((b3 & SIGN) == 0) ? (byte) (b3 >> 6) : (byte) ((b3) >> 6 ^ 0xfc);
+
+            if (fDebug) {
+                System.out.println("val2 = " + val2);
+                System.out.println("k4   = " + (k << 4));
+                System.out.println("vak  = " + (val2 | (k << 4)));
+            }
+
+            encodedData[encodedIndex++] = lookUpBase64Alphabet[val1];
+            encodedData[encodedIndex++] = lookUpBase64Alphabet[val2 | (k << 4)];
+            encodedData[encodedIndex++] = lookUpBase64Alphabet[(l << 2) | val3];
+            encodedData[encodedIndex++] = lookUpBase64Alphabet[b3 & 0x3f];
+        }
+
+        // form integral number of 6-bit groups
+        if (fewerThan24bits == EIGHTBIT) {
+            b1 = binaryData[dataIndex];
+            k = (byte) (b1 & 0x03);
+            if (fDebug) {
+                System.out.println("b1=" + b1);
+                System.out.println("b1<<2 = " + (b1 >> 2));
+            }
+            byte val1 = ((b1 & SIGN) == 0) ? (byte) (b1 >> 2) : (byte) ((b1) >> 2 ^ 0xc0);
+            encodedData[encodedIndex++] = lookUpBase64Alphabet[val1];
+            encodedData[encodedIndex++] = lookUpBase64Alphabet[k << 4];
+            encodedData[encodedIndex++] = PAD;
+            encodedData[encodedIndex++] = PAD;
+        } else if (fewerThan24bits == SIXTEENBIT) {
+            b1 = binaryData[dataIndex];
+            b2 = binaryData[dataIndex + 1];
+            l = (byte) (b2 & 0x0f);
+            k = (byte) (b1 & 0x03);
+
+            byte val1 = ((b1 & SIGN) == 0) ? (byte) (b1 >> 2) : (byte) ((b1) >> 2 ^ 0xc0);
+            byte val2 = ((b2 & SIGN) == 0) ? (byte) (b2 >> 4) : (byte) ((b2) >> 4 ^ 0xf0);
+
+            encodedData[encodedIndex++] = lookUpBase64Alphabet[val1];
+            encodedData[encodedIndex++] = lookUpBase64Alphabet[val2 | (k << 4)];
+            encodedData[encodedIndex++] = lookUpBase64Alphabet[l << 2];
+            encodedData[encodedIndex++] = PAD;
+        }
+
+        return new String(encodedData);
+    }
+
+    /**
+     * Decodes Base64 data into octects
+     *
+     * @param encoded string containing Base64 data
+     * @return Array containind decoded data.
+     */
+    public static byte[] decode(String encoded) {
+
+        if (encoded == null) {
+            return null;
+        }
+
+        char[] base64Data = encoded.toCharArray();
+        // remove white spaces
+        int len = removeWhiteSpace(base64Data);
+
+        if (len % FOURBYTE != 0) {
+            return null;//should be divisible by four
+        }
+
+        int numberQuadruple = (len / FOURBYTE);
+
+        if (numberQuadruple == 0) {
+            return new byte[0];
+        }
+
+        byte[] decodedData = null;
+        byte b1 = 0, b2 = 0, b3 = 0, b4 = 0;
+        char d1 = 0, d2 = 0, d3 = 0, d4 = 0;
+
+        int i = 0;
+        int encodedIndex = 0;
+        int dataIndex = 0;
+        decodedData = new byte[(numberQuadruple) * 3];
+
+        for (; i < numberQuadruple - 1; i++) {
+
+            if (!isData((d1 = base64Data[dataIndex++])) || !isData((d2 = base64Data[dataIndex++]))
+                    || !isData((d3 = base64Data[dataIndex++]))
+                    || !isData((d4 = base64Data[dataIndex++]))) {
+                return null;
+            }//if found "no data" just return null
+
+            b1 = base64Alphabet[d1];
+            b2 = base64Alphabet[d2];
+            b3 = base64Alphabet[d3];
+            b4 = base64Alphabet[d4];
+
+            decodedData[encodedIndex++] = (byte) (b1 << 2 | b2 >> 4);
+            decodedData[encodedIndex++] = (byte) (((b2 & 0xf) << 4) | ((b3 >> 2) & 0xf));
+            decodedData[encodedIndex++] = (byte) (b3 << 6 | b4);
+        }
+
+        if (!isData((d1 = base64Data[dataIndex++])) || !isData((d2 = base64Data[dataIndex++]))) {
+            return null;//if found "no data" just return null
+        }
+
+        b1 = base64Alphabet[d1];
+        b2 = base64Alphabet[d2];
+
+        d3 = base64Data[dataIndex++];
+        d4 = base64Data[dataIndex++];
+        if (!isData((d3)) || !isData((d4))) {//Check if they are PAD characters
+            if (isPad(d3) && isPad(d4)) {
+                if ((b2 & 0xf) != 0)//last 4 bits should be zero
+                {
+                    return null;
+                }
+                byte[] tmp = new byte[i * 3 + 1];
+                System.arraycopy(decodedData, 0, tmp, 0, i * 3);
+                tmp[encodedIndex] = (byte) (b1 << 2 | b2 >> 4);
+                return tmp;
+            } else if (!isPad(d3) && isPad(d4)) {
+                b3 = base64Alphabet[d3];
+                if ((b3 & 0x3) != 0)//last 2 bits should be zero
+                {
+                    return null;
+                }
+                byte[] tmp = new byte[i * 3 + 2];
+                System.arraycopy(decodedData, 0, tmp, 0, i * 3);
+                tmp[encodedIndex++] = (byte) (b1 << 2 | b2 >> 4);
+                tmp[encodedIndex] = (byte) (((b2 & 0xf) << 4) | ((b3 >> 2) & 0xf));
+                return tmp;
+            } else {
+                return null;
+            }
+        } else { //No PAD e.g 3cQl
+            b3 = base64Alphabet[d3];
+            b4 = base64Alphabet[d4];
+            decodedData[encodedIndex++] = (byte) (b1 << 2 | b2 >> 4);
+            decodedData[encodedIndex++] = (byte) (((b2 & 0xf) << 4) | ((b3 >> 2) & 0xf));
+            decodedData[encodedIndex++] = (byte) (b3 << 6 | b4);
+
+        }
+
+        return decodedData;
+    }
+
+    /**
+     * remove WhiteSpace from MIME containing encoded Base64 data.
+     *
+     * @param data  the byte array of base64 data (with WS)
+     * @return      the new length
+     */
+    private static int removeWhiteSpace(char[] data) {
+        if (data == null) {
+            return 0;
+        }
+
+        // count characters that's not whitespace
+        int newSize = 0;
+        int len = data.length;
+        for (int i = 0; i < len; i++) {
+            if (!isWhiteSpace(data[i])) {
+                data[newSize++] = data[i];
+            }
+        }
+        return newSize;
+    }
+}
diff --git a/src/main/java/com/fzzy/gateway/hx2023/util/OpenApiRsaSigner.java b/src/main/java/com/fzzy/gateway/hx2023/util/OpenApiRsaSigner.java
new file mode 100644
index 0000000..82f952a
--- /dev/null
+++ b/src/main/java/com/fzzy/gateway/hx2023/util/OpenApiRsaSigner.java
@@ -0,0 +1,283 @@
+package com.fzzy.gateway.hx2023.util;
+
+import java.security.*;
+import java.security.interfaces.RSAPrivateKey;
+import java.security.interfaces.RSAPublicKey;
+import java.security.spec.InvalidKeySpecException;
+import java.security.spec.PKCS8EncodedKeySpec;
+import java.security.spec.X509EncodedKeySpec;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.crypto.BadPaddingException;
+import javax.crypto.Cipher;
+import javax.crypto.IllegalBlockSizeException;
+import javax.crypto.NoSuchPaddingException;
+
+import lombok.extern.slf4j.Slf4j;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import lombok.Data;
+
+/**
+ * RSA绛惧悕楠岀绫�
+ *
+ */
+@Slf4j
+@Data
+public class OpenApiRsaSigner {
+
+    /**
+     * 鍚庣画鐢ㄤ簬缂撳瓨鍏挜鍜岀閽�
+     */
+    private static Map<String, OpenApiRsaSigner> signerMap = new HashMap<>();
+
+    private PublicKey publicKey;
+    private PrivateKey privateKey;
+
+    /**
+     * 瀛楄妭鏁版嵁杞瓧绗︿覆涓撶敤闆嗗悎
+     */
+    private static final char[] HEX_CHAR = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
+
+    private OpenApiRsaSigner(PublicKey publicKey, PrivateKey privateKey) {
+        this.publicKey = publicKey;
+        this.privateKey = privateKey;
+    }
+
+    public static OpenApiRsaSigner initSigner(String publicKey, String privateKey) {
+        try {
+            PublicKey publicKeyObj = loadPublicKeyByStr(publicKey);
+            PrivateKey privateKeyObj = loadPrivateKeyByStr(privateKey);
+            return new OpenApiRsaSigner(publicKeyObj, privateKeyObj);
+        }catch (Exception e) {
+            log.error("initSigner(),exception happens.", e);
+        }
+        return null;
+    }
+
+    /**
+     * 浠庡瓧绗︿覆涓姞杞藉叕閽�
+     *
+     * @param publicKeyStr 鍏挜鏁版嵁瀛楃涓�
+     * @throws Exception 鍔犺浇鍏挜鏃朵骇鐢熺殑寮傚父
+     */
+    public static RSAPublicKey loadPublicKeyByStr(String publicKeyStr) throws Exception {
+        try {
+            byte[] buffer = Base64Utils.decode(publicKeyStr);
+            KeyFactory keyFactory = KeyFactory.getInstance("RSA");
+            X509EncodedKeySpec keySpec = new X509EncodedKeySpec(buffer);
+            return (RSAPublicKey) keyFactory.generatePublic(keySpec);
+        } catch (NoSuchAlgorithmException e) {
+            throw new Exception("鏃犳绠楁硶");
+        } catch (InvalidKeySpecException e) {
+            throw new Exception("鍏挜闈炴硶");
+        } catch (NullPointerException e) {
+            throw new Exception("鍏挜鏁版嵁涓虹┖");
+        }
+    }
+
+    /**
+     * @param privateKeyStr
+     * @return
+     * @throws Exception
+     */
+    public static RSAPrivateKey loadPrivateKeyByStr(String privateKeyStr) throws Exception {
+        try {
+            byte[] buffer = Base64Utils.decode(privateKeyStr);
+            PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(buffer);
+            KeyFactory keyFactory = KeyFactory.getInstance("RSA");
+            return (RSAPrivateKey) keyFactory.generatePrivate(keySpec);
+        } catch (NoSuchAlgorithmException e) {
+            throw new Exception("鏃犳绠楁硶");
+        } catch (InvalidKeySpecException e) {
+            throw new Exception("绉侀挜闈炴硶");
+        } catch (NullPointerException e) {
+            throw new Exception("绉侀挜鏁版嵁涓虹┖");
+        }
+    }
+
+    /**
+     * 鍏挜鍔犲瘑杩囩▼
+     *
+     * @param publicKey     鍏挜
+     * @param plainTextData 鏄庢枃鏁版嵁
+     * @return
+     * @throws Exception 鍔犲瘑杩囩▼涓殑寮傚父淇℃伅
+     */
+    public static byte[] encrypt(RSAPublicKey publicKey, byte[] plainTextData) throws Exception {
+        if (publicKey == null) {
+            throw new Exception("鍔犲瘑鍏挜涓虹┖, 璇疯缃�");
+        }
+        Cipher cipher = null;
+        try {
+            // 浣跨敤榛樿RSA
+            cipher = Cipher.getInstance("RSA");
+            // cipher= Cipher.getInstance("RSA", new BouncyCastleProvider());
+            cipher.init(Cipher.ENCRYPT_MODE, publicKey);
+            byte[] output = cipher.doFinal(plainTextData);
+            return output;
+        } catch (NoSuchAlgorithmException e) {
+            throw new Exception("鏃犳鍔犲瘑绠楁硶");
+        } catch (NoSuchPaddingException e) {
+            log.error("exception happens.", e);
+            return null;
+        } catch (InvalidKeyException e) {
+            throw new Exception("鍔犲瘑鍏挜闈炴硶,璇锋鏌�");
+        } catch (IllegalBlockSizeException e) {
+            throw new Exception("鏄庢枃闀垮害闈炴硶");
+        } catch (BadPaddingException e) {
+            throw new Exception("鏄庢枃鏁版嵁宸叉崯鍧�");
+        }
+    }
+
+    /**
+     * 绉侀挜鍔犲瘑杩囩▼
+     *
+     * @param privateKey    绉侀挜
+     * @param plainTextData 鏄庢枃鏁版嵁
+     * @return
+     * @throws Exception 鍔犲瘑杩囩▼涓殑寮傚父淇℃伅
+     */
+    public static byte[] encrypt(RSAPrivateKey privateKey, byte[] plainTextData) throws Exception {
+        if (privateKey == null) {
+            throw new Exception("鍔犲瘑绉侀挜涓虹┖, 璇疯缃�");
+        }
+        Cipher cipher = null;
+        try {
+            // 浣跨敤榛樿RSA
+            cipher = Cipher.getInstance("RSA");
+            cipher.init(Cipher.ENCRYPT_MODE, privateKey);
+            byte[] output = cipher.doFinal(plainTextData);
+            return output;
+        } catch (NoSuchAlgorithmException e) {
+            throw new Exception("鏃犳鍔犲瘑绠楁硶");
+        } catch (NoSuchPaddingException e) {
+            log.error("exception happens.", e);
+            return null;
+        } catch (InvalidKeyException e) {
+            throw new Exception("鍔犲瘑绉侀挜闈炴硶,璇锋鏌�");
+        } catch (IllegalBlockSizeException e) {
+            throw new Exception("鏄庢枃闀垮害闈炴硶");
+        } catch (BadPaddingException e) {
+            throw new Exception("鏄庢枃鏁版嵁宸叉崯鍧�");
+        }
+    }
+
+    /**
+     * 绉侀挜瑙e瘑杩囩▼
+     *
+     * @param privateKey 绉侀挜
+     * @param cipherData 瀵嗘枃鏁版嵁
+     * @return 鏄庢枃
+     * @throws Exception 瑙e瘑杩囩▼涓殑寮傚父淇℃伅
+     */
+    public static byte[] decrypt(RSAPrivateKey privateKey, byte[] cipherData) throws Exception {
+        if (privateKey == null) {
+            throw new Exception("瑙e瘑绉侀挜涓虹┖, 璇疯缃�");
+        }
+
+        if (cipherData == null) {
+            return null;
+        }
+
+        Cipher cipher = null;
+        try {
+            // 浣跨敤榛樿RSA
+            cipher = Cipher.getInstance("RSA");
+            // cipher= Cipher.getInstance("RSA", new BouncyCastleProvider());
+            cipher.init(Cipher.DECRYPT_MODE, privateKey);
+            byte[] output = cipher.doFinal(cipherData);
+            return output;
+        } catch (NoSuchAlgorithmException e) {
+            throw new Exception("鏃犳瑙e瘑绠楁硶");
+        } catch (NoSuchPaddingException e) {
+            log.error("exception happens.", e);
+            return null;
+        } catch (InvalidKeyException e) {
+            throw new Exception("瑙e瘑绉侀挜闈炴硶,璇锋鏌�");
+        } catch (IllegalBlockSizeException e) {
+            throw new Exception("瀵嗘枃闀垮害闈炴硶");
+        } catch (BadPaddingException e) {
+            throw new Exception("瀵嗘枃鏁版嵁宸叉崯鍧�");
+        }
+    }
+
+    /**
+     * 鍏挜瑙e瘑杩囩▼
+     *
+     * @param publicKey  鍏挜
+     * @param cipherData 瀵嗘枃鏁版嵁
+     * @return 鏄庢枃
+     * @throws Exception 瑙e瘑杩囩▼涓殑寮傚父淇℃伅
+     */
+    public static byte[] decrypt(RSAPublicKey publicKey, byte[] cipherData) throws Exception {
+        if (publicKey == null) {
+            throw new Exception("瑙e瘑鍏挜涓虹┖, 璇疯缃�");
+        }
+        Cipher cipher = null;
+        try {
+            // 浣跨敤榛樿RSA
+            cipher = Cipher.getInstance("RSA");
+            // cipher= Cipher.getInstance("RSA", new BouncyCastleProvider());
+            cipher.init(Cipher.DECRYPT_MODE, publicKey);
+            byte[] output = cipher.doFinal(cipherData);
+            return output;
+        } catch (NoSuchAlgorithmException e) {
+            throw new Exception("鏃犳瑙e瘑绠楁硶");
+        } catch (NoSuchPaddingException e) {
+            log.error("exception happens.", e);
+            return null;
+        } catch (InvalidKeyException e) {
+            throw new Exception("瑙e瘑鍏挜闈炴硶,璇锋鏌�");
+        } catch (IllegalBlockSizeException e) {
+            throw new Exception("瀵嗘枃闀垮害闈炴硶");
+        } catch (BadPaddingException e) {
+            throw new Exception("瀵嗘枃鏁版嵁宸叉崯鍧�");
+        }
+    }
+
+    public static boolean verify(String content, String sign, RSAPrivateKey privateKey) throws Exception {
+        byte[] singBytes = encrypt(privateKey, content.getBytes());
+
+        return sign.equals(new String(singBytes));
+    }
+
+    /**
+     * 瀛楄妭鏁版嵁杞崄鍏繘鍒跺瓧绗︿覆
+     *
+     * @param data 杈撳叆鏁版嵁
+     * @return 鍗佸叚杩涘埗鍐呭
+     */
+    public static String byteArrayToString(byte[] data) {
+        StringBuilder stringBuilder = new StringBuilder();
+        for (int i = 0; i < data.length; i++) {
+            // 鍙栧嚭瀛楄妭鐨勯珮鍥涗綅 浣滀负绱㈠紩寰楀埌鐩稿簲鐨勫崄鍏繘鍒舵爣璇嗙 娉ㄦ剰鏃犵鍙峰彸绉�
+            stringBuilder.append(HEX_CHAR[(data[i] & 0xf0) >>> 4]);
+            // 鍙栧嚭瀛楄妭鐨勪綆鍥涗綅 浣滀负绱㈠紩寰楀埌鐩稿簲鐨勫崄鍏繘鍒舵爣璇嗙
+            stringBuilder.append(HEX_CHAR[(data[i] & 0x0f)]);
+            if (i < data.length - 1) {
+                stringBuilder.append(' ');
+            }
+        }
+        return stringBuilder.toString();
+    }
+
+    public static OpenApiRsaSigner getInstance(String appId, String publicKey, String privateKey) {
+        OpenApiRsaSigner signer = signerMap.get(appId);
+        if (signer != null) {
+            return signer;
+        }
+        try {
+            signer = initSigner(publicKey, privateKey);
+            if(signer != null){
+                signerMap.put(appId, signer);
+            }
+        } catch (Exception e) {
+            log.error("exception happens.", e);
+        }
+        return signerMap.get(appId);
+    }
+
+}
diff --git a/src/main/java/com/fzzy/gateway/hx2023/util/OpenApiSignatureUtils.java b/src/main/java/com/fzzy/gateway/hx2023/util/OpenApiSignatureUtils.java
new file mode 100644
index 0000000..1e00ae9
--- /dev/null
+++ b/src/main/java/com/fzzy/gateway/hx2023/util/OpenApiSignatureUtils.java
@@ -0,0 +1,206 @@
+package com.fzzy.gateway.hx2023.util;
+
+import cn.hutool.crypto.digest.MD5;
+import lombok.Data;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.codec.binary.Base64;
+import org.apache.commons.codec.binary.Hex;
+import org.apache.commons.lang3.StringUtils;
+
+import javax.servlet.http.HttpServletRequest;
+import java.io.UnsupportedEncodingException;
+import java.nio.charset.StandardCharsets;
+import java.security.interfaces.RSAPrivateKey;
+import java.util.*;
+
+/**
+ * 绛惧悕宸ュ叿绫�
+ */
+@Slf4j
+@Data
+public class OpenApiSignatureUtils {
+
+    public static String getMd5Content(String content, String charset) {
+        try {
+            byte[] md5 = MD5.create().digest(content);
+            return new String(md5, charset);
+        } catch (UnsupportedEncodingException e) {
+            log.error("getMd5Content(),exception happens.", e);
+        }
+        return null;
+    }
+
+    public static String getSignContent(final Map<String, String> sortedParams) {
+        StringBuffer content = new StringBuffer();
+        List<String> keys = new ArrayList(sortedParams.keySet());
+        Collections.sort(keys);
+        int index = 0;
+        for (int i = 0; i < keys.size(); i++) {
+            String key = keys.get(i);
+            String value = sortedParams.get(key);
+            if (key.equals("sign") || key.equals("sign_type")) {
+                continue;
+            }
+            if (StringUtils.isNotEmpty(key) && StringUtils.isNotEmpty(value)) {
+                content.append((index == 0 ? "" : "&") + key + "=" + value);
+                index++;
+            }
+        }
+        return content.toString();
+    }
+
+    public static String getSignContentWithQuotes(final Map<String, String> sortedParams) {
+        StringBuffer content = new StringBuffer();
+        List<String> keys = new ArrayList<String>(sortedParams.keySet());
+        Collections.sort(keys);
+        int index = 0;
+        for (int i = 0; i < keys.size(); i++) {
+            String key = keys.get(i);
+            String value = sortedParams.get(key);
+            if (StringUtils.isNotEmpty(key) && StringUtils.isNotEmpty(value)) {
+                content.append((index == 0 ? "" : "&") + key + "=\"" + value + "\"");
+                index++;
+            }
+        }
+        return content.toString();
+    }
+
+    public static boolean doCheckV1(String appId, Map<String, String> params, String charset, String publicKey, String privateKye) throws Exception {
+        String sign = params.get("sign");
+        String content = getSignCheckContentWithoutSign(params);
+        return doRsaCheckContent(appId, content, sign, charset, publicKey, privateKye);
+    }
+
+    public static String doSignByBase64(String appId, String content, String charset, String publicKey, String privateKye) throws RuntimeException {
+        try {
+            byte[] signData = OpenApiRsaSigner.encrypt((RSAPrivateKey) OpenApiRsaSigner.getInstance(appId, publicKey, privateKye).getPrivateKey(), content.getBytes(charset));
+            //return new String(signData, charset);
+            return new String(Base64.encodeBase64(signData), StandardCharsets.UTF_8);
+        } catch (Exception e) {
+            throw new RuntimeException("key=" + appId + ";content=" + content + ";charset=" + charset, e);
+        }
+    }
+
+    public static String doSignByHex(String appId, String content, String charset, String publicKey, String privateKye) throws RuntimeException {
+        try {
+            byte[] signData = OpenApiRsaSigner.encrypt((RSAPrivateKey) OpenApiRsaSigner.getInstance(appId, publicKey, privateKye).getPrivateKey(), content.getBytes(charset));
+            //return new String(signData, charset);
+            return new String(Hex.encodeHex(signData));
+        } catch (Exception e) {
+            throw new RuntimeException("key=" + appId + ";content=" + content + ";charset=" + charset, e);
+        }
+    }
+
+    public static String doSignByTranscode(String appId, String content, String charset, String publicKey, String privateKye) throws RuntimeException {
+        try {
+            byte[] signData = OpenApiRsaSigner.encrypt((RSAPrivateKey) OpenApiRsaSigner.getInstance(appId, publicKey, privateKye).getPrivateKey(), content.getBytes(charset));
+            return new String(signData, charset);
+            //return new String(Base64.encodeBase64(signData), StandardCharsets.UTF_8);
+        } catch (Exception e) {
+            throw new RuntimeException("key=" + appId + ";content=" + content + ";charset=" + charset, e);
+        }
+    }
+
+    public static String getSignCheckContentWithoutSign(Map<String, String> params) {
+        if (params == null) {
+            return null;
+        }
+        params.remove("sign");
+        params.remove("sign_type");
+
+        StringBuffer content = new StringBuffer();
+        List<String> keys = new ArrayList<String>(params.keySet());
+        Collections.sort(keys);
+
+        for (int i = 0; i < keys.size(); i++) {
+            String key = keys.get(i);
+            String value = params.get(key);
+            content.append((i == 0 ? "" : "&") + key + "=" + value);
+        }
+        return content.toString();
+    }
+
+    public static boolean doRsaCheckContent(String appId, String content, String sign,
+                                            String charset, String publicKey, String privateKye) throws RuntimeException {
+        try {
+            RSAPrivateKey privateKey = (RSAPrivateKey) OpenApiRsaSigner.getInstance(appId, publicKey, privateKye).getPrivateKey();
+            return OpenApiRsaSigner.verify(content, sign, privateKey);
+        } catch (Exception e) {
+            throw new RuntimeException("key=" + appId + ";content=" + content + ";sign=" + sign + ";charset="
+                    + charset, e);
+        }
+    }
+
+    public static boolean doCheckByBase64(String appId, String content, String sign,
+                                          String charset, String publicKey, String privateKye) throws RuntimeException {
+        try {
+            RSAPrivateKey privateKey = (RSAPrivateKey) OpenApiRsaSigner.getInstance(appId, publicKey, privateKye).getPrivateKey();
+            return OpenApiRsaSigner.verify(content, new String(Base64.decodeBase64(sign), StandardCharsets.UTF_8), privateKey);
+        } catch (Exception e) {
+            throw new RuntimeException("key=" + appId + ";content=" + content + ";sign=" + sign + ";charset="
+                    + charset, e);
+        }
+    }
+
+    public static boolean doCheckByHex(String appId, String content, String sign,
+                                       String charset, String publicKey, String privateKye) throws RuntimeException {
+        try {
+            RSAPrivateKey privateKey = (RSAPrivateKey) OpenApiRsaSigner.getInstance(appId, publicKey, privateKye).getPrivateKey();
+            return OpenApiRsaSigner.verify(content, new String(Hex.decodeHex(sign.toCharArray())), privateKey);
+        } catch (Exception e) {
+            throw new RuntimeException("key=" + appId + ";content=" + content + ";sign=" + sign + ";charset="
+                    + charset, e);
+        }
+    }
+
+    public static boolean doCheckByTranscode(String appId, String content, String sign,
+                                             String charset, String publicKey, String privateKye) throws RuntimeException {
+        try {
+            RSAPrivateKey privateKey = (RSAPrivateKey) OpenApiRsaSigner.getInstance(appId, publicKey, privateKye).getPrivateKey();
+            return OpenApiRsaSigner.verify(content, sign, privateKey);
+        } catch (Exception e) {
+            throw new RuntimeException("key=" + appId + ";content=" + content + ";sign=" + sign + ";charset="
+                    + charset, e);
+        }
+    }
+
+    /**
+     * 鑾峰彇璇锋眰鍙傛暟
+     *
+     * @param request
+     * @return
+     */
+    public static Map<String, String> getParameterMap(HttpServletRequest request) {
+        Enumeration<String> parameters = request.getParameterNames();
+        if (parameters == null) {
+            return new HashMap<>();
+        }
+
+        HashMap resultMap = new HashMap<>();
+        while (parameters.hasMoreElements()) {
+            String key = parameters.nextElement();
+            String value = request.getParameter(key);
+            resultMap.put(key, value);
+        }
+
+        return resultMap;
+    }
+
+    /**
+     * 娴嬭瘯閫昏緫
+     *
+     * @param args
+     * @throws UnsupportedEncodingException
+     */
+    public static void testSign(String[] args) throws UnsupportedEncodingException {
+        Map<String, String> sortedParams = new HashMap<String, String>();
+        sortedParams.put("appId", "6e3d896b71b911eea5e50250f2000002");
+//        sortedParams.put("method", "test");
+//        sortedParams.put("format", "json");
+//        sortedParams.put("charset", "utf-8");
+//        sortedParams.put("sign_type", "RSA");
+//        sortedParams.put("timestamp", "2019-01-01 00:00:00");
+//        sortedParams.put("version", "1.0");
+//        sortedParams.put("biz_content", "{\"name\":\"寮犱笁\",\"age\":18}");
+    }
+}
diff --git a/src/main/java/com/fzzy/gateway/service/GatewayDeviceService.java b/src/main/java/com/fzzy/gateway/service/GatewayDeviceService.java
index bda41b6..4f68178 100644
--- a/src/main/java/com/fzzy/gateway/service/GatewayDeviceService.java
+++ b/src/main/java/com/fzzy/gateway/service/GatewayDeviceService.java
@@ -6,13 +6,9 @@
 import com.fzzy.api.Constant;
 import com.fzzy.api.data.ApiCommonDevice;
 import com.fzzy.api.utils.ContextUtil;
-import com.fzzy.async.fzzy40.Fzzy40CommonService;
 import com.fzzy.gateway.GatewayUtils;
-import com.fzzy.gateway.api.GatewayRemoteManager;
 import com.fzzy.gateway.entity.GatewayDevice;
 import com.fzzy.gateway.service.repository.GatewayDeviceRep;
-import com.fzzy.mqtt.MqttProviderConfig;
-import com.fzzy.mqtt.MqttPublishService;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.BeanUtils;
 import org.springframework.data.domain.Sort;
@@ -20,6 +16,7 @@
 
 import javax.annotation.Resource;
 import java.util.ArrayList;
+import java.util.Date;
 import java.util.List;
 
 @Slf4j
@@ -45,36 +42,20 @@
 
         List<GatewayDevice> result = new ArrayList<>();
 
-        ApiCommonDevice apiCommonDevice;
+        GatewayDevice cacheDevice;
         for (GatewayDevice device : list) {
-
-            apiCommonDevice = Constant.getCommonDeviceCache(device.getDeviceSn());
-            if (null != apiCommonDevice) {
-                device.setIp(apiCommonDevice.getIp());
-                device.setPort(apiCommonDevice.getPort());
-                device.setStatus(apiCommonDevice.getStatus());
-                device.setOnlineTime(apiCommonDevice.getOnlineTime());
+            device.setStatus(Constant.YN_Y);
+            cacheDevice = GatewayUtils.getCacheByDeviceId(device.getDeviceId());
+            if (null != cacheDevice) {
+                device.setIp(cacheDevice.getIp());
+                device.setPort(cacheDevice.getPort());
+                device.setStatus(cacheDevice.getStatus());
+                device.setOnlineTime(cacheDevice.getOnlineTime());
             }
             result.add(device);
         }
         return result;
     }
-
-//    /**
-//     * gatewayDeviceService#getQuery
-//     *
-//     * @return
-//     */
-//    @DataProvider
-//    public GateWayTestParam getQuery() {
-//        GateWayTestParam param = new GateWayTestParam();
-//        param.setDayTime(new Date());
-//        param.setCarNumber("宸滱12345");
-//        param.setEnd(new Date());
-//        param.setStart(new Date());
-//        param.setWeight(25000.00);
-//        return param;
-//    }
 
     /**
      * gatewayDeviceService#updateSave
@@ -134,4 +115,37 @@
         log.info("-----------test-------------------");
         return "SUCCESS";
     }
+
+    /**
+     * 鏍规嵁瀹為檯閫氳鍒嗘満璁剧疆锛屽綋鍓嶅垎鏈哄湪绾�
+     *
+     * @param commonDevice 瀹為檯閫氳璁惧
+     */
+    public void onlineByCommonDevice(ApiCommonDevice commonDevice) {
+        List<GatewayDevice> list = GatewayUtils.getCacheByDeviceSn2(commonDevice.getSn());
+        if (null == list || list.isEmpty()) return;
+
+        for (GatewayDevice device : list) {
+            device.setIp(commonDevice.getIp());
+            device.setPort(commonDevice.getPort());
+            device.setOnlineTime(new Date());
+            device.setStatus(Constant.YN_Y);
+
+            GatewayUtils.add2Cache(device);
+        }
+    }
+
+    public void OfflineByCommonDevice(ApiCommonDevice commonDevice) {
+        List<GatewayDevice> list = GatewayUtils.getCacheByDeviceSn2(commonDevice.getSn());
+        if (null == list || list.isEmpty()) return;
+
+        for (GatewayDevice device : list) {
+            device.setIp(commonDevice.getIp());
+            device.setPort(commonDevice.getPort());
+            //device.setOnlineTime(new Date());
+            device.setStatus(Constant.YN_N);
+
+            GatewayUtils.add2Cache(device);
+        }
+    }
 }
diff --git a/src/main/java/com/fzzy/gateway/util/GatewayHttpUtil.java b/src/main/java/com/fzzy/gateway/util/GatewayHttpUtil.java
index 91586dd..25846ce 100644
--- a/src/main/java/com/fzzy/gateway/util/GatewayHttpUtil.java
+++ b/src/main/java/com/fzzy/gateway/util/GatewayHttpUtil.java
@@ -47,7 +47,7 @@
             }
             HttpGet method = new HttpGet(getUrl);
             method.setHeader("Accept", "application/json");
-            method.setHeader("charset", "UTF-8");
+            method.setHeader("charset", "utf-8");
 
             response = client.execute(method);
 //            response.setHeader("Accept", "application/json");
diff --git a/src/main/java/com/fzzy/gateway/util/GatewayRSAUtils.java b/src/main/java/com/fzzy/gateway/util/GatewayRSAUtils.java
deleted file mode 100644
index d504333..0000000
--- a/src/main/java/com/fzzy/gateway/util/GatewayRSAUtils.java
+++ /dev/null
@@ -1,367 +0,0 @@
-package com.fzzy.gateway.util;
-
-
-import javax.crypto.Cipher;
-import java.io.ByteArrayOutputStream;
-import java.nio.charset.StandardCharsets;
-import java.security.*;
-import java.security.interfaces.RSAPrivateKey;
-import java.security.interfaces.RSAPublicKey;
-import java.security.spec.PKCS8EncodedKeySpec;
-import java.security.spec.X509EncodedKeySpec;
-import org.apache.xerces.impl.dv.util.Base64;
-import java.util.HashMap;
-import java.util.Map;
-
-public class GatewayRSAUtils {
-    /**
-     * RSA鏈�澶у姞瀵嗘槑鏂囧ぇ灏� 2048/8-11
-     */
-    private static final int MAX_ENCRYPT_BLOCK = 245;
-
-    /**
-     * RSA鏈�澶цВ瀵嗗瘑鏂囧ぇ灏� 2048/8
-     */
-    private static final int MAX_DECRYPT_BLOCK = 256;
-
-    private static final int KEYSIZE = 1024;// 瀵嗛挜浣嶆暟
-
-    /**
-     * 瀹氫箟鍔犲瘑鏂瑰紡
-     */
-    public static final String KEY_RSA = "RSA";
-    /**
-     * 瀹氫箟鍏挜鍏抽敭璇�
-     */
-    public static final String KEY_RSA_PUBLICKEY = "RSAPublicKey";
-    /**
-     * 瀹氫箟绉侀挜鍏抽敭璇�
-     */
-    public static final String KEY_RSA_PRIVATEKEY = "RSAPrivateKey";
-    /**
-     * 瀹氫箟绛惧悕绠楁硶
-     */
-    private final static String KEY_RSA_SIGNATURE = "MD5withRSA";
-
-    /**
-     * 鐢熸垚鍏瀵嗛挜瀵�
-     */
-    public static Map<String, Object> init() {
-        Map<String, Object> map = null;
-        try {
-            KeyPairGenerator generator = KeyPairGenerator.getInstance(KEY_RSA);
-            //璁剧疆瀵嗛挜瀵圭殑bit鏁帮紝瓒婂ぇ瓒婂畨鍏紝浣嗛�熷害鍑忔參锛屼竴鑸娇鐢�512鎴�1024
-            generator.initialize(KEYSIZE);
-            KeyPair keyPair = generator.generateKeyPair();
-            // 鑾峰彇鍏挜
-            RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();
-            // 鑾峰彇绉侀挜
-            RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();
-            // 灏嗗瘑閽ュ灏佽涓篗ap
-            map = new HashMap<>(2);
-            map.put(KEY_RSA_PUBLICKEY, publicKey);
-            map.put(KEY_RSA_PRIVATEKEY, privateKey);
-        } catch (NoSuchAlgorithmException e) {
-            e.printStackTrace();
-        }
-
-        return map;
-    }
-
-    /**
-     * 鑾峰彇Base64缂栫爜鐨勫叕閽ュ瓧绗︿覆
-     */
-    public static String getPublicKey(Map<String, Object> map) {
-        String str = "";
-        Key key = (Key) map.get(KEY_RSA_PUBLICKEY);
-        str = encryptBase64(key.getEncoded());
-        return str;
-    }
-
-    /**
-     * 鑾峰彇Base64缂栫爜鐨勭閽ュ瓧绗︿覆
-     */
-    public static String getPrivateKey(Map<String, Object> map) {
-        String str = "";
-        Key key = (Key) map.get(KEY_RSA_PRIVATEKEY);
-        str = encryptBase64(key.getEncoded());
-        return str;
-    }
-
-    /**
-     * BASE64 瑙g爜
-     *
-     * @param key 闇�瑕丅ase64瑙g爜鐨勫瓧绗︿覆
-     * @return 瀛楄妭鏁扮粍
-     */
-    public static byte[] decryptBase64(String key) {
-       // return Base64.getDecoder().decode(key);
-        return Base64.decode(key);
-    }
-
-    /**
-     * BASE64 缂栫爜
-     *
-     * @param key 闇�瑕丅ase64缂栫爜鐨勫瓧鑺傛暟缁�
-     * @return 瀛楃涓�
-     */
-    public static String encryptBase64(byte[] key) {
-       // return new String(Base64.getEncoder().encode(key));
-        return new String(Base64.encode(key));
-    }
-
-    /**
-     * 鍏挜鍔犲瘑  濡傛灉澶т簬245鍒欏垎娈靛姞瀵�
-     */
-    public static String encryptByPublic(String encryptingStr, String publicKeyStr) {
-        try {
-            // 灏嗗叕閽ョ敱瀛楃涓茶浆涓篣TF-8鏍煎紡鐨勫瓧鑺傛暟缁�
-            byte[] publicKeyBytes = decryptBase64(publicKeyStr);
-            // 鑾峰緱鍏挜
-            X509EncodedKeySpec keySpec = new X509EncodedKeySpec(publicKeyBytes);
-            // 鍙栧緱寰呭姞瀵嗘暟鎹�
-            byte[] data = encryptingStr.getBytes(StandardCharsets.UTF_8);
-            KeyFactory factory;
-            factory = KeyFactory.getInstance(KEY_RSA);
-            PublicKey publicKey = factory.generatePublic(keySpec);
-            // 瀵规暟鎹姞瀵�
-            Cipher cipher = Cipher.getInstance(factory.getAlgorithm());
-            cipher.init(Cipher.ENCRYPT_MODE, publicKey);
-            int inputLen = data.length;
-            ByteArrayOutputStream out = new ByteArrayOutputStream();
-            int offSet = 0;
-            byte[] cache;
-            int i = 0;
-            // 瀵规暟鎹垎娈靛姞瀵�
-            while (inputLen - offSet > 0) {
-                if (inputLen - offSet > MAX_ENCRYPT_BLOCK) {
-                    cache = cipher.doFinal(data, offSet, MAX_ENCRYPT_BLOCK);
-                } else {
-                    cache = cipher.doFinal(data, offSet, inputLen - offSet);
-                }
-                out.write(cache, 0, cache.length);
-                i++;
-                offSet = i * MAX_ENCRYPT_BLOCK;
-            }
-            byte[] encryptedData = out.toByteArray();
-            out.close();
-            // 杩斿洖鍔犲瘑鍚庣敱Base64缂栫爜鐨勫姞瀵嗕俊鎭�
-            return encryptBase64(encryptedData);
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-
-        return null;
-    }
-
-    /**
-     * 绉侀挜瑙e瘑 濡傛灉澶т簬256鍒欏垎娈佃В瀵�
-     */
-    public static String decryptByPrivate(String encryptedStr, String privateKeyStr) {
-        try {
-            // 瀵圭閽ヨВ瀵�
-            byte[] privateKeyBytes = decryptBase64(privateKeyStr);
-            // 鑾峰緱绉侀挜
-            PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(privateKeyBytes);
-            // 鑾峰緱寰呰В瀵嗘暟鎹�
-            byte[] data = decryptBase64(encryptedStr);
-            KeyFactory factory = KeyFactory.getInstance(KEY_RSA);
-            PrivateKey privateKey = factory.generatePrivate(keySpec);
-            // 瀵规暟鎹В瀵�
-            Cipher cipher = Cipher.getInstance(factory.getAlgorithm());
-            cipher.init(Cipher.DECRYPT_MODE, privateKey);
-            int inputLen = data.length;
-            ByteArrayOutputStream out = new ByteArrayOutputStream();
-            int offSet = 0;
-            byte[] cache;
-            int i = 0;
-            // 瀵规暟鎹垎娈佃В瀵�
-            while (inputLen - offSet > 0) {
-                if (inputLen - offSet > MAX_DECRYPT_BLOCK) {
-                    cache = cipher.doFinal(data, offSet, MAX_DECRYPT_BLOCK);
-                } else {
-                    cache = cipher.doFinal(data, offSet, inputLen - offSet);
-                }
-                out.write(cache, 0, cache.length);
-                i++;
-                offSet = i * MAX_DECRYPT_BLOCK;
-            }
-            byte[] decryptedData = out.toByteArray();
-            out.close();
-            // 杩斿洖UTF-8缂栫爜鐨勮В瀵嗕俊鎭�
-            return new String(decryptedData, StandardCharsets.UTF_8);
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-
-        return null;
-    }
-
-    /**
-     * 绉侀挜鍔犲瘑  濡傛灉澶т簬245鍒欏垎娈靛姞瀵�
-     */
-    public static String encryptByPrivate(String encryptingStr, String privateKeyStr) {
-        try {
-            byte[] privateKeyBytes = decryptBase64(privateKeyStr);
-            // 鑾峰緱绉侀挜
-            PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(privateKeyBytes);
-            // 鍙栧緱寰呭姞瀵嗘暟鎹�
-            byte[] data = encryptingStr.getBytes(StandardCharsets.UTF_8);
-            KeyFactory factory = KeyFactory.getInstance(KEY_RSA);
-            PrivateKey privateKey = factory.generatePrivate(keySpec);
-            // 瀵规暟鎹姞瀵�
-            Cipher cipher = Cipher.getInstance(factory.getAlgorithm());
-            cipher.init(Cipher.ENCRYPT_MODE, privateKey);
-            int inputLen = data.length;
-            ByteArrayOutputStream out = new ByteArrayOutputStream();
-            int offSet = 0;
-            byte[] cache;
-            int i = 0;
-            // 瀵规暟鎹垎娈靛姞瀵�
-            while (inputLen - offSet > 0) {
-                if (inputLen - offSet > MAX_ENCRYPT_BLOCK) {
-                    cache = cipher.doFinal(data, offSet, MAX_ENCRYPT_BLOCK);
-                } else {
-                    cache = cipher.doFinal(data, offSet, inputLen - offSet);
-                }
-                out.write(cache, 0, cache.length);
-                i++;
-                offSet = i * MAX_ENCRYPT_BLOCK;
-            }
-            byte[] encryptedData = out.toByteArray();
-            out.close();
-            // 杩斿洖鍔犲瘑鍚庣敱Base64缂栫爜鐨勫姞瀵嗕俊鎭�
-            return encryptBase64(encryptedData);
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-        return null;
-    }
-
-    /**
-     * 鍏挜瑙e瘑 濡傛灉澶т簬256鍒欏垎娈佃В瀵�
-     */
-    public static String decryptByPublic(String encryptedStr, String publicKeyStr) {
-        try {
-            // 瀵瑰叕閽ヨВ瀵�
-            byte[] publicKeyBytes = decryptBase64(publicKeyStr);
-            // 鍙栧緱鍏挜
-            X509EncodedKeySpec keySpec = new X509EncodedKeySpec(publicKeyBytes);
-            // 鍙栧緱寰呭姞瀵嗘暟鎹�
-            byte[] data = decryptBase64(encryptedStr);
-            KeyFactory factory = KeyFactory.getInstance(KEY_RSA);
-            PublicKey publicKey = factory.generatePublic(keySpec);
-            // 瀵规暟鎹В瀵�
-            Cipher cipher = Cipher.getInstance(factory.getAlgorithm());
-            cipher.init(Cipher.DECRYPT_MODE, publicKey);
-            int inputLen = data.length;
-            ByteArrayOutputStream out = new ByteArrayOutputStream();
-            int offSet = 0;
-            byte[] cache;
-            int i = 0;
-            // 瀵规暟鎹垎娈佃В瀵�
-            while (inputLen - offSet > 0) {
-                if (inputLen - offSet > MAX_DECRYPT_BLOCK) {
-                    cache = cipher.doFinal(data, offSet, MAX_DECRYPT_BLOCK);
-                } else {
-                    cache = cipher.doFinal(data, offSet, inputLen - offSet);
-                }
-                out.write(cache, 0, cache.length);
-                i++;
-                offSet = i * MAX_DECRYPT_BLOCK;
-            }
-            byte[] decryptedData = out.toByteArray();
-            out.close();
-            // 杩斿洖UTF-8缂栫爜鐨勮В瀵嗕俊鎭�
-            return new String(decryptedData, StandardCharsets.UTF_8);
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-        return null;
-    }
-
-    /**
-     * 鐢ㄧ閽ュ鍔犲瘑鏁版嵁杩涜绛惧悕
-     */
-    public static String sign(String encryptedStr, String privateKey) {
-        String str = "";
-        try {
-            //灏嗙閽ュ姞瀵嗘暟鎹瓧绗︿覆杞崲涓哄瓧鑺傛暟缁�
-            byte[] data = encryptedStr.getBytes();
-            // 瑙e瘑鐢眀ase64缂栫爜鐨勭閽�
-            byte[] bytes = decryptBase64(privateKey);
-            // 鏋勯�燩KCS8EncodedKeySpec瀵硅薄
-            PKCS8EncodedKeySpec pkcs = new PKCS8EncodedKeySpec(bytes);
-            // 鎸囧畾鐨勫姞瀵嗙畻娉�
-            KeyFactory factory = KeyFactory.getInstance(KEY_RSA);
-            // 鍙栫閽ュ璞�
-            PrivateKey key = factory.generatePrivate(pkcs);
-            // 鐢ㄧ閽ュ淇℃伅鐢熸垚鏁板瓧绛惧悕
-            Signature signature = Signature.getInstance(KEY_RSA_SIGNATURE);
-            signature.initSign(key);
-            signature.update(data);
-            str = encryptBase64(signature.sign());
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-        return str;
-    }
-
-    /**
-     * 鏍¢獙鏁板瓧绛惧悕
-     *
-     * @return 鏍¢獙鎴愬姛杩斿洖true锛屽け璐ヨ繑鍥瀎alse
-     */
-    public static boolean verify(String encryptedStr, String publicKey, String sign) {
-        boolean flag = false;
-        try {
-            //灏嗙閽ュ姞瀵嗘暟鎹瓧绗︿覆杞崲涓哄瓧鑺傛暟缁�
-            byte[] data = encryptedStr.getBytes();
-            // 瑙e瘑鐢眀ase64缂栫爜鐨勫叕閽�
-            byte[] bytes = decryptBase64(publicKey);
-            // 鏋勯�燲509EncodedKeySpec瀵硅薄
-            X509EncodedKeySpec keySpec = new X509EncodedKeySpec(bytes);
-            // 鎸囧畾鐨勫姞瀵嗙畻娉�
-            KeyFactory factory = KeyFactory.getInstance(KEY_RSA);
-            // 鍙栧叕閽ュ璞�
-            PublicKey key = factory.generatePublic(keySpec);
-            // 鐢ㄥ叕閽ラ獙璇佹暟瀛楃鍚�
-            Signature signature = Signature.getInstance(KEY_RSA_SIGNATURE);
-            signature.initVerify(key);
-            signature.update(data);
-            flag = signature.verify(decryptBase64(sign));
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-        return flag;
-    }
-
-
-    /**
-     * 鍔熻兘鎻忚堪:鏍煎紡鍖栧叕绉侀挜 C++鏍煎紡
-     * 鍏挜瀛楃涓插紑澶磋鍔犱笂鈥�-----BEGIN PUBLIC KEY-----\n鈥濓紝缁撳熬鍔犱笂鈥淺n-----END PUBLIC KEY-----\n鈥�
-     * 绉侀挜瀛楃涓插紑澶磋鍔犱笂鈥�-----BEGIN RSA PRIVATE KEY-----\n鈥濓紝缁撳熬鍔犱笂鈥淺n-----END RSA PRIVATE KEY-----\n鈥�
-     *
-     * @param str  瑕佹牸寮忕殑瀛楃涓�, flag
-     * @param flag true涓哄叕 false涓虹
-     * @return java.lang.String
-     * @author xiaobu
-     * @date 2020/3/18 16:40
-     * @version 1.0
-     */
-    public static String formatStr(String str, boolean flag) {
-        StringBuilder sb = new StringBuilder(str);
-        for (int i = 0, len = sb.length(); i < len; i++) {
-            if (i % 64 == 0) {
-                sb.insert(i, "\n");
-            }
-        }
-        if (flag) {
-            sb = new StringBuilder("-----BEGIN PUBLIC KEY-----").append(sb).append("\n-----END PUBLIC KEY-----\n");
-        } else {
-            sb = new StringBuilder("-----BEGIN RSA PRIVATE KEY-----").append(sb).append("\n-----END RSA PRIVATE KEY-----\n");
-        }
-        return sb.toString();
-    }
-
-}
diff --git a/src/main/java/com/fzzy/protocol/fzzy/analysis/AnalysisSystem.java b/src/main/java/com/fzzy/protocol/fzzy/analysis/AnalysisSystem.java
index f0f6e00..83b0fae 100644
--- a/src/main/java/com/fzzy/protocol/fzzy/analysis/AnalysisSystem.java
+++ b/src/main/java/com/fzzy/protocol/fzzy/analysis/AnalysisSystem.java
@@ -4,6 +4,7 @@
 import com.fzzy.api.data.ApiCommonDevice;
 import com.fzzy.gateway.GatewayUtils;
 import com.fzzy.gateway.entity.GatewayDevice;
+import com.fzzy.gateway.service.GatewayDeviceService;
 import com.fzzy.protocol.fzzy.builder.ObjectCommandBuilder;
 import com.fzzy.protocol.fzzy.builder.SimpleCommandBuilder;
 import com.fzzy.protocol.fzzy.cmd.BaseRemoteImpl;
@@ -15,6 +16,7 @@
 import org.apache.commons.lang3.time.DateFormatUtils;
 import org.springframework.stereotype.Component;
 
+import javax.annotation.Resource;
 import java.util.Date;
 
 /**
@@ -25,6 +27,10 @@
 public class AnalysisSystem extends BaseRemoteImpl {
 
     public static final String BEAN_ID = "fzzy.analysisSystem";
+
+
+    @Resource
+    private GatewayDeviceService gatewayDeviceService;
 
 
     public void analysis1001(ReMessage reMessage) {
@@ -39,8 +45,12 @@
         device.setSn(reMessage.getSn());
         device.setId(reMessage.getIedId());
         device.setOnlineTime(new Date());
+        device.setCode("SUCCESS");
         Constant.updateCache(device);
 
+        //鏇存柊璁惧鍦ㄧ嚎
+        gatewayDeviceService.onlineByCommonDevice(device);
+
 
         //杩斿洖褰撳墠绯荤粺鏃堕棿
         Response1001 response = new Response1001();
diff --git a/src/main/java/com/fzzy/protocol/fzzy/server/SessionListener.java b/src/main/java/com/fzzy/protocol/fzzy/server/SessionListener.java
index 0c0f766..aa9da47 100644
--- a/src/main/java/com/fzzy/protocol/fzzy/server/SessionListener.java
+++ b/src/main/java/com/fzzy/protocol/fzzy/server/SessionListener.java
@@ -1,11 +1,19 @@
 package com.fzzy.protocol.fzzy.server;
 
+import com.fzzy.api.Constant;
+import com.fzzy.api.data.ApiCommonDevice;
+import com.fzzy.api.utils.SpringUtil;
+import com.fzzy.gateway.service.GatewayDeviceService;
 import com.ld.io.api.IoSession;
 import com.ld.io.api.IoSessionListener;
 import lombok.extern.slf4j.Slf4j;
 
+import javax.annotation.Resource;
+
 @Slf4j
 public class SessionListener implements IoSessionListener {
+
+    private GatewayDeviceService gatewayDeviceService;
 
     @Override
     public void onCreate(IoSession session) {
@@ -20,5 +28,18 @@
     @Override
     public void onDestroy(IoSession session) {
         log.info("----FZZY-鎺у埗涓崗璁湁璁惧绂荤嚎-----IP={}锛孭ORT={}", session.getAddress(), session.getPort());
+
+        //璁剧疆鍒嗘満鎺夌嚎
+        ApiCommonDevice commonDevice = Constant.updateCacheOffline(session.getAddress(), session.getPort());
+
+        if (null == commonDevice) return;
+
+
+        if (null == gatewayDeviceService) {
+            gatewayDeviceService = SpringUtil.getBean(GatewayDeviceService.class);
+
+            gatewayDeviceService.OfflineByCommonDevice(commonDevice);
+        }
+
     }
 }
diff --git a/src/main/java/com/fzzy/protocol/sdkhk/common/LPRCallBask_V31.java b/src/main/java/com/fzzy/protocol/sdkhk/common/LPRCallBask_V31.java
index 7e9e557..f109708 100644
--- a/src/main/java/com/fzzy/protocol/sdkhk/common/LPRCallBask_V31.java
+++ b/src/main/java/com/fzzy/protocol/sdkhk/common/LPRCallBask_V31.java
@@ -1,6 +1,7 @@
 
 package com.fzzy.protocol.sdkhk.common;
 
+import com.fzzy.api.data.GatewayDeviceType;
 import com.fzzy.api.utils.SpringUtil;
 import com.fzzy.gateway.GatewayUtils;
 import com.fzzy.gateway.api.GatewayRemoteManager;
diff --git a/src/main/java/com/fzzy/protocol/weightyh/MessageConsumer.java b/src/main/java/com/fzzy/protocol/weightyh/MessageConsumer.java
index a0253fc..4d88ea0 100644
--- a/src/main/java/com/fzzy/protocol/weightyh/MessageConsumer.java
+++ b/src/main/java/com/fzzy/protocol/weightyh/MessageConsumer.java
@@ -1,5 +1,6 @@
 package com.fzzy.protocol.weightyh;
 
+import com.fzzy.api.data.GatewayDeviceType;
 import com.fzzy.api.utils.BytesUtil;
 import com.fzzy.api.utils.SpringUtil;
 import com.fzzy.gateway.GatewayUtils;
diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml
index d4804f2..eb50cd5 100644
--- a/src/main/resources/application-dev.yml
+++ b/src/main/resources/application-dev.yml
@@ -75,6 +75,7 @@
       max-idle: 10
       min-idle: 0
       timeout: 6000
+
   kafka:
     bootstrap-servers: 103.203.217.42:9092
     security-protocol: SASL_PLAINTEXT
@@ -82,6 +83,7 @@
     sasl-jaas-config: org.apache.kafka.common.security.scram.ScramLoginModule required username=\"{username}\" password=\"{password}\";"
     sasl-username: sc001
     sasl-password: wCV0ISwmoKwbx1lpBKMW
+    enabled: false
     producer:
       retries: 0
       acks: 1
diff --git a/src/main/resources/application-devGateway.yml b/src/main/resources/application-devGateway.yml
index 473ed3c..3d07a98 100644
--- a/src/main/resources/application-devGateway.yml
+++ b/src/main/resources/application-devGateway.yml
@@ -46,8 +46,10 @@
       max-idle: 10
       min-idle: 0
       timeout: 6000
+
   kafka:
     bootstrap-servers: 103.203.217.16:9092
+    enabled: false
     producer:
       retries: 0
       acks: 1
diff --git a/src/main/resources/application-devGatewayCommon.yml b/src/main/resources/application-devGatewayCommon.yml
index 45596de..6bf114c 100644
--- a/src/main/resources/application-devGatewayCommon.yml
+++ b/src/main/resources/application-devGatewayCommon.yml
@@ -48,6 +48,7 @@
       timeout: 6000
   kafka:
     bootstrap-servers: 103.203.217.16:9092
+    enabled: false
     producer:
       retries: 0
       acks: 1
diff --git a/src/main/resources/application-proGateway.yml b/src/main/resources/application-proGateway.yml
index 5f33262..2dde28c 100644
--- a/src/main/resources/application-proGateway.yml
+++ b/src/main/resources/application-proGateway.yml
@@ -48,6 +48,7 @@
       timeout: 6000
   kafka:
     bootstrap-servers: 103.203.217.16:9092
+    enabled: false
     producer:
       retries: 0
       acks: 1

--
Gitblit v1.9.3