From f513f5ef67409a0db26d85a95a5e3b127595aaca Mon Sep 17 00:00:00 2001
From: mk1990 <153958232@qq.com>
Date: 星期三, 25 五月 2022 14:09:43 +0800
Subject: [PATCH] 解决海康设备在实时监控模块中无法获取到通道信息
---
src/main/java/com/genersoft/iot/vmp/service/impl/DeviceServiceImpl.java | 100 ++++++++++++++++++++++++++++++++++++--------------
1 files changed, 72 insertions(+), 28 deletions(-)
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 ce211c3..e4a2a19 100644
--- a/src/main/java/com/genersoft/iot/vmp/service/impl/DeviceServiceImpl.java
+++ b/src/main/java/com/genersoft/iot/vmp/service/impl/DeviceServiceImpl.java
@@ -11,23 +11,18 @@
import com.genersoft.iot.vmp.gb28181.task.impl.MobilePositionSubscribeTask;
import com.genersoft.iot.vmp.gb28181.bean.SyncStatus;
import com.genersoft.iot.vmp.service.IMediaServerService;
-import com.genersoft.iot.vmp.service.IMediaService;
import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
import com.genersoft.iot.vmp.storager.dao.DeviceMapper;
import com.genersoft.iot.vmp.utils.DateUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Qualifier;
-import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import org.springframework.stereotype.Service;
+import org.springframework.util.StringUtils;
-import javax.sip.DialogState;
-import javax.sip.TimeoutEvent;
-import java.text.ParseException;
-import java.util.Calendar;
-import java.util.Date;
+import java.time.Instant;
import java.util.List;
+import java.util.concurrent.TimeUnit;
/**
* 璁惧涓氬姟锛堢洰褰曡闃咃級
@@ -65,7 +60,7 @@
@Override
public void online(Device device) {
- logger.info("[璁惧涓婄嚎]锛宒eviceId锛�" + device.getDeviceId());
+ logger.info("[璁惧涓婄嚎] deviceId锛歿}->{}:{}", device.getDeviceId(), device.getIp(), device.getPort());
Device deviceInRedis = redisCatchStorage.getDevice(device.getDeviceId());
Device deviceInDb = deviceMapper.getDeviceByDeviceId(device.getDeviceId());
@@ -73,21 +68,24 @@
if (deviceInRedis != null && deviceInDb == null) {
// redis 瀛樺湪鑴忔暟鎹�
redisCatchStorage.clearCatchByDeviceId(device.getDeviceId());
- device.setCreateTime(now);
+
}
+ device.setUpdateTime(now);
device.setOnline(1);
- device.setRegisterTime(now);
// 绗竴娆′笂绾�
if (device.getCreateTime() == null) {
+ device.setCreateTime(now);
logger.info("[璁惧涓婄嚎,棣栨娉ㄥ唽]: {}锛屾煡璇㈣澶囦俊鎭互鍙婇�氶亾淇℃伅", device.getDeviceId());
+ deviceMapper.add(device);
+ redisCatchStorage.updateDevice(device);
commander.deviceInfoQuery(device);
sync(device);
- deviceMapper.add(device);
}else {
deviceMapper.update(device);
+ redisCatchStorage.updateDevice(device);
}
- redisCatchStorage.updateDevice(device);
+
// 涓婄嚎娣诲姞璁㈤槄
if (device.getSubscribeCycleForCatalog() > 0) {
// 鏌ヨ鍦ㄧ嚎璁惧閭d簺寮�鍚簡璁㈤槄锛屼负璁惧寮�鍚畾鏃剁殑鐩綍璁㈤槄
@@ -99,9 +97,7 @@
// 鍒锋柊杩囨湡浠诲姟
String registerExpireTaskKey = registerExpireTaskKeyPrefix + device.getDeviceId();
dynamicTask.stop(registerExpireTaskKey);
- dynamicTask.startDelay(registerExpireTaskKey, ()->{
- offline(device.getDeviceId());
- }, device.getExpires() * 1000);
+ dynamicTask.startDelay(registerExpireTaskKey, ()-> offline(device.getDeviceId()), device.getExpires() * 1000);
}
@Override
@@ -215,18 +211,9 @@
@Override
public boolean expire(Device device) {
- Date registerTimeDate;
- try {
- registerTimeDate = DateUtil.format.parse(device.getRegisterTime());
- } catch (ParseException e) {
- logger.error("璁惧鏃堕棿鏍煎紡鍖栧け璐ワ細{}->{} ", device.getDeviceId(), device.getRegisterTime() );
- return false;
- }
- int expires = device.getExpires();
- Calendar calendarForExpire = Calendar.getInstance();
- calendarForExpire.setTime(registerTimeDate);
- calendarForExpire.set(Calendar.SECOND, calendarForExpire.get(Calendar.SECOND) + expires);
- return calendarForExpire.before(DateUtil.getNow());
+ Instant registerTimeDate = Instant.from(DateUtil.formatter.parse(device.getRegisterTime()));
+ Instant expireInstant = registerTimeDate.plusMillis(TimeUnit.SECONDS.toMillis(device.getExpires()));
+ return expireInstant.isBefore(Instant.now());
}
@Override
@@ -242,4 +229,61 @@
public Device getDeviceByHostAndPort(String host, int port) {
return deviceMapper.getDeviceByHostAndPort(host, port);
}
+
+ @Override
+ public void updateDevice(Device device) {
+
+ Device deviceInStore = deviceMapper.getDeviceByDeviceId(device.getDeviceId());
+ if (deviceInStore == null) {
+ logger.warn("鏇存柊璁惧鏃舵湭鎵惧埌璁惧淇℃伅");
+ return;
+ }
+ if (!StringUtils.isEmpty(device.getName())) {
+ deviceInStore.setName(device.getName());
+ }
+ if (!StringUtils.isEmpty(device.getCharset())) {
+ deviceInStore.setCharset(device.getCharset());
+ }
+ if (!StringUtils.isEmpty(device.getMediaServerId())) {
+ deviceInStore.setMediaServerId(device.getMediaServerId());
+ }
+
+ // 鐩綍璁㈤槄鐩稿叧鐨勪俊鎭�
+ if (device.getSubscribeCycleForCatalog() > 0) {
+ if (deviceInStore.getSubscribeCycleForCatalog() == 0 || deviceInStore.getSubscribeCycleForCatalog() != device.getSubscribeCycleForCatalog()) {
+ deviceInStore.setSubscribeCycleForCatalog(device.getSubscribeCycleForCatalog());
+ // 寮�鍚闃�
+ addCatalogSubscribe(deviceInStore);
+ }
+ }else if (device.getSubscribeCycleForCatalog() == 0) {
+ if (deviceInStore.getSubscribeCycleForCatalog() != 0) {
+ deviceInStore.setSubscribeCycleForCatalog(device.getSubscribeCycleForCatalog());
+ // 鍙栨秷璁㈤槄
+ removeCatalogSubscribe(deviceInStore);
+ }
+ }
+
+ // 绉诲姩浣嶇疆璁㈤槄鐩稿叧鐨勪俊鎭�
+ if (device.getSubscribeCycleForMobilePosition() > 0) {
+ if (deviceInStore.getSubscribeCycleForMobilePosition() == 0 || deviceInStore.getSubscribeCycleForMobilePosition() != device.getSubscribeCycleForMobilePosition()) {
+ deviceInStore.setMobilePositionSubmissionInterval(device.getMobilePositionSubmissionInterval());
+ deviceInStore.setSubscribeCycleForMobilePosition(device.getSubscribeCycleForMobilePosition());
+ // 寮�鍚闃�
+ addMobilePositionSubscribe(deviceInStore);
+ }
+ }else if (device.getSubscribeCycleForMobilePosition() == 0) {
+ if (deviceInStore.getSubscribeCycleForMobilePosition() != 0) {
+ // 鍙栨秷璁㈤槄
+ removeMobilePositionSubscribe(deviceInStore);
+ }
+ }
+
+ String now = DateUtil.getNow();
+ device.setUpdateTime(now);
+ device.setCharset(device.getCharset().toUpperCase());
+ device.setUpdateTime(DateUtil.getNow());
+ if (deviceMapper.update(device) > 0) {
+ redisCatchStorage.updateDevice(device);
+ }
+ }
}
--
Gitblit v1.8.0