648540858
2022-02-24 a42dda2bd3cc1cf8c20cc61e7ad9211eadecbaf3
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/NotifyRequestProcessor.java
@@ -1,14 +1,17 @@
package com.genersoft.iot.vmp.gb28181.transmit.event.request.impl;
import com.genersoft.iot.vmp.common.VideoManagerConstants;
import com.genersoft.iot.vmp.conf.SipConfig;
import com.genersoft.iot.vmp.conf.UserSetup;
import com.genersoft.iot.vmp.gb28181.bean.*;
import com.genersoft.iot.vmp.gb28181.event.DeviceOffLineDetector;
import com.genersoft.iot.vmp.gb28181.event.EventPublisher;
import com.genersoft.iot.vmp.gb28181.event.subscribe.catalog.CatalogEvent;
import com.genersoft.iot.vmp.gb28181.transmit.SIPProcessorObserver;
import com.genersoft.iot.vmp.gb28181.transmit.callback.DeferredResultHolder;
import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommander;
import com.genersoft.iot.vmp.gb28181.transmit.event.request.SIPRequestProcessorAbstract;
import com.genersoft.iot.vmp.gb28181.transmit.event.request.ISIPRequestProcessor;
import com.genersoft.iot.vmp.gb28181.transmit.event.request.SIPRequestProcessorParent;
import com.genersoft.iot.vmp.gb28181.utils.NumericUtil;
import com.genersoft.iot.vmp.gb28181.utils.SipUtils;
import com.genersoft.iot.vmp.gb28181.utils.XmlUtil;
@@ -20,6 +23,7 @@
import org.dom4j.Element;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
@@ -33,12 +37,10 @@
import java.util.Iterator;
/**
 * @description: Notify请求处理器
 * @author: lawrencehj
 * @date: 2021年1月27日
 * SIP命令类型: NOTIFY请求
 */
