Merge remote-tracking branch 'origin/master'
| | |
| | | <skipTests>true</skipTests> |
| | | </configuration> |
| | | </plugin> |
| | | |
| | | <plugin> |
| | | <groupId>org.apache.maven.plugins</groupId> |
| | | <artifactId>maven-jar-plugin</artifactId> |
| | | <version>3.3.0</version> |
| | | <configuration> |
| | | <excludes> |
| | | <exclude>**/all-application.yml</exclude> |
| | | <exclude>**/application.yml</exclude> |
| | | <exclude>**/application-*.yml</exclude> |
| | | <exclude>**/local.jks</exclude> |
| | | </excludes> |
| | | </configuration> |
| | | </plugin> |
| | | <plugin> |
| | | <artifactId>maven-resources-plugin</artifactId> |
| | | <executions> |
| | | <execution> <!-- 复制配置文件 --> |
| | | <id>copy-resources</id> |
| | | <phase>package</phase> |
| | | <goals> |
| | | <goal>copy-resources</goal> |
| | | </goals> |
| | | <configuration> |
| | | <resources> |
| | | <resource> |
| | | <directory>src/main/resources</directory> |
| | | <includes> |
| | | <include>application.yml</include> |
| | | <include>application-*.yml</include> |
| | | </includes> |
| | | </resource> |
| | | </resources> |
| | | <outputDirectory>${project.build.directory}</outputDirectory> |
| | | </configuration> |
| | | </execution> |
| | | </executions> |
| | | </plugin> |
| | | </plugins> |
| | | <resources> |
| | | <resource> |
| | |
| | | package com.genersoft.iot.vmp.conf; |
| | | |
| | | import com.genersoft.iot.vmp.common.CivilCodePo; |
| | | import org.ehcache.impl.internal.concurrent.ConcurrentHashMap; |
| | | import com.genersoft.iot.vmp.utils.CivilCodeUtil; |
| | | import org.slf4j.Logger; |
| | | import org.slf4j.LoggerFactory; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | |
| | | import java.io.InputStream; |
| | | import java.io.InputStreamReader; |
| | | import java.nio.file.Files; |
| | | import java.util.Map; |
| | | import java.util.ArrayList; |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * 启动时读取行政区划表 |
| | |
| | | public class CivilCodeFileConf implements CommandLineRunner { |
| | | |
| | | private final static Logger logger = LoggerFactory.getLogger(CivilCodeFileConf.class); |
| | | |
| | | private final Map<String, CivilCodePo> civilCodeMap= new ConcurrentHashMap<>(); |
| | | |
| | | @Autowired |
| | | @Lazy |
| | |
| | | BufferedReader inputStreamReader = new BufferedReader(new InputStreamReader(inputStream)); |
| | | int index = -1; |
| | | String line; |
| | | List<CivilCodePo> civilCodePoList = new ArrayList<>(); |
| | | while ((line = inputStreamReader.readLine()) != null) { |
| | | index ++; |
| | | if (index == 0) { |
| | |
| | | } |
| | | String[] infoArray = line.split(","); |
| | | CivilCodePo civilCodePo = CivilCodePo.getInstance(infoArray); |
| | | civilCodeMap.put(civilCodePo.getCode(), civilCodePo); |
| | | civilCodePoList.add(civilCodePo); |
| | | } |
| | | CivilCodeUtil.INSTANCE.add(civilCodePoList); |
| | | inputStreamReader.close(); |
| | | inputStream.close(); |
| | | if (civilCodeMap.size() == 0) { |
| | | if (civilCodePoList.isEmpty()) { |
| | | logger.warn("[行政区划] 文件内容为空,可能造成目录刷新结果不完整"); |
| | | }else { |
| | | logger.info("[行政区划] 加载成功,共加载数据{}条", civilCodeMap.size()); |
| | | logger.info("[行政区划] 加载成功,共加载数据{}条", civilCodePoList.size()); |
| | | } |
| | | } |
| | | |
| | | public CivilCodePo getParentCode(String code) { |
| | | if (code.length() > 8) { |
| | | return null; |
| | | } |
| | | if (code.length() == 8) { |
| | | String parentCode = code.substring(0, 6); |
| | | return civilCodeMap.get(parentCode); |
| | | }else { |
| | | CivilCodePo civilCodePo = civilCodeMap.get(code); |
| | | if (civilCodePo == null){ |
| | | return null; |
| | | } |
| | | String parentCode = civilCodePo.getParentCode(); |
| | | if (parentCode == null) { |
| | | return null; |
| | | } |
| | | return civilCodeMap.get(parentCode); |
| | | } |
| | | |
| | | } |
| | | |
| | | } |
| | |
| | | String endTimeStr = DateUtil.urlFormatter.format(end); |
| | | String stream = device.getDeviceId() + "_" + channelId + "_" + startTimeStr + "_" + endTimeStr; |
| | | SSRCInfo ssrcInfo = mediaServerService.openRTPServer(mediaServerItem, stream, null, device.isSsrcCheck(), true, 0,false, false, device.getStreamModeForParam()); |
| | | sendRtpItem.setStream(stream); |
| | | // 写入redis, 超时时回复 |
| | | redisCatchStorage.updateSendRTPSever(sendRtpItem); |
| | | playService.playBack(mediaServerItem, ssrcInfo, device.getDeviceId(), channelId, DateUtil.formatter.format(start), |
| | |
| | | Media media = mediaDescription.getMedia(); |
| | | |
| | | Vector mediaFormats = media.getMediaFormats(false); |
| | | if (mediaFormats.contains("8")) { |
| | | // if (mediaFormats.contains("8")) { |
| | | port = media.getMediaPort(); |
| | | String protocol = media.getProtocol(); |
| | | // 区分TCP发流还是udp, 当前默认udp |
| | |
| | | } |
| | | } |
| | | break; |
| | | } |
| | | // } |
| | | } |
| | | if (port == -1) { |
| | | logger.info("不支持的媒体格式,返回415"); |
| | |
| | | }else { |
| | | event = eventElement.getText().toUpperCase(); |
| | | } |
| | | DeviceChannel channel = XmlUtil.channelContentHandler(itemDevice, device, event, civilCodeFileConf); |
| | | DeviceChannel channel = XmlUtil.channelContentHandler(itemDevice, device, event); |
| | | if (channel == null) { |
| | | logger.info("[收到目录订阅]:但是解析失败 {}", new String(evt.getRequest().getRawContent())); |
| | | continue; |
| | |
| | | package com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.response.cmd; |
| | | |
| | | import com.genersoft.iot.vmp.common.VideoManagerConstants; |
| | | import com.genersoft.iot.vmp.conf.DynamicTask; |
| | | import com.genersoft.iot.vmp.gb28181.bean.AudioBroadcastCatch; |
| | | import com.genersoft.iot.vmp.gb28181.bean.AudioBroadcastCatchStatus; |
| | | import com.genersoft.iot.vmp.gb28181.bean.Device; |
| | | import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform; |
| | | import com.genersoft.iot.vmp.gb28181.session.AudioBroadcastManager; |
| | | import com.genersoft.iot.vmp.gb28181.transmit.callback.DeferredResultHolder; |
| | | import com.genersoft.iot.vmp.gb28181.transmit.event.request.SIPRequestProcessorParent; |
| | | import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.IMessageHandler; |
| | | import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.response.ResponseMessageHandler; |
| | | import com.genersoft.iot.vmp.gb28181.utils.SipUtils; |
| | | import com.genersoft.iot.vmp.service.IPlayService; |
| | | import gov.nist.javax.sip.message.SIPRequest; |
| | | import org.dom4j.Element; |
| | |
| | | AudioBroadcastCatch audioBroadcastCatch = audioBroadcastManager.get(device.getDeviceId(), channelId); |
| | | audioBroadcastCatch.setStatus(AudioBroadcastCatchStatus.WaiteInvite); |
| | | audioBroadcastManager.update(audioBroadcastCatch); |
| | | // 等待invite消息, 超时则结束 |
| | | String key = VideoManagerConstants.BROADCAST_WAITE_INVITE + device.getDeviceId(); |
| | | if (!SipUtils.isFrontEnd(device.getDeviceId())) { |
| | | key += audioBroadcastCatch.getChannelId(); |
| | | } |
| | | dynamicTask.startDelay(key, ()->{ |
| | | logger.info("[语音广播]等待invite消息超时:{}/{}", device.getDeviceId(), channelId); |
| | | playService.stopAudioBroadcast(device.getDeviceId(), channelId); |
| | | }, 2000); |
| | | }else { |
| | | playService.stopAudioBroadcast(device.getDeviceId(), channelId); |
| | | } |
| | |
| | | package com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.response.cmd; |
| | | |
| | | import com.genersoft.iot.vmp.conf.CivilCodeFileConf; |
| | | import com.genersoft.iot.vmp.conf.SipConfig; |
| | | import com.genersoft.iot.vmp.gb28181.bean.*; |
| | | import com.genersoft.iot.vmp.gb28181.session.CatalogDataCatch; |
| | |
| | | @Qualifier("taskExecutor") |
| | | @Autowired |
| | | private ThreadPoolTaskExecutor taskExecutor; |
| | | |
| | | @Autowired |
| | | private CivilCodeFileConf civilCodeFileConf; |
| | | |
| | | @Autowired |
| | | private SipConfig sipConfig; |
| | |
| | | if (channelDeviceElement == null) { |
| | | continue; |
| | | } |
| | | DeviceChannel channel = XmlUtil.channelContentHandler(itemDevice, device, null, civilCodeFileConf); |
| | | DeviceChannel channel = XmlUtil.channelContentHandler(itemDevice, device, null); |
| | | if (channel == null) { |
| | | logger.info("[收到目录订阅]:但是解析失败 {}", new String(evt.getRequest().getRawContent())); |
| | | continue; |
| | |
| | | import com.alibaba.fastjson2.JSONArray; |
| | | import com.alibaba.fastjson2.JSONObject; |
| | | import com.genersoft.iot.vmp.common.CivilCodePo; |
| | | import com.genersoft.iot.vmp.conf.CivilCodeFileConf; |
| | | import com.genersoft.iot.vmp.gb28181.bean.Device; |
| | | import com.genersoft.iot.vmp.gb28181.bean.DeviceChannel; |
| | | import com.genersoft.iot.vmp.gb28181.event.subscribe.catalog.CatalogEvent; |
| | | import com.genersoft.iot.vmp.utils.CivilCodeUtil; |
| | | import com.genersoft.iot.vmp.utils.DateUtil; |
| | | import org.apache.commons.lang3.StringUtils; |
| | | import org.apache.commons.lang3.math.NumberUtils; |
| | |
| | | CivilCode, BusinessGroup,VirtualOrganization,Other |
| | | } |
| | | |
| | | public static DeviceChannel channelContentHandler(Element itemDevice, Device device, String event, CivilCodeFileConf civilCodeFileConf){ |
| | | public static DeviceChannel channelContentHandler(Element itemDevice, Device device, String event){ |
| | | DeviceChannel deviceChannel = new DeviceChannel(); |
| | | deviceChannel.setDeviceId(device.getDeviceId()); |
| | | Element channdelIdElement = itemDevice.element("DeviceID"); |
| | |
| | | } |
| | | if(channelId.length() <= 8) { |
| | | deviceChannel.setHasAudio(false); |
| | | CivilCodePo parentCode = civilCodeFileConf.getParentCode(channelId); |
| | | CivilCodePo parentCode = CivilCodeUtil.INSTANCE.getParentCode(channelId); |
| | | if (parentCode != null) { |
| | | deviceChannel.setParentId(parentCode.getCode()); |
| | | deviceChannel.setCivilCode(parentCode.getCode()); |
| | |
| | | import com.github.pagehelper.PageInfo; |
| | | |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | |
| | | /** |
| | | * 级联国标平台关联流业务接口 |
| | |
| | | void delAllPlatformInfo(String platformId, String catalogId); |
| | | |
| | | List<GbStream> getGbChannelWithGbid(String gbId); |
| | | |
| | | Map<String, GbStream> getAllGBId(); |
| | | |
| | | } |
| | |
| | | */ |
| | | ResourceBaseInfo getOverview(); |
| | | |
| | | Map<String, StreamPushItem> getAllAppAndStreamMap(); |
| | | |
| | | |
| | | } |
| | |
| | | |
| | | }else if (device.getSubscribeCycleForMobilePosition() == 0) { |
| | | // 取消订阅 |
| | | deviceInStore.setSubscribeCycleForCatalog(0); |
| | | removeCatalogSubscribe(deviceInStore, null); |
| | | deviceInStore.setSubscribeCycleForMobilePosition(0); |
| | | removeMobilePositionSubscribe(deviceInStore, null); |
| | | } |
| | | } |
| | | if (deviceInStore.getGeoCoordSys() != null) { |
| | |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.transaction.TransactionDefinition; |
| | | import org.springframework.transaction.TransactionStatus; |
| | | import org.springframework.transaction.annotation.Transactional; |
| | | import org.springframework.util.ObjectUtils; |
| | | |
| | | import java.util.ArrayList; |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | |
| | | @Service |
| | | @DS("master") |
| | |
| | | public List<GbStream> getGbChannelWithGbid(String gbId) { |
| | | return gbStreamMapper.selectByGBId(gbId); |
| | | } |
| | | |
| | | @Override |
| | | public Map<String, GbStream> getAllGBId() { |
| | | return gbStreamMapper.getAllGBId(); |
| | | } |
| | | } |
| | |
| | | import com.alibaba.fastjson2.JSONArray; |
| | | import com.alibaba.fastjson2.JSONObject; |
| | | import com.baomidou.dynamic.datasource.annotation.DS; |
| | | import com.genersoft.iot.vmp.common.InviteInfo; |
| | | import com.genersoft.iot.vmp.common.InviteSessionStatus; |
| | | import com.genersoft.iot.vmp.common.InviteSessionType; |
| | | import com.genersoft.iot.vmp.common.StreamInfo; |
| | | import com.genersoft.iot.vmp.common.*; |
| | | import com.genersoft.iot.vmp.conf.DynamicTask; |
| | | import com.genersoft.iot.vmp.conf.SipConfig; |
| | | import com.genersoft.iot.vmp.conf.UserSetting; |
| | |
| | | import com.genersoft.iot.vmp.gb28181.session.AudioBroadcastManager; |
| | | import com.genersoft.iot.vmp.gb28181.session.SSRCFactory; |
| | | import com.genersoft.iot.vmp.gb28181.session.VideoStreamSessionManager; |
| | | import com.genersoft.iot.vmp.gb28181.transmit.cmd.ISIPCommanderForPlatform; |
| | | import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommander; |
| | | import com.genersoft.iot.vmp.gb28181.transmit.cmd.ISIPCommander; |
| | | import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommanderFroPlatform; |
| | | import com.genersoft.iot.vmp.gb28181.transmit.cmd.ISIPCommanderForPlatform; |
| | | import com.genersoft.iot.vmp.gb28181.utils.SipUtils; |
| | | import com.genersoft.iot.vmp.media.zlm.SendRtpPortManager; |
| | | import com.genersoft.iot.vmp.media.zlm.ZLMRESTfulUtils; |
| | | import com.genersoft.iot.vmp.media.zlm.ZLMServerFactory; |
| | | import com.genersoft.iot.vmp.media.zlm.ZlmHttpHookSubscribe; |
| | | import com.genersoft.iot.vmp.media.zlm.dto.*; |
| | | import com.genersoft.iot.vmp.media.zlm.*; |
| | | import com.genersoft.iot.vmp.media.zlm.dto.HookSubscribeFactory; |
| | | import com.genersoft.iot.vmp.media.zlm.dto.HookSubscribeForStreamChange; |
| | | import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem; |
| | | import com.genersoft.iot.vmp.media.zlm.dto.HookSubscribeFactory; |
| | | import com.genersoft.iot.vmp.media.zlm.dto.HookSubscribeForRecordMp4; |
| | | import com.genersoft.iot.vmp.media.zlm.dto.HookSubscribeForStreamChange; |
| | |
| | | import com.genersoft.iot.vmp.media.zlm.dto.hook.OnStreamChangedHookParam; |
| | | import com.genersoft.iot.vmp.service.*; |
| | | import com.genersoft.iot.vmp.service.bean.*; |
| | | import com.genersoft.iot.vmp.service.bean.ErrorCallback; |
| | | import com.genersoft.iot.vmp.service.bean.InviteErrorCode; |
| | | import com.genersoft.iot.vmp.service.bean.RequestPushStreamMsg; |
| | | import com.genersoft.iot.vmp.service.bean.SSRCInfo; |
| | | import com.genersoft.iot.vmp.service.redisMsg.RedisGbPlayMsgListener; |
| | | import com.genersoft.iot.vmp.service.bean.DownloadFileInfo; |
| | | import com.genersoft.iot.vmp.service.bean.ErrorCallback; |
| | | import com.genersoft.iot.vmp.service.bean.InviteErrorCode; |
| | | import com.genersoft.iot.vmp.service.bean.SSRCInfo; |
| | | import com.genersoft.iot.vmp.storager.IRedisCatchStorage; |
| | | import com.genersoft.iot.vmp.storager.IVideoManagerStorage; |
| | | import com.genersoft.iot.vmp.storager.dao.CloudRecordServiceMapper; |
| | |
| | | // 发送成功 |
| | | AudioBroadcastCatch audioBroadcastCatch = new AudioBroadcastCatch(device.getDeviceId(), channelId, mediaServerItem, app, stream, event, AudioBroadcastCatchStatus.Ready, isFromPlatform); |
| | | audioBroadcastManager.update(audioBroadcastCatch); |
| | | // 等待invite消息, 超时则结束 |
| | | String key = VideoManagerConstants.BROADCAST_WAITE_INVITE + device.getDeviceId(); |
| | | if (!SipUtils.isFrontEnd(device.getDeviceId())) { |
| | | key += audioBroadcastCatch.getChannelId(); |
| | | } |
| | | dynamicTask.startDelay(key, ()->{ |
| | | logger.info("[语音广播]等待invite消息超时:{}/{}", device.getDeviceId(), channelId); |
| | | stopAudioBroadcast(device.getDeviceId(), channelId); |
| | | }, 2000); |
| | | }, eventResultForError -> { |
| | | // 发送失败 |
| | | logger.error("语音广播发送失败: {}:{}", channelId, eventResultForError.msg); |
| | |
| | | |
| | | return new ResourceBaseInfo(total, online); |
| | | } |
| | | |
| | | @Override |
| | | public Map<String, StreamPushItem> getAllAppAndStreamMap() { |
| | | return streamPushMapper.getAllAppAndStreamMap(); |
| | | } |
| | | } |
| | |
| | | |
| | | import com.alibaba.fastjson2.JSON; |
| | | import com.alibaba.fastjson2.JSONObject; |
| | | import com.genersoft.iot.vmp.gb28181.bean.GbStream; |
| | | import com.genersoft.iot.vmp.media.zlm.dto.StreamPushItem; |
| | | import com.genersoft.iot.vmp.service.IGbStreamService; |
| | | import com.genersoft.iot.vmp.service.IMediaServerService; |
| | |
| | | import javax.annotation.Resource; |
| | | import java.util.ArrayList; |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | import java.util.concurrent.ConcurrentLinkedQueue; |
| | | |
| | | /** |
| | |
| | | try { |
| | | List<StreamPushItem> streamPushItems = JSON.parseArray(new String(msg.getBody()), StreamPushItem.class); |
| | | //查询全部的app+stream 用于判断是添加还是修改 |
| | | List<String> allAppAndStream = streamPushService.getAllAppAndStream(); |
| | | Map<String, StreamPushItem> allAppAndStream = streamPushService.getAllAppAndStreamMap(); |
| | | Map<String, GbStream> allGBId = gbStreamService.getAllGBId(); |
| | | |
| | | /** |
| | | * 用于存储更具APP+Stream过滤后的数据,可以直接存入stream_push表与gb_stream表 |
| | |
| | | for (StreamPushItem streamPushItem : streamPushItems) { |
| | | String app = streamPushItem.getApp(); |
| | | String stream = streamPushItem.getStream(); |
| | | boolean contains = allAppAndStream.contains(app + stream); |
| | | boolean contains = allAppAndStream.containsKey(app + stream); |
| | | //不存在就添加 |
| | | if (!contains) { |
| | | if (allGBId.containsKey(streamPushItem.getGbId())) { |
| | | GbStream gbStream = allGBId.get(streamPushItem.getGbId()); |
| | | logger.warn("[REDIS消息-推流设备列表更新-INSERT] 国标编号重复: {}, 已分配给{}/{}", |
| | | streamPushItem.getGbId(), gbStream.getApp(), gbStream.getStream()); |
| | | continue; |
| | | } |
| | | streamPushItem.setStreamType("push"); |
| | | streamPushItem.setCreateTime(DateUtil.getNow()); |
| | | streamPushItem.setMediaServerId(mediaServerService.getDefaultMediaServer().getId()); |
| | |
| | | streamPushItem.setOriginTypeStr("rtsp_push"); |
| | | streamPushItem.setTotalReaderCount("0"); |
| | | streamPushItemForSave.add(streamPushItem); |
| | | allGBId.put(streamPushItem.getGbId(), streamPushItem); |
| | | } else { |
| | | if (allGBId.containsKey(streamPushItem.getGbId())) { |
| | | GbStream gbStream = allGBId.get(streamPushItem.getGbId()); |
| | | logger.warn("[REDIS消息-推流设备列表更新-UPDATE] 国标编号重复: {}, 已分配给{}/{}", |
| | | streamPushItem.getGbId(), gbStream.getApp(), gbStream.getStream()); |
| | | continue; |
| | | } |
| | | //存在就只修改 name和gbId |
| | | streamPushItemForUpdate.add(streamPushItem); |
| | | } |
| | | } |
| | | if (streamPushItemForSave.size() > 0) { |
| | | |
| | | if (!streamPushItemForSave.isEmpty()) { |
| | | logger.info("添加{}条",streamPushItemForSave.size()); |
| | | logger.info(JSONObject.toJSONString(streamPushItemForSave)); |
| | | streamPushService.batchAdd(streamPushItemForSave); |
| | | |
| | | } |
| | | if(streamPushItemForUpdate.size()>0){ |
| | | if(!streamPushItemForUpdate.isEmpty()){ |
| | | logger.info("修改{}条",streamPushItemForUpdate.size()); |
| | | logger.info(JSONObject.toJSONString(streamPushItemForUpdate)); |
| | | gbStreamService.updateGbIdOrName(streamPushItemForUpdate); |
| | | } |
| | | }catch (Exception e) { |
| | | logger.warn("[REDIS消息-推流设备列表更新] 发现未处理的异常, \r\n{}", JSON.toJSONString(message)); |
| | | logger.warn("[REDIS消息-推流设备列表更新] 发现未处理的异常, \r\n{}", new String(message.getBody())); |
| | | logger.error("[REDIS消息-推流设备列表更新] 异常内容: ", e); |
| | | } |
| | | } |
| | |
| | | import org.springframework.stereotype.Repository; |
| | | |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | |
| | | @Mapper |
| | | @Repository |
| | |
| | | @Select("SELECT status FROM wvp_stream_push WHERE app=#{app} AND stream=#{stream}") |
| | | Boolean selectStatusForPush(@Param("app") String app, @Param("stream") String stream); |
| | | |
| | | @MapKey("gbId") |
| | | @Select("SELECT * from wvp_gb_stream") |
| | | Map<String, GbStream> getAllGBId(); |
| | | } |
| | |
| | | import org.springframework.stereotype.Repository; |
| | | |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | |
| | | @Mapper |
| | | @Repository |
| | |
| | | "</foreach>" + |
| | | "</script>") |
| | | List<StreamPushItem> getListIn(List<StreamPushItem> streamPushItems); |
| | | |
| | | @MapKey("vhost") |
| | | @Select("SELECT CONCAT(wsp.app, wsp.stream) as vhost, wsp.app, wsp.stream, wgs.gb_id, wgs.name " + |
| | | " from wvp_stream_push wsp " + |
| | | " left join wvp_gb_stream wgs on wgs.app = wsp.app and wgs.stream = wsp.stream") |
| | | Map<String, StreamPushItem> getAllAppAndStreamMap(); |
| | | |
| | | |
| | | } |
New file |
| | |
| | | package com.genersoft.iot.vmp.utils; |
| | | |
| | | import com.genersoft.iot.vmp.common.CivilCodePo; |
| | | import org.slf4j.Logger; |
| | | import org.slf4j.LoggerFactory; |
| | | |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | import java.util.concurrent.ConcurrentHashMap; |
| | | |
| | | public enum CivilCodeUtil { |
| | | |
| | | INSTANCE; |
| | | private final static Logger log = LoggerFactory.getLogger(CivilCodeUtil.class); |
| | | |
| | | // 用与消息的缓存 |
| | | private final Map<String, CivilCodePo> civilCodeMap = new ConcurrentHashMap<>(); |
| | | |
| | | CivilCodeUtil() { |
| | | } |
| | | |
| | | public void add(List<CivilCodePo> civilCodePoList) { |
| | | if (!civilCodePoList.isEmpty()) { |
| | | for (CivilCodePo civilCodePo : civilCodePoList) { |
| | | civilCodeMap.put(civilCodePo.getCode(), civilCodePo); |
| | | } |
| | | } |
| | | } |
| | | |
| | | public CivilCodePo getParentCode(String code) { |
| | | if (code.length() > 8) { |
| | | return null; |
| | | } |
| | | if (code.length() == 8) { |
| | | String parentCode = code.substring(0, 6); |
| | | return civilCodeMap.get(parentCode); |
| | | }else { |
| | | CivilCodePo civilCodePo = civilCodeMap.get(code); |
| | | if (civilCodePo == null){ |
| | | return null; |
| | | } |
| | | String parentCode = civilCodePo.getParentCode(); |
| | | if (parentCode == null) { |
| | | return null; |
| | | } |
| | | return civilCodeMap.get(parentCode); |
| | | } |
| | | |
| | | } |
| | | } |
| | |
| | | private static final String ISO8601_ZONE_PATTERN = "yyyy-MM-dd'T'HH:mm:ssXXX"; |
| | | |
| | | /** |
| | | * 兼容的时间格式 iso8601时间格式带毫秒 |
| | | */ |
| | | private static final String ISO8601_MILLISECOND_PATTERN = "yyyy-MM-dd'T'HH:mm:ss.SSS"; |
| | | |
| | | /** |
| | | * wvp内部统一时间格式 |
| | | */ |
| | | public static final String PATTERN = "yyyy-MM-dd HH:mm:ss"; |
| | |
| | | public static final DateTimeFormatter formatterCompatibleISO8601 = DateTimeFormatter.ofPattern(ISO8601_COMPATIBLE_PATTERN, Locale.getDefault()).withZone(ZoneId.of(zoneStr)); |
| | | public static final DateTimeFormatter formatterISO8601 = DateTimeFormatter.ofPattern(ISO8601_PATTERN, Locale.getDefault()).withZone(ZoneId.of(zoneStr)); |
| | | public static final DateTimeFormatter formatterZoneISO8601 = DateTimeFormatter.ofPattern(ISO8601_ZONE_PATTERN, Locale.getDefault()).withZone(ZoneId.of(zoneStr)); |
| | | public static final DateTimeFormatter formatterMillisecondISO8601 = DateTimeFormatter.ofPattern(ISO8601_MILLISECOND_PATTERN, Locale.getDefault()).withZone(ZoneId.of(zoneStr)); |
| | | |
| | | public static final DateTimeFormatter formatter = DateTimeFormatter.ofPattern(PATTERN, Locale.getDefault()).withZone(ZoneId.of(zoneStr)); |
| | | public static final DateTimeFormatter DateFormatter = DateTimeFormatter.ofPattern(date_PATTERN, Locale.getDefault()).withZone(ZoneId.of(zoneStr)); |
| | | public static final DateTimeFormatter urlFormatter = DateTimeFormatter.ofPattern(URL_PATTERN, Locale.getDefault()).withZone(ZoneId.of(zoneStr)); |
| | |
| | | return formatter.format(formatterCompatibleISO8601.parse(formatTime)); |
| | | } else if (verification(formatTime, formatterZoneISO8601)) { |
| | | return formatter.format(formatterZoneISO8601.parse(formatTime)); |
| | | } else if (verification(formatTime, formatterMillisecondISO8601)) { |
| | | return formatter.format(formatterMillisecondISO8601.parse(formatTime)); |
| | | } |
| | | return formatter.format(formatterISO8601.parse(formatTime)); |
| | | } |
| | |
| | | import com.genersoft.iot.vmp.conf.exception.ControllerException; |
| | | import com.genersoft.iot.vmp.conf.security.JwtUtils; |
| | | import com.genersoft.iot.vmp.gb28181.bean.GbStream; |
| | | import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform; |
| | | import com.genersoft.iot.vmp.service.IGbStreamService; |
| | | import com.genersoft.iot.vmp.service.IPlatformService; |
| | | import com.genersoft.iot.vmp.storager.IVideoManagerStorage; |
| | | import com.genersoft.iot.vmp.service.IStreamPushService; |
| | | import com.genersoft.iot.vmp.vmanager.bean.ErrorCode; |
| | | import com.genersoft.iot.vmp.vmanager.gb28181.gbStream.bean.GbStreamParam; |
| | | import com.github.pagehelper.PageInfo; |
| | |
| | | import org.springframework.util.ObjectUtils; |
| | | import org.springframework.web.bind.annotation.*; |
| | | |
| | | import java.util.ArrayList; |
| | | import java.util.List; |
| | | |
| | | @Tag(name = "视频流关联到级联平台") |
| | |
| | | private IGbStreamService gbStreamService; |
| | | |
| | | @Autowired |
| | | private IStreamPushService service; |
| | | |
| | | @Autowired |
| | | private IPlatformService platformService; |
| | | |
| | | |