From b57dbeac1354999488b9ef2ad4192dc1b323f642 Mon Sep 17 00:00:00 2001
From: 648540858 <648540858@qq.com>
Date: 星期六, 20 四月 2024 18:58:53 +0800
Subject: [PATCH] 优化通道更新

---
 src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/InviteRequestProcessor.java                  |    1 
 src/main/java/com/genersoft/iot/vmp/service/impl/DeviceServiceImpl.java                                              |    3 
 src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/NotifyRequestForCatalogProcessor.java        |    3 
 src/main/java/com/genersoft/iot/vmp/gb28181/utils/XmlUtil.java                                                       |    7 
 src/main/java/com/genersoft/iot/vmp/gb28181/bean/DeviceChannel.java                                                  |    2 
 src/main/java/com/genersoft/iot/vmp/service/IDeviceChannelService.java                                               |    4 
 src/main/java/com/genersoft/iot/vmp/conf/redis/RedisRpcConfig.java                                                   |   14 +-
 src/main/java/com/genersoft/iot/vmp/service/impl/DeviceChannelServiceImpl.java                                       |   10 ++
 src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/NotifyRequestForMobilePositionProcessor.java |  214 ++++++++++++++++++++++++++++++++++++++++++
 src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/NotifyRequestProcessor.java                  |   12 +-
 src/main/resources/application.yml                                                                                   |    2 
 11 files changed, 253 insertions(+), 19 deletions(-)

diff --git a/src/main/java/com/genersoft/iot/vmp/conf/redis/RedisRpcConfig.java b/src/main/java/com/genersoft/iot/vmp/conf/redis/RedisRpcConfig.java
index e49b01d..661e370 100644
--- a/src/main/java/com/genersoft/iot/vmp/conf/redis/RedisRpcConfig.java
+++ b/src/main/java/com/genersoft/iot/vmp/conf/redis/RedisRpcConfig.java
@@ -15,7 +15,6 @@
 import org.springframework.data.redis.connection.Message;
 import org.springframework.data.redis.connection.MessageListener;
 import org.springframework.data.redis.core.RedisTemplate;
-import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
 import org.springframework.stereotype.Component;
 
@@ -216,10 +215,11 @@
         return callbacks.size();
     }
 
-    @Scheduled(fixedRate = 1000)   //姣�1绉掓墽琛屼竴娆�
-    public void execute(){
-        System.out.println("callbacks鐨勯暱搴�: " + callbacks.size());
-        System.out.println("闃熷垪鐨勯暱搴�: " + topicSubscribers.size());
-        System.out.println("HOOK鐩戝惉鐨勯暱搴�: " + hookSubscribe.size());
-    }
+//    @Scheduled(fixedRate = 1000)   //姣�1绉掓墽琛屼竴娆�
+//    public void execute(){
+//        logger.info("callbacks鐨勯暱搴�: " + callbacks.size());
+//        logger.info("闃熷垪鐨勯暱搴�: " + topicSubscribers.size());
+//        logger.info("HOOK鐩戝惉鐨勯暱搴�: " + hookSubscribe.size());
+//        logger.info("");
+//    }
 }
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/bean/DeviceChannel.java b/src/main/java/com/genersoft/iot/vmp/gb28181/bean/DeviceChannel.java
index 2593ec6..8290a45 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/bean/DeviceChannel.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/bean/DeviceChannel.java
@@ -238,7 +238,7 @@
 	 *  鏄惁鍚湁闊抽
 	 */
 	@Schema(description = "鏄惁鍚湁闊抽")