@Component
public class NotifyRequestProcessor extends SIPRequestProcessorAbstract {
public class NotifyRequestProcessor extends SIPRequestProcessorParent implements InitializingBean, ISIPRequestProcessor {
    private final static Logger logger = LoggerFactory.getLogger(NotifyRequestProcessor.class);
@@ -50,6 +52,12 @@
   private IVideoManagerStorager storager;
   @Autowired
   private EventPublisher eventPublisher;
   @Autowired
   private SipConfig sipConfig;
   @Autowired
   private IRedisCatchStorage redisCatchStorage;
   @Autowired
@@ -58,9 +66,7 @@
   @Autowired
   private DeviceOffLineDetector offLineDetector;
   private static final String NOTIFY_CATALOG = "Catalog";
   private static final String NOTIFY_ALARM = "Alarm";
   private static final String NOTIFY_MOBILE_POSITION = "MobilePosition";
   private String method = "NOTIFY";
   @Autowired
@@ -78,13 +84,13 @@
         Element rootElement = getRootElement(evt);
         String cmd = XmlUtil.getText(rootElement, "CmdType");
         if (NOTIFY_CATALOG.equals(cmd)) {
         if (CmdType.CATALOG.equals(cmd)) {
            logger.info("接收到Catalog通知");
            processNotifyCatalogList(evt);
         } else if (NOTIFY_ALARM.equals(cmd)) {
         } else if (CmdType.ALARM.equals(cmd)) {
            logger.info("接收到Alarm通知");
            processNotifyAlarm(evt);
         } else if (NOTIFY_MOBILE_POSITION.equals(cmd)) {
         } else if (CmdType.MOBILE_POSITION.equals(cmd)) {
            logger.info("接收到MobilePosition通知");
            processNotifyMobilePosition(evt);
         } else {
@@ -108,7 +114,7 @@
         MobilePosition mobilePosition = new MobilePosition();
         Element deviceIdElement = rootElement.element("DeviceID");
         String deviceId = deviceIdElement.getTextTrim().toString();
         Device device = storager.queryVideoDevice(deviceId);
         Device device = redisCatchStorage.getDevice(deviceId);
         if (device != null) {
            if (!StringUtils.isEmpty(device.getName())) {
               mobilePosition.setDeviceName(device.getName());
@@ -156,12 +162,15 @@
    * @param evt
    */
   private void processNotifyAlarm(RequestEvent evt) {
      if (!sipConfig.isAlarm()) {
         return;
      }
      try {
         Element rootElement = getRootElement(evt);
         Element deviceIdElement = rootElement.element("DeviceID");
         String deviceId = deviceIdElement.getText().toString();
         Device device = storager.queryVideoDevice(deviceId);
         Device device = redisCatchStorage.getDevice(deviceId);
         if (device == null) {
            return;
         }
@@ -228,9 +237,7 @@
         String deviceId = SipUtils.getUserIdFromFromHeader(fromHeader);
         Element rootElement = getRootElement(evt);
         Element deviceIdElement = rootElement.element("DeviceID");
         String channelId = deviceIdElement.getText();
         Device device = storager.queryVideoDevice(deviceId);
         Device device = redisCatchStorage.getDevice(deviceId);
         if (device == null) {
            return;
         }
@@ -251,87 +258,55 @@
               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");
               DeviceChannel channel = XmlUtil.channelContentHander(itemDevice);
               channel.setDeviceId(device.getDeviceId());
               logger.debug("收到来自设备【{}】的通道: {}【{}】", device.getDeviceId(), channel.getName(), channel.getChannelId());
               switch (eventElement.getText().toUpperCase()) {
                  case CatalogEvent.ON: // 上线
                     logger.info("收到来自设备【{}】的通道【{}】上线通知", device.getDeviceId(), channel.getChannelId());
                     storager.deviceChannelOnline(deviceId, channel.getChannelId());
                     // 回复200 OK
                     responseAck(evt, Response.OK);
                     break;
                  case CatalogEvent.OFF : // 离线
                     logger.info("收到来自设备【{}】的通道【{}】离线通知", device.getDeviceId(), channel.getChannelId());
                     storager.deviceChannelOffline(deviceId, channel.getChannelId());
                     // 回复200 OK
                     responseAck(evt, Response.OK);
                     break;
                  case CatalogEvent.VLOST: // 视频丢失
                     logger.info("收到来自设备【{}】的通道【{}】视频丢失通知", device.getDeviceId(), channel.getChannelId());
                     storager.deviceChannelOffline(deviceId, channel.getChannelId());
                     // 回复200 OK
                     responseAck(evt, Response.OK);
                     break;
                  case CatalogEvent.DEFECT: // 故障
                     // 回复200 OK
                     responseAck(evt, Response.OK);
                     break;
                  case CatalogEvent.ADD: // 增加
                     logger.info("收到来自设备【{}】的增加通道【{}】通知", device.getDeviceId(), channel.getChannelId());
                     storager.updateChannel(deviceId, channel);
                     responseAck(evt, Response.OK);
                     break;
                  case CatalogEvent.DEL: // 删除
                     logger.info("收到来自设备【{}】的删除通道【{}】通知", device.getDeviceId(), channel.getChannelId());
                     storager.delChannel(deviceId, channel.getChannelId());
                     responseAck(evt, Response.OK);
                     break;
                  case CatalogEvent.UPDATE: // 更新
                     logger.info("收到来自设备【{}】的更新通道【{}】通知", device.getDeviceId(), channel.getChannelId());
                     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);
               // 转发变化信息
               eventPublisher.catalogEventPublish(null, channel, eventElement.getText().toUpperCase());
            }
            // RequestMessage msg = new RequestMessage();
@@ -339,8 +314,7 @@
            // 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);
            }
@@ -349,9 +323,6 @@
         e.printStackTrace();
      }
   }
   public void setCmder(SIPCommander cmder) {
   }