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());
|
}
|
|
|
}
|
}
|