|  |  |  | 
|---|
|  |  |  | 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; | 
|---|
|  |  |  | 
|---|
|  |  |  | 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); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | 
|---|
|  |  |  | 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) { | 
|---|
|  |  |  | 
|---|
|  |  |  | 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(); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|