| | |
| | | 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; |
| | | |
| | | /** |
| | | * 设备业务(目录订阅) |
| | |
| | | |
| | | @Override |
| | | public void online(Device device) { |
| | | logger.info("[设备上线],deviceId:" + device.getDeviceId()); |
| | | logger.info("[设备上线] deviceId:{}->{}:{}", device.getDeviceId(), device.getIp(), device.getPort()); |
| | | Device deviceInRedis = redisCatchStorage.getDevice(device.getDeviceId()); |
| | | Device deviceInDb = deviceMapper.getDeviceByDeviceId(device.getDeviceId()); |
| | | |
| | |
| | | redisCatchStorage.clearCatchByDeviceId(device.getDeviceId()); |
| | | |
| | | } |
| | | if (device.getRegisterTime() == null) { |
| | | device.setRegisterTime(now); |
| | | } |
| | | if(device.getUpdateTime() == null) { |
| | | device.setUpdateTime(now); |
| | | } |
| | | device.setUpdateTime(now); |
| | | device.setOnline(1); |
| | | |
| | | // 第一次上线 |
| | |
| | | // 刷新过期任务 |
| | | 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 |
| | |
| | | |
| | | @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 |
| | |
| | | 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); |
| | | } |
| | | } |
| | | } |