Преглед на файлове

维护目录订阅消息与接口

648540858 преди 4 години
родител
ревизия
eca1e05aee

+ 5 - 4
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/SIPProcessorObserver.java

@@ -71,7 +71,7 @@ public class SIPProcessorObserver implements SipListener {
             logger.warn("不支持方法{}的request", method);
             return;
         }
-        requestProcessorMap.get(requestEvent.getRequest().getMethod()).process(requestEvent);
+        requestProcessorMap.get(method).process(requestEvent);
     }
 
     /**
@@ -143,17 +143,18 @@ public class SIPProcessorObserver implements SipListener {
 
     @Override
     public void processIOException(IOExceptionEvent exceptionEvent) {
-
+//        System.out.println("processIOException");
     }
 
     @Override
     public void processTransactionTerminated(TransactionTerminatedEvent transactionTerminatedEvent) {
-
+//        System.out.println("processTransactionTerminated");
     }
 
     @Override
     public void processDialogTerminated(DialogTerminatedEvent dialogTerminatedEvent) {
-
+        CallIdHeader callId = dialogTerminatedEvent.getDialog().getCallId();
+        System.out.println("processDialogTerminated:::::" + callId);
     }
 
 

+ 3 - 2
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/SIPRequestProcessorParent.java

@@ -125,7 +125,8 @@ public abstract class SIPRequestProcessorParent {
 		Response response = getMessageFactory().createResponse(statusCode, evt.getRequest());
 		ServerTransaction serverTransaction = getServerTransaction(evt);
 		serverTransaction.sendResponse(response);
-		if (statusCode >= 200) {
+		if (statusCode >= 200 && !"NOTIFY".equals(evt.getRequest().getMethod())) {
+
 			if (serverTransaction.getDialog() != null) serverTransaction.getDialog().delete();
 		}
 	}
@@ -135,7 +136,7 @@ public abstract class SIPRequestProcessorParent {
 		response.setReasonPhrase(msg);
 		ServerTransaction serverTransaction = getServerTransaction(evt);
 		serverTransaction.sendResponse(response);
-		if (statusCode >= 200) {
+		if (statusCode >= 200 && !"NOTIFY".equals(evt.getRequest().getMethod())) {
 			if (serverTransaction.getDialog() != null) serverTransaction.getDialog().delete();
 		}
 	}

+ 127 - 81
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/NotifyRequestProcessor.java

@@ -253,87 +253,52 @@ public class NotifyRequestProcessor extends SIPRequestProcessorParent implements
 					if (channelDeviceElement == null) {
 						continue;
 					}
-					String channelDeviceId = channelDeviceElement.getTextTrim();
-					Element channdelNameElement = itemDevice.element("Name");
-					String channelName = channdelNameElement != null ? channdelNameElement.getTextTrim().toString() : "";
-					Element statusElement = itemDevice.element("Status");
-					String status = statusElement != null ? statusElement.getTextTrim().toString() : "ON";
-					DeviceChannel deviceChannel = new DeviceChannel();
-					deviceChannel.setName(channelName);
-					deviceChannel.setChannelId(channelDeviceId);
-					// ONLINE OFFLINE HIKVISION DS-7716N-E4 NVR的兼容性处理
-					if (status.equals("ON") || status.equals("On") || status.equals("ONLINE")) {
-						deviceChannel.setStatus(1);
-					}
-					if (status.equals("OFF") || status.equals("Off") || status.equals("OFFLINE")) {
-						deviceChannel.setStatus(0);
-					}
+					Element eventElement = itemDevice.element("Event");
+					switch (eventElement.getText().toUpperCase()) {
+						case "ON" : // 上线
+							logger.info("收到来自设备【{}】的通道上线【{}】通知", device.getDeviceId(), channelId);
+							storager.deviceChannelOnline(deviceId, channelId);
+							// 回复200 OK
+							responseAck(evt, Response.OK);
+							break;
+						case "OFF" : // 离线
+							logger.info("收到来自设备【{}】的通道离线【{}】通知", device.getDeviceId(), channelId);
+							storager.deviceChannelOffline(deviceId, channelId);
+							// 回复200 OK
+							responseAck(evt, Response.OK);
+							break;
+						case "VLOST" : // 视频丢失
+							logger.info("收到来自设备【{}】的通道视频丢失【{}】通知", device.getDeviceId(), channelId);
+							storager.deviceChannelOffline(deviceId, channelId);
+							// 回复200 OK
+							responseAck(evt, Response.OK);
+							break;
+						case "DEFECT" : // 故障
+							// 回复200 OK
+							responseAck(evt, Response.OK);
+							break;
+						case "ADD" : // 增加
+							logger.info("收到来自设备【{}】的增加通道【{}】通知", device.getDeviceId(), channelId);
+							DeviceChannel deviceChannel = channelContentHander(itemDevice, channelId);
+							storager.updateChannel(deviceId, deviceChannel);
+							responseAck(evt, Response.OK);
+							break;
+						case "DEL" : // 删除
+							logger.info("收到来自设备【{}】的删除通道【{}】通知", device.getDeviceId(), channelId);
+							storager.delChannel(deviceId, channelId);
+							responseAck(evt, Response.OK);
+							break;
+						case "UPDATE" : // 更新
+							logger.info("收到来自设备【{}】的更新通道【{}】通知", device.getDeviceId(), channelId);
+							DeviceChannel channel = channelContentHander(itemDevice, channelId);
+							storager.updateChannel(deviceId, channel);
+							responseAck(evt, Response.OK);
+							break;
+						default:
+							responseAck(evt, Response.BAD_REQUEST, "event not found");
 
-					deviceChannel.setManufacture(XmlUtil.getText(itemDevice, "Manufacturer"));
-					deviceChannel.setModel(XmlUtil.getText(itemDevice, "Model"));
-					deviceChannel.setOwner(XmlUtil.getText(itemDevice, "Owner"));
-					deviceChannel.setCivilCode(XmlUtil.getText(itemDevice, "CivilCode"));
-					deviceChannel.setBlock(XmlUtil.getText(itemDevice, "Block"));
-					deviceChannel.setAddress(XmlUtil.getText(itemDevice, "Address"));
-					if (XmlUtil.getText(itemDevice, "Parental") == null
-							|| XmlUtil.getText(itemDevice, "Parental") == "") {
-						deviceChannel.setParental(0);
-					} else {
-						deviceChannel.setParental(Integer.parseInt(XmlUtil.getText(itemDevice, "Parental")));
-					}
-					deviceChannel.setParentId(XmlUtil.getText(itemDevice, "ParentID"));
-					if (XmlUtil.getText(itemDevice, "SafetyWay") == null
-							|| XmlUtil.getText(itemDevice, "SafetyWay") == "") {
-						deviceChannel.setSafetyWay(0);
-					} else {
-						deviceChannel.setSafetyWay(Integer.parseInt(XmlUtil.getText(itemDevice, "SafetyWay")));
-					}
-					if (XmlUtil.getText(itemDevice, "RegisterWay") == null
-							|| XmlUtil.getText(itemDevice, "RegisterWay") == "") {
-						deviceChannel.setRegisterWay(1);
-					} else {
-						deviceChannel.setRegisterWay(Integer.parseInt(XmlUtil.getText(itemDevice, "RegisterWay")));
-					}
-					deviceChannel.setCertNum(XmlUtil.getText(itemDevice, "CertNum"));
-					if (XmlUtil.getText(itemDevice, "Certifiable") == null
-							|| XmlUtil.getText(itemDevice, "Certifiable") == "") {
-						deviceChannel.setCertifiable(0);
-					} else {
-						deviceChannel.setCertifiable(Integer.parseInt(XmlUtil.getText(itemDevice, "Certifiable")));
-					}
-					if (XmlUtil.getText(itemDevice, "ErrCode") == null
-							|| XmlUtil.getText(itemDevice, "ErrCode") == "") {
-						deviceChannel.setErrCode(0);
-					} else {
-						deviceChannel.setErrCode(Integer.parseInt(XmlUtil.getText(itemDevice, "ErrCode")));
-					}
-					deviceChannel.setEndTime(XmlUtil.getText(itemDevice, "EndTime"));
-					deviceChannel.setSecrecy(XmlUtil.getText(itemDevice, "Secrecy"));
-					deviceChannel.setIpAddress(XmlUtil.getText(itemDevice, "IPAddress"));
-					if (XmlUtil.getText(itemDevice, "Port") == null || XmlUtil.getText(itemDevice, "Port") == "") {
-						deviceChannel.setPort(0);
-					} else {
-						deviceChannel.setPort(Integer.parseInt(XmlUtil.getText(itemDevice, "Port")));
 					}
-					deviceChannel.setPassword(XmlUtil.getText(itemDevice, "Password"));
-					if (NumericUtil.isDouble(XmlUtil.getText(itemDevice, "Longitude"))) {
-						deviceChannel.setLongitude(Double.parseDouble(XmlUtil.getText(itemDevice, "Longitude")));
-					} else {
-						deviceChannel.setLongitude(0.00);
-					}
-					if (NumericUtil.isDouble(XmlUtil.getText(itemDevice, "Latitude"))) {
-						deviceChannel.setLatitude(Double.parseDouble(XmlUtil.getText(itemDevice, "Latitude")));
-					} else {
-						deviceChannel.setLatitude(0.00);
-					}
-					if (XmlUtil.getText(itemDevice, "PTZType") == null
-							|| XmlUtil.getText(itemDevice, "PTZType") == "") {
-						deviceChannel.setPTZType(0);
-					} else {
-						deviceChannel.setPTZType(Integer.parseInt(XmlUtil.getText(itemDevice, "PTZType")));
-					}
-					deviceChannel.setHasAudio(true); // 默认含有音频,播放时再检查是否有音频及是否AAC
-					storager.updateChannel(device.getDeviceId(), deviceChannel);
+
 				}
 
 				// RequestMessage msg = new RequestMessage();
@@ -341,8 +306,7 @@ public class NotifyRequestProcessor extends SIPRequestProcessorParent implements
 				// msg.setType(DeferredResultHolder.CALLBACK_CMD_CATALOG);
 				// msg.setData(device);
 				// deferredResultHolder.invokeResult(msg);
-				// 回复200 OK
-				responseAck(evt, Response.OK);
+
 				if (offLineDetector.isOnline(deviceId)) {
 					publisher.onlineEventPublish(device, VideoManagerConstants.EVENT_ONLINE_MESSAGE);
 				}
@@ -352,6 +316,88 @@ public class NotifyRequestProcessor extends SIPRequestProcessorParent implements
 		}
 	}
 
+	public DeviceChannel channelContentHander(Element itemDevice, String channelId){
+		Element channdelNameElement = itemDevice.element("Name");
+		String channelName = channdelNameElement != null ? channdelNameElement.getTextTrim().toString() : "";
+		Element statusElement = itemDevice.element("Status");
+		String status = statusElement != null ? statusElement.getTextTrim().toString() : "ON";
+		DeviceChannel deviceChannel = new DeviceChannel();
+		deviceChannel.setName(channelName);
+		deviceChannel.setChannelId(channelId);
+		// ONLINE OFFLINE HIKVISION DS-7716N-E4 NVR的兼容性处理
+		if (status.equals("ON") || status.equals("On") || status.equals("ONLINE")) {
+			deviceChannel.setStatus(1);
+		}
+		if (status.equals("OFF") || status.equals("Off") || status.equals("OFFLINE")) {
+			deviceChannel.setStatus(0);
+		}
+
+		deviceChannel.setManufacture(XmlUtil.getText(itemDevice, "Manufacturer"));
+		deviceChannel.setModel(XmlUtil.getText(itemDevice, "Model"));
+		deviceChannel.setOwner(XmlUtil.getText(itemDevice, "Owner"));
+		deviceChannel.setCivilCode(XmlUtil.getText(itemDevice, "CivilCode"));
+		deviceChannel.setBlock(XmlUtil.getText(itemDevice, "Block"));
+		deviceChannel.setAddress(XmlUtil.getText(itemDevice, "Address"));
+		if (XmlUtil.getText(itemDevice, "Parental") == null
+				|| XmlUtil.getText(itemDevice, "Parental") == "") {
+			deviceChannel.setParental(0);
+		} else {
+			deviceChannel.setParental(Integer.parseInt(XmlUtil.getText(itemDevice, "Parental")));
+		}
+		deviceChannel.setParentId(XmlUtil.getText(itemDevice, "ParentID"));
+		if (XmlUtil.getText(itemDevice, "SafetyWay") == null
+				|| XmlUtil.getText(itemDevice, "SafetyWay") == "") {
+			deviceChannel.setSafetyWay(0);
+		} else {
+			deviceChannel.setSafetyWay(Integer.parseInt(XmlUtil.getText(itemDevice, "SafetyWay")));
+		}
+		if (XmlUtil.getText(itemDevice, "RegisterWay") == null
+				|| XmlUtil.getText(itemDevice, "RegisterWay") == "") {
+			deviceChannel.setRegisterWay(1);
+		} else {
+			deviceChannel.setRegisterWay(Integer.parseInt(XmlUtil.getText(itemDevice, "RegisterWay")));
+		}
+		deviceChannel.setCertNum(XmlUtil.getText(itemDevice, "CertNum"));
+		if (XmlUtil.getText(itemDevice, "Certifiable") == null
+				|| XmlUtil.getText(itemDevice, "Certifiable") == "") {
+			deviceChannel.setCertifiable(0);
+		} else {
+			deviceChannel.setCertifiable(Integer.parseInt(XmlUtil.getText(itemDevice, "Certifiable")));
+		}
+		if (XmlUtil.getText(itemDevice, "ErrCode") == null
+				|| XmlUtil.getText(itemDevice, "ErrCode") == "") {
+			deviceChannel.setErrCode(0);
+		} else {
+			deviceChannel.setErrCode(Integer.parseInt(XmlUtil.getText(itemDevice, "ErrCode")));
+		}
+		deviceChannel.setEndTime(XmlUtil.getText(itemDevice, "EndTime"));
+		deviceChannel.setSecrecy(XmlUtil.getText(itemDevice, "Secrecy"));
+		deviceChannel.setIpAddress(XmlUtil.getText(itemDevice, "IPAddress"));
+		if (XmlUtil.getText(itemDevice, "Port") == null || XmlUtil.getText(itemDevice, "Port") == "") {
+			deviceChannel.setPort(0);
+		} else {
+			deviceChannel.setPort(Integer.parseInt(XmlUtil.getText(itemDevice, "Port")));
+		}
+		deviceChannel.setPassword(XmlUtil.getText(itemDevice, "Password"));
+		if (NumericUtil.isDouble(XmlUtil.getText(itemDevice, "Longitude"))) {
+			deviceChannel.setLongitude(Double.parseDouble(XmlUtil.getText(itemDevice, "Longitude")));
+		} else {
+			deviceChannel.setLongitude(0.00);
+		}
+		if (NumericUtil.isDouble(XmlUtil.getText(itemDevice, "Latitude"))) {
+			deviceChannel.setLatitude(Double.parseDouble(XmlUtil.getText(itemDevice, "Latitude")));
+		} else {
+			deviceChannel.setLatitude(0.00);
+		}
+		if (XmlUtil.getText(itemDevice, "PTZType") == null
+				|| XmlUtil.getText(itemDevice, "PTZType") == "") {
+			deviceChannel.setPTZType(0);
+		} else {
+			deviceChannel.setPTZType(Integer.parseInt(XmlUtil.getText(itemDevice, "PTZType")));
+		}
+		deviceChannel.setHasAudio(true); // 默认含有音频,播放时再检查是否有音频及是否AAC
+		return deviceChannel;
+	}
 
 
 

+ 19 - 0
src/main/java/com/genersoft/iot/vmp/storager/IVideoManagerStorager.java

@@ -97,6 +97,13 @@ public interface IVideoManagerStorager {
 	 */
 	public DeviceChannel queryChannel(String deviceId, String channelId);
 
