package com.doumee.core.haikang.service; 
 | 
  
 | 
    import com.alibaba.fastjson.JSONObject; 
 | 
    import com.alibaba.fastjson.TypeReference; 
 | 
    import com.doumee.core.haikang.model.HKConstants; 
 | 
    import com.doumee.core.haikang.model.cars.BaseCarsPageResponse; 
 | 
    import com.doumee.core.haikang.model.cars.BaseCarsResponse; 
 | 
    import com.doumee.core.haikang.model.cars.request.CarsAlarmListRequest; 
 | 
    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.*; 
 | 
    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  List<CarsDeviceDetaisResponse> HK_CARS_LIST=  null; 
 | 
    public static   String BASE_URL = "https://open.hikvisionauto.com:14021/v2/"; 
 | 
    private static TreeMap<String, String> getBaseParams()   { 
 | 
        Map<String, String> 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<String, String> sortParas = Maps.newTreeMap(); 
 | 
        sortParas.putAll(params); 
 | 
        return sortParas; 
 | 
    } 
 | 
  
 | 
    public static String sign(String accessSecret, TreeMap<String, String> 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<String, String> params, HttpMethod method) throws Exception { 
 | 
        StringBuilder sortQueryStringTmp = new StringBuilder(); 
 | 
        for(Map.Entry<String, String> 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<CarsDeviceDetaisResponse> getAllCarsDetais() { 
 | 
        List<CarsDeviceDetaisResponse> list = new ArrayList<>(); 
 | 
        BaseCarsPageResponse<CarsDeviceResponse>  data = getDeviceList(new CarsDeviceRequest()); 
 | 
        if(data!=null &&data.getResults()!=null){ 
 | 
            List<String> cars = new ArrayList<>(); 
 | 
            List<String> 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<String,Integer>   statusList = getDeviceStatusList(codes); 
 | 
            if(statusList!=null &&statusList.size()>0){ 
 | 
                for(Map.Entry<String, Integer> 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; 
 | 
    } 
 | 
    public static List<CarsAlarmResultListResponse> getAlarmEvemtList(List<CarsDeviceDetaisResponse> detaisResponses ,  Date date) { 
 | 
        List<CarsAlarmResultListResponse> list = new ArrayList<>(); 
 | 
        if(detaisResponses ==null || detaisResponses.size()==0){ 
 | 
            return list ; 
 | 
        } 
 | 
        CarsAlarmListRequest param = new CarsAlarmListRequest(); 
 | 
        param.setStartTime(DateUtil.getPlusTime2(DateUtil.getStartOfDay(date))); 
 | 
        param.setEndTime(DateUtil.getPlusTime2(DateUtil.getEndOfDay(date))); 
 | 
        param.setPageNo(1); 
 | 
        param.setPageSize(100); 
 | 
        for( CarsDeviceDetaisResponse de :detaisResponses ){ 
 | 
            param.setDeviceCode(de.getTerminalID()); 
 | 
            BaseCarsPageResponse<CarsAlarmListResponse>  data = getAlarmList(param); 
 | 
            if(data!=null &&data.getResults()!=null){ 
 | 
                for(CarsAlarmListResponse model :data.getResults()){ 
 | 
                    CarsAlarmResultListResponse tm = new CarsAlarmResultListResponse(); 
 | 
                    tm.setTime(model.getTime()); 
 | 
                    tm.setCarCode(de.getPlateNum()); 
 | 
                    tm.setType(model.getType()); 
 | 
                    tm.setSubType(model.getSubType()); 
 | 
                    Date tmDate = DateUtil.fromStringToDate("yyyy-MM-dd HH:mm:ss", tm.getTime() ); 
 | 
                    if(tmDate!=null){ 
 | 
                        tm.setTimeStamp(tmDate.getTime()); 
 | 
                    } 
 | 
                    tm.setTitle(HKConstants.CarsEventType.getName(tm.getType(),tm.getSubType())); 
 | 
                    list.add(tm); 
 | 
                } 
 | 
            } 
 | 
        } 
 | 
        Collections.sort(list, (o1, o2) -> { 
 | 
            return (int) (o1.getTimeStamp() - o2.getTimeStamp()); //按数量从大到小排序 
 | 
        }); 
 | 
        return list; 
 | 
    } 
 | 
  
 | 
    private static CarsDeviceDetaisResponse getFromListById(String key, List<CarsDeviceDetaisResponse> 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<String, String> map){ 
 | 
        try { 
 | 
            StringBuilder sortQueryStringTmp = new StringBuilder(); 
 | 
            for(Map.Entry<String, String> 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<CarsGpsResponse>  getGpsList(CarsGpsRequest param)   { 
 | 
        String url = BASE_URL + "gps/list/"; 
 | 
        TreeMap<String, String> 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<BaseCarsPageResponse<CarsGpsResponse>>>(){}; 
 | 
        BaseCarsResponse<BaseCarsPageResponse<CarsGpsResponse>>   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<String, String> BASE_PARAMS = getBaseParams(); 
 | 
        BASE_PARAMS.put("deviceCode", deviceCode);//设备型号秘钥 
 | 
        String str = sendRequest(url,BASE_PARAMS); 
 | 
        TypeReference typeReference = 
 | 
                new TypeReference<BaseCarsResponse<CarsGpsResponse>>(){}; 
 | 
        BaseCarsResponse<CarsGpsResponse>   result = JSONObject.parseObject(str, typeReference.getType()); 
 | 
        if(result!=null && Constants.equalsInteger(result.getStatus(),0)){ 
 | 
            return  result.getData(); 
 | 
        } 
 | 
        return  null; 
 | 
    } 
 | 
    public static   Map<String,Integer>   getDeviceStatusList(List<String> code)   { 
 | 
        String url = BASE_URL + "device/status/"; 
 | 
        TreeMap<String, String> 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<Map<String,Integer>>>(){}; 
 | 
        BaseCarsResponse<Map<String,Integer>>   result = JSONObject.parseObject(str, typeReference.getType()); 
 | 
        if(result!=null && Constants.equalsInteger(result.getStatus(),0)){ 
 | 
            return  result.getData(); 
 | 
        } 
 | 
        return  null; 
 | 
    } 
 | 
    public static BaseCarsPageResponse<CarsDeviceResponse> getDeviceList(CarsDeviceRequest param)  { 
 | 
        String url = BASE_URL + "device/list/"; 
 | 
        TreeMap<String, String> BASE_PARAMS = getBaseParams(); 
 | 
        if(StringUtils.isNotBlank(param.getProductKey())){ 
 | 
            BASE_PARAMS.put("productKey", param.getProductKey());//设备型号秘钥 
 | 
        } 
 | 
        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<BaseCarsPageResponse<CarsDeviceResponse>>>(){}; 
 | 
        BaseCarsResponse<BaseCarsPageResponse<CarsDeviceResponse>>   result = JSONObject.parseObject(str, typeReference.getType()); 
 | 
        if(result!=null && Constants.equalsInteger(result.getStatus(),0)){ 
 | 
            return  result.getData(); 
 | 
        } 
 | 
        return  null; 
 | 
    } 
 | 
    public static BaseCarsPageResponse<CarsAlarmListResponse> getAlarmList(CarsAlarmListRequest param)  { 
 | 
        String url = BASE_URL + "alarm/list/"; 
 | 
        TreeMap<String, String> BASE_PARAMS = getBaseParams(); 
 | 
        if(StringUtils.isNotBlank(param.getStartTime())){ 
 | 
            BASE_PARAMS.put("startTime", param.getStartTime()); 
 | 
        } 
 | 
        if(StringUtils.isNotBlank(param.getEndTime())){ 
 | 
            BASE_PARAMS.put("endTime", param.getEndTime()); 
 | 
        } 
 | 
        BASE_PARAMS.put("deviceCode", param.getDeviceCode()); 
 | 
        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<BaseCarsPageResponse<CarsAlarmListResponse>>>(){}; 
 | 
        BaseCarsResponse<BaseCarsPageResponse<CarsAlarmListResponse>>   result = JSONObject.parseObject(str, typeReference.getType()); 
 | 
        if(result!=null && Constants.equalsInteger(result.getStatus(),0)){ 
 | 
            return  result.getData(); 
 | 
        } 
 | 
        return  null; 
 | 
    } 
 | 
} 
 |