-	private boolean hasAudio;
+	private Boolean hasAudio;
 
 	/**
 	 * 鏍囪閫氶亾鐨勭被鍨嬶紝0->鍥芥爣閫氶亾 1->鐩存挱娴侀�氶亾 2->涓氬姟鍒嗙粍/铏氭嫙缁勭粐/琛屾斂鍖哄垝
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/InviteRequestProcessor.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/InviteRequestProcessor.java
index 8e2f503..d61a818 100755
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/InviteRequestProcessor.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/InviteRequestProcessor.java
@@ -831,6 +831,7 @@
             }
         });
         // 娣诲姞鍥炲鐨勬嫆缁濇垨鑰呴敊璇殑閫氱煡
+        // redis娑堟伅渚嬪锛� PUBLISH VM_MSG_STREAM_PUSH_RESPONSE  '{"code":1,"msg":"澶辫触","app":"1","stream":"2"}'
         redisPushStreamResponseListener.addEvent(sendRtpItem.getApp(), sendRtpItem.getStream(), response -> {
             if (response.getCode() != 0) {
                 dynamicTask.stop(sendRtpItem.getCallId());
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/NotifyRequestForCatalogProcessor.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/NotifyRequestForCatalogProcessor.java
index cd97786..cde70eb 100755
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/NotifyRequestForCatalogProcessor.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/NotifyRequestForCatalogProcessor.java
@@ -295,9 +295,10 @@
 
 	private void executeSaveForUpdate(){
 		if (!updateChannelMap.values().isEmpty()) {
+			logger.info("[瀛樺偍鏀跺埌鐨勬洿鏂伴�氶亾], 鏁伴噺锛� {}", updateChannelMap.size());
 			ArrayList<DeviceChannel> deviceChannels = new ArrayList<>(updateChannelMap.values());
-			updateChannelMap.clear();
 			deviceChannelService.batchUpdateChannel(deviceChannels);
+			updateChannelMap.clear();
 		}
 
 	}
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/NotifyRequestForMobilePositionProcessor.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/NotifyRequestForMobilePositionProcessor.java
new file mode 100755
index 0000000..89f57c2
--- /dev/null
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/NotifyRequestForMobilePositionProcessor.java
@@ -0,0 +1,214 @@
+package com.genersoft.iot.vmp.gb28181.transmit.event.request.impl;
+
+import com.genersoft.iot.vmp.conf.CivilCodeFileConf;
+import com.genersoft.iot.vmp.conf.DynamicTask;
+import com.genersoft.iot.vmp.conf.SipConfig;
+import com.genersoft.iot.vmp.conf.UserSetting;
+import com.genersoft.iot.vmp.gb28181.bean.Device;
+import com.genersoft.iot.vmp.gb28181.bean.DeviceChannel;
+import com.genersoft.iot.vmp.gb28181.bean.MobilePosition;
+import com.genersoft.iot.vmp.gb28181.event.EventPublisher;
+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;
+import com.genersoft.iot.vmp.service.IDeviceChannelService;
+import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
+import com.genersoft.iot.vmp.utils.DateUtil;
+import org.dom4j.DocumentException;
+import org.dom4j.Element;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+import org.springframework.util.ObjectUtils;
+
+import javax.sip.RequestEvent;
+import javax.sip.header.FromHeader;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.CopyOnWriteArrayList;
+
+/**
+ * SIP鍛戒护绫诲瀷锛� NOTIFY璇锋眰涓殑绉诲姩浣嶇疆璇锋眰澶勭悊
+ */
+@Component
+public class NotifyRequestForMobilePositionProcessor extends SIPRequestProcessorParent {
+
+
+    private final static Logger logger = LoggerFactory.getLogger(NotifyRequestForMobilePositionProcessor.class);
+
+	private final Map<String, DeviceChannel> updateChannelMap = new ConcurrentHashMap<>();
+
+	private final List<MobilePosition> addMobilePositionList = new CopyOnWriteArrayList();
+
+
+	@Autowired
+	private UserSetting userSetting;
+
+	@Autowired
+	private EventPublisher eventPublisher;
+
+	@Autowired
+	private IRedisCatchStorage redisCatchStorage;
+
+	@Autowired
+	private IDeviceChannelService deviceChannelService;
+
+	@Autowired
+	private DynamicTask dynamicTask;
+
+	@Autowired
+	private CivilCodeFileConf civilCodeFileConf;
+
+	@Autowired
+	private SipConfig sipConfig;
+
+	private final static String talkKey = "notify-request-for-mobile-position-task";
+
+	public void process(RequestEvent evt) {
+		try {
+			FromHeader fromHeader = (FromHeader) evt.getRequest().getHeader(FromHeader.NAME);
+			String deviceId = SipUtils.getUserIdFromFromHeader(fromHeader);
+
+			// 鍥炲 200 OK
+			Element rootElement = getRootElement(evt);
+			if (rootElement == null) {
+				logger.error("澶勭悊MobilePosition绉诲姩浣嶇疆Notify鏃舵湭鑾峰彇鍒版秷鎭綋,{}", evt.getRequest());
+				return;
+			}
+
+			MobilePosition mobilePosition = new MobilePosition();
+			mobilePosition.setCreateTime(DateUtil.getNow());
+
+			Element deviceIdElement = rootElement.element("DeviceID");
+			String channelId = deviceIdElement.getTextTrim().toString();
+			Device device = redisCatchStorage.getDevice(deviceId);
+
+			if (device == null) {
+				device = redisCatchStorage.getDevice(channelId);
+				if (device == null) {
+					// 鏍规嵁閫氶亾id鏌ヨ璁惧Id
+					List<Device> deviceList = deviceChannelService.getDeviceByChannelId(channelId);
+					if (deviceList.size() > 0) {
+						device = deviceList.get(0);
+					}
+				}
+			}
+			if (device == null) {
+				logger.warn("[mobilePosition绉诲姩浣嶇疆Notify] 鏈壘鍒伴�氶亾{}鎵�灞炵殑璁惧", channelId);
+				return;
+			}
+			// 鍏煎璁惧閮ㄥ垎璁惧涓婃姤鏄�氶亾缂栧彿涓庤澶囩紪鍙蜂竴鑷寸殑鎯呭喌
+			if (deviceId.equals(channelId)) {
+				List<DeviceChannel> deviceChannels = deviceChannelService.queryChaneListByDeviceId(deviceId);
+				if (deviceChannels.size() == 1) {
+					channelId = deviceChannels.get(0).getChannelId();
+				}
+			}
+			if (!ObjectUtils.isEmpty(device.getName())) {
+				mobilePosition.setDeviceName(device.getName());
+			}
+
+			mobilePosition.setDeviceId(device.getDeviceId());
+			mobilePosition.setChannelId(channelId);
+			String time = XmlUtil.getText(rootElement, "Time");
+			if (ObjectUtils.isEmpty(time)) {
+				mobilePosition.setTime(DateUtil.getNow());
+			} else {
+				mobilePosition.setTime(SipUtils.parseTime(time));
+			}
+
+			mobilePosition.setLongitude(Double.parseDouble(XmlUtil.getText(rootElement, "Longitude")));
+			mobilePosition.setLatitude(Double.parseDouble(XmlUtil.getText(rootElement, "Latitude")));
+			if (NumericUtil.isDouble(XmlUtil.getText(rootElement, "Speed"))) {
+				mobilePosition.setSpeed(Double.parseDouble(XmlUtil.getText(rootElement, "Speed")));
+			} else {
+				mobilePosition.setSpeed(0.0);
+			}
+			if (NumericUtil.isDouble(XmlUtil.getText(rootElement, "Direction"))) {
+				mobilePosition.setDirection(Double.parseDouble(XmlUtil.getText(rootElement, "Direction")));
+			} else {
+				mobilePosition.setDirection(0.0);
+			}
+			if (NumericUtil.isDouble(XmlUtil.getText(rootElement, "Altitude"))) {
+				mobilePosition.setAltitude(Double.parseDouble(XmlUtil.getText(rootElement, "Altitude")));
+			} else {
+				mobilePosition.setAltitude(0.0);
+			}
+			logger.info("[鏀跺埌绉诲姩浣嶇疆璁㈤槄閫氱煡]锛歿}/{}->{}.{}", mobilePosition.getDeviceId(), mobilePosition.getChannelId(),
+					mobilePosition.getLongitude(), mobilePosition.getLatitude());
+			mobilePosition.setReportSource("Mobile Position");
+
+			// 鏇存柊device channel 鐨勭粡绾害
+			DeviceChannel deviceChannel = new DeviceChannel();
+			deviceChannel.setDeviceId(device.getDeviceId());
+			deviceChannel.setChannelId(channelId);
+			deviceChannel.setLongitude(mobilePosition.getLongitude());
+			deviceChannel.setLatitude(mobilePosition.getLatitude());
+			deviceChannel.setGpsTime(mobilePosition.getTime());
+			updateChannelMap.put(channelId, deviceChannel);
+			addMobilePositionList.add(mobilePosition);
+			if(updateChannelMap.size() > 300) {
+				executeSaveChannel();
+			}
+			if (userSetting.isSavePositionHistory()) {
+				if(addMobilePositionList.size() > 300) {
+					executeSaveMobilePosition();
+				}
+			}
+
+//			deviceChannel = deviceChannelService.updateGps(deviceChannel, device);
+//
+//			mobilePosition.setLongitudeWgs84(deviceChannel.getLongitudeWgs84());
+//			mobilePosition.setLatitudeWgs84(deviceChannel.getLatitudeWgs84());
+//			mobilePosition.setLongitudeGcj02(deviceChannel.getLongitudeGcj02());
+//			mobilePosition.setLatitudeGcj02(deviceChannel.getLatitudeGcj02());
+
+//			deviceChannelService.updateChannelGPS(device, deviceChannel, mobilePosition);
+
+			if (!dynamicTask.contains(talkKey)) {
+				dynamicTask.startDelay(talkKey, this::executeSave, 1000);
+			}
+
+		} catch (DocumentException e) {
+			logger.error("鏈鐞嗙殑寮傚父 ", e);
+		}
+
+
+	}
+
+	private void executeSave(){
+		executeSaveChannel();
+		executeSaveMobilePosition();
+		dynamicTask.stop(talkKey);
+	}
+
+	private void executeSaveChannel(){
+		try {
+			logger.info("[绉诲姩浣嶇疆璁㈤槄]鏇存柊閫氶亾浣嶇疆锛� {}", updateChannelMap.size());
+			ArrayList<DeviceChannel> deviceChannels = new ArrayList<>(updateChannelMap.values());
+			deviceChannelService.batchUpdateChannelGPS(deviceChannels);
+			updateChannelMap.clear();
+		}catch (Exception e) {
+
+		}
+	}
+
+	private void executeSaveMobilePosition(){
+		if (userSetting.isSavePositionHistory()) {
+			try {
+				logger.info("[绉诲姩浣嶇疆璁㈤槄] 娣诲姞閫氶亾杞ㄨ抗鐐逛綅锛� {}", addMobilePositionList.size());
+				deviceChannelService.batchAddMobilePosition(addMobilePositionList);
+				addMobilePositionList.clear();
+			}catch (Exception e) {
+				logger.info("[绉诲姩浣嶇疆璁㈤槄] b娣诲姞閫氶亾杞ㄨ抗鐐逛綅淇濆瓨澶辫触锛� {}", addMobilePositionList.size());
+			}
+		}
+	}
+
+
+
+}
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/NotifyRequestProcessor.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/NotifyRequestProcessor.java
index edfee49..84f44b5 100755
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/NotifyRequestProcessor.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/NotifyRequestProcessor.java
@@ -228,12 +228,12 @@
 			deviceChannel.setLongitude(mobilePosition.getLongitude());
 			deviceChannel.setLatitude(mobilePosition.getLatitude());
 			deviceChannel.setGpsTime(mobilePosition.getTime());