+	/**
+	 * 删除通道
+	 * @param deviceId 设备ID
+	 * @param channelId 通道ID
+	 */
+	public int delChannel(String deviceId, String channelId);
+
 	/**
 	 * 获取多个设备
 	 * @param page 当前页数
@@ -387,4 +394,16 @@ public interface IVideoManagerStorager {
 	 * @return
 	 */
     Device queryVideoDeviceByChannelId(String channelId);
+
+	/**
+	 * 通道上线
+	 * @param channelId 通道ID
+	 */
+	void deviceChannelOnline(String deviceId, String channelId);
+
+	/**
+	 * 通道离线
+	 * @param channelId 通道ID
+	 */
+	void deviceChannelOffline(String deviceId, String channelId);
 }

+ 10 - 1
src/main/java/com/genersoft/iot/vmp/storager/dao/DeviceChannelMapper.java

@@ -74,6 +74,9 @@ public interface DeviceChannelMapper {
     @Delete("DELETE FROM device_channel WHERE deviceId=#{deviceId}")
     int cleanChannelsByDeviceId(String deviceId);
 
+    @Delete("DELETE FROM device_channel WHERE deviceId=#{deviceId} AND channelId=#{channelId}")
+    int del(String deviceId, String channelId);
+
     @Update(value = {"UPDATE device_channel SET streamId=null WHERE deviceId=#{deviceId} AND channelId=#{channelId}"})
     void stopPlay(String deviceId, String channelId);
 
@@ -104,5 +107,11 @@ public interface DeviceChannelMapper {
     List<ChannelReduce> queryChannelListInAll(String query, Boolean online, Boolean hasSubChannel, String platformId, Boolean inPlatform);
 
     @Select("SELECT * FROM device_channel WHERE channelId=#{channelId}")
-    List<DeviceChannel> queryChannelByChannelId(String channelId);
+    List<DeviceChannel> queryChannelByChannelId( String channelId);
+
+    @Update(value = {"UPDATE device_channel SET status=0 WHERE deviceId=#{deviceId} AND channelId=#{channelId}"})
+    void offline(String deviceId,  String channelId);
+
+    @Update(value = {"UPDATE device_channel SET status=1 WHERE deviceId=#{deviceId} AND channelId=#{channelId}"})
+    void online(String deviceId,  String channelId);
 }

+ 24 - 6
src/main/java/com/genersoft/iot/vmp/storager/impl/VideoManagerStoragerImpl.java

@@ -1,14 +1,12 @@
 package com.genersoft.iot.vmp.storager.impl;
 
-import java.text.SimpleDateFormat;
-import java.util.*;
-
 import com.genersoft.iot.vmp.gb28181.bean.*;
 import com.genersoft.iot.vmp.gb28181.session.VideoStreamSessionManager;
 import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem;
 import com.genersoft.iot.vmp.media.zlm.dto.StreamProxyItem;
 import com.genersoft.iot.vmp.media.zlm.dto.StreamPushItem;
 import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
+import com.genersoft.iot.vmp.storager.IVideoManagerStorager;
 import com.genersoft.iot.vmp.storager.dao.*;
 import com.genersoft.iot.vmp.vmanager.gb28181.platform.bean.ChannelReduce;
 import com.github.pagehelper.PageHelper;
@@ -18,12 +16,16 @@ import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.jdbc.datasource.DataSourceTransactionManager;
 import org.springframework.stereotype.Component;
-
-import com.genersoft.iot.vmp.storager.IVideoManagerStorager;
 import org.springframework.transaction.TransactionDefinition;
 import org.springframework.transaction.TransactionStatus;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
 /**    
  * @description:视频设备数据存储-jdbc实现
  * @author: swwheihei
@@ -137,6 +139,16 @@ public class VideoManagerStoragerImpl implements IVideoManagerStorager {
 		}
 	}
 
+	@Override
+	public void deviceChannelOnline(String deviceId, String channelId) {
+		deviceChannelMapper.online(deviceId, channelId);
+	}
+
+	@Override
+	public void deviceChannelOffline(String deviceId, String channelId) {
+		deviceChannelMapper.offline(deviceId, channelId);
+	}
+
 	@Override
 	public void startPlay(String deviceId, String channelId, String streamId) {
 		deviceChannelMapper.startPlay(deviceId, channelId, streamId);
@@ -184,6 +196,11 @@ public class VideoManagerStoragerImpl implements IVideoManagerStorager {
 	}
 
 
+	@Override
+	public int delChannel(String deviceId, String channelId) {
+		return deviceChannelMapper.del(deviceId, channelId);
+	}
+
 	/**
 	 * 获取多个设备
 	 *
@@ -624,8 +641,9 @@ public class VideoManagerStoragerImpl implements IVideoManagerStorager {
 		return streamProxyMapper.selectForEnableInMediaServer(id, enable);
 	}
 
+
 	@Override
-	public Device queryVideoDeviceByChannelId(String channelId) {
+	public Device queryVideoDeviceByChannelId( String channelId) {
 		Device result = null;
 		List<DeviceChannel> channelList = deviceChannelMapper.queryChannelByChannelId(channelId);
 		if (channelList.size() == 1) {