package com.doumee.core.haikang.service; import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.TypeReference; import com.doumee.core.haikang.model.cars.BaseCarsPageResponse; import com.doumee.core.haikang.model.cars.BaseCarsResponse; import com.doumee.core.haikang.model.cars.request.CarsDeviceRequest; import com.doumee.core.haikang.model.cars.request.CarsGpsRequest; import com.doumee.core.haikang.model.cars.response.CarsDeviceDetaisResponse; import com.doumee.core.haikang.model.cars.response.CarsDeviceResponse; import com.doumee.core.haikang.model.cars.response.CarsGpsResponse; import com.doumee.core.haikang.model.param.BaseListPageResponse; import com.doumee.core.haikang.model.param.BaseResponse; import com.doumee.core.haikang.model.param.respose.FindHomeAlarmInfoPageResponse; import com.doumee.core.utils.Constants; import com.doumee.core.utils.DateUtil; import com.google.common.collect.Maps; import org.apache.commons.lang3.StringUtils; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClientBuilder; import org.apache.http.util.EntityUtils; import org.springframework.http.HttpMethod; import java.io.UnsupportedEncodingException; import java.util.*; public class HKCarOpenService { public static String ACCESS_KEY = "D_SUB_gfJkiUxt_1723101405213"; public static String ACCESS_SECRET = "0vB3VLU21SC6eG8T"; private static final String SIGNATURE_METHOD = "HMAC-SHA1"; private static final String DEFAULT_CHARSET = "UTF-8"; private static final String REGION_ID = "cn-hangzhou"; private static final String VERSION = "2.1.0"; public static String BASE_URL = "https://open.hikvisionauto.com:14021/v2/"; private static TreeMap getBaseParams() { Map params = Maps.newHashMap(); params.put("SignatureMethod", SIGNATURE_METHOD); params.put("SignatureNonce", UUID.randomUUID().toString()); params.put("AccessKey", ACCESS_KEY); params.put("Timestamp", String.valueOf(System.currentTimeMillis())); params.put("Version", VERSION); params.put("RegionId", REGION_ID); TreeMap sortParas = Maps.newTreeMap(); sortParas.putAll(params); return sortParas; } public static String sign(String accessSecret, TreeMap params, HttpMethod method) throws Exception { String stringToSign = getStringToSign(params, method); System.out.println("StringToSign = [" + stringToSign + "]"); javax.crypto.Mac mac = javax.crypto.Mac.getInstance("HmacSHA1"); mac.init(new javax.crypto.spec.SecretKeySpec(accessSecret.getBytes(DEFAULT_CHARSET), "HmacSHA1")); byte[] signData = mac.doFinal(stringToSign.getBytes(DEFAULT_CHARSET)); return new sun.misc.BASE64Encoder().encode(signData); } private static String getStringToSign(TreeMap params, HttpMethod method) throws Exception { StringBuilder sortQueryStringTmp = new StringBuilder(); for(Map.Entry entry : params.entrySet()){ sortQueryStringTmp.append("&").append(specialUrlEncode(entry.getKey())).append("=").append(specialUrlEncode(entry.getValue())); } StringBuilder stringToSign = new StringBuilder(); stringToSign.append(method.toString()).append("&").append(specialUrlEncode("/")).append("&").append(specialUrlEncode(sortQueryStringTmp.substring(1))); return stringToSign.toString(); } public static String specialUrlEncode(String value) throws Exception { return java.net.URLEncoder.encode(value, "UTF-8").replace("+", "%20").replace("*", "%2A").replace("%7E", "~"); } public static void main(String[] args) { getAllCarsDetais(); } public static List getAllCarsDetais() { List list = new ArrayList<>(); BaseCarsPageResponse data = getDeviceList(new CarsDeviceRequest()); if(data!=null &&data.getResults()!=null){ List cars = new ArrayList<>(); List codes = new ArrayList<>(); for(CarsDeviceResponse model :data.getResults()){ // System.out.println("=================车牌号:"+model.getPlateNum()); cars.add(model.getPlateNum()); codes.add(model.getTerminalID()); CarsDeviceDetaisResponse t = new CarsDeviceDetaisResponse(); t.setPlateNum(model.getPlateNum()); t.setTerminalID(model.getTerminalID()); /*CarsGpsRequest gp = new CarsGpsRequest(); gp.setDeviceCode(t.getTerminalID()); gp.setFilterSupplementGps(false); gp.setFilterSupplementGps(false); gp.setStartTime(DateUtil.getYesterday()+" 00:00:00"); gp.setEndTime(DateUtil.getNowPlusTime()); gp.setPageNo(1); gp.setPageSize(10);*/ CarsGpsResponse tg = getLatestGpsInfo(t.getTerminalID()); if(tg!=null ){ t.setSpeed(tg.getSpeed()); t.setLatitude(tg.getLatitude()); t.setLongitude(tg.getLongitude()); t.setCollectTime(tg.getCollectTime()); t.setAccStatus(tg.getAccStatus()); t.setGpsValid(tg.getGpsValid()); } list.add(t); } System.out.println("=================车牌总数:"+codes.size()); Map statusList = getDeviceStatusList(codes); if(statusList!=null &&statusList.size()>0){ for(Map.Entry entry : statusList.entrySet()){ CarsDeviceDetaisResponse t = getFromListById(entry.getKey(),list); if(t!=null) { t.setStatus(entry.getValue()); } } } } for(CarsDeviceDetaisResponse m : list){ System.out.println("=================车牌号:"+m.getPlateNum()+" 状态:【"+m.getStatus()+"】"+" 位置:【"+m.getLongitude()+","+m.getLatitude()+"】"); } return list; } private static CarsDeviceDetaisResponse getFromListById(String key, List list) { for(CarsDeviceDetaisResponse dd :list){ if(dd.getTerminalID()!=null && key !=null && dd.getTerminalID().equals(key)){ return dd; } } return null; } public static String sendRequest(String url,TreeMap map){ try { StringBuilder sortQueryStringTmp = new StringBuilder(); for(Map.Entry entry : map.entrySet()){ sortQueryStringTmp .append("&") .append(specialUrlEncode(entry.getKey())) .append("=") .append(specialUrlEncode(entry.getValue())); } //与下方的HttpGet对应,采用的是HttpMethod.GET String sign = sign(ACCESS_SECRET + "&", map, HttpMethod.GET); url += "?Signature=" + specialUrlEncode(sign) + sortQueryStringTmp.toString(); CloseableHttpClient httpClient = HttpClientBuilder.create().build(); //与上方的HttpMethod.GET对应,使用HttpGet HttpGet httpDelete = new HttpGet(url); CloseableHttpResponse response = httpClient.execute(httpDelete); return EntityUtils.toString(response.getEntity()); }catch (Exception e){ e.printStackTrace(); } return null; } public static BaseCarsPageResponse getGpsList(CarsGpsRequest param) { String url = BASE_URL + "gps/list/"; TreeMap BASE_PARAMS = getBaseParams(); if(StringUtils.isNotBlank(param.getEndTime())) { BASE_PARAMS.put("endTime", param.getEndTime()); } if(StringUtils.isNotBlank(param.getStartTime())){ BASE_PARAMS.put("startTime",param.getStartTime()); } if( param.getFilterInvalidGps() !=null && !param.getFilterInvalidGps()){ BASE_PARAMS.put("filterInvalidGps", "false"); } if( param.getFilterSupplementGps() !=null && !param.getFilterSupplementGps()){ BASE_PARAMS.put("filterSupplementGps", "false"); } if(StringUtils.isNotBlank(param.getDeviceCode())){ BASE_PARAMS.put("deviceCode", param.getDeviceCode().toString());//设备型号秘钥 } BASE_PARAMS.put("pageSize",Constants.equalsInteger(param.getPageSize(),0)? "100":param.getPageSize().toString());//页面大小 BASE_PARAMS.put("pageNo", Constants.equalsInteger(param.getPageNo(),0)? "1":param.getPageNo().toString());//当前页 String str = sendRequest(url,BASE_PARAMS); TypeReference typeReference = new TypeReference>>(){}; BaseCarsResponse> result = JSONObject.parseObject(str, typeReference.getType()); if(result!=null && Constants.equalsInteger(result.getStatus(),0)){ return result.getData(); } return null; } public static CarsGpsResponse getLatestGpsInfo(String deviceCode) { String url = BASE_URL + "gps/latest/"; TreeMap BASE_PARAMS = getBaseParams(); BASE_PARAMS.put("deviceCode", deviceCode);//设备型号秘钥 String str = sendRequest(url,BASE_PARAMS); TypeReference typeReference = new TypeReference>(){}; BaseCarsResponse result = JSONObject.parseObject(str, typeReference.getType()); if(result!=null && Constants.equalsInteger(result.getStatus(),0)){ return result.getData(); } return null; } public static Map getDeviceStatusList(List code) { String url = BASE_URL + "device/status/"; TreeMap BASE_PARAMS = getBaseParams(); if(code ==null || code.size() ==0){ return new HashMap<>(); } BASE_PARAMS.put("deviceCodeList", JSONObject.toJSONString(code));//终端手机号列表 String str = sendRequest(url,BASE_PARAMS); TypeReference typeReference = new TypeReference>>(){}; BaseCarsResponse> result = JSONObject.parseObject(str, typeReference.getType()); if(result!=null && Constants.equalsInteger(result.getStatus(),0)){ return result.getData(); } return null; } public static BaseCarsPageResponse getDeviceList(CarsDeviceRequest param) { String url = BASE_URL + "device/list/"; TreeMap BASE_PARAMS = getBaseParams(); if(StringUtils.isNotBlank(param.getProductKey())){ BASE_PARAMS.put("productKey", "");//设备型号秘钥 } BASE_PARAMS.put("pageSize",Constants.equalsInteger(param.getPageSize(),0)? "100":param.getPageSize().toString());//页面大小 BASE_PARAMS.put("pageNo", Constants.equalsInteger(param.getPageNo(),0)? "1":param.getPageNo().toString());//当前页 String str = sendRequest(url,BASE_PARAMS); TypeReference typeReference = new TypeReference>>(){}; BaseCarsResponse> result = JSONObject.parseObject(str, typeReference.getType()); if(result!=null && Constants.equalsInteger(result.getStatus(),0)){ return result.getData(); } return null; } }