毕业设计中,有一项海康威视摄像头实时监控的功能,需要去萤石开放平台获取AppKey、Secret和AccessToken。但是有一个问题,获取到的AccessToken只有7天有效期。每隔7天就要获取一次token。项目发布后不可能通过手动去获取,而是要通过代码自动去获取。因此,去查找萤石开放平台的官方文档,通过接口进行调用。
因为项目采用的是ssm框架,因此在这里,使用springmvc配置定时执行任务,定期通过接口获取AccessToken,然后修改MySQL数据库中的数据,来达到定期更换token的效果。当想要访问实时监控画面时,只需在Controller中添加一个方法,从数据库中获取AccessToken,然后利用session传到前端即可。
1. 首先在spring-mvc.xml配置文件中添加
xmlns:task="http://www.springframework.org/schema/task"
http://www.springframework.org/schema/task
http://www.springframework.org/schema/task/spring-task-3.0.xsd
配置扫描任务位置
<task:annotation-driven />
<task:scheduler id="scheduler" pool-size="10" />
<context:component-scan base-package="com.gong.*"/>
2. (因为项目需要,我将要定期执行获取AccessToken的方法放到了controller包里。)具体实现如下:
因为要用到http客户端,所以需要导入httpclient依赖。同时,因为从接口获取到的数据是Json格式,因此在这里采用阿里巴巴的fastjson。
首先在pom.xml中添加依赖
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.5</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.47</version>
</dependency>
HistoryDataController类:
@Controller
@RequestMapping("/historydata")
public class HistoryDataController {
@Autowired
private HistoryDataService historyDataService;
private static String appKey = "*********************";//填上自己的appKey和Secret即可
private static String appSecret="**********************";//
@Scheduled(cron = "0 0 13 ? * MON")
public void updateVideoToken() throws IOException {
CloseableHttpClient httpClient = HttpClientBuilder.create().build();
StringBuffer params = new StringBuffer();
params.append("appKey="+appKey);
params.append("&");
params.append("appSecret="+appSecret);
// 创建Post请求
HttpPost httpPost = new HttpPost("https://open.ys7.com/api/lapp/token/get" + "?" + params);
httpPost.setHeader("Content-Type","application/x-www-form-urlencoded");
// 响应模型
CloseableHttpResponse response = null;
// 由客户端执行(发送)Post请求
response = httpClient.execute(httpPost);
// 从响应模型中获取响应实体
HttpEntity responseEntity = response.getEntity();
if (responseEntity != null) {
//返回数据
String responseString = EntityUtils.toString(responseEntity);
//生成实体类(responseString就可以看到数据的)
JSONObject jsonObject = JSON.parseObject(responseString);
String msg = jsonObject.getString("msg");
String code = jsonObject.getString("code");
JSONObject dataJson = jsonObject.getJSONObject("data");
Data data = JSONObject.toJavaObject(dataJson, Data.class);
VideoToken videoToken = new VideoToken();
videoToken.setId(1);
videoToken.setAccesstoken(data.getAccessToken());
if(code.equals("200")){
historyDataService.updateAccessToken(videoToken);
}
}
}
@RequestMapping("/toreal")
public String toRealJsp(HttpServletRequest request){
int id=1;
VideoToken videoToken = historyDataService.getVideoToken(id);
String accesstoken = videoToken.getAccesstoken();
request.setAttribute("accesstoken",accesstoken);
return "real";
}
}
在方法上添加了 @Scheduled(cron = "0 0 13 ? * MON")注解,意思为每周一中午13点执行一次,关于该注释的参数详解,可以点击这里进行查看
其中,Data类为自定义类,如下:
package com.gong.pojo;
@lombok.Data
public class Data {
private String accessToken;
private long expireTime;
}
VideoToken类如下:
package com.gong.pojo;
import lombok.Data;
@Data
public class VideoToken {
private int id;
private String accesstoken;
}
在HistoryDataController中定义了HistoryDataService,调用updateAccessToken()方法来实现更新AccessToken。
其中,HistoryDataMapper.xml文件中的语句如下:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.gong.mapper.HistoryDataMapper">
<update id="updateAccessToken" parameterType="com.gong.pojo.VideoToken">
update ssmiot.videotoken
set accesstoken = #{accesstoken}
where id = #{id}
</update>
<select id="getVideoToken" resultType="com.gong.pojo.VideoToken">
select * from ssmiot.videotoken where id = #{id}
</select>
</mapper>
数据库中的表如下
在HistoryDataController中,给id赋值为1,即修改id为1的accesstoken值。
每当想进入实时监控画面时,必须通过/toreal路径去访问,该方法会去数据库获取accesstoken的值,然后传给前端页面。
<%
String accesstoken = (String)request.getAttribute("accesstoken");
%>
<iframe
src="https://open.ys7.com/ezopen/h5/iframe?url=ezopen://SAKUIV@open.ys7.com/xxxxxxxxx/1.hd.live&autoplay=0&audio=1&
accessToken=<%=accesstoken%>
&templete=1" id="ysopen" allowfullscreen width="500px" height="300px">
</iframe>
其中,xxxxxxxxx处填写对应摄像头的设备序列号。