| 
					
				 | 
			
			
				@ -0,0 +1,408 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				package com.yihu.jw.care.service.device; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				import com.alibaba.fastjson.JSON; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				import com.alibaba.fastjson.JSONArray; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				import com.alibaba.fastjson.JSONObject; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				import com.yihu.jw.care.config.YsConfig; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				import com.yihu.jw.util.http.HttpClientUtil; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				import com.yihu.jw.utils.encode.Base64; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				import org.apache.commons.lang3.StringUtils; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				import org.slf4j.Logger; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				import org.slf4j.LoggerFactory; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				import org.springframework.beans.factory.annotation.Autowired; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				import org.springframework.data.redis.core.StringRedisTemplate; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				import org.springframework.http.HttpEntity; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				import org.springframework.http.HttpMethod; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				import org.springframework.stereotype.Service; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				import org.springframework.util.LinkedMultiValueMap; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				import org.springframework.util.MultiValueMap; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				import javax.crypto.Cipher; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				import javax.crypto.spec.SecretKeySpec; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				import javax.servlet.http.HttpServletRequest; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				import java.security.Security; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				import java.text.MessageFormat; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				import java.util.HashMap; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				import java.util.Map; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				import java.util.concurrent.TimeUnit; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				/** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 * Created by Bing on 2021/6/1. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				@Service 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				public class YsDeviceService { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    private static Logger logger = LoggerFactory.getLogger(YsDeviceService.class); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    private Map<String,String> msgType = new HashMap<>(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    @Autowired 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    private StringRedisTemplate redisTemplate; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    @Autowired 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    private HttpClientUtil httpClientUtil; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * 获取萤石设备assesToken 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    public String getAccessToken() throws Exception { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        if(redisTemplate.hasKey(YsConfig.redisKey)){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            return redisTemplate.opsForValue().get(YsConfig.redisKey); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        JSONObject param = new JSONObject(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        param.put("appKey",YsConfig.AppKey); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        param.put("appSecret",YsConfig.Secret); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        HttpEntity<JSONObject> response = httpClientUtil.assesTokenPostHttp(YsConfig.saasAssesToken,param, HttpMethod.POST); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        JSONObject responseBody = response.getBody(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        String assToken = null; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        if (responseBody.getInteger("code")==200){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            assToken = responseBody.getJSONObject("data").getString("accessToken"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            Long expireTime = responseBody.getJSONObject("data").getLong("expiresIn");//token有效期 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            redisTemplate.opsForValue().set(YsConfig.redisKey,assToken,expireTime, TimeUnit.MILLISECONDS); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        }else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            throw new Exception("获取token失败"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        return assToken; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * 获取IOT开放平台assesToken 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * @return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * @throws Exception 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    public String getIotAccessToken() throws Exception { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        if(redisTemplate.hasKey(YsConfig.iotRedisKey)){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            return redisTemplate.opsForValue().get(YsConfig.iotRedisKey); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        JSONObject param = new JSONObject(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        param.put("accessToken",getAccessToken()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        HttpEntity<JSONObject> response = httpClientUtil.assesTokenPostHttp(YsConfig.iotAssesToken,param, HttpMethod.POST); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        JSONObject responseBody = response.getBody(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        String assToken = null; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        if (responseBody.getInteger("code")==200){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            assToken = responseBody.getJSONObject("data").getString("ezOpenAccessToken"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            Long expireTime = responseBody.getJSONObject("data").getLong("expireTime");//token有效期 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            redisTemplate.opsForValue().set(YsConfig.iotRedisKey,assToken,expireTime, TimeUnit.MILLISECONDS); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            //设备解密密钥 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            String secretKey = responseBody.getJSONObject("data").getString("secretKey"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            redisTemplate.opsForValue().set(YsConfig.secretKey,secretKey,expireTime, TimeUnit.MILLISECONDS); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        }else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            throw new Exception("获取token失败"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        return assToken; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * 获取设备解密密钥 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * @return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * @throws Exception 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    public String getSecretKey() throws Exception { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        if(redisTemplate.hasKey(YsConfig.secretKey)){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            return redisTemplate.opsForValue().get(YsConfig.secretKey); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            getIotAccessToken(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            return redisTemplate.opsForValue().get(YsConfig.secretKey); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * 萤石摄像机获取通道详情 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * @param deviceSerial 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * @param channelNo 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * @param isTrust 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * @param request 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * @return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * @throws Exception 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    public JSONObject surveillanceWay(String deviceSerial,Integer channelNo,Integer isTrust,HttpServletRequest request) throws Exception { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        JSONObject param = new JSONObject(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        param.put("accessToken",getAccessToken()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        param.put("deviceSerial",deviceSerial); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        param.put("channelNo",channelNo); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        param.put("isTrust",0); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        HttpEntity<JSONObject> response = httpClientUtil.assesTokenPostHttp(YsConfig.surveillanceWay,param,HttpMethod.POST); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        JSONObject responseBody = response.getBody(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        return responseBody; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        //https://www.yuque.com/u1400669/kb/os58z7#p9Tfd 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * 视频加解密开关 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * @param deviceSerial 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * @param isEncrypt 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * @param validateCode 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * @param request 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * @return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * @throws Exception 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    public JSONObject deviceEncrypt(String deviceSerial,Integer isEncrypt,String validateCode,HttpServletRequest request) throws Exception { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        JSONObject param = new JSONObject(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        param.put("accessToken",getAccessToken()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        param.put("deviceSerial",deviceSerial); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        param.put("isEncrypt",isEncrypt); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        if (0==isEncrypt){//PU4eJqa7j9GMst8P 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            validateCode = messageDecrypt(validateCode,getSecretKey()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            param.put("validateCode",validateCode); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        HttpEntity<JSONObject> response = httpClientUtil.assesTokenPostHttp(YsConfig.deviceEncrypt,param,HttpMethod.POST); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        JSONObject responseBody = response.getBody(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        return responseBody; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        //https://www.yuque.com/u1400669/kb/os58z7#zfqzn 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * 设备抓拍 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * @param deviceSerial 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * @param channelNo 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * @param request 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * @return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * @throws Exception 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    public JSONObject deviceCapture(String deviceSerial,Integer channelNo,HttpServletRequest request) throws Exception { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        JSONObject param = new JSONObject(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        param.put("accessToken",getAccessToken()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        param.put("deviceSerial",deviceSerial); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        param.put("channelNo",channelNo+""); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        HttpEntity<JSONObject> response = httpClientUtil.assesTokenPostHttp(YsConfig.deviceCapture,param,HttpMethod.POST); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        JSONObject responseBody = response.getBody(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        return responseBody; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        //https://www.yuque.com/u1400669/kb/os58z7#K2AHX 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * 获取视频地址 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    public JSONObject getDeviceLiveAddress(String deviceSerial,Integer channelNo,HttpServletRequest request) throws Exception { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        MultiValueMap<String, String> param = new LinkedMultiValueMap<>(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        param.add("accessToken",getIotAccessToken()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        param.add("deviceSerial",deviceSerial); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        param.add("channelNo",channelNo+""); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        HttpEntity<JSONObject> response = httpClientUtil.iotAssesTokenPostHttp(YsConfig.getDeviceLiveAddress,param,HttpMethod.POST); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        JSONObject responseBody = response.getBody(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        return responseBody; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        //https://open.ys7.com/doc/zh/book/index/address.html#address-api2 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         * { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         *     "msg":"操作成功!", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         *     "code":"200", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         *     "data":{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         *         "deviceSerial":"F56826706", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         *         "channelNo":1, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         *         "deviceName":"C6Wi(F56826706)", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         *         "liveAddress":"http://hls01open.ys7.com/openlive/99c146f11ab042849fd4b49f7b0d86cf.m3u8",  HLS流畅直播地址 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         *         "hdAddress":"http://hls01open.ys7.com/openlive/99c146f11ab042849fd4b49f7b0d86cf.hd.m3u8",  HLS高清直播地址 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         *         "rtmp":"rtmp://rtmp01open.ys7.com/openlive/99c146f11ab042849fd4b49f7b0d86cf",               RTMP流畅直播地址 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         *         "rtmpHd":"rtmp://rtmp01open.ys7.com/openlive/99c146f11ab042849fd4b49f7b0d86cf.hd",           RTMP高清直播地址 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         *         "flvAddress":"https://flvopen.ys7.com:9188/openlive/99c146f11ab042849fd4b49f7b0d86cf.flv",    FLV流畅直播地址 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         *         "hdFlvAddress":"https://flvopen.ys7.com:9188/openlive/99c146f11ab042849fd4b49f7b0d86cf.hd.flv", FLV高清直播地址 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         *         "status":1, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         *         "exception":0, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         *         "beginTime":1622615659000, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         *         "endTime":1622615659000 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         *     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         * } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * 云台控制开始 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * @param deviceSerial 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * @param channelNo 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * @param direction 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * @param speed 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * @param request 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * @return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * @throws Exception 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    public JSONObject ptzStart(String deviceSerial,Integer channelNo,Integer direction,Integer speed,HttpServletRequest request) throws Exception { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        MultiValueMap<String,String> param = new LinkedMultiValueMap<>(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        param.add("accessToken",getIotAccessToken()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        param.add("deviceSerial",deviceSerial); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        param.add("channelNo",channelNo+""); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        param.add("direction",direction+""); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        param.add("speed",speed+""); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        HttpEntity<JSONObject> response = httpClientUtil.iotAssesTokenPostHttp(YsConfig.ptzStart,param,HttpMethod.POST); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        JSONObject responseBody = response.getBody(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        return responseBody; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        //https://open.ys7.com/doc/zh/book/index/device_ptz.html#device_ptz-api1 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * 云台控制结束 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * @param deviceSerial 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * @param channelNo 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * @param direction 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * @param request 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * @return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * @throws Exception 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    public JSONObject ptzStop(String deviceSerial,Integer channelNo,Integer direction,HttpServletRequest request) throws Exception { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        MultiValueMap<String,String> param = new LinkedMultiValueMap<>(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        param.add("accessToken",getIotAccessToken()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        param.add("deviceSerial",deviceSerial); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        param.add("channelNo",channelNo+""); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        param.add("direction",direction+""); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        HttpEntity<JSONObject> response = httpClientUtil.iotAssesTokenPostHttp(YsConfig.ptzStop,param,HttpMethod.POST); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        JSONObject responseBody = response.getBody(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        return responseBody; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        //https://open.ys7.com/doc/zh/book/index/device_ptz.html#device_ptz-api2 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * 获取上传录像授权信息 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * @param request 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * @return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * @throws Exception 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    public JSONObject getVideoKey(HttpServletRequest request) throws Exception { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        JSONObject param = new JSONObject(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        param.put("accessToken",getAccessToken()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        HttpEntity<JSONObject> response = httpClientUtil.assesTokenPostHttp(YsConfig.videoKey,param,HttpMethod.POST); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        JSONObject responseBody = response.getBody(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        return responseBody; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        //https://www.yuque.com/u1400669/kb/nu22ks#Kj5dG 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * 录像列表(无法区分用户) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * @return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * @throws Exception 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    public JSONObject videoList(String name,String type,Integer page,Integer count) throws Exception { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        page = page>0?page-1:0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        JSONObject param = new JSONObject(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        param.put("accessToken",getAccessToken()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        if (StringUtils.isNotBlank(name)){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            param.put("name",name); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        if (StringUtils.isNotBlank(type)){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            param.put("type",type); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        param.put("page",page); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        param.put("count",count); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        HttpEntity<JSONObject> response = httpClientUtil.assesTokenPostHttp(YsConfig.videoList,param,HttpMethod.POST); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        JSONObject responseBody = response.getBody(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        return responseBody; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        //https://www.yuque.com/u1400669/kb/nu22ks#kF97n 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * 批量获取录像详情 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * @param vod_ids 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * @return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * @throws Exception 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    public JSONObject videoDetailList(String[] vod_ids) throws Exception { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        JSONArray arr = JSONArray.parseArray(JSON.toJSONString(vod_ids)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        JSONObject param = new JSONObject(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        param.put("accessToken",getAccessToken()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        param.put("vod_ids",arr); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        HttpEntity<JSONObject> response = httpClientUtil.assesTokenPostHttp(YsConfig.videoDetailList,param,HttpMethod.POST); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        JSONObject responseBody = response.getBody(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        return responseBody; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        //https://www.yuque.com/u1400669/kb/nu22ks#60Fjf 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * 获取录像详情 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * @return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * @throws Exception 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    public JSONObject videoDetail(String vod_id) throws Exception { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        JSONObject param = new JSONObject(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        param.put("accessToken",getAccessToken()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        param.put("vod_id",vod_id); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        HttpEntity<JSONObject> response = httpClientUtil.assesTokenPostHttp(YsConfig.videoDetail,param,HttpMethod.POST); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        JSONObject responseBody = response.getBody(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        return responseBody; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        //https://www.yuque.com/u1400669/kb/nu22ks#xQCVK 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    public JSONObject deviceFailConfig(String deviceSerial,Integer type,HttpServletRequest request) throws Exception { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        JSONObject responseBody = new JSONObject(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        String url =MessageFormat.format(YsConfig.deviceFailConfig, deviceSerial,"1"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        if (null==type){//查询 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            url += "?accessToken="+getIotAccessToken()+"&key=Alarm_DetectHumanCar"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            MultiValueMap<String, String> param = new LinkedMultiValueMap<>(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            HttpEntity<JSONObject> response = httpClientUtil.iotAssesTokenPostHttp(url,param,HttpMethod.GET); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            responseBody = response.getBody(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            MultiValueMap<String, String> param = new LinkedMultiValueMap<>(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            param.add("accessToken",getIotAccessToken()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            param.add("key","Alarm_DetectHumanCar"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            param.add("value","{\"type\":"+type+"}"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            HttpEntity<JSONObject> response = httpClientUtil.iotAssesTokenPostHttp(url,param,HttpMethod.PUT); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            responseBody = response.getBody(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        return responseBody; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        //https://www.yuque.com/u1400669/kb/os58z7#YYazO 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    public JSONObject videoUpload(HttpServletRequest request){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        return null; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        //https://www.yuque.com/u1400669/kb/nu22ks#nQXzO 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * 消息解密 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * @param sSrc 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * @param sKey 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * @return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * @throws Exception 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    public String messageDecrypt(String sSrc, String sKey) throws Exception { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        try { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            byte[] raw = sKey.getBytes("utf-8"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            Cipher cipher = Cipher.getInstance("AES/ECB/PKCS7Padding"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            cipher.init(Cipher.DECRYPT_MODE, skeySpec); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            byte[] encrypted1 = Base64.decode(sSrc);//先用base64解密 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            byte[] original = cipher.doFinal(encrypted1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            return new String(original, "utf-8"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        } catch (Exception ex) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            logger.error("AES解密异常:Str"+sSrc+"\nkey:"+sKey); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            throw new Exception("解密失败"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				//    public static void main(String[] args) throws Exception { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				//        String mess = "9uFqSq7m0HCj0vboHqVI5XLmnlS+ZB4S2k2gH6CZyUMXIod2OP+UK7ibjP27v9OX"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				//        String skey="PU4eJqa7j9GMst8P"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				//        String response = messageDecrypt(mess,skey); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				//        System.out.println(response); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				//        JSONObject tmp = JSONObject.parseObject(response); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				//        System.out.println("1"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				//    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        msgType.put("10001","离岗检测消息"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        msgType.put("10002","身份识别消息"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        msgType.put("10003","回头客消息"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        msgType.put("10004","门禁事件消息"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        msgType.put("10005","设备报警消息"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        msgType.put("10006","设备上线离线消息"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        msgType.put("10007","门禁权限同步消息"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        msgType.put("10008","消防设备消息"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        msgType.put("10009","企业数据变更消息"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        msgType.put("10010","智能联动消息"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        msgType.put("10011","海康设备透传消息"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        msgType.put("10012","通道关联状态上报消息"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        msgType.put("10013","智能控制设备状态消息"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        msgType.put("10014","托管设备增删消息"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        msgType.put("10016","门铃消息"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				} 
			 |