package com.fzzy.gateway.hx2023.service; import com.alibaba.fastjson2.JSONObject; import com.fzzy.api.data.PushProtocol; import com.fzzy.api.utils.*; 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.api.GatewayRemoteService; import com.fzzy.gateway.entity.GatewayConf; import com.fzzy.gateway.hx2023.ScConstant; import com.fzzy.gateway.hx2023.data.CloudResp; import com.fzzy.gateway.util.GatewayRSAUtils; 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.io.UnsupportedEncodingException; import java.util.Comparator; import java.util.HashMap; import java.util.Map; import java.util.TreeMap; @Slf4j @Data @Component public class HxGatewayRemoteServiceImpl implements GatewayRemoteService { @Resource private ApiLogRep apiLogRep; @Resource private GatewayConfService gatewayConfService; @Override public String getProtocol() { return PushProtocol.GATEWAY_SC_2023.getCode(); } @Override public void init(GatewayConf gatewayConf) { try { if (StringUtils.isEmpty(gatewayConf.getApiUrl())) { return; } //获取公私钥接口 Map 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.getPrivateKey()); 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) { try { if (StringUtils.isEmpty(gatewayConf.getApiUrl())) { return; } gatewayConf = getCacheConf(gatewayConf.getKqdm()); //网关心跳接口 Map 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"; 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 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.getPrivateKey()); 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); } } public String getSign(Map parames, String priKey) { //参数拼接 String msg = ""; parames = sortMapKey(parames); for (Map.Entry param : parames.entrySet()) { msg += param.getKey() + "=" + param.getValue() + "&"; } msg = msg.substring(0, msg.length() - 1); log.debug("------待加密信息-----{}", msg); //MD5加密 String md5sign = MyMD5Util.getMD5(msg); log.debug("------md5加密-----{}", md5sign); //RSA加密 String result = GatewayRSAUtils.encryptByPrivate(md5sign, priKey); log.debug("------RSA加密-----{}", result); return result; } public static String getSign2(Map parames, String priKey) { //参数拼接 String msg = ""; parames = sortMapKey(parames); for (Map.Entry param : parames.entrySet()) { msg += param.getKey() + "=" + param.getValue() + "&"; } msg = msg.substring(0, msg.length() - 1); log.debug("------待加密信息-----{}", msg); //MD5加密 String md5sign = MyMD5Util.getMD5(msg); log.debug("------md5加密-----{}", md5sign); //RSA加密 String result = GatewayRSAUtils.encryptByPrivate(md5sign, priKey); log.debug("------RSA加密-----{}", result); return result; } /** * @param kqdm * @return */ public GatewayConf getCacheConf(String kqdm) { return gatewayConfService.getCacheConf(kqdm); } private void updateAuthToken(GatewayConf conf) { gatewayConfService.updateCache(conf); } private static Map sortMapKey(Map map){ if(map == null || map.isEmpty()){ return null; } Map sortMap = new TreeMap<>(new Comparator() { @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 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=="))); } }