1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
package com.genersoft.iot.vmp.vmanager.onvif;
 
import be.teletask.onvif.models.OnvifDevice;
import com.genersoft.iot.vmp.gb28181.transmit.callback.DeferredResultHolder;
import com.genersoft.iot.vmp.gb28181.transmit.callback.RequestMessage;
import com.genersoft.iot.vmp.onvif.IONVIFServer;
import com.genersoft.iot.vmp.vmanager.bean.WVPResult;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.context.request.async.DeferredResult;
 
import java.util.List;
import java.util.UUID;
 
@SuppressWarnings(value = {"rawtypes", "unchecked"})
@Api(tags = "onvif设备")
@CrossOrigin
@RestController
@RequestMapping("/api/onvif")
public class ONVIFController {
 
 
    @Autowired
    private DeferredResultHolder resultHolder;
 
    @Autowired
    private IONVIFServer onvifServer;
 
 
    @ApiOperation("搜索")
    @ApiImplicitParams({
            @ApiImplicitParam(name="timeout", value = "超时时间", required = true, dataTypeClass = Integer.class),
    })
    @GetMapping(value = "/search")
    @ResponseBody
    public DeferredResult<ResponseEntity<WVPResult>> search(@RequestParam(required = false)Integer timeout){
        DeferredResult<ResponseEntity<WVPResult>> result = new DeferredResult<>(timeout + 10L);
        String uuid = UUID.randomUUID().toString();
        result.onTimeout(()->{
            RequestMessage msg = new RequestMessage();
            msg.setKey(DeferredResultHolder.CALLBACK_ONVIF );
            msg.setId(uuid);
            WVPResult<String> wvpResult = new WVPResult();
            wvpResult.setCode(0);
            wvpResult.setMsg("搜索超时");
            msg.setData(wvpResult);
            resultHolder.invokeResult(msg);
        });
        resultHolder.put(DeferredResultHolder.CALLBACK_ONVIF, uuid, result);
 
        onvifServer.search(timeout, (errorCode, onvifDevices) ->{
            RequestMessage msg = new RequestMessage();
            msg.setId(DeferredResultHolder.CALLBACK_ONVIF + uuid);
            WVPResult<List<String>> resultData = new WVPResult();
            resultData.setCode(errorCode);
            if (errorCode == 0) {
                resultData.setMsg("success");
                resultData.setData(onvifDevices);
            }else {
                resultData.setMsg("fail");
            }
            msg.setData(resultData);
            msg.setData(resultData);
            resultHolder.invokeResult(msg);
        });
 
        return result;
    }
 
    @ApiOperation("获取onvif的rtsp地址")
    @ApiImplicitParams({
            @ApiImplicitParam(name="timeout", value = "超时时间", required = true, dataTypeClass = Integer.class),
            @ApiImplicitParam(name="hostname", value = "onvif地址", required = true, dataTypeClass = String.class),
            @ApiImplicitParam(name="username", value = "用户名", required = true, dataTypeClass = String.class),
            @ApiImplicitParam(name="password", value = "密码", required = true, dataTypeClass = String.class),
    })
    @GetMapping(value = "/rtsp")
    @ResponseBody
    public DeferredResult<ResponseEntity<WVPResult>> getRTSPUrl(@RequestParam(value="timeout", required=false, defaultValue="3000") Integer timeout,
                                                                @RequestParam(required = true) String hostname,
                                                                @RequestParam(required = false) String username,
                                                                @RequestParam(required = false) String password
                                                                ){
 
        DeferredResult<ResponseEntity<WVPResult>> result = new DeferredResult<>(timeout + 10L);
        String uuid = UUID.randomUUID().toString();
        result.onTimeout(()->{
            RequestMessage msg = new RequestMessage();
            msg.setId(uuid);
            msg.setKey(DeferredResultHolder.CALLBACK_ONVIF);
            WVPResult<String> wvpResult = new WVPResult();
            wvpResult.setCode(0);
            wvpResult.setMsg("获取onvif的rtsp地址超时");
            msg.setData(wvpResult);
            resultHolder.invokeResult(msg);
        });
        resultHolder.put(DeferredResultHolder.CALLBACK_ONVIF, uuid, result);
        OnvifDevice onvifDevice = new OnvifDevice(hostname, username, password);
        onvifServer.getRTSPUrl(timeout, onvifDevice,  (errorCode, url) ->{
            RequestMessage msg = new RequestMessage();
            msg.setId(DeferredResultHolder.CALLBACK_ONVIF + uuid);
            WVPResult<String> resultData = new WVPResult();
            resultData.setCode(errorCode);
            if (errorCode == 0) {
                resultData.setMsg("success");
                resultData.setData(url);
            }else {
                resultData.setMsg(url);
            }
            msg.setData(resultData);
 
            resultHolder.invokeResult(msg);
        });
 
        return result;
    }
 
}