Commit ec0ec5eb54723cc9aeabb4f313da2a101ab98bd2
1 parent
e7bdcc1f
修复并发点播时可能出现的rtpServer开启但是还未收到流的情况,编码类型136,137,138默认开启音频通道
Showing
11 changed files
with
87 additions
and
35 deletions
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java
| @@ -356,7 +356,7 @@ public class SIPCommander implements ISIPCommander { | @@ -356,7 +356,7 @@ public class SIPCommander implements ISIPCommander { | ||
| 356 | // String streamMode = device.getStreamMode().toUpperCase(); | 356 | // String streamMode = device.getStreamMode().toUpperCase(); |
| 357 | 357 | ||
| 358 | logger.info("{} 分配的ZLM为: {} [{}:{}]", stream, mediaServerItem.getId(), mediaServerItem.getIp(), ssrcInfo.getPort()); | 358 | logger.info("{} 分配的ZLM为: {} [{}:{}]", stream, mediaServerItem.getId(), mediaServerItem.getIp(), ssrcInfo.getPort()); |
| 359 | - HookSubscribeForStreamChange hookSubscribe = HookSubscribeFactory.on_stream_changed("rtp", stream, true, "rtmp", mediaServerItem.getId()); | 359 | + HookSubscribeForStreamChange hookSubscribe = HookSubscribeFactory.on_stream_changed("rtp", stream, true, "rtsp", mediaServerItem.getId()); |
| 360 | subscribe.addSubscribe(hookSubscribe, (MediaServerItem mediaServerItemInUse, JSONObject json)->{ | 360 | subscribe.addSubscribe(hookSubscribe, (MediaServerItem mediaServerItemInUse, JSONObject json)->{ |
| 361 | if (event != null) { | 361 | if (event != null) { |
| 362 | event.response(mediaServerItemInUse, json); | 362 | event.response(mediaServerItemInUse, json); |
| @@ -524,7 +524,7 @@ public class SIPCommander implements ISIPCommander { | @@ -524,7 +524,7 @@ public class SIPCommander implements ISIPCommander { | ||
| 524 | 524 | ||
| 525 | CallIdHeader callIdHeader = device.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId() | 525 | CallIdHeader callIdHeader = device.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId() |
| 526 | : udpSipProvider.getNewCallId(); | 526 | : udpSipProvider.getNewCallId(); |
| 527 | - HookSubscribeForStreamChange hookSubscribe = HookSubscribeFactory.on_stream_changed("rtp", ssrcInfo.getStream(), true, "rtmp", mediaServerItem.getId()); | 527 | + HookSubscribeForStreamChange hookSubscribe = HookSubscribeFactory.on_stream_changed("rtp", ssrcInfo.getStream(), true, "rtsp", mediaServerItem.getId()); |
| 528 | // 添加订阅 | 528 | // 添加订阅 |
| 529 | subscribe.addSubscribe(hookSubscribe, (MediaServerItem mediaServerItemInUse, JSONObject json)->{ | 529 | subscribe.addSubscribe(hookSubscribe, (MediaServerItem mediaServerItemInUse, JSONObject json)->{ |
| 530 | if (hookEvent != null) { | 530 | if (hookEvent != null) { |
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/InviteRequestProcessor.java
| @@ -16,9 +16,7 @@ import com.genersoft.iot.vmp.gb28181.utils.SipUtils; | @@ -16,9 +16,7 @@ import com.genersoft.iot.vmp.gb28181.utils.SipUtils; | ||
| 16 | import com.genersoft.iot.vmp.media.zlm.ZlmHttpHookSubscribe; | 16 | import com.genersoft.iot.vmp.media.zlm.ZlmHttpHookSubscribe; |
| 17 | import com.genersoft.iot.vmp.media.zlm.ZLMMediaListManager; | 17 | import com.genersoft.iot.vmp.media.zlm.ZLMMediaListManager; |
| 18 | import com.genersoft.iot.vmp.media.zlm.ZLMRTPServerFactory; | 18 | import com.genersoft.iot.vmp.media.zlm.ZLMRTPServerFactory; |
| 19 | -import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem; | ||
| 20 | -import com.genersoft.iot.vmp.media.zlm.dto.StreamProxyItem; | ||
| 21 | -import com.genersoft.iot.vmp.media.zlm.dto.StreamPushItem; | 19 | +import com.genersoft.iot.vmp.media.zlm.dto.*; |
| 22 | import com.genersoft.iot.vmp.service.IMediaServerService; | 20 | import com.genersoft.iot.vmp.service.IMediaServerService; |
| 23 | import com.genersoft.iot.vmp.service.IPlayService; | 21 | import com.genersoft.iot.vmp.service.IPlayService; |
| 24 | import com.genersoft.iot.vmp.service.IStreamProxyService; | 22 | import com.genersoft.iot.vmp.service.IStreamProxyService; |
| @@ -91,6 +89,9 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements | @@ -91,6 +89,9 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements | ||
| 91 | private IMediaServerService mediaServerService; | 89 | private IMediaServerService mediaServerService; |
| 92 | 90 | ||
| 93 | @Autowired | 91 | @Autowired |
| 92 | + private ZlmHttpHookSubscribe zlmHttpHookSubscribe; | ||
| 93 | + | ||
| 94 | + @Autowired | ||
| 94 | private SIPProcessorObserver sipProcessorObserver; | 95 | private SIPProcessorObserver sipProcessorObserver; |
| 95 | 96 | ||
| 96 | @Autowired | 97 | @Autowired |
| @@ -400,7 +401,14 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements | @@ -400,7 +401,14 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements | ||
| 400 | if (playTransaction != null) { | 401 | if (playTransaction != null) { |
| 401 | Boolean streamReady = zlmrtpServerFactory.isStreamReady(mediaServerItem, "rtp", playTransaction.getStream()); | 402 | Boolean streamReady = zlmrtpServerFactory.isStreamReady(mediaServerItem, "rtp", playTransaction.getStream()); |
| 402 | if (!streamReady) { | 403 | if (!streamReady) { |
| 403 | - playTransaction = null; | 404 | + boolean hasRtpServer = mediaServerService.checkRtpServer(mediaServerItem, "rtp", playTransaction.getStream()); |
| 405 | + if (hasRtpServer) { | ||
| 406 | + logger.info("[上级点播]已经开启rtpServer但是尚未收到流,开启监听流的到来"); | ||
| 407 | + HookSubscribeForStreamChange hookSubscribe = HookSubscribeFactory.on_stream_changed("rtp", playTransaction.getStream(), true, "rtsp", mediaServerItem.getId()); | ||
| 408 | + zlmHttpHookSubscribe.addSubscribe(hookSubscribe, hookEvent); | ||
| 409 | + }else { | ||
| 410 | + playTransaction = null; | ||
| 411 | + } | ||
| 404 | } | 412 | } |
| 405 | } | 413 | } |
| 406 | if (playTransaction == null) { | 414 | if (playTransaction == null) { |
| @@ -564,7 +572,7 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements | @@ -564,7 +572,7 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements | ||
| 564 | } else if ("push".equals(gbStream.getStreamType())) { | 572 | } else if ("push".equals(gbStream.getStreamType())) { |
| 565 | if (!platform.isStartOfflinePush()) { | 573 | if (!platform.isStartOfflinePush()) { |
| 566 | // 平台设置中关闭了拉起离线的推流则直接回复 | 574 | // 平台设置中关闭了拉起离线的推流则直接回复 |
| 567 | - responseAck(evt, Response.TEMPORARILY_UNAVAILABLE, "channel unavailable"); | 575 | + responseAck(evt, Response.TEMPORARILY_UNAVAILABLE, "channel stream not pushing"); |
| 568 | return; | 576 | return; |
| 569 | } | 577 | } |
| 570 | // 发送redis消息以使设备上线 | 578 | // 发送redis消息以使设备上线 |
src/main/java/com/genersoft/iot/vmp/gb28181/utils/XmlUtil.java
| @@ -203,6 +203,12 @@ public class XmlUtil { | @@ -203,6 +203,12 @@ public class XmlUtil { | ||
| 203 | return null; | 203 | return null; |
| 204 | } | 204 | } |
| 205 | deviceChannel.setChannelId(channelId); | 205 | deviceChannel.setChannelId(channelId); |
| 206 | + int channelTypeCode = Integer.parseInt(channelId.substring(10, 13)); | ||
| 207 | + if (channelTypeCode == 136 || channelTypeCode == 137 || channelTypeCode == 138) { | ||
| 208 | + deviceChannel.setHasAudio(true); | ||
| 209 | + }else { | ||
| 210 | + deviceChannel.setHasAudio(false); | ||
| 211 | + } | ||
| 206 | if (event != null && !event.equals(CatalogEvent.ADD) && !event.equals(CatalogEvent.UPDATE)) { | 212 | if (event != null && !event.equals(CatalogEvent.ADD) && !event.equals(CatalogEvent.UPDATE)) { |
| 207 | // 除了ADD和update情况下需要识别全部内容, | 213 | // 除了ADD和update情况下需要识别全部内容, |
| 208 | return deviceChannel; | 214 | return deviceChannel; |
| @@ -396,7 +402,6 @@ public class XmlUtil { | @@ -396,7 +402,6 @@ public class XmlUtil { | ||
| 396 | } else { | 402 | } else { |
| 397 | deviceChannel.setPTZType(Integer.parseInt(XmlUtil.getText(itemDevice, "PTZType"))); | 403 | deviceChannel.setPTZType(Integer.parseInt(XmlUtil.getText(itemDevice, "PTZType"))); |
| 398 | } | 404 | } |
| 399 | - deviceChannel.setHasAudio(true); // 默认含有音频,播放时再检查是否有音频及是否AAC | ||
| 400 | return deviceChannel; | 405 | return deviceChannel; |
| 401 | } | 406 | } |
| 402 | } | 407 | } |
| 403 | \ No newline at end of file | 408 | \ No newline at end of file |
src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRTPServerFactory.java
| @@ -96,6 +96,10 @@ public class ZLMRTPServerFactory { | @@ -96,6 +96,10 @@ public class ZLMRTPServerFactory { | ||
| 96 | if(rtpInfo.getInteger("code") == 0){ | 96 | if(rtpInfo.getInteger("code") == 0){ |
| 97 | if (rtpInfo.getBoolean("exist")) { | 97 | if (rtpInfo.getBoolean("exist")) { |
| 98 | result = rtpInfo.getInteger("local_port"); | 98 | result = rtpInfo.getInteger("local_port"); |
| 99 | + if (result == 0) { | ||
| 100 | + // 此时说明rtpServer已经创建但是流还没有推上来 | ||
| 101 | + | ||
| 102 | + } | ||
| 99 | return result; | 103 | return result; |
| 100 | } | 104 | } |
| 101 | }else if(rtpInfo.getInteger("code") == -2){ | 105 | }else if(rtpInfo.getInteger("code") == -2){ |
src/main/java/com/genersoft/iot/vmp/service/IMediaServerService.java
| @@ -83,4 +83,6 @@ public interface IMediaServerService { | @@ -83,4 +83,6 @@ public interface IMediaServerService { | ||
| 83 | MediaServerItem getDefaultMediaServer(); | 83 | MediaServerItem getDefaultMediaServer(); |
| 84 | 84 | ||
| 85 | void updateMediaServerKeepalive(String mediaServerId, JSONObject data); | 85 | void updateMediaServerKeepalive(String mediaServerId, JSONObject data); |
| 86 | + | ||
| 87 | + boolean checkRtpServer(MediaServerItem mediaServerItem, String rtp, String stream); | ||
| 86 | } | 88 | } |
src/main/java/com/genersoft/iot/vmp/service/impl/MediaServerServiceImpl.java
| @@ -147,9 +147,11 @@ public class MediaServerServiceImpl implements IMediaServerService { | @@ -147,9 +147,11 @@ public class MediaServerServiceImpl implements IMediaServerService { | ||
| 147 | if (streamId == null) { | 147 | if (streamId == null) { |
| 148 | streamId = String.format("%08x", Integer.parseInt(ssrc)).toUpperCase(); | 148 | streamId = String.format("%08x", Integer.parseInt(ssrc)).toUpperCase(); |
| 149 | } | 149 | } |
| 150 | - int rtpServerPort = mediaServerItem.getRtpProxyPort(); | 150 | + int rtpServerPort; |
| 151 | if (mediaServerItem.isRtpEnable()) { | 151 | if (mediaServerItem.isRtpEnable()) { |
| 152 | rtpServerPort = zlmrtpServerFactory.createRTPServer(mediaServerItem, streamId, ssrcCheck?Integer.parseInt(ssrc):0, port); | 152 | rtpServerPort = zlmrtpServerFactory.createRTPServer(mediaServerItem, streamId, ssrcCheck?Integer.parseInt(ssrc):0, port); |
| 153 | + } else { | ||
| 154 | + rtpServerPort = mediaServerItem.getRtpProxyPort(); | ||
| 153 | } | 155 | } |
| 154 | RedisUtil.set(key, mediaServerItem); | 156 | RedisUtil.set(key, mediaServerItem); |
| 155 | return new SSRCInfo(rtpServerPort, ssrc, streamId); | 157 | return new SSRCInfo(rtpServerPort, ssrc, streamId); |
| @@ -681,4 +683,13 @@ public class MediaServerServiceImpl implements IMediaServerService { | @@ -681,4 +683,13 @@ public class MediaServerServiceImpl implements IMediaServerService { | ||
| 681 | } | 683 | } |
| 682 | } | 684 | } |
| 683 | } | 685 | } |
| 686 | + | ||
| 687 | + @Override | ||
| 688 | + public boolean checkRtpServer(MediaServerItem mediaServerItem, String app, String stream) { | ||
| 689 | + JSONObject rtpInfo = zlmresTfulUtils.getRtpInfo(mediaServerItem, stream); | ||
| 690 | + if(rtpInfo.getInteger("code") == 0){ | ||
| 691 | + return rtpInfo.getBoolean("exist"); | ||
| 692 | + } | ||
| 693 | + return false; | ||
| 694 | + } | ||
| 684 | } | 695 | } |
src/main/java/com/genersoft/iot/vmp/service/impl/PlayServiceImpl.java
| @@ -164,17 +164,30 @@ public class PlayServiceImpl implements IPlayService { | @@ -164,17 +164,30 @@ public class PlayServiceImpl implements IPlayService { | ||
| 164 | JSONObject rtpInfo = zlmresTfulUtils.getRtpInfo(mediaInfo, streamId); | 164 | JSONObject rtpInfo = zlmresTfulUtils.getRtpInfo(mediaInfo, streamId); |
| 165 | if(rtpInfo.getInteger("code") == 0){ | 165 | if(rtpInfo.getInteger("code") == 0){ |
| 166 | if (rtpInfo.getBoolean("exist")) { | 166 | if (rtpInfo.getBoolean("exist")) { |
| 167 | - | ||
| 168 | - WVPResult wvpResult = new WVPResult(); | ||
| 169 | - wvpResult.setCode(ErrorCode.SUCCESS.getCode()); | ||
| 170 | - wvpResult.setMsg(ErrorCode.SUCCESS.getMsg()); | ||
| 171 | - wvpResult.setData(streamInfo); | ||
| 172 | - msg.setData(wvpResult); | ||
| 173 | - | ||
| 174 | - resultHolder.invokeAllResult(msg); | ||
| 175 | - if (hookEvent != null) { | ||
| 176 | - hookEvent.response(mediaServerItem, JSONObject.parseObject(JSON.toJSONString(streamInfo))); | 167 | + int localPort = rtpInfo.getInteger("local_port"); |
| 168 | + if (localPort == 0) { | ||
| 169 | + logger.warn("[点播],点播时发现rtpServerC存在,但是尚未开始推流"); | ||
| 170 | + // 此时说明rtpServer已经创建但是流还没有推上来 | ||
| 171 | + WVPResult wvpResult = new WVPResult(); | ||
| 172 | + wvpResult.setCode(ErrorCode.ERROR100.getCode()); | ||
| 173 | + wvpResult.setMsg("点播已经在进行中,请稍候重试"); | ||
| 174 | + msg.setData(wvpResult); | ||
| 175 | + | ||
| 176 | + resultHolder.invokeAllResult(msg); | ||
| 177 | + return playResult; | ||
| 178 | + }else { | ||
| 179 | + WVPResult wvpResult = new WVPResult(); | ||
| 180 | + wvpResult.setCode(ErrorCode.SUCCESS.getCode()); | ||
| 181 | + wvpResult.setMsg(ErrorCode.SUCCESS.getMsg()); | ||
| 182 | + wvpResult.setData(streamInfo); | ||
| 183 | + msg.setData(wvpResult); | ||
| 184 | + | ||
| 185 | + resultHolder.invokeAllResult(msg); | ||
| 186 | + if (hookEvent != null) { | ||
| 187 | + hookEvent.response(mediaServerItem, JSONObject.parseObject(JSON.toJSONString(streamInfo))); | ||
| 188 | + } | ||
| 177 | } | 189 | } |
| 190 | + | ||
| 178 | }else { | 191 | }else { |
| 179 | redisCatchStorage.stopPlay(streamInfo); | 192 | redisCatchStorage.stopPlay(streamInfo); |
| 180 | storager.stopPlay(streamInfo.getDeviceID(), streamInfo.getChannelId()); | 193 | storager.stopPlay(streamInfo.getDeviceID(), streamInfo.getChannelId()); |
| @@ -187,7 +200,6 @@ public class PlayServiceImpl implements IPlayService { | @@ -187,7 +200,6 @@ public class PlayServiceImpl implements IPlayService { | ||
| 187 | streamInfo = null; | 200 | streamInfo = null; |
| 188 | 201 | ||
| 189 | } | 202 | } |
| 190 | - | ||
| 191 | } | 203 | } |
| 192 | if (streamInfo == null) { | 204 | if (streamInfo == null) { |
| 193 | String streamId = null; | 205 | String streamId = null; |
src/main/java/com/genersoft/iot/vmp/storager/dao/DeviceChannelMapper.java
| @@ -143,15 +143,12 @@ public interface DeviceChannelMapper { | @@ -143,15 +143,12 @@ public interface DeviceChannelMapper { | ||
| 143 | @Update(value = {"UPDATE device_channel SET status=0 WHERE deviceId=#{deviceId}"}) | 143 | @Update(value = {"UPDATE device_channel SET status=0 WHERE deviceId=#{deviceId}"}) |
| 144 | void offlineByDeviceId(String deviceId); | 144 | void offlineByDeviceId(String deviceId); |
| 145 | 145 | ||
| 146 | - @Update(value = {"UPDATE device_channel SET status=1 WHERE deviceId=#{deviceId} AND channelId=#{channelId}"}) | ||
| 147 | - void online(String deviceId, String channelId); | ||
| 148 | - | ||
| 149 | @Insert("<script> " + | 146 | @Insert("<script> " + |
| 150 | "insert into device_channel " + | 147 | "insert into device_channel " + |
| 151 | "(channelId, deviceId, name, manufacture, model, owner, civilCode, block, subCount, " + | 148 | "(channelId, deviceId, name, manufacture, model, owner, civilCode, block, subCount, " + |
| 152 | " address, parental, parentId, safetyWay, registerWay, certNum, certifiable, errCode, secrecy, " + | 149 | " address, parental, parentId, safetyWay, registerWay, certNum, certifiable, errCode, secrecy, " + |
| 153 | " ipAddress, port, password, PTZType, status, streamId, longitude, latitude, longitudeGcj02, latitudeGcj02, " + | 150 | " ipAddress, port, password, PTZType, status, streamId, longitude, latitude, longitudeGcj02, latitudeGcj02, " + |
| 154 | - " longitudeWgs84, latitudeWgs84, createTime, updateTime, businessGroupId, gpsTime) " + | 151 | + " longitudeWgs84, latitudeWgs84, hasAudio, createTime, updateTime, businessGroupId, gpsTime) " + |
| 155 | "values " + | 152 | "values " + |
| 156 | "<foreach collection='addChannels' index='index' item='item' separator=','> " + | 153 | "<foreach collection='addChannels' index='index' item='item' separator=','> " + |
| 157 | "('${item.channelId}', '${item.deviceId}', '${item.name}', '${item.manufacture}', '${item.model}', " + | 154 | "('${item.channelId}', '${item.deviceId}', '${item.name}', '${item.manufacture}', '${item.model}', " + |
| @@ -160,7 +157,7 @@ public interface DeviceChannelMapper { | @@ -160,7 +157,7 @@ public interface DeviceChannelMapper { | ||
| 160 | "'${item.certNum}', ${item.certifiable}, ${item.errCode}, '${item.secrecy}', " + | 157 | "'${item.certNum}', ${item.certifiable}, ${item.errCode}, '${item.secrecy}', " + |
| 161 | "'${item.ipAddress}', ${item.port}, '${item.password}', ${item.PTZType}, ${item.status}, " + | 158 | "'${item.ipAddress}', ${item.port}, '${item.password}', ${item.PTZType}, ${item.status}, " + |
| 162 | "'${item.streamId}', ${item.longitude}, ${item.latitude},${item.longitudeGcj02}, " + | 159 | "'${item.streamId}', ${item.longitude}, ${item.latitude},${item.longitudeGcj02}, " + |
| 163 | - "${item.latitudeGcj02},${item.longitudeWgs84}, ${item.latitudeWgs84},'${item.createTime}', '${item.updateTime}', " + | 160 | + "${item.latitudeGcj02},${item.longitudeWgs84}, ${item.latitudeWgs84}, ${item.hasAudio},'${item.createTime}', '${item.updateTime}', " + |
| 164 | "'${item.businessGroupId}', '${item.gpsTime}') " + | 161 | "'${item.businessGroupId}', '${item.gpsTime}') " + |
| 165 | "</foreach> " + | 162 | "</foreach> " + |
| 166 | "ON DUPLICATE KEY UPDATE " + | 163 | "ON DUPLICATE KEY UPDATE " + |
| @@ -193,11 +190,15 @@ public interface DeviceChannelMapper { | @@ -193,11 +190,15 @@ public interface DeviceChannelMapper { | ||
| 193 | "latitudeGcj02=VALUES(latitudeGcj02), " + | 190 | "latitudeGcj02=VALUES(latitudeGcj02), " + |
| 194 | "longitudeWgs84=VALUES(longitudeWgs84), " + | 191 | "longitudeWgs84=VALUES(longitudeWgs84), " + |
| 195 | "latitudeWgs84=VALUES(latitudeWgs84), " + | 192 | "latitudeWgs84=VALUES(latitudeWgs84), " + |
| 193 | + "hasAudio=VALUES(hasAudio), " + | ||
| 196 | "businessGroupId=VALUES(businessGroupId), " + | 194 | "businessGroupId=VALUES(businessGroupId), " + |
| 197 | "gpsTime=VALUES(gpsTime)" + | 195 | "gpsTime=VALUES(gpsTime)" + |
| 198 | "</script>") | 196 | "</script>") |
| 199 | int batchAdd(List<DeviceChannel> addChannels); | 197 | int batchAdd(List<DeviceChannel> addChannels); |
| 200 | 198 | ||
| 199 | + @Update(value = {"UPDATE device_channel SET status=1 WHERE deviceId=#{deviceId} AND channelId=#{channelId}"}) | ||
| 200 | + void online(String deviceId, String channelId); | ||
| 201 | + | ||
| 201 | @Update({"<script>" + | 202 | @Update({"<script>" + |
| 202 | "<foreach collection='updateChannels' item='item' separator=';'>" + | 203 | "<foreach collection='updateChannels' item='item' separator=';'>" + |
| 203 | " UPDATE" + | 204 | " UPDATE" + |
| @@ -341,4 +342,7 @@ public interface DeviceChannelMapper { | @@ -341,4 +342,7 @@ public interface DeviceChannelMapper { | ||
| 341 | " left join platform_catalog pc on pgc.catalogId = pc.id and pgc.platformId = pc.platformId" + | 342 | " left join platform_catalog pc on pgc.catalogId = pc.id and pgc.platformId = pc.platformId" + |
| 342 | " where pgc.platformId=#{serverGBId}") | 343 | " where pgc.platformId=#{serverGBId}") |
| 343 | List<DeviceChannel> queryChannelWithCatalog(String serverGBId); | 344 | List<DeviceChannel> queryChannelWithCatalog(String serverGBId); |
| 345 | + | ||
| 346 | + @Select("select * from device_channel where deviceId = #{deviceId}") | ||
| 347 | + List<DeviceChannel> queryAllChannels(String deviceId); | ||
| 344 | } | 348 | } |
src/main/java/com/genersoft/iot/vmp/storager/impl/VideoManagerStorageImpl.java
| @@ -111,11 +111,11 @@ public class VideoManagerStorageImpl implements IVideoManagerStorage { | @@ -111,11 +111,11 @@ public class VideoManagerStorageImpl implements IVideoManagerStorage { | ||
| 111 | if (CollectionUtils.isEmpty(deviceChannelList)) { | 111 | if (CollectionUtils.isEmpty(deviceChannelList)) { |
| 112 | return false; | 112 | return false; |
| 113 | } | 113 | } |
| 114 | - List<DeviceChannel> allChannelInPlay = deviceChannelMapper.getAllChannelInPlay(); | ||
| 115 | - Map<String,DeviceChannel> allChannelMapInPlay = new ConcurrentHashMap<>(); | ||
| 116 | - if (allChannelInPlay.size() > 0) { | ||
| 117 | - for (DeviceChannel deviceChannel : allChannelInPlay) { | ||
| 118 | - allChannelMapInPlay.put(deviceChannel.getChannelId(), deviceChannel); | 114 | + List<DeviceChannel> allChannels = deviceChannelMapper.queryAllChannels(deviceId); |
| 115 | + Map<String,DeviceChannel> allChannelMap = new ConcurrentHashMap<>(); | ||
| 116 | + if (allChannels.size() > 0) { | ||
| 117 | + for (DeviceChannel deviceChannel : allChannels) { | ||
| 118 | + allChannelMap.put(deviceChannel.getChannelId(), deviceChannel); | ||
| 119 | } | 119 | } |
| 120 | } | 120 | } |
| 121 | TransactionStatus transactionStatus = dataSourceTransactionManager.getTransaction(transactionDefinition); | 121 | TransactionStatus transactionStatus = dataSourceTransactionManager.getTransaction(transactionDefinition); |
| @@ -123,15 +123,17 @@ public class VideoManagerStorageImpl implements IVideoManagerStorage { | @@ -123,15 +123,17 @@ public class VideoManagerStorageImpl implements IVideoManagerStorage { | ||
| 123 | List<DeviceChannel> channels = new ArrayList<>(); | 123 | List<DeviceChannel> channels = new ArrayList<>(); |
| 124 | StringBuilder stringBuilder = new StringBuilder(); | 124 | StringBuilder stringBuilder = new StringBuilder(); |
| 125 | Map<String, Integer> subContMap = new HashMap<>(); | 125 | Map<String, Integer> subContMap = new HashMap<>(); |
| 126 | - if (deviceChannelList.size() > 1) { | 126 | + if (deviceChannelList.size() > 0) { |
| 127 | // 数据去重 | 127 | // 数据去重 |
| 128 | Set<String> gbIdSet = new HashSet<>(); | 128 | Set<String> gbIdSet = new HashSet<>(); |
| 129 | for (DeviceChannel deviceChannel : deviceChannelList) { | 129 | for (DeviceChannel deviceChannel : deviceChannelList) { |
| 130 | if (!gbIdSet.contains(deviceChannel.getChannelId())) { | 130 | if (!gbIdSet.contains(deviceChannel.getChannelId())) { |
| 131 | gbIdSet.add(deviceChannel.getChannelId()); | 131 | gbIdSet.add(deviceChannel.getChannelId()); |
| 132 | - if (allChannelMapInPlay.containsKey(deviceChannel.getChannelId())) { | ||
| 133 | - deviceChannel.setStreamId(allChannelMapInPlay.get(deviceChannel.getChannelId()).getStreamId()); | 132 | + if (allChannelMap.containsKey(deviceChannel.getChannelId())) { |
| 133 | + deviceChannel.setStreamId(allChannelMap.get(deviceChannel.getChannelId()).getStreamId()); | ||
| 134 | + deviceChannel.setHasAudio(allChannelMap.get(deviceChannel.getChannelId()).isHasAudio()); | ||
| 134 | } | 135 | } |
| 136 | + | ||
| 135 | channels.add(deviceChannel); | 137 | channels.add(deviceChannel); |
| 136 | if (!ObjectUtils.isEmpty(deviceChannel.getParentId())) { | 138 | if (!ObjectUtils.isEmpty(deviceChannel.getParentId())) { |
| 137 | if (subContMap.get(deviceChannel.getParentId()) == null) { | 139 | if (subContMap.get(deviceChannel.getParentId()) == null) { |
| @@ -153,8 +155,6 @@ public class VideoManagerStorageImpl implements IVideoManagerStorage { | @@ -153,8 +155,6 @@ public class VideoManagerStorageImpl implements IVideoManagerStorage { | ||
| 153 | } | 155 | } |
| 154 | } | 156 | } |
| 155 | 157 | ||
| 156 | - }else { | ||
| 157 | - channels = deviceChannelList; | ||
| 158 | } | 158 | } |
| 159 | if (stringBuilder.length() > 0) { | 159 | if (stringBuilder.length() > 0) { |
| 160 | logger.info("[目录查询]收到的数据存在重复: {}" , stringBuilder); | 160 | logger.info("[目录查询]收到的数据存在重复: {}" , stringBuilder); |
src/main/java/com/genersoft/iot/vmp/vmanager/user/UserController.java
| @@ -43,6 +43,7 @@ public class UserController { | @@ -43,6 +43,7 @@ public class UserController { | ||
| 43 | private IRoleService roleService; | 43 | private IRoleService roleService; |
| 44 | 44 | ||
| 45 | @GetMapping("/login") | 45 | @GetMapping("/login") |
| 46 | + @PostMapping("/login") | ||
| 46 | @Operation(summary = "登录") | 47 | @Operation(summary = "登录") |
| 47 | @Parameter(name = "username", description = "用户名", required = true) | 48 | @Parameter(name = "username", description = "用户名", required = true) |
| 48 | @Parameter(name = "password", description = "密码(32位md5加密)", required = true) | 49 | @Parameter(name = "password", description = "密码(32位md5加密)", required = true) |
src/main/resources/logback-spring-local.xml
| @@ -98,6 +98,11 @@ | @@ -98,6 +98,11 @@ | ||
| 98 | <appender-ref ref="STDOUT" /> | 98 | <appender-ref ref="STDOUT" /> |
| 99 | </root> | 99 | </root> |
| 100 | 100 | ||
| 101 | + <logger name="wvp" level="debug" additivity="true"> | ||
| 102 | + <appender-ref ref="RollingFileError"/> | ||
| 103 | + <appender-ref ref="RollingFile"/> | ||
| 104 | + </logger> | ||
| 105 | + | ||
| 101 | <logger name="GB28181_SIP" level="debug" additivity="true"> | 106 | <logger name="GB28181_SIP" level="debug" additivity="true"> |
| 102 | <appender-ref ref="RollingFileError"/> | 107 | <appender-ref ref="RollingFileError"/> |
| 103 | <appender-ref ref="sipRollingFile"/> | 108 | <appender-ref ref="sipRollingFile"/> |