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