old mode 100644
new mode 100755
| | |
| | | import com.genersoft.iot.vmp.common.VideoManagerConstants; |
| | | import com.genersoft.iot.vmp.conf.DynamicTask; |
| | | import com.genersoft.iot.vmp.conf.UserSetting; |
| | | import com.genersoft.iot.vmp.conf.exception.SsrcTransactionNotFoundException; |
| | | import com.genersoft.iot.vmp.gb28181.bean.*; |
| | | import com.genersoft.iot.vmp.gb28181.session.VideoStreamSessionManager; |
| | | import com.genersoft.iot.vmp.gb28181.task.ISubscribeTask; |
| | | import com.genersoft.iot.vmp.gb28181.task.impl.CatalogSubscribeTask; |
| | | import com.genersoft.iot.vmp.gb28181.task.impl.MobilePositionSubscribeTask; |
| | | import com.genersoft.iot.vmp.gb28181.transmit.cmd.ISIPCommander; |
| | | import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommander; |
| | | import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.response.cmd.CatalogResponseMessageHandler; |
| | | import com.genersoft.iot.vmp.service.IDeviceChannelService; |
| | | import com.genersoft.iot.vmp.service.IDeviceService; |
| | | import com.genersoft.iot.vmp.service.IInviteStreamService; |
| | | import com.genersoft.iot.vmp.service.IMediaServerService; |
| | | import com.genersoft.iot.vmp.storager.IRedisCatchStorage; |
| | | import com.genersoft.iot.vmp.storager.dao.DeviceChannelMapper; |
| | |
| | | import com.genersoft.iot.vmp.storager.dao.PlatformChannelMapper; |
| | | import com.genersoft.iot.vmp.utils.DateUtil; |
| | | import com.genersoft.iot.vmp.vmanager.bean.BaseTree; |
| | | import com.genersoft.iot.vmp.vmanager.bean.ResourceBaceInfo; |
| | | import com.genersoft.iot.vmp.vmanager.bean.ResourceBaseInfo; |
| | | import org.slf4j.Logger; |
| | | import org.slf4j.LoggerFactory; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | |
| | | private final static Logger logger = LoggerFactory.getLogger(DeviceServiceImpl.class); |
| | | |
| | | @Autowired |
| | | private SIPCommander cmder; |
| | | @Autowired |
| | | private DynamicTask dynamicTask; |
| | | |
| | | @Autowired |
| | |
| | | |
| | | @Autowired |
| | | private IRedisCatchStorage redisCatchStorage; |
| | | |
| | | @Autowired |
| | | private IInviteStreamService inviteStreamService; |
| | | |
| | | @Autowired |
| | | private DeviceMapper deviceMapper; |
| | |
| | | String now = DateUtil.getNow(); |
| | | if (deviceInRedis != null && deviceInDb == null) { |
| | | // redis 存在脏数据 |
| | | redisCatchStorage.clearCatchByDeviceId(device.getDeviceId()); |
| | | inviteStreamService.clearInviteInfo(device.getDeviceId()); |
| | | } |
| | | device.setUpdateTime(now); |
| | | device.setKeepaliveTime(now); |
| | | if (device.getKeepaliveIntervalTime() == 0) { |
| | | // 默认心跳间隔60 |
| | | device.setKeepaliveIntervalTime(60); |
| | |
| | | } |
| | | |
| | | // 第一次上线 或则设备之前是离线状态--进行通道同步和设备信息查询 |
| | | if (device.getCreateTime() == null) { |
| | | device.setOnline(1); |
| | | if (deviceInDb == null) { |
| | | device.setOnLine(true); |
| | | device.setCreateTime(now); |
| | | device.setUpdateTime(now); |
| | | logger.info("[设备上线,首次注册]: {},查询设备信息以及通道信息", device.getDeviceId()); |
| | | deviceMapper.add(device); |
| | | redisCatchStorage.updateDevice(device); |
| | |
| | | } |
| | | sync(device); |
| | | }else { |
| | | if(device.getOnline() == 0){ |
| | | device.setOnline(1); |
| | | |
| | | if (deviceInDb != null) { |
| | | device.setSwitchPrimarySubStream(deviceInDb.isSwitchPrimarySubStream()); |
| | | } |
| | | if(!device.isOnLine()){ |
| | | device.setOnLine(true); |
| | | device.setCreateTime(now); |
| | | deviceMapper.update(device); |
| | | redisCatchStorage.updateDevice(device); |
| | |
| | | redisCatchStorage.sendDeviceOrChannelStatus(device.getDeviceId(), null, true); |
| | | } |
| | | |
| | | // |
| | | // try { |
| | | // cmder.alarmSubscribe(device, 600, "0", "4", "0", "2023-7-27T00:00:00", "2023-7-28T00:00:00"); |
| | | // } catch (InvalidArgumentException e) { |
| | | // throw new RuntimeException(e); |
| | | // } catch (SipException e) { |
| | | // throw new RuntimeException(e); |
| | | // } catch (ParseException e) { |
| | | // throw new RuntimeException(e); |
| | | // } |
| | | |
| | | } |
| | | |
| | | @Override |
| | | public void offline(String deviceId, String reason) { |
| | | logger.error("[设备离线],{}, device:{}", reason, deviceId); |
| | | logger.warn("[设备离线],{}, device:{}", reason, deviceId); |
| | | Device device = deviceMapper.getDeviceByDeviceId(deviceId); |
| | | if (device == null) { |
| | | return; |
| | | } |
| | | String registerExpireTaskKey = VideoManagerConstants.REGISTER_EXPIRE_TASK_KEY_PREFIX + deviceId; |
| | | dynamicTask.stop(registerExpireTaskKey); |
| | | device.setOnline(0); |
| | | device.setOnLine(false); |
| | | redisCatchStorage.updateDevice(device); |
| | | deviceMapper.update(device); |
| | | //进行通道离线 |
| | |
| | | } |
| | | logger.info("[移除目录订阅]: {}", device.getDeviceId()); |
| | | String taskKey = device.getDeviceId() + "catalog"; |
| | | if (device.getOnline() == 1) { |
| | | if (device.isOnLine()) { |
| | | Runnable runnable = dynamicTask.get(taskKey); |
| | | if (runnable instanceof ISubscribeTask) { |
| | | ISubscribeTask subscribeTask = (ISubscribeTask) runnable; |
| | |
| | | } |
| | | logger.info("[移除移动位置订阅]: {}", device.getDeviceId()); |
| | | String taskKey = device.getDeviceId() + "mobile_position"; |
| | | if (device.getOnline() == 1) { |
| | | if (device.isOnLine()) { |
| | | Runnable runnable = dynamicTask.get(taskKey); |
| | | if (runnable instanceof ISubscribeTask) { |
| | | ISubscribeTask subscribeTask = (ISubscribeTask) runnable; |
| | |
| | | |
| | | @Override |
| | | public void checkDeviceStatus(Device device) { |
| | | if (device == null || device.getOnline() == 0) { |
| | | if (device == null || !device.isOnLine()) { |
| | | return; |
| | | } |
| | | try { |
| | |
| | | if (device == null) { |
| | | return null; |
| | | } |
| | | if (ObjectUtils.isEmpty(parentId) || parentId.equals(deviceId)) { |
| | | parentId = null; |
| | | if (ObjectUtils.isEmpty(parentId) ) { |
| | | parentId = deviceId; |
| | | } |
| | | List<DeviceChannel> rootNodes = deviceChannelMapper.getSubChannelsByDeviceId(deviceId, parentId, onlyCatalog); |
| | | return transportChannelsToTree(rootNodes, ""); |
| | |
| | | |
| | | @Override |
| | | public void addDevice(Device device) { |
| | | device.setOnline(0); |
| | | device.setOnLine(false); |
| | | device.setCreateTime(DateUtil.getNow()); |
| | | device.setUpdateTime(DateUtil.getNow()); |
| | | deviceMapper.addCustomDevice(device); |
| | |
| | | logger.warn("更新设备时未找到设备信息"); |
| | | return; |
| | | } |
| | | if(deviceInStore.isSwitchPrimarySubStream() != device.isSwitchPrimarySubStream()){ |
| | | //当修改设备的主子码流开关时,需要校验是否存在流,如果存在流则直接关闭 |
| | | List<SsrcTransaction> ssrcTransactionForAll = streamSession.getSsrcTransactionForAll(device.getDeviceId(), null, null, null); |
| | | if(ssrcTransactionForAll != null){ |
| | | for (SsrcTransaction ssrcTransaction: ssrcTransactionForAll) { |
| | | try { |
| | | cmder.streamByeCmd(device, ssrcTransaction.getChannelId(), ssrcTransaction.getStream(), null, null); |
| | | } catch (InvalidArgumentException | SsrcTransactionNotFoundException | ParseException | SipException e) { |
| | | throw new RuntimeException(e); |
| | | } |
| | | } |
| | | } |
| | | deviceChannelMapper.clearPlay(device.getDeviceId()); |
| | | inviteStreamService.clearInviteInfo(device.getDeviceId()); |
| | | } |
| | | |
| | | if (!ObjectUtils.isEmpty(device.getName())) { |
| | | deviceInStore.setName(device.getName()); |
| | | } |
| | |
| | | if (!ObjectUtils.isEmpty(device.getMediaServerId())) { |
| | | deviceInStore.setMediaServerId(device.getMediaServerId()); |
| | | } |
| | | deviceInStore.setSdpIp(device.getSdpIp()); |
| | | deviceInStore.setCharset(device.getCharset()); |
| | | deviceInStore.setTreeType(device.getTreeType()); |
| | | if (!ObjectUtils.isEmpty(device.getCharset())) { |
| | | deviceInStore.setCharset(device.getCharset()); |
| | | } |
| | | if (!ObjectUtils.isEmpty(device.getSdpIp())) { |
| | | deviceInStore.setSdpIp(device.getSdpIp()); |
| | | } |
| | | |
| | | // 目录订阅相关的信息 |
| | | if (device.getSubscribeCycleForCatalog() > 0) { |
| | |
| | | removeMobilePositionSubscribe(deviceInStore); |
| | | } |
| | | } |
| | | // 坐标系变化,需要重新计算GCJ02坐标和WGS84坐标 |
| | | if (!deviceInStore.getGeoCoordSys().equals(device.getGeoCoordSys())) { |
| | | updateDeviceChannelGeoCoordSys(device); |
| | | if (deviceInStore.getGeoCoordSys() != null) { |
| | | // 坐标系变化,需要重新计算GCJ02坐标和WGS84坐标 |
| | | if (!deviceInStore.getGeoCoordSys().equals(device.getGeoCoordSys())) { |
| | | updateDeviceChannelGeoCoordSys(device); |
| | | } |
| | | }else { |
| | | device.setGeoCoordSys("WGS84"); |
| | | } |
| | | if (device.getCharset() == null) { |
| | | device.setCharset("GB2312"); |
| | | } |
| | | |
| | | // 更新redis |
| | | redisCatchStorage.updateDevice(device); |
| | | deviceMapper.updateCustom(device); |
| | |
| | | }catch (Exception e) { |
| | | dataSourceTransactionManager.rollback(transactionStatus); |
| | | } |
| | | if (result) { |
| | | redisCatchStorage.removeDevice(deviceId); |
| | | } |
| | | return result; |
| | | } |
| | | |
| | | @Override |
| | | public ResourceBaceInfo getOverview() { |
| | | return deviceMapper.getOverview(); |
| | | public ResourceBaseInfo getOverview() { |
| | | List<Device> onlineDevices = deviceMapper.getOnlineDevices(); |
| | | List<Device> all = deviceMapper.getAll(); |
| | | return new ResourceBaseInfo(all.size(), onlineDevices.size()); |
| | | } |
| | | |
| | | @Override |