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> 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){ logger.info(device.getHostName()); deviceMap.put(device.getHostName(), device); } } // 搜索结束 @Override public void onDiscoveryFinished() { ArrayList 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 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 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()); } } }