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> search(@RequestParam(required = false)Integer timeout){ DeferredResult> 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 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> 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> 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> 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 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 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; } }