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<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.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<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";
|
|
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.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<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);
|
|
//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<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);
|
|
//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<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==")));
|
|
}
|
|
}
|