|  |  |  | 
|---|
|  |  |  | package com.genersoft.iot.vmp.service.impl; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | import com.genersoft.iot.vmp.conf.DynamicTask; | 
|---|
|  |  |  | import com.genersoft.iot.vmp.conf.UserSetting; | 
|---|
|  |  |  | 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.transmit.cmd.ISIPCommander; | 
|---|
|  |  |  | import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.response.cmd.CatalogResponseMessageHandler; | 
|---|
|  |  |  | import com.genersoft.iot.vmp.gb28181.utils.Coordtransform; | 
|---|
|  |  |  | import com.genersoft.iot.vmp.service.IDeviceChannelService; | 
|---|
|  |  |  | 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.transmit.cmd.ISIPCommander; | 
|---|
|  |  |  | 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.IMediaServerService; | 
|---|
|  |  |  | import com.genersoft.iot.vmp.storager.IRedisCatchStorage; | 
|---|
|  |  |  | import com.genersoft.iot.vmp.storager.IVideoManagerStorage; | 
|---|
|  |  |  | import com.genersoft.iot.vmp.storager.dao.DeviceChannelMapper; | 
|---|
|  |  |  | import com.genersoft.iot.vmp.storager.dao.DeviceMapper; | 
|---|
|  |  |  | 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 org.slf4j.Logger; | 
|---|
|  |  |  | import org.slf4j.LoggerFactory; | 
|---|
|  |  |  | import org.springframework.beans.factory.annotation.Autowired; | 
|---|
|  |  |  | import org.springframework.jdbc.datasource.DataSourceTransactionManager; | 
|---|
|  |  |  | import org.springframework.jdbc.support.incrementer.AbstractIdentityColumnMaxValueIncrementer; | 
|---|
|  |  |  | import org.springframework.stereotype.Service; | 
|---|
|  |  |  | import org.springframework.transaction.TransactionDefinition; | 
|---|
|  |  |  | import org.springframework.transaction.TransactionStatus; | 
|---|
|  |  |  | import org.springframework.util.ObjectUtils; | 
|---|
|  |  |  | import org.springframework.util.StringUtils; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | import javax.sip.InvalidArgumentException; | 
|---|
|  |  |  | import javax.sip.SipException; | 
|---|
|  |  |  | 
|---|
|  |  |  | TransactionDefinition transactionDefinition; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Autowired | 
|---|
|  |  |  | private IVideoManagerStorage storage; | 
|---|
|  |  |  | private UserSetting userSetting; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Autowired | 
|---|
|  |  |  | private ISIPCommander commander; | 
|---|
|  |  |  | 
|---|
|  |  |  | } | 
|---|
|  |  |  | sync(device); | 
|---|
|  |  |  | }else { | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if(device.getOnline() == 0){ | 
|---|
|  |  |  | device.setOnline(1); | 
|---|
|  |  |  | device.setCreateTime(now); | 
|---|
|  |  |  | logger.info("[设备上线,离线状态下重新注册]: {},查询设备信息以及通道信息", device.getDeviceId()); | 
|---|
|  |  |  | deviceMapper.update(device); | 
|---|
|  |  |  | redisCatchStorage.updateDevice(device); | 
|---|
|  |  |  | try { | 
|---|
|  |  |  | commander.deviceInfoQuery(device); | 
|---|
|  |  |  | } catch (InvalidArgumentException | SipException | ParseException e) { | 
|---|
|  |  |  | logger.error("[命令发送失败] 查询设备信息: {}", e.getMessage()); | 
|---|
|  |  |  | if (userSetting.getSyncChannelOnDeviceOnline()) { | 
|---|
|  |  |  | logger.info("[设备上线,离线状态下重新注册]: {},查询设备信息以及通道信息", device.getDeviceId()); | 
|---|
|  |  |  | try { | 
|---|
|  |  |  | commander.deviceInfoQuery(device); | 
|---|
|  |  |  | } catch (InvalidArgumentException | SipException | ParseException e) { | 
|---|
|  |  |  | logger.error("[命令发送失败] 查询设备信息: {}", e.getMessage()); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | sync(device); | 
|---|
|  |  |  | // TODO 如果设备下的通道级联到了其他平台,那么需要发送事件或者notify给上级平台 | 
|---|
|  |  |  | } | 
|---|
|  |  |  | sync(device); | 
|---|
|  |  |  | // TODO 如果设备下的通道级联到了其他平台,那么需要发送事件或者notify给上级平台 | 
|---|
|  |  |  | }else { | 
|---|
|  |  |  | if (deviceChannelMapper.queryAllChannels(device.getDeviceId()).size() == 0) { | 
|---|
|  |  |  | logger.info("[设备上线]: {},通道数为0,查询通道信息", device.getDeviceId()); | 
|---|
|  |  |  | sync(device); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | deviceMapper.update(device); | 
|---|
|  |  |  | redisCatchStorage.updateDevice(device); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | 
|---|
|  |  |  | redisCatchStorage.updateDevice(device); | 
|---|
|  |  |  | deviceMapper.update(device); | 
|---|
|  |  |  | //进行通道离线 | 
|---|
|  |  |  | deviceChannelMapper.offlineByDeviceId(deviceId); | 
|---|
|  |  |  | //        deviceChannelMapper.offlineByDeviceId(deviceId); | 
|---|
|  |  |  | // 离线释放所有ssrc | 
|---|
|  |  |  | List<SsrcTransaction> ssrcTransactions = streamSession.getSsrcTransactionForAll(deviceId, null, null, null); | 
|---|
|  |  |  | if (ssrcTransactions != null && ssrcTransactions.size() > 0) { | 
|---|
|  |  |  | 
|---|
|  |  |  | return null; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | // 使用行政区划展示树 | 
|---|
|  |  |  | if (parentId.length() > 10) { | 
|---|
|  |  |  | // TODO 可能是行政区划与业务分组混杂的情形 | 
|---|
|  |  |  | return null; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | //            if (parentId.length() > 10) { | 
|---|
|  |  |  | //                // TODO 可能是行政区划与业务分组混杂的情形 | 
|---|
|  |  |  | //                return null; | 
|---|
|  |  |  | //            } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if (parentId.length() == 10 ) { | 
|---|
|  |  |  | if (onlyCatalog) { | 
|---|
|  |  |  | 
|---|
|  |  |  | List<DeviceChannel> channelsForCivilCode = deviceChannelMapper.getChannelsWithCivilCodeAndLength(deviceId, parentId, parentId.length() + 2); | 
|---|
|  |  |  | if (!onlyCatalog) { | 
|---|
|  |  |  | List<DeviceChannel> channels = deviceChannelMapper.getChannelsByCivilCode(deviceId, parentId); | 
|---|
|  |  |  | channelsForCivilCode.addAll(channels); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | for(DeviceChannel channel : channels) { | 
|---|
|  |  |  | boolean flag = false; | 
|---|
|  |  |  | for(DeviceChannel deviceChannel : channelsForCivilCode) { | 
|---|
|  |  |  | if(channel.getChannelId().equals(deviceChannel.getChannelId())) { | 
|---|
|  |  |  | flag = true; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | if(!flag) { | 
|---|
|  |  |  | channelsForCivilCode.add(channel); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | List<BaseTree<DeviceChannel>> trees = transportChannelsToTree(channelsForCivilCode, parentId); | 
|---|
|  |  |  | return trees; | 
|---|
|  |  |  | 
|---|
|  |  |  | if (!ObjectUtils.isEmpty(device.getMediaServerId())) { | 
|---|
|  |  |  | deviceInStore.setMediaServerId(device.getMediaServerId()); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | deviceInStore.setSdpIp(device.getSdpIp()); | 
|---|
|  |  |  | deviceInStore.setCharset(device.getCharset()); | 
|---|
|  |  |  | deviceInStore.setTreeType(device.getTreeType()); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | //  目录订阅相关的信息 | 
|---|
|  |  |  | if (device.getSubscribeCycleForCatalog() > 0) { | 
|---|
|  |  |  | 
|---|
|  |  |  | if (!deviceInStore.getGeoCoordSys().equals(device.getGeoCoordSys())) { | 
|---|
|  |  |  | updateDeviceChannelGeoCoordSys(device); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | // 更新redis | 
|---|
|  |  |  | redisCatchStorage.updateDevice(device); | 
|---|
|  |  |  | deviceMapper.updateCustom(device); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | 
|---|
|  |  |  | } | 
|---|
|  |  |  | return result; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Override | 
|---|
|  |  |  | public ResourceBaceInfo getOverview() { | 
|---|
|  |  |  | return deviceMapper.getOverview(); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|