| New file |
| | |
| | | package com.dy.pipIrrRemote.video.ys; |
| | | |
| | | import com.dy.common.schedulerTask.SchedulerTaskSupport; |
| | | import com.dy.pipIrrRemote.video.YsAppCtrl; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.beans.factory.annotation.Value; |
| | | import org.springframework.http.*; |
| | | import org.springframework.stereotype.Component; |
| | | import org.springframework.util.LinkedMultiValueMap; |
| | | import org.springframework.util.MultiValueMap; |
| | | import org.springframework.web.client.RestTemplate; |
| | | import org.springframework.web.util.UriComponentsBuilder; |
| | | |
| | | /** |
| | | * @Author: liurunyu |
| | | * @Date: 2025/6/7 11:40 |
| | | * @Description |
| | | */ |
| | | @Slf4j |
| | | @Component |
| | | public class YsAppClient { |
| | | |
| | | private static final String JobName = "VideoYsJob" ; |
| | | private static final String JobGroupName = "VideoYsGroup" ; |
| | | private static final Integer ThreadPoolMaxCount = 1 ;//线程池线程最大个数 |
| | | private static final Integer ThreadPoolPriority = 5 ;//线程优先级 |
| | | private static final boolean quartzJobRunOneTimes = true ;//定时任务只执行一次 |
| | | |
| | | @Value("${video.ys.accessTokenExpireDay: 7}") |
| | | protected Integer accessTokenExpireDay;//AccessToken过期时间,单位天 |
| | | |
| | | @Value("${video.ys.appKey}") |
| | | protected String appKey; |
| | | |
| | | @Value("${video.ys.secret}") |
| | | protected String secret; |
| | | |
| | | @Value("${video.ys.requestAccessTokenUrl}") |
| | | protected String requestAccessTokenUrl; |
| | | |
| | | @Autowired |
| | | protected RestTemplate restTemplate ; |
| | | |
| | | @Autowired |
| | | protected YsAppCtrl ysVideoCtrl; |
| | | |
| | | private Long computeNetGetAccessTokenAt(){ |
| | | Long millis = (System.currentTimeMillis() + (accessTokenExpireDay * 24 * 60 * 60 * 1000) ) ; |
| | | // millis = 10000L ; |
| | | return millis ; |
| | | } |
| | | |
| | | /** |
| | | * 获得AccessToken |
| | | */ |
| | | public void getAccessToken(){ |
| | | if((appKey != null && appKey.trim().length() > 0) |
| | | && (secret != null && secret.trim().length() > 0) |
| | | && (requestAccessTokenUrl != null && requestAccessTokenUrl.trim().length() > 0)){ |
| | | MultiValueMap<String, String> formData = new LinkedMultiValueMap<>(); |
| | | formData.add("appKey", appKey); |
| | | formData.add("appSecret", secret); |
| | | YsAccessTokenResponse response = this.postRequest2Ys(restTemplate, requestAccessTokenUrl, formData); |
| | | if(response != null){ |
| | | switch (response.code){ |
| | | case "200" :{ |
| | | this.dealSuccessOfRequestAccessTokenFromYs(response) ; |
| | | break ; |
| | | } |
| | | default: { |
| | | this.dealErrorOfRequestAccessTokenFromYs(response) ; |
| | | break ; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | private void dealSuccessOfRequestAccessTokenFromYs(YsAccessTokenResponse response){ |
| | | if(response != null && response.data != null){ |
| | | ysVideoCtrl.saveAccessTokenOfYs(response.data.accessToken, response.data.expireTime); |
| | | } |
| | | } |
| | | |
| | | private void dealErrorOfRequestAccessTokenFromYs(YsAccessTokenResponse response){ |
| | | log.error("从萤石开放平台获得AccessToken失败,错误码:{},错误信息:{}", response.code, response.msg); |
| | | } |
| | | /** |
| | | * 设置下次获得AccessToken |
| | | */ |
| | | public void reSetNextGetAccessToken(Long getAccessTokenAt){ |
| | | if(getAccessTokenAt == null || getAccessTokenAt.longValue() == 0){ |
| | | getAccessTokenAt = this.computeNetGetAccessTokenAt() ; |
| | | } |
| | | //毫秒变成秒 |
| | | int futureSecond = (int)((getAccessTokenAt - System.currentTimeMillis()) / 1000) ; |
| | | try { |
| | | SchedulerTaskSupport.setThreadPoolPro(ThreadPoolMaxCount , ThreadPoolPriority); |
| | | //因为要重复加工作任务,所以先把上次加的同组同名任务删除 |
| | | SchedulerTaskSupport.deleteJob(JobName , JobGroupName) ; |
| | | // 只执行一次的任务 |
| | | SchedulerTaskSupport.addSecondlyJob(JobName , JobGroupName, YsAccessTokenQuartzJob.class, null, futureSecond, 1, 0) ; |
| | | } catch (Exception e) { |
| | | log.error("设置从萤石开放平台定时获得AccessToken任务时发生异常", e); |
| | | } |
| | | } |
| | | /** |
| | | * 向萤石开放平台发送Post请求 |
| | | * @param restTemplate SpringBoot的RestTemplate |
| | | * @param toMwUrl web请求Url |
| | | * @param body 数据 |
| | | * @return |
| | | */ |
| | | private YsAccessTokenResponse postRequest2Ys(RestTemplate restTemplate, String toMwUrl, Object body) { |
| | | String url = UriComponentsBuilder.fromUriString(toMwUrl) |
| | | .build() |
| | | .toUriString(); |
| | | HttpHeaders headers = new HttpHeaders(); |
| | | headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED); |
| | | |
| | | HttpEntity<?> httpEntity = new HttpEntity<>(body, headers); |
| | | ResponseEntity<YsAccessTokenResponse> resEntity = null; |
| | | try { |
| | | // 通过Post方式调用接口 |
| | | resEntity = restTemplate.exchange(url, HttpMethod.POST, httpEntity, YsAccessTokenResponse.class); |
| | | } catch (Exception e) { |
| | | log.error("从萤石开放平台定时获得AccessToken任务执行时发生异常", e); |
| | | } |
| | | if(resEntity != null){ |
| | | return resEntity.getBody(); |
| | | } |
| | | return null ; |
| | | } |
| | | |
| | | } |