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