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