From 5ba0fba03d9fcb09eea0c1e703a4f050378d7992 Mon Sep 17 00:00:00 2001 From: panlinlin <648540858@qq.com> Date: Mon, 26 Apr 2021 09:13:17 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E9=83=A8=E5=88=86onvif?= =?UTF-8?q?=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitmodules | 3 + libs/onvif-java-1.0.2.jar | Bin 0 -> 58484 bytes pom.xml | 33 ++++- .../callback/DeferredResultHolder.java | 2 + .../genersoft/iot/vmp/onvif/IONVIFServer.java | 13 ++ .../iot/vmp/onvif/dto/ONVIFCallBack.java | 5 + .../iot/vmp/onvif/impl/ONVIFServerIMpl.java | 116 +++++++++++++++++ .../vmp/vmanager/onvif/ONVIFController.java | 120 +++++++++++++++++ web_src/src/components/StreamProxyList.vue | 36 +++++- .../src/components/dialog/StreamProxyEdit.vue | 4 +- web_src/src/components/dialog/onvifEdit.vue | 121 ++++++++++++++++++ 11 files changed, 446 insertions(+), 7 deletions(-) create mode 100644 .gitmodules create mode 100644 libs/onvif-java-1.0.2.jar create mode 100644 src/main/java/com/genersoft/iot/vmp/onvif/IONVIFServer.java create mode 100644 src/main/java/com/genersoft/iot/vmp/onvif/dto/ONVIFCallBack.java create mode 100644 src/main/java/com/genersoft/iot/vmp/onvif/impl/ONVIFServerIMpl.java create mode 100644 src/main/java/com/genersoft/iot/vmp/vmanager/onvif/ONVIFController.java create mode 100644 web_src/src/components/dialog/onvifEdit.vue diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 00000000..202b14c8 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "be.teletask.onvif-java"] + path = be.teletask.onvif-java + url = https://gitee.com/18010473990/be.teletask.onvif-java.git diff --git a/libs/onvif-java-1.0.2.jar b/libs/onvif-java-1.0.2.jar new file mode 100644 index 0000000000000000000000000000000000000000..dd62a2385edd6f1589bb5779b58ca644a5867418 GIT binary patch literal 58484 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 bK64#3%|cfl&RFhHO7XW5(+FiBonQX}-LTZ< literal 0 HcmV?d00001 diff --git a/pom.xml b/pom.xml index 91b90e69..f8a8b532 100644 --- a/pom.xml +++ b/pom.xml @@ -10,7 +10,7 @@ com.genersoft - wvp + wvp-gb28181 2.0.0 web video platform @@ -44,6 +44,7 @@ UTF-8 + yyyyMMddHHmmss 5.2.0 @@ -167,10 +168,36 @@ okhttp 4.9.0 - + + + + com.burgstaller + okhttp-digest + 2.1 + + + + + net.sf.kxml + kxml2 + 2.3.0 + + + + + + be.teletask + onvif-java + 1.0.2 + system + ${project.basedir}/libs/onvif-java-1.0.2.jar + + + + - wvp-2.0 + ${project.artifactId}-${project.version}-${maven.build.timestamp} org.springframework.boot diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/callback/DeferredResultHolder.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/callback/DeferredResultHolder.java index b7f592e1..f21895c4 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/callback/DeferredResultHolder.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/callback/DeferredResultHolder.java @@ -35,6 +35,8 @@ public class DeferredResultHolder { public static final String CALLBACK_CMD_STOP = "CALLBACK_STOP"; + public static final String CALLBACK_ONVIF = "CALLBACK_ONVIF"; + public static final String CALLBACK_CMD_MOBILEPOSITION = "CALLBACK_MOBILEPOSITION"; public static final String CALLBACK_CMD_PRESETQUERY = "CALLBACK_PRESETQUERY"; diff --git a/src/main/java/com/genersoft/iot/vmp/onvif/IONVIFServer.java b/src/main/java/com/genersoft/iot/vmp/onvif/IONVIFServer.java new file mode 100644 index 00000000..eb81a363 --- /dev/null +++ b/src/main/java/com/genersoft/iot/vmp/onvif/IONVIFServer.java @@ -0,0 +1,13 @@ +package com.genersoft.iot.vmp.onvif; + +import be.teletask.onvif.models.OnvifDevice; +import com.genersoft.iot.vmp.onvif.dto.ONVIFCallBack; + +import java.util.List; + +public interface IONVIFServer { + + void search(int timeout, ONVIFCallBack> callBack); + + void getRTSPUrl(int timeout, OnvifDevice device, ONVIFCallBack callBack); +} diff --git a/src/main/java/com/genersoft/iot/vmp/onvif/dto/ONVIFCallBack.java b/src/main/java/com/genersoft/iot/vmp/onvif/dto/ONVIFCallBack.java new file mode 100644 index 00000000..3fdbde5b --- /dev/null +++ b/src/main/java/com/genersoft/iot/vmp/onvif/dto/ONVIFCallBack.java @@ -0,0 +1,5 @@ +package com.genersoft.iot.vmp.onvif.dto; + +public interface ONVIFCallBack { + void run(int errorCode, T t); +} diff --git a/src/main/java/com/genersoft/iot/vmp/onvif/impl/ONVIFServerIMpl.java b/src/main/java/com/genersoft/iot/vmp/onvif/impl/ONVIFServerIMpl.java new file mode 100644 index 00000000..e747118e --- /dev/null +++ b/src/main/java/com/genersoft/iot/vmp/onvif/impl/ONVIFServerIMpl.java @@ -0,0 +1,116 @@ +package com.genersoft.iot.vmp.onvif.impl; + + +import be.teletask.onvif.DiscoveryManager; +import be.teletask.onvif.OnvifManager; +import be.teletask.onvif.listeners.*; +import be.teletask.onvif.models.*; +import be.teletask.onvif.responses.OnvifResponse; +import com.genersoft.iot.vmp.onvif.IONVIFServer; +import com.genersoft.iot.vmp.onvif.dto.ONVIFCallBack; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; + +import java.net.URI; +import java.net.URISyntaxException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 处理onvif的各种操作 + */ +@Service +public class ONVIFServerIMpl implements IONVIFServer { + + private final static Logger logger = LoggerFactory.getLogger(ONVIFServerIMpl.class); + + @Override + public void search(int timeout, ONVIFCallBack> callBack) { + DiscoveryManager manager = new DiscoveryManager(); + manager.setDiscoveryTimeout(timeout); + Map deviceMap = new HashMap<>(); + // 搜索设备 + manager.discover(new DiscoveryListener() { + @Override + public void onDiscoveryStarted() { + logger.info("Discovery started"); + } + + @Override + public void onDevicesFound(List devices) { + if (devices == null || devices.size() == 0) return; + for (Device device : devices){ + System.out.println(device.getHostName()); + deviceMap.put(device.getHostName(), device); + } + } + + // 搜索结束 + @Override + public void onDiscoveryFinished() { + ArrayList result = new ArrayList<>(); + for (Device device : deviceMap.values()) { + System.out.println(device.getHostName()); + result.add(device.getHostName()); + } + callBack.run(0, result); + } + }); + } + + @Override + public void getRTSPUrl(int timeout, OnvifDevice device, ONVIFCallBack callBack) { + if (device.getHostName() == null ){ + callBack.run(400, null); + } + OnvifManager onvifManager = new OnvifManager(); + onvifManager.setOnvifResponseListener(new OnvifResponseListener(){ + + @Override + public void onResponse(OnvifDevice onvifDevice, OnvifResponse response) { + System.out.println("[RESPONSE] " + onvifDevice.getHostName() + + "======" + response.getErrorCode() + + "======" + response.getErrorMessage()); + } + + @Override + public void onError(OnvifDevice onvifDevice, int errorCode, String errorMessage) { + System.out.println("[ERROR] " + onvifDevice.getHostName() + "======" + errorCode + "=======" + errorMessage); + callBack.run(errorCode, errorMessage); + } + }); + + try { + onvifManager.getServices(device, (OnvifDevice onvifDevice, OnvifServices services) -> { + if (services.getProfilesPath().equals("/onvif/Media")) { + onvifDevice.setPath(services); + onvifManager.getMediaProfiles(onvifDevice, new OnvifMediaProfilesListener() { + @Override + public void onMediaProfilesReceived(OnvifDevice device, List mediaProfiles) { + for (OnvifMediaProfile mediaProfile : mediaProfiles) { + System.out.println(mediaProfile.getName()); + System.out.println(mediaProfile.getToken()); + if (mediaProfile.getName().equals("mainStream")) { + onvifManager.getMediaStreamURI(device, mediaProfile, (OnvifDevice onvifDevice, + OnvifMediaProfile profile, String uri) -> { + + uri = uri.replace("rtsp://", "rtsp://"+ device.getUsername() + ":"+ device.getPassword() + "@"); + logger.info(onvifDevice.getHostName() + "的地址" + uri); + callBack.run(0, uri); + }); + } + } + } + }); + } + }); + }catch (Exception e) { + callBack.run(400, e.getMessage()); + } + + + } +} diff --git a/src/main/java/com/genersoft/iot/vmp/vmanager/onvif/ONVIFController.java b/src/main/java/com/genersoft/iot/vmp/vmanager/onvif/ONVIFController.java new file mode 100644 index 00000000..a484b51e --- /dev/null +++ b/src/main/java/com/genersoft/iot/vmp/vmanager/onvif/ONVIFController.java @@ -0,0 +1,120 @@ +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; + +@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); + UUID uuid = UUID.randomUUID(); + result.onTimeout(()->{ + RequestMessage msg = new RequestMessage(); + msg.setId(DeferredResultHolder.CALLBACK_ONVIF + 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); + UUID uuid = UUID.randomUUID(); + result.onTimeout(()->{ + RequestMessage msg = new RequestMessage(); + msg.setId(DeferredResultHolder.CALLBACK_ONVIF + uuid); + 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; + } + +} diff --git a/web_src/src/components/StreamProxyList.vue b/web_src/src/components/StreamProxyList.vue index 0e0fcdd5..d71de84b 100644 --- a/web_src/src/components/StreamProxyList.vue +++ b/web_src/src/components/StreamProxyList.vue @@ -10,6 +10,7 @@
添加代理 + 搜索ONVIF
@@ -79,6 +80,7 @@ :total="total"> + @@ -86,6 +88,7 @@