-			deviceChannel = deviceChannelService.updateGps(deviceChannel, device);
-
-			mobilePosition.setLongitudeWgs84(deviceChannel.getLongitudeWgs84());
-			mobilePosition.setLatitudeWgs84(deviceChannel.getLatitudeWgs84());
-			mobilePosition.setLongitudeGcj02(deviceChannel.getLongitudeGcj02());
-			mobilePosition.setLatitudeGcj02(deviceChannel.getLatitudeGcj02());
+//			deviceChannel = deviceChannelService.updateGps(deviceChannel, device);
+//
+//			mobilePosition.setLongitudeWgs84(deviceChannel.getLongitudeWgs84());
+//			mobilePosition.setLatitudeWgs84(deviceChannel.getLatitudeWgs84());
+//			mobilePosition.setLongitudeGcj02(deviceChannel.getLongitudeGcj02());
+//			mobilePosition.setLatitudeGcj02(deviceChannel.getLatitudeGcj02());
 
 			deviceChannelService.updateChannelGPS(device, deviceChannel, mobilePosition);
 
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/utils/XmlUtil.java b/src/main/java/com/genersoft/iot/vmp/gb28181/utils/XmlUtil.java
index 70702bb..6596f53 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/utils/XmlUtil.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/utils/XmlUtil.java
@@ -532,16 +532,17 @@
                     String status = getText(itemDevice, "Status");
                     if (status != null) {
                         // ONLINE OFFLINE HIKVISION DS-7716N-E4 NVR鐨勫吋瀹规�у鐞�
-                        if (status.equals("ON") || status.equals("On") || status.equals("ONLINE") || status.equals("OK")) {
+                        if (status.equalsIgnoreCase("ON") || status.equalsIgnoreCase("On") || status.equalsIgnoreCase("ONLINE") || status.equalsIgnoreCase("OK")) {
                             deviceChannel.setStatus(true);
                         }
-                        if (status.equals("OFF") || status.equals("Off") || status.equals("OFFLINE")) {
+                        if (status.equalsIgnoreCase("OFF") || status.equalsIgnoreCase("Off") || status.equalsIgnoreCase("OFFLINE")) {
                             deviceChannel.setStatus(false);
                         }
                     }else {
                         deviceChannel.setStatus(true);
                     }
-
+//                    logger.info("鐘舵�佸瓧绗︿覆锛� {}", status);
+//                    logger.info("鐘舵�佺粨鏋滐細 {}", deviceChannel.isStatus());
                     // 缁忓害
                     String longitude = getText(itemDevice, "Longitude");
                     if (NumericUtil.isDouble(longitude)) {
diff --git a/src/main/java/com/genersoft/iot/vmp/service/IDeviceChannelService.java b/src/main/java/com/genersoft/iot/vmp/service/IDeviceChannelService.java
index c690f11..7dd04e8 100755
--- a/src/main/java/com/genersoft/iot/vmp/service/IDeviceChannelService.java
+++ b/src/main/java/com/genersoft/iot/vmp/service/IDeviceChannelService.java
@@ -98,4 +98,8 @@
 
     void updateChannelGPS(Device device, DeviceChannel deviceChannel, MobilePosition mobilePosition);
 
+    void batchUpdateChannelGPS(List<DeviceChannel> channelList);
+
+    void batchAddMobilePosition(List<MobilePosition> addMobilePositionList);
+
 }
diff --git a/src/main/java/com/genersoft/iot/vmp/service/impl/DeviceChannelServiceImpl.java b/src/main/java/com/genersoft/iot/vmp/service/impl/DeviceChannelServiceImpl.java
index 632be91..3760381 100755
--- a/src/main/java/com/genersoft/iot/vmp/service/impl/DeviceChannelServiceImpl.java
+++ b/src/main/java/com/genersoft/iot/vmp/service/impl/DeviceChannelServiceImpl.java
@@ -353,4 +353,14 @@
             redisCatchStorage.sendMobilePositionMsg(jsonObject);
         }
     }
+
+    @Override
+    public void batchUpdateChannelGPS(List<DeviceChannel> channelList) {
+
+    }
+
+    @Override
+    public void batchAddMobilePosition(List<MobilePosition> mobilePositions) {
+
+    }
 }
diff --git a/src/main/java/com/genersoft/iot/vmp/service/impl/DeviceServiceImpl.java b/src/main/java/com/genersoft/iot/vmp/service/impl/DeviceServiceImpl.java
index 2c2674f..f4c9923 100755
--- a/src/main/java/com/genersoft/iot/vmp/service/impl/DeviceServiceImpl.java
+++ b/src/main/java/com/genersoft/iot/vmp/service/impl/DeviceServiceImpl.java
@@ -565,6 +565,7 @@
                     removeMobilePositionSubscribe(deviceInStore, result->{
                         // 寮�鍚闃�
                         deviceInStore.setSubscribeCycleForMobilePosition(device.getSubscribeCycleForMobilePosition());
+                        deviceInStore.setMobilePositionSubmissionInterval(device.getMobilePositionSubmissionInterval());
                         addMobilePositionSubscribe(deviceInStore);
                         // 鍥犱负鏄紓姝ユ墽琛岋紝闇�瑕佸湪杩欓噷鏇存柊涓嬫暟鎹�
                         deviceMapper.updateCustom(deviceInStore);
@@ -573,12 +574,14 @@
                 }else {
                     // 寮�鍚闃�
                     deviceInStore.setSubscribeCycleForMobilePosition(device.getSubscribeCycleForMobilePosition());
+                    deviceInStore.setMobilePositionSubmissionInterval(device.getMobilePositionSubmissionInterval());
                     addMobilePositionSubscribe(deviceInStore);
                 }
 
             }else if (device.getSubscribeCycleForMobilePosition() == 0) {
                 // 鍙栨秷璁㈤槄
                 deviceInStore.setSubscribeCycleForMobilePosition(0);
+                deviceInStore.setMobilePositionSubmissionInterval(0);
                 removeMobilePositionSubscribe(deviceInStore, null);
             }
         }
diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml
index 69f947e..3f47844 100644
--- a/src/main/resources/application.yml
+++ b/src/main/resources/application.yml
@@ -2,4 +2,4 @@
   application:
     name: wvp
   profiles:
-    active: local2
\ No newline at end of file
+    active: local
\ No newline at end of file

--
Gitblit v1.8.0