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.config.RequestConfig;
|
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);
|
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) (o2.getTimeStamp() - o1.getTimeStamp()); //按时间倒序
|
});
|
System.out.println(JSONObject.toJSONString(list));
|
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 {
|
|
map.put("random", System.currentTimeMillis()+"");
|
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();
|
RequestConfig requestConfig = RequestConfig.custom()
|
.setSocketTimeout(5000) // 设置读取超时时间(单位:毫秒)
|
.setConnectTimeout(5000) // 设置连接超时时间(单位:毫秒)
|
.build();
|
CloseableHttpClient httpClient = HttpClientBuilder.create().build();
|
//与上方的HttpMethod.GET对应,使用HttpGet
|
HttpGet httpDelete = new HttpGet(url);
|
httpDelete.setConfig(requestConfig);
|
CloseableHttpResponse response = httpClient.execute(httpDelete);
|
return EntityUtils.toString(response.getEntity());
|
}catch (Exception e){
|
e.printStackTrace();
|
System.err.println(url);
|
}
|
|
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) {
|
try {
|
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();
|
}
|
}catch (Exception e){
|
e.printStackTrace();
|
}
|
|
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;
|
}
|
}
|