From ea32cd2673b83b9481e8cc45705d2d3a84e884bb Mon Sep 17 00:00:00 2001
From: 64850858 <648540858@qq.com>
Date: 星期一, 26 七月 2021 13:21:03 +0800
Subject: [PATCH] 重启后对心跳超时的设备设置为离线。

---
 src/main/java/com/genersoft/iot/vmp/conf/SipDeviceRunner.java                                  |   36 ++++++++++++++++++
 src/main/java/com/genersoft/iot/vmp/storager/impl/RedisCatchStorageImpl.java                   |   11 +++++
 src/main/java/com/genersoft/iot/vmp/storager/IRedisCatchStorage.java                           |    5 ++
 src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/MessageRequestProcessor.java |   30 ++++++++++----
 4 files changed, 73 insertions(+), 9 deletions(-)

diff --git a/src/main/java/com/genersoft/iot/vmp/conf/SipDeviceRunner.java b/src/main/java/com/genersoft/iot/vmp/conf/SipDeviceRunner.java
new file mode 100644
index 0000000..68bb1a6
--- /dev/null
+++ b/src/main/java/com/genersoft/iot/vmp/conf/SipDeviceRunner.java
@@ -0,0 +1,36 @@
+package com.genersoft.iot.vmp.conf;
+
+import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
+import com.genersoft.iot.vmp.storager.IVideoManagerStorager;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.CommandLineRunner;
+import org.springframework.core.annotation.Order;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+
+/**
+ * 绯荤粺鍚姩鏃舵帶鍒惰澶囩绾�
+ */
+@Component
+@Order(value=4)
+public class SipDeviceRunner implements CommandLineRunner {
+
+    @Autowired
+    private IVideoManagerStorager storager;
+
+    @Autowired
+    private IRedisCatchStorage redisCatchStorage;
+
+    @Override
+    public void run(String... args) throws Exception {
+        // 璇诲彇redis娌℃湁蹇冭烦淇℃伅鐨勫垯璁剧疆涓虹绾匡紝绛夋敹鍒颁笅娆″績璺宠缃负鍦ㄧ嚎
+        // 璁剧疆鎵�鏈夎澶囩绾�
+        storager.outlineForAll();
+        List<String> onlineForAll = redisCatchStorage.getOnlineForAll();
+        for (String deviceId : onlineForAll) {
+            storager.online(deviceId);
+        }
+    }
+}
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/MessageRequestProcessor.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/MessageRequestProcessor.java
index 70e64a5..d46c0c4 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/MessageRequestProcessor.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/MessageRequestProcessor.java
@@ -771,19 +771,31 @@
 			Element rootElement = getRootElement(evt);
 			String deviceId = XmlUtil.getText(rootElement, "DeviceID");
 			Device device = storager.queryVideoDevice(deviceId);
-			// 妫�鏌ヨ澶囨槸鍚﹀瓨鍦ㄥ苟鍦ㄧ嚎锛� 涓嶅瓨鍦ㄥ垯涓嶅洖澶�
-			if (device != null && device.getOnline() == 1) {
+
+			// 妫�鏌ヨ澶囨槸鍚﹀瓨鍦ㄥ苟鍦ㄧ嚎锛� 涓嶅湪绾垮垯璁剧疆涓哄湪绾�
+			if (device != null ) {
 				// 鍥炲200 OK
 				responseAck(evt);
-				if (offLineDetector.isOnline(deviceId)) {
-					publisher.onlineEventPublish(device, VideoManagerConstants.EVENT_ONLINE_KEEPLIVE);
-				} else {
-				}
-			}else {
-				logger.warn("鏀跺埌[ "+deviceId+" ]蹇冭烦淇℃伅, 浣嗘槸璁惧" + (device == null? "涓嶅瓨鍦�":"绂荤嚎") + ", 鍥炲401");
-				Response response = getMessageFactory().createResponse(Response.UNAUTHORIZED, evt.getRequest());
+				publisher.onlineEventPublish(device, VideoManagerConstants.EVENT_ONLINE_KEEPLIVE);
+			}else{
+				logger.warn("鏀跺埌[ "+deviceId+" ]蹇冭烦淇℃伅, 浣嗘槸璁惧涓嶅瓨鍦�, 鍥炲404");
+				Response response = getMessageFactory().createResponse(Response.NOT_FOUND, evt.getRequest());
 				getServerTransaction(evt).sendResponse(response);
 			}
+
+//			if (device != null && device.getOnline() == 1) {
+//
+//				if (offLineDetector.isOnline(deviceId)) {
+//					publisher.onlineEventPublish(device, VideoManagerConstants.EVENT_ONLINE_KEEPLIVE);
+//				} else {
+//				}
+//			}else {
+////				logger.warn("鏀跺埌[ "+deviceId+" ]蹇冭烦淇℃伅, 浣嗘槸璁惧" + (device == null? "涓嶅瓨鍦�":"绂荤嚎") + ", 鍥炲401");
+////				Response response = getMessageFactory().createResponse(Response.UNAUTHORIZED, evt.getRequest());
+////				getServerTransaction(evt).sendResponse(response);
+//				publisher.onlineEventPublish(device, VideoManagerConstants.EVENT_ONLINE_KEEPLIVE);
+//
+//			}
 		} catch (ParseException | SipException | InvalidArgumentException | DocumentException e) {
 			e.printStackTrace();
 		}
diff --git a/src/main/java/com/genersoft/iot/vmp/storager/IRedisCatchStorage.java b/src/main/java/com/genersoft/iot/vmp/storager/IRedisCatchStorage.java
index f5b2b1b..e4313d9 100644
--- a/src/main/java/com/genersoft/iot/vmp/storager/IRedisCatchStorage.java
+++ b/src/main/java/com/genersoft/iot/vmp/storager/IRedisCatchStorage.java
@@ -113,6 +113,11 @@
     void outlineForAll();
 
     /**
+     * 鑾峰彇鎵�鏈夊湪绾跨殑
+     */
+    List<String> getOnlineForAll();
+
+    /**
      * 鍦╮edis娣诲姞wvp鐨勪俊鎭�
      */
     void updateWVPInfo(JSONObject jsonObject);
diff --git a/src/main/java/com/genersoft/iot/vmp/storager/impl/RedisCatchStorageImpl.java b/src/main/java/com/genersoft/iot/vmp/storager/impl/RedisCatchStorageImpl.java
index 08eb9d1..e5b1269 100644
--- a/src/main/java/com/genersoft/iot/vmp/storager/impl/RedisCatchStorageImpl.java
+++ b/src/main/java/com/genersoft/iot/vmp/storager/impl/RedisCatchStorageImpl.java
@@ -284,6 +284,17 @@
     }
 
     @Override
+    public List<String> getOnlineForAll() {
+        List<String> result = new ArrayList<>();
+        List<Object> onlineDevices = redis.scan(VideoManagerConstants.KEEPLIVEKEY_PREFIX + "*" );
+        for (int i = 0; i < onlineDevices.size(); i++) {
+            String key = (String) onlineDevices.get(i);
+            result.add((String) redis.get(key));
+        }
+        return result;
+    }
+
+    @Override
     public void updateWVPInfo(JSONObject jsonObject) {
 
     }

--
Gitblit v1.8.0