From f6893cf95b15531dfc45950fea7e780e045ba2ae Mon Sep 17 00:00:00 2001 From: 648540858 <648540858@qq.com> Date: 星期三, 11 五月 2022 18:37:24 +0800 Subject: [PATCH] 优化设备在线状态 --- src/main/java/com/genersoft/iot/vmp/service/impl/DeviceServiceImpl.java | 135 ++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 133 insertions(+), 2 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 39a59f8..ce211c3 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 @@ -2,13 +2,19 @@ import com.genersoft.iot.vmp.conf.DynamicTask; import com.genersoft.iot.vmp.gb28181.bean.Device; +import com.genersoft.iot.vmp.gb28181.bean.SsrcTransaction; +import com.genersoft.iot.vmp.gb28181.session.VideoStreamSessionManager; import com.genersoft.iot.vmp.gb28181.transmit.cmd.ISIPCommander; import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.response.cmd.CatalogResponseMessageHandler; import com.genersoft.iot.vmp.service.IDeviceService; import com.genersoft.iot.vmp.gb28181.task.impl.CatalogSubscribeTask; 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; @@ -17,6 +23,11 @@ import org.springframework.stereotype.Service; import javax.sip.DialogState; +import javax.sip.TimeoutEvent; +import java.text.ParseException; +import java.util.Calendar; +import java.util.Date; +import java.util.List; /** * 璁惧涓氬姟锛堢洰褰曡闃咃級 @@ -25,6 +36,8 @@ public class DeviceServiceImpl implements IDeviceService { private final static Logger logger = LoggerFactory.getLogger(DeviceServiceImpl.class); + + private final String registerExpireTaskKeyPrefix = "device-register-expire-"; @Autowired private DynamicTask dynamicTask; @@ -38,6 +51,84 @@ @Autowired private IRedisCatchStorage redisCatchStorage; + @Autowired + private DeviceMapper deviceMapper; + + @Autowired + private ISIPCommander commander; + + @Autowired + private VideoStreamSessionManager streamSession; + + @Autowired + private IMediaServerService mediaServerService; + + @Override + public void online(Device device) { + logger.info("[璁惧涓婄嚎]锛宒eviceId锛�" + device.getDeviceId()); + Device deviceInRedis = redisCatchStorage.getDevice(device.getDeviceId()); + Device deviceInDb = deviceMapper.getDeviceByDeviceId(device.getDeviceId()); + + String now = DateUtil.getNow(); + if (deviceInRedis != null && deviceInDb == null) { + // redis 瀛樺湪鑴忔暟鎹� + redisCatchStorage.clearCatchByDeviceId(device.getDeviceId()); + device.setCreateTime(now); + } + device.setOnline(1); + device.setRegisterTime(now); + + // 绗竴娆′笂绾� + if (device.getCreateTime() == null) { + logger.info("[璁惧涓婄嚎,棣栨娉ㄥ唽]: {}锛屾煡璇㈣澶囦俊鎭互鍙婇�氶亾淇℃伅", device.getDeviceId()); + commander.deviceInfoQuery(device); + sync(device); + deviceMapper.add(device); + }else { + deviceMapper.update(device); + } + redisCatchStorage.updateDevice(device); + // 涓婄嚎娣诲姞璁㈤槄 + if (device.getSubscribeCycleForCatalog() > 0) { + // 鏌ヨ鍦ㄧ嚎璁惧閭d簺寮�鍚簡璁㈤槄锛屼负璁惧寮�鍚畾鏃剁殑鐩綍璁㈤槄 + addCatalogSubscribe(device); + } + if (device.getSubscribeCycleForMobilePosition() > 0) { + addMobilePositionSubscribe(device); + } + // 鍒锋柊杩囨湡浠诲姟 + String registerExpireTaskKey = registerExpireTaskKeyPrefix + device.getDeviceId(); + dynamicTask.stop(registerExpireTaskKey); + dynamicTask.startDelay(registerExpireTaskKey, ()->{ + offline(device.getDeviceId()); + }, device.getExpires() * 1000); + } + + @Override + public void offline(String deviceId) { + Device device = deviceMapper.getDeviceByDeviceId(deviceId); + if (device == null) { + return; + } + String registerExpireTaskKey = registerExpireTaskKeyPrefix + deviceId; + dynamicTask.stop(registerExpireTaskKey); + device.setOnline(0); + redisCatchStorage.updateDevice(device); + deviceMapper.update(device); + // 绂荤嚎閲婃斁鎵�鏈塻src + List<SsrcTransaction> ssrcTransactions = streamSession.getSsrcTransactionForAll(deviceId, null, null, null); + if (ssrcTransactions != null && ssrcTransactions.size() > 0) { + for (SsrcTransaction ssrcTransaction : ssrcTransactions) { + mediaServerService.releaseSsrc(ssrcTransaction.getMediaServerId(), ssrcTransaction.getSsrc()); + mediaServerService.closeRTPServer(deviceId, ssrcTransaction.getChannelId(), ssrcTransaction.getStream()); + streamSession.remove(deviceId, ssrcTransaction.getChannelId(), ssrcTransaction.getStream()); + } + } + // 绉婚櫎璁㈤槄 + removeCatalogSubscribe(device); + removeMobilePositionSubscribe(device); + } + @Override public boolean addCatalogSubscribe(Device device) { if (device == null || device.getSubscribeCycleForCatalog() < 0) { @@ -49,7 +140,7 @@ // 鎻愬墠寮�濮嬪埛鏂拌闃� int subscribeCycleForCatalog = Math.max(device.getSubscribeCycleForCatalog(),30); // 璁剧疆鏈�灏忓�间负30 - dynamicTask.startCron(device.getDeviceId() + "catalog", catalogSubscribeTask, subscribeCycleForCatalog -1); + dynamicTask.startCron(device.getDeviceId() + "catalog", catalogSubscribeTask, (subscribeCycleForCatalog -1) * 1000); return true; } @@ -74,7 +165,7 @@ // 璁剧疆鏈�灏忓�间负30 int subscribeCycleForCatalog = Math.max(device.getSubscribeCycleForMobilePosition(),30); // 鎻愬墠寮�濮嬪埛鏂拌闃� - dynamicTask.startCron(device.getDeviceId() + "mobile_position" , mobilePositionSubscribeTask, subscribeCycleForCatalog -1 ); + dynamicTask.startCron(device.getDeviceId() + "mobile_position" , mobilePositionSubscribeTask, (subscribeCycleForCatalog -1 ) * 1000); return true; } @@ -111,4 +202,44 @@ catalogResponseMessageHandler.setChannelSyncEnd(device.getDeviceId(), errorMsg); }); } + + @Override + public Device queryDevice(String deviceId) { + return deviceMapper.getDeviceByDeviceId(deviceId); + } + + @Override + public List<Device> getAllOnlineDevice() { + return deviceMapper.getOnlineDevices(); + } + + @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()); + } + + @Override + public void checkDeviceStatus(Device device) { + if (device == null || device.getOnline() == 0) { + return; + } + sipCommander.deviceStatusQuery(device, null); + + } + + @Override + public Device getDeviceByHostAndPort(String host, int port) { + return deviceMapper.getDeviceByHostAndPort(host, port); + } } -- Gitblit v1.8.0