648540858
3 years ago
7 changed files with 2 additions and 267 deletions
Binary file not shown.
@ -1,13 +0,0 @@ |
|||
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<List<String>> callBack); |
|||
|
|||
void getRTSPUrl(int timeout, OnvifDevice device, ONVIFCallBack<String> callBack); |
|||
} |
@ -1,5 +0,0 @@ |
|||
package com.genersoft.iot.vmp.onvif.dto; |
|||
|
|||
public interface ONVIFCallBack<T> { |
|||
void run(int errorCode, T t); |
|||
} |
@ -1,115 +0,0 @@ |
|||
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.util.ArrayList; |
|||
import java.util.HashMap; |
|||
import java.util.List; |
|||
import java.util.Map; |
|||
|
|||
@SuppressWarnings("rawtypes") |
|||
/** |
|||
* 处理onvif的各种操作 |
|||
*/ |
|||
@Service |
|||
public class ONVIFServerIMpl implements IONVIFServer { |
|||
|
|||
private final static Logger logger = LoggerFactory.getLogger(ONVIFServerIMpl.class); |
|||
|
|||
@Override |
|||
public void search(int timeout, ONVIFCallBack<List<String>> callBack) { |
|||
DiscoveryManager manager = new DiscoveryManager(); |
|||
manager.setDiscoveryTimeout(timeout); |
|||
Map<String, Device> deviceMap = new HashMap<>(); |
|||
// 搜索设备
|
|||
manager.discover(new DiscoveryListener() { |
|||
@Override |
|||
public void onDiscoveryStarted() { |
|||
logger.info("Discovery started"); |
|||
} |
|||
|
|||
@Override |
|||
public void onDevicesFound(List<Device> devices) { |
|||
if (devices == null || devices.size() == 0) return; |
|||
for (Device device : devices){ |
|||
logger.info(device.getHostName()); |
|||
deviceMap.put(device.getHostName(), device); |
|||
} |
|||
} |
|||
|
|||
// 搜索结束
|
|||
@Override |
|||
public void onDiscoveryFinished() { |
|||
ArrayList<String> result = new ArrayList<>(); |
|||
for (Device device : deviceMap.values()) { |
|||
logger.info(device.getHostName()); |
|||
result.add(device.getHostName()); |
|||
} |
|||
callBack.run(0, result); |
|||
} |
|||
}); |
|||
} |
|||
|
|||
@Override |
|||
public void getRTSPUrl(int timeout, OnvifDevice device, ONVIFCallBack<String> 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) { |
|||
logger.info("[RESPONSE] " + onvifDevice.getHostName() |
|||
+ "======" + response.getErrorCode() |
|||
+ "======" + response.getErrorMessage()); |
|||
} |
|||
|
|||
@Override |
|||
public void onError(OnvifDevice onvifDevice, int errorCode, String errorMessage) { |
|||
logger.info("[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<OnvifMediaProfile> mediaProfiles) { |
|||
for (OnvifMediaProfile mediaProfile : mediaProfiles) { |
|||
logger.info(mediaProfile.getName()); |
|||
logger.info(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()); |
|||
} |
|||
|
|||
|
|||
} |
|||
} |
@ -1,123 +0,0 @@ |
|||
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; |
|||
} |
|||
|
|||
} |
Loading…
Reference in new issue