毕业设计中,有一项海康威视摄像头实时监控的功能,需要去萤石开放平台获取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>

数据库中的表如下

萤石云 java开发 萤石云 开放平台_萤石云 java开发

 在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处填写对应摄像头的设备序列号。