Commit f6c48588daba63846a9e70ef10fe7af2fceab035
1 parent
18898e98
支持支持主码流子码流切换
Showing
21 changed files
with
910 additions
and
169 deletions
README.md
src/main/java/com/genersoft/iot/vmp/common/InviteInfo.java
| 1 | 1 | package com.genersoft.iot.vmp.common; |
| 2 | 2 | |
| 3 | 3 | import com.genersoft.iot.vmp.service.bean.SSRCInfo; |
| 4 | -import io.swagger.v3.oas.annotations.media.Schema; | |
| 5 | 4 | |
| 6 | 5 | /** |
| 7 | 6 | * 记录每次发送invite消息的状态 |
| ... | ... | @@ -125,20 +124,4 @@ public class InviteInfo { |
| 125 | 124 | this.streamMode = streamMode; |
| 126 | 125 | } |
| 127 | 126 | |
| 128 | - | |
| 129 | - /*=========================设备主子码流逻辑START====================*/ | |
| 130 | - @Schema(description = "是否为子码流(true-是,false-主码流)") | |
| 131 | - private boolean subStream; | |
| 132 | - | |
| 133 | - public boolean isSubStream() { | |
| 134 | - return subStream; | |
| 135 | - } | |
| 136 | - | |
| 137 | - public void setSubStream(boolean subStream) { | |
| 138 | - this.subStream = subStream; | |
| 139 | - } | |
| 140 | - | |
| 141 | - | |
| 142 | - | |
| 143 | - | |
| 144 | 127 | } | ... | ... |
src/main/java/com/genersoft/iot/vmp/gb28181/bean/Device.java
| ... | ... | @@ -453,19 +453,4 @@ public class Device { |
| 453 | 453 | this.sipTransactionInfo = sipTransactionInfo; |
| 454 | 454 | } |
| 455 | 455 | |
| 456 | - /*======================设备主子码流逻辑START=========================*/ | |
| 457 | - @Schema(description = "开启主子码流切换的开关(false-不开启,true-开启)") | |
| 458 | - private boolean switchPrimarySubStream; | |
| 459 | - | |
| 460 | - public boolean isSwitchPrimarySubStream() { | |
| 461 | - return switchPrimarySubStream; | |
| 462 | - } | |
| 463 | - | |
| 464 | - public void setSwitchPrimarySubStream(boolean switchPrimarySubStream) { | |
| 465 | - this.switchPrimarySubStream = switchPrimarySubStream; | |
| 466 | - } | |
| 467 | - | |
| 468 | - /*======================设备主子码流逻辑END=========================*/ | |
| 469 | - | |
| 470 | - | |
| 471 | 456 | } | ... | ... |
src/main/java/com/genersoft/iot/vmp/gb28181/bean/DeviceChannel.java
| ... | ... | @@ -246,6 +246,10 @@ public class DeviceChannel { |
| 246 | 246 | @Schema(description = "GPS的更新时间") |
| 247 | 247 | private String gpsTime; |
| 248 | 248 | |
| 249 | + @Schema(description = "码流标识,优先级高于设备中码流标识," + | |
| 250 | + "用于选择码流时组成码流标识。默认为null,不设置。可选值: stream/streamnumber/streamprofile/streamMode") | |
| 251 | + private String streamIdentification; | |
| 252 | + | |
| 249 | 253 | public int getId() { |
| 250 | 254 | return id; |
| 251 | 255 | } |
| ... | ... | @@ -574,4 +578,12 @@ public class DeviceChannel { |
| 574 | 578 | public void setGpsTime(String gpsTime) { |
| 575 | 579 | this.gpsTime = gpsTime; |
| 576 | 580 | } |
| 581 | + | |
| 582 | + public String getStreamIdentification() { | |
| 583 | + return streamIdentification; | |
| 584 | + } | |
| 585 | + | |
| 586 | + public void setStreamIdentification(String streamIdentification) { | |
| 587 | + this.streamIdentification = streamIdentification; | |
| 588 | + } | |
| 577 | 589 | } | ... | ... |
src/main/java/com/genersoft/iot/vmp/gb28181/bean/GbSteamIdentification.java
0 → 100644
| 1 | +package com.genersoft.iot.vmp.gb28181.bean; | |
| 2 | + | |
| 3 | +/** | |
| 4 | + * 码流索引标识 | |
| 5 | + */ | |
| 6 | +public enum GbSteamIdentification { | |
| 7 | + /** | |
| 8 | + * 主码流 stream:0 | |
| 9 | + * 子码流 stream:1s | |
| 10 | + */ | |
| 11 | + streamMain("stream", new String[]{"0","1"}), | |
| 12 | + /** | |
| 13 | + * 国标28181-2022定义的方式 | |
| 14 | + * 主码流 streamnumber:0 | |
| 15 | + * 子码流 streamnumber:1 | |
| 16 | + */ | |
| 17 | + streamnumber("streamnumber", new String[]{"0","1"}), | |
| 18 | + /** | |
| 19 | + * 主码流 streamprofile:0 | |
| 20 | + * 子码流 streamprofile:1 | |
| 21 | + */ | |
| 22 | + streamprofile("streamprofile", new String[]{"0","1"}), | |
| 23 | + /** | |
| 24 | + * 适用的品牌: TP-LINK | |
| 25 | + */ | |
| 26 | + streamMode("streamMode", new String[]{"main","sub"}), | |
| 27 | + ; | |
| 28 | + | |
| 29 | + GbSteamIdentification(String value, String[] indexArray) { | |
| 30 | + this.value = value; | |
| 31 | + this.indexArray = indexArray; | |
| 32 | + } | |
| 33 | + | |
| 34 | + private String value; | |
| 35 | + private String[] indexArray; | |
| 36 | + | |
| 37 | + public String getValue() { | |
| 38 | + return value; | |
| 39 | + } | |
| 40 | + | |
| 41 | + public String[] getIndexArray() { | |
| 42 | + return indexArray; | |
| 43 | + } | |
| 44 | +} | ... | ... |
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/ISIPCommander.java
| ... | ... | @@ -4,6 +4,7 @@ import com.genersoft.iot.vmp.common.StreamInfo; |
| 4 | 4 | import com.genersoft.iot.vmp.conf.exception.SsrcTransactionNotFoundException; |
| 5 | 5 | import com.genersoft.iot.vmp.gb28181.bean.Device; |
| 6 | 6 | import com.genersoft.iot.vmp.gb28181.bean.DeviceAlarm; |
| 7 | +import com.genersoft.iot.vmp.gb28181.bean.DeviceChannel; | |
| 7 | 8 | import com.genersoft.iot.vmp.gb28181.event.SipSubscribe; |
| 8 | 9 | import com.genersoft.iot.vmp.media.zlm.ZlmHttpHookSubscribe; |
| 9 | 10 | import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem; |
| ... | ... | @@ -96,9 +97,9 @@ public interface ISIPCommander { |
| 96 | 97 | /** |
| 97 | 98 | * 请求预览视频流 |
| 98 | 99 | * @param device 视频设备 |
| 99 | - * @param channelId 预览通道 | |
| 100 | + * @param channel 预览通道 | |
| 100 | 101 | */ |
| 101 | - void playStreamCmd(MediaServerItem mediaServerItem, SSRCInfo ssrcInfo, Device device, String channelId, ZlmHttpHookSubscribe.Event event, SipSubscribe.Event okEvent, SipSubscribe.Event errorEvent) throws InvalidArgumentException, SipException, ParseException; | |
| 102 | + void playStreamCmd(MediaServerItem mediaServerItem, SSRCInfo ssrcInfo, Device device, DeviceChannel channel, ZlmHttpHookSubscribe.Event event, SipSubscribe.Event okEvent, SipSubscribe.Event errorEvent) throws InvalidArgumentException, SipException, ParseException; | |
| 102 | 103 | |
| 103 | 104 | /** |
| 104 | 105 | * 请求回放视频流 | ... | ... |
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java
| ... | ... | @@ -8,6 +8,7 @@ import com.genersoft.iot.vmp.conf.exception.SsrcTransactionNotFoundException; |
| 8 | 8 | import com.genersoft.iot.vmp.gb28181.SipLayer; |
| 9 | 9 | import com.genersoft.iot.vmp.gb28181.bean.Device; |
| 10 | 10 | import com.genersoft.iot.vmp.gb28181.bean.DeviceAlarm; |
| 11 | +import com.genersoft.iot.vmp.gb28181.bean.DeviceChannel; | |
| 11 | 12 | import com.genersoft.iot.vmp.gb28181.bean.SsrcTransaction; |
| 12 | 13 | import com.genersoft.iot.vmp.gb28181.event.SipSubscribe; |
| 13 | 14 | import com.genersoft.iot.vmp.gb28181.session.VideoStreamSessionManager; |
| ... | ... | @@ -264,12 +265,12 @@ public class SIPCommander implements ISIPCommander { |
| 264 | 265 | * 请求预览视频流 |
| 265 | 266 | * |
| 266 | 267 | * @param device 视频设备 |
| 267 | - * @param channelId 预览通道 | |
| 268 | + * @param channel 预览通道 | |
| 268 | 269 | * @param event hook订阅 |
| 269 | 270 | * @param errorEvent sip错误订阅 |
| 270 | 271 | */ |
| 271 | 272 | @Override |
| 272 | - public void playStreamCmd(MediaServerItem mediaServerItem, SSRCInfo ssrcInfo, Device device, String channelId, | |
| 273 | + public void playStreamCmd(MediaServerItem mediaServerItem, SSRCInfo ssrcInfo, Device device, DeviceChannel channel, | |
| 273 | 274 | ZlmHttpHookSubscribe.Event event, SipSubscribe.Event okEvent, SipSubscribe.Event errorEvent) throws InvalidArgumentException, SipException, ParseException { |
| 274 | 275 | String stream = ssrcInfo.getStream(); |
| 275 | 276 | |
| ... | ... | @@ -293,7 +294,7 @@ public class SIPCommander implements ISIPCommander { |
| 293 | 294 | } |
| 294 | 295 | StringBuffer content = new StringBuffer(200); |
| 295 | 296 | content.append("v=0\r\n"); |
| 296 | - content.append("o=" + channelId + " 0 0 IN IP4 " + sdpIp + "\r\n"); | |
| 297 | + content.append("o=" + channel.getChannelId() + " 0 0 IN IP4 " + sdpIp + "\r\n"); | |
| 297 | 298 | content.append("s=Play\r\n"); |
| 298 | 299 | content.append("c=IN IP4 " + sdpIp + "\r\n"); |
| 299 | 300 | content.append("t=0 0\r\n"); |
| ... | ... | @@ -344,20 +345,8 @@ public class SIPCommander implements ISIPCommander { |
| 344 | 345 | } |
| 345 | 346 | } |
| 346 | 347 | |
| 347 | - if( device.isSwitchPrimarySubStream() ){ | |
| 348 | - if("TP-LINK".equals(device.getManufacturer())){ | |
| 349 | - if (device.isSwitchPrimarySubStream()){ | |
| 350 | - content.append("a=streamMode:sub\r\n"); | |
| 351 | - }else { | |
| 352 | - content.append("a=streamMode:main\r\n"); | |
| 353 | - } | |
| 354 | - }else { | |
| 355 | - if (device.isSwitchPrimarySubStream()){ | |
| 356 | - content.append("a=streamprofile:1\r\n"); | |
| 357 | - }else { | |
| 358 | - content.append("a=streamprofile:0\r\n"); | |
| 359 | - } | |
| 360 | - } | |
| 348 | + if (!ObjectUtils.isEmpty(channel.getStreamIdentification())) { | |
| 349 | + content.append("a=" + channel.getStreamIdentification() + "\r\n"); | |
| 361 | 350 | } |
| 362 | 351 | |
| 363 | 352 | content.append("y=" + ssrcInfo.getSsrc() + "\r\n");//ssrc |
| ... | ... | @@ -366,16 +355,16 @@ public class SIPCommander implements ISIPCommander { |
| 366 | 355 | |
| 367 | 356 | |
| 368 | 357 | |
| 369 | - Request request = headerProvider.createInviteRequest(device, channelId, content.toString(), SipUtils.getNewViaTag(), SipUtils.getNewFromTag(), null, ssrcInfo.getSsrc(),sipSender.getNewCallIdHeader(sipLayer.getLocalIp(device.getLocalIp()),device.getTransport())); | |
| 358 | + Request request = headerProvider.createInviteRequest(device, channel.getChannelId(), content.toString(), SipUtils.getNewViaTag(), SipUtils.getNewFromTag(), null, ssrcInfo.getSsrc(),sipSender.getNewCallIdHeader(sipLayer.getLocalIp(device.getLocalIp()),device.getTransport())); | |
| 370 | 359 | sipSender.transmitRequest(sipLayer.getLocalIp(device.getLocalIp()), request, (e -> { |
| 371 | - streamSession.remove(device.getDeviceId(), channelId, ssrcInfo.getStream()); | |
| 360 | + streamSession.remove(device.getDeviceId(), channel.getChannelId(), ssrcInfo.getStream()); | |
| 372 | 361 | mediaServerService.releaseSsrc(mediaServerItem.getId(), ssrcInfo.getSsrc()); |
| 373 | 362 | errorEvent.response(e); |
| 374 | 363 | }), e -> { |
| 375 | 364 | ResponseEvent responseEvent = (ResponseEvent) e.event; |
| 376 | 365 | SIPResponse response = (SIPResponse) responseEvent.getResponse(); |
| 377 | 366 | String callId = response.getCallIdHeader().getCallId(); |
| 378 | - streamSession.put(device.getDeviceId(), channelId, callId, stream, ssrcInfo.getSsrc(), mediaServerItem.getId(), response, | |
| 367 | + streamSession.put(device.getDeviceId(), channel.getChannelId(), callId, stream, ssrcInfo.getSsrc(), mediaServerItem.getId(), response, | |
| 379 | 368 | InviteSessionType.PLAY); |
| 380 | 369 | okEvent.response(e); |
| 381 | 370 | }); | ... | ... |
src/main/java/com/genersoft/iot/vmp/service/IDeviceChannelService.java
src/main/java/com/genersoft/iot/vmp/service/IPlayService.java
| ... | ... | @@ -3,6 +3,7 @@ package com.genersoft.iot.vmp.service; |
| 3 | 3 | import com.genersoft.iot.vmp.common.StreamInfo; |
| 4 | 4 | import com.genersoft.iot.vmp.conf.exception.ServiceException; |
| 5 | 5 | import com.genersoft.iot.vmp.gb28181.bean.Device; |
| 6 | +import com.genersoft.iot.vmp.gb28181.bean.DeviceChannel; | |
| 6 | 7 | import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem; |
| 7 | 8 | import com.genersoft.iot.vmp.service.bean.ErrorCallback; |
| 8 | 9 | import com.genersoft.iot.vmp.service.bean.SSRCInfo; |
| ... | ... | @@ -16,7 +17,7 @@ import java.text.ParseException; |
| 16 | 17 | */ |
| 17 | 18 | public interface IPlayService { |
| 18 | 19 | |
| 19 | - void play(MediaServerItem mediaServerItem, SSRCInfo ssrcInfo, Device device, String channelId, | |
| 20 | + void play(MediaServerItem mediaServerItem, SSRCInfo ssrcInfo, Device device, DeviceChannel channelId, | |
| 20 | 21 | ErrorCallback<Object> callback); |
| 21 | 22 | SSRCInfo play(MediaServerItem mediaServerItem, String deviceId, String channelId, String ssrc, ErrorCallback<Object> callback); |
| 22 | 23 | ... | ... |
src/main/java/com/genersoft/iot/vmp/service/impl/DeviceChannelServiceImpl.java
| ... | ... | @@ -18,6 +18,7 @@ import org.slf4j.Logger; |
| 18 | 18 | import org.slf4j.LoggerFactory; |
| 19 | 19 | import org.springframework.beans.factory.annotation.Autowired; |
| 20 | 20 | import org.springframework.stereotype.Service; |
| 21 | +import org.springframework.util.ObjectUtils; | |
| 21 | 22 | |
| 22 | 23 | import java.util.ArrayList; |
| 23 | 24 | import java.util.HashMap; |
| ... | ... | @@ -267,5 +268,16 @@ public class DeviceChannelServiceImpl implements IDeviceChannelService { |
| 267 | 268 | } |
| 268 | 269 | } |
| 269 | 270 | |
| 270 | - | |
| 271 | + @Override | |
| 272 | + public void updateChannelStreamIdentification(DeviceChannel channel) { | |
| 273 | + assert !ObjectUtils.isEmpty(channel.getDeviceId()); | |
| 274 | + assert !ObjectUtils.isEmpty(channel.getStreamIdentification()); | |
| 275 | + if (ObjectUtils.isEmpty(channel.getStreamIdentification())) { | |
| 276 | + logger.info("[重置通道码流类型] 设备: {}, 码流: {}", channel.getDeviceId(), channel.getStreamIdentification()); | |
| 277 | + }else { | |
| 278 | + logger.info("[更新通道码流类型] 设备: {}, 通道:{}, 码流: {}", channel.getDeviceId(), channel.getChannelId(), | |
| 279 | + channel.getStreamIdentification()); | |
| 280 | + } | |
| 281 | + channelMapper.updateChannelStreamIdentification(channel); | |
| 282 | + } | |
| 271 | 283 | } | ... | ... |
src/main/java/com/genersoft/iot/vmp/service/impl/DeviceServiceImpl.java
| ... | ... | @@ -5,7 +5,6 @@ import com.genersoft.iot.vmp.common.CommonCallback; |
| 5 | 5 | import com.genersoft.iot.vmp.common.VideoManagerConstants; |
| 6 | 6 | import com.genersoft.iot.vmp.conf.DynamicTask; |
| 7 | 7 | import com.genersoft.iot.vmp.conf.UserSetting; |
| 8 | -import com.genersoft.iot.vmp.conf.exception.SsrcTransactionNotFoundException; | |
| 9 | 8 | import com.genersoft.iot.vmp.gb28181.bean.*; |
| 10 | 9 | import com.genersoft.iot.vmp.gb28181.session.VideoStreamSessionManager; |
| 11 | 10 | import com.genersoft.iot.vmp.gb28181.task.ISubscribeTask; |
| ... | ... | @@ -139,10 +138,6 @@ public class DeviceServiceImpl implements IDeviceService { |
| 139 | 138 | } |
| 140 | 139 | sync(device); |
| 141 | 140 | }else { |
| 142 | - | |
| 143 | - if (deviceInDb != null) { | |
| 144 | - device.setSwitchPrimarySubStream(deviceInDb.isSwitchPrimarySubStream()); | |
| 145 | - } | |
| 146 | 141 | if(!device.isOnLine()){ |
| 147 | 142 | device.setOnLine(true); |
| 148 | 143 | device.setCreateTime(now); |
| ... | ... | @@ -486,21 +481,6 @@ public class DeviceServiceImpl implements IDeviceService { |
| 486 | 481 | logger.warn("更新设备时未找到设备信息"); |
| 487 | 482 | return; |
| 488 | 483 | } |
| 489 | - if(deviceInStore.isSwitchPrimarySubStream() != device.isSwitchPrimarySubStream()){ | |
| 490 | - //当修改设备的主子码流开关时,需要校验是否存在流,如果存在流则直接关闭 | |
| 491 | - List<SsrcTransaction> ssrcTransactionForAll = streamSession.getSsrcTransactionForAll(device.getDeviceId(), null, null, null); | |
| 492 | - if(ssrcTransactionForAll != null){ | |
| 493 | - for (SsrcTransaction ssrcTransaction: ssrcTransactionForAll) { | |
| 494 | - try { | |
| 495 | - cmder.streamByeCmd(device, ssrcTransaction.getChannelId(), ssrcTransaction.getStream(), null, null); | |
| 496 | - } catch (InvalidArgumentException | SsrcTransactionNotFoundException | ParseException | SipException e) { | |
| 497 | - throw new RuntimeException(e); | |
| 498 | - } | |
| 499 | - } | |
| 500 | - } | |
| 501 | - deviceChannelMapper.clearPlay(device.getDeviceId()); | |
| 502 | - inviteStreamService.clearInviteInfo(device.getDeviceId()); | |
| 503 | - } | |
| 504 | 484 | |
| 505 | 485 | if (!ObjectUtils.isEmpty(device.getName())) { |
| 506 | 486 | deviceInStore.setName(device.getName()); | ... | ... |
src/main/java/com/genersoft/iot/vmp/service/impl/PlayServiceImpl.java
| ... | ... | @@ -15,21 +15,26 @@ import com.genersoft.iot.vmp.conf.exception.SsrcTransactionNotFoundException; |
| 15 | 15 | import com.genersoft.iot.vmp.gb28181.bean.*; |
| 16 | 16 | import com.genersoft.iot.vmp.gb28181.event.SipSubscribe; |
| 17 | 17 | import com.genersoft.iot.vmp.gb28181.session.VideoStreamSessionManager; |
| 18 | -import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommander; | |
| 18 | +import com.genersoft.iot.vmp.gb28181.transmit.cmd.ISIPCommander; | |
| 19 | 19 | import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommanderFroPlatform; |
| 20 | 20 | import com.genersoft.iot.vmp.gb28181.utils.SipUtils; |
| 21 | 21 | import com.genersoft.iot.vmp.media.zlm.ZLMRESTfulUtils; |
| 22 | 22 | import com.genersoft.iot.vmp.media.zlm.ZLMServerFactory; |
| 23 | 23 | import com.genersoft.iot.vmp.media.zlm.ZlmHttpHookSubscribe; |
| 24 | -import com.genersoft.iot.vmp.media.zlm.dto.*; | |
| 24 | +import com.genersoft.iot.vmp.media.zlm.dto.HookSubscribeFactory; | |
| 25 | +import com.genersoft.iot.vmp.media.zlm.dto.HookSubscribeForRecordMp4; | |
| 26 | +import com.genersoft.iot.vmp.media.zlm.dto.HookSubscribeForStreamChange; | |
| 27 | +import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem; | |
| 25 | 28 | import com.genersoft.iot.vmp.media.zlm.dto.hook.HookParam; |
| 26 | 29 | import com.genersoft.iot.vmp.media.zlm.dto.hook.OnRecordMp4HookParam; |
| 27 | 30 | import com.genersoft.iot.vmp.media.zlm.dto.hook.OnStreamChangedHookParam; |
| 28 | 31 | import com.genersoft.iot.vmp.service.*; |
| 29 | -import com.genersoft.iot.vmp.service.bean.*; | |
| 32 | +import com.genersoft.iot.vmp.service.bean.DownloadFileInfo; | |
| 33 | +import com.genersoft.iot.vmp.service.bean.ErrorCallback; | |
| 34 | +import com.genersoft.iot.vmp.service.bean.InviteErrorCode; | |
| 35 | +import com.genersoft.iot.vmp.service.bean.SSRCInfo; | |
| 30 | 36 | import com.genersoft.iot.vmp.storager.IRedisCatchStorage; |
| 31 | 37 | import com.genersoft.iot.vmp.storager.IVideoManagerStorage; |
| 32 | -import com.genersoft.iot.vmp.storager.dao.CloudRecordServiceMapper; | |
| 33 | 38 | import com.genersoft.iot.vmp.utils.CloudRecordUtils; |
| 34 | 39 | import com.genersoft.iot.vmp.utils.DateUtil; |
| 35 | 40 | import com.genersoft.iot.vmp.vmanager.bean.ErrorCode; |
| ... | ... | @@ -63,7 +68,7 @@ public class PlayServiceImpl implements IPlayService { |
| 63 | 68 | private IVideoManagerStorage storager; |
| 64 | 69 | |
| 65 | 70 | @Autowired |
| 66 | - private SIPCommander cmder; | |
| 71 | + private ISIPCommander cmder; | |
| 67 | 72 | |
| 68 | 73 | @Autowired |
| 69 | 74 | private SIPCommanderFroPlatform sipCommanderFroPlatform; |
| ... | ... | @@ -96,13 +101,13 @@ public class PlayServiceImpl implements IPlayService { |
| 96 | 101 | private IDeviceService deviceService; |
| 97 | 102 | |
| 98 | 103 | @Autowired |
| 99 | - private UserSetting userSetting; | |
| 104 | + private IDeviceChannelService channelService; | |
| 100 | 105 | |
| 101 | 106 | @Autowired |
| 102 | - private DynamicTask dynamicTask; | |
| 107 | + private UserSetting userSetting; | |
| 103 | 108 | |
| 104 | 109 | @Autowired |
| 105 | - private CloudRecordServiceMapper cloudRecordServiceMapper; | |
| 110 | + private DynamicTask dynamicTask; | |
| 106 | 111 | |
| 107 | 112 | |
| 108 | 113 | @Override |
| ... | ... | @@ -117,6 +122,11 @@ public class PlayServiceImpl implements IPlayService { |
| 117 | 122 | logger.warn("[点播] 单端口收流时不支持TCP主动方式收流 deviceId: {},channelId:{}", deviceId, channelId); |
| 118 | 123 | throw new ControllerException(ErrorCode.ERROR100.getCode(), "单端口收流时不支持TCP主动方式收流"); |
| 119 | 124 | } |
| 125 | + DeviceChannel channel = channelService.getOne(deviceId, channelId); | |
| 126 | + if (channel == null) { | |
| 127 | + logger.warn("[点播] 未找到通道 deviceId: {},channelId:{}", deviceId, channelId); | |
| 128 | + throw new ControllerException(ErrorCode.ERROR100.getCode(), "未找到通道"); | |
| 129 | + } | |
| 120 | 130 | InviteInfo inviteInfo = inviteStreamService.getInviteInfoByDeviceAndChannel(InviteSessionType.PLAY, deviceId, channelId); |
| 121 | 131 | if (inviteInfo != null ) { |
| 122 | 132 | if (inviteInfo.getStreamInfo() == null) { |
| ... | ... | @@ -165,13 +175,13 @@ public class PlayServiceImpl implements IPlayService { |
| 165 | 175 | null); |
| 166 | 176 | return null; |
| 167 | 177 | } |
| 168 | - play(mediaServerItem, ssrcInfo, device, channelId, callback); | |
| 178 | + play(mediaServerItem, ssrcInfo, device, channel, callback); | |
| 169 | 179 | return ssrcInfo; |
| 170 | 180 | } |
| 171 | 181 | |
| 172 | 182 | |
| 173 | 183 | @Override |
| 174 | - public void play(MediaServerItem mediaServerItem, SSRCInfo ssrcInfo, Device device, String channelId, | |
| 184 | + public void play(MediaServerItem mediaServerItem, SSRCInfo ssrcInfo, Device device, DeviceChannel channel, | |
| 175 | 185 | ErrorCallback<Object> callback) { |
| 176 | 186 | |
| 177 | 187 | if (mediaServerItem == null || ssrcInfo == null) { |
| ... | ... | @@ -180,110 +190,109 @@ public class PlayServiceImpl implements IPlayService { |
| 180 | 190 | null); |
| 181 | 191 | return; |
| 182 | 192 | } |
| 183 | - logger.info("[点播开始] deviceId: {}, channelId: {},码流类型:{}, 收流端口: {}, STREAM:{}, 收流模式:{}, SSRC: {}, SSRC校验:{}", | |
| 184 | - device.getDeviceId(), channelId, device.isSwitchPrimarySubStream() ? "辅码流" : "主码流", ssrcInfo.getPort(), ssrcInfo.getStream(), | |
| 193 | + logger.info("[点播开始] deviceId: {}, channelId: {},码流类型:{}, 收流端口: {}, 码流:{}, 收流模式:{}, SSRC: {}, SSRC校验:{}", | |
| 194 | + device.getDeviceId(), channel.getChannelId(), channel.getStreamIdentification(), ssrcInfo.getPort(), ssrcInfo.getStream(), | |
| 185 | 195 | device.getStreamMode(), ssrcInfo.getSsrc(), device.isSsrcCheck()); |
| 186 | 196 | //端口获取失败的ssrcInfo 没有必要发送点播指令 |
| 187 | 197 | if (ssrcInfo.getPort() <= 0) { |
| 188 | - logger.info("[点播端口分配异常],deviceId={},channelId={},ssrcInfo={}", device.getDeviceId(), channelId, ssrcInfo); | |
| 198 | + logger.info("[点播端口分配异常],deviceId={},channelId={},ssrcInfo={}", device.getDeviceId(), channel.getChannelId(), ssrcInfo); | |
| 189 | 199 | // 释放ssrc |
| 190 | 200 | mediaServerService.releaseSsrc(mediaServerItem.getId(), ssrcInfo.getSsrc()); |
| 191 | - streamSession.remove(device.getDeviceId(), channelId, ssrcInfo.getStream()); | |
| 201 | + streamSession.remove(device.getDeviceId(), channel.getChannelId(), ssrcInfo.getStream()); | |
| 192 | 202 | |
| 193 | 203 | callback.run(InviteErrorCode.ERROR_FOR_RESOURCE_EXHAUSTION.getCode(), "点播端口分配异常", null); |
| 194 | - inviteStreamService.call(InviteSessionType.PLAY, device.getDeviceId(), channelId, null, | |
| 204 | + inviteStreamService.call(InviteSessionType.PLAY, device.getDeviceId(), channel.getChannelId(), null, | |
| 195 | 205 | InviteErrorCode.ERROR_FOR_RESOURCE_EXHAUSTION.getCode(), "点播端口分配异常", null); |
| 196 | 206 | return; |
| 197 | 207 | } |
| 198 | 208 | |
| 199 | 209 | // 初始化redis中的invite消息状态 |
| 200 | - InviteInfo inviteInfo = InviteInfo.getInviteInfo(device.getDeviceId(), channelId, ssrcInfo.getStream(), ssrcInfo, | |
| 210 | + InviteInfo inviteInfo = InviteInfo.getInviteInfo(device.getDeviceId(), channel.getChannelId(), ssrcInfo.getStream(), ssrcInfo, | |
| 201 | 211 | mediaServerItem.getSdpIp(), ssrcInfo.getPort(), device.getStreamMode(), InviteSessionType.PLAY, |
| 202 | 212 | InviteSessionStatus.ready); |
| 203 | - inviteInfo.setSubStream(device.isSwitchPrimarySubStream()); | |
| 204 | 213 | inviteStreamService.updateInviteInfo(inviteInfo); |
| 205 | 214 | // 超时处理 |
| 206 | 215 | String timeOutTaskKey = UUID.randomUUID().toString(); |
| 207 | 216 | dynamicTask.startDelay(timeOutTaskKey, () -> { |
| 208 | 217 | // 执行超时任务时查询是否已经成功,成功了则不执行超时任务,防止超时任务取消失败的情况 |
| 209 | - InviteInfo inviteInfoForTimeOut = inviteStreamService.getInviteInfoByDeviceAndChannel(InviteSessionType.PLAY, device.getDeviceId(), channelId); | |
| 218 | + InviteInfo inviteInfoForTimeOut = inviteStreamService.getInviteInfoByDeviceAndChannel(InviteSessionType.PLAY, device.getDeviceId(), channel.getChannelId()); | |
| 210 | 219 | if (inviteInfoForTimeOut == null || inviteInfoForTimeOut.getStreamInfo() == null) { |
| 211 | - logger.info("[点播超时] 收流超时 deviceId: {}, channelId: {},码流类型:{},端口:{}, SSRC: {}", | |
| 212 | - device.getDeviceId(), channelId, device.isSwitchPrimarySubStream() ? "辅码流" : "主码流", | |
| 220 | + logger.info("[点播超时] 收流超时 deviceId: {}, channelId: {},码流:{},端口:{}, SSRC: {}", | |
| 221 | + device.getDeviceId(), channel.getChannelId(), channel.getStreamIdentification(), | |
| 213 | 222 | ssrcInfo.getPort(), ssrcInfo.getSsrc()); |
| 214 | 223 | |
| 215 | 224 | callback.run(InviteErrorCode.ERROR_FOR_STREAM_TIMEOUT.getCode(), InviteErrorCode.ERROR_FOR_STREAM_TIMEOUT.getMsg(), null); |
| 216 | - inviteStreamService.call(InviteSessionType.PLAY, device.getDeviceId(), channelId, null, | |
| 225 | + inviteStreamService.call(InviteSessionType.PLAY, device.getDeviceId(), channel.getChannelId(), null, | |
| 217 | 226 | InviteErrorCode.ERROR_FOR_STREAM_TIMEOUT.getCode(), InviteErrorCode.ERROR_FOR_STREAM_TIMEOUT.getMsg(), null); |
| 218 | - inviteStreamService.removeInviteInfoByDeviceAndChannel(InviteSessionType.PLAY, device.getDeviceId(), channelId); | |
| 227 | + inviteStreamService.removeInviteInfoByDeviceAndChannel(InviteSessionType.PLAY, device.getDeviceId(), channel.getChannelId()); | |
| 219 | 228 | |
| 220 | 229 | try { |
| 221 | - cmder.streamByeCmd(device, channelId, ssrcInfo.getStream(), null); | |
| 230 | + cmder.streamByeCmd(device, channel.getChannelId(), ssrcInfo.getStream(), null); | |
| 222 | 231 | } catch (InvalidArgumentException | ParseException | SipException | SsrcTransactionNotFoundException e) { |
| 223 | 232 | logger.error("[点播超时], 发送BYE失败 {}", e.getMessage()); |
| 224 | 233 | } finally { |
| 225 | 234 | mediaServerService.releaseSsrc(mediaServerItem.getId(), ssrcInfo.getSsrc()); |
| 226 | 235 | mediaServerService.closeRTPServer(mediaServerItem, ssrcInfo.getStream()); |
| 227 | - streamSession.remove(device.getDeviceId(), channelId, ssrcInfo.getStream()); | |
| 236 | + streamSession.remove(device.getDeviceId(), channel.getChannelId(), ssrcInfo.getStream()); | |
| 228 | 237 | mediaServerService.closeRTPServer(mediaServerItem, ssrcInfo.getStream()); |
| 229 | 238 | // 取消订阅消息监听 |
| 230 | 239 | HookSubscribeForStreamChange hookSubscribe = HookSubscribeFactory.on_stream_changed("rtp", ssrcInfo.getStream(), true, "rtsp", mediaServerItem.getId()); |
| 231 | 240 | subscribe.removeSubscribe(hookSubscribe); |
| 232 | 241 | } |
| 233 | 242 | }else { |
| 234 | - logger.info("[点播超时] 收流超时 deviceId: {}, channelId: {},码流类型:{},端口:{}, SSRC: {}", | |
| 235 | - device.getDeviceId(), channelId, device.isSwitchPrimarySubStream() ? "辅码流" : "主码流", | |
| 243 | + logger.info("[点播超时] 收流超时 deviceId: {}, channelId: {},码流:{},端口:{}, SSRC: {}", | |
| 244 | + device.getDeviceId(), channel.getChannelId(), channel.getStreamIdentification(), | |
| 236 | 245 | ssrcInfo.getPort(), ssrcInfo.getSsrc()); |
| 237 | 246 | |
| 238 | 247 | mediaServerService.releaseSsrc(mediaServerItem.getId(), ssrcInfo.getSsrc()); |
| 239 | 248 | |
| 240 | 249 | mediaServerService.closeRTPServer(mediaServerItem.getId(), ssrcInfo.getStream()); |
| 241 | - streamSession.remove(device.getDeviceId(), channelId, ssrcInfo.getStream()); | |
| 250 | + streamSession.remove(device.getDeviceId(), channel.getChannelId(), ssrcInfo.getStream()); | |
| 242 | 251 | } |
| 243 | 252 | }, userSetting.getPlayTimeout()); |
| 244 | 253 | |
| 245 | 254 | try { |
| 246 | - cmder.playStreamCmd(mediaServerItem, ssrcInfo, device, channelId, (mediaServerItemInuse, hookParam ) -> { | |
| 255 | + cmder.playStreamCmd(mediaServerItem, ssrcInfo, device, channel, (mediaServerItemInuse, hookParam ) -> { | |
| 247 | 256 | logger.info("收到订阅消息: " + hookParam); |
| 248 | 257 | dynamicTask.stop(timeOutTaskKey); |
| 249 | 258 | // hook响应 |
| 250 | - StreamInfo streamInfo = onPublishHandlerForPlay(mediaServerItemInuse, hookParam, device.getDeviceId(), channelId); | |
| 259 | + StreamInfo streamInfo = onPublishHandlerForPlay(mediaServerItemInuse, hookParam, device.getDeviceId(), channel.getChannelId()); | |
| 251 | 260 | if (streamInfo == null){ |
| 252 | 261 | callback.run(InviteErrorCode.ERROR_FOR_STREAM_PARSING_EXCEPTIONS.getCode(), |
| 253 | 262 | InviteErrorCode.ERROR_FOR_STREAM_PARSING_EXCEPTIONS.getMsg(), null); |
| 254 | - inviteStreamService.call(InviteSessionType.PLAY, device.getDeviceId(), channelId, null, | |
| 263 | + inviteStreamService.call(InviteSessionType.PLAY, device.getDeviceId(), channel.getChannelId(), null, | |
| 255 | 264 | InviteErrorCode.ERROR_FOR_STREAM_PARSING_EXCEPTIONS.getCode(), |
| 256 | 265 | InviteErrorCode.ERROR_FOR_STREAM_PARSING_EXCEPTIONS.getMsg(), null); |
| 257 | 266 | return; |
| 258 | 267 | } |
| 259 | 268 | callback.run(InviteErrorCode.SUCCESS.getCode(), InviteErrorCode.SUCCESS.getMsg(), streamInfo); |
| 260 | - inviteStreamService.call(InviteSessionType.PLAY, device.getDeviceId(), channelId, null, | |
| 269 | + inviteStreamService.call(InviteSessionType.PLAY, device.getDeviceId(), channel.getChannelId(), null, | |
| 261 | 270 | InviteErrorCode.SUCCESS.getCode(), |
| 262 | 271 | InviteErrorCode.SUCCESS.getMsg(), |
| 263 | 272 | streamInfo); |
| 264 | - logger.info("[点播成功] deviceId: {}, channelId:{}, 码流类型:{}", device.getDeviceId(), channelId, | |
| 265 | - device.isSwitchPrimarySubStream() ? "辅码流" : "主码流"); | |
| 266 | - snapOnPlay(mediaServerItemInuse, device.getDeviceId(), channelId, ssrcInfo.getStream()); | |
| 273 | + logger.info("[点播成功] deviceId: {}, channelId:{}, 码流类型:{}", device.getDeviceId(), channel.getChannelId(), | |
| 274 | + channel.getStreamIdentification()); | |
| 275 | + snapOnPlay(mediaServerItemInuse, device.getDeviceId(), channel.getChannelId(), ssrcInfo.getStream()); | |
| 267 | 276 | }, (eventResult) -> { |
| 268 | 277 | // 处理收到200ok后的TCP主动连接以及SSRC不一致的问题 |
| 269 | - InviteOKHandler(eventResult, ssrcInfo, mediaServerItem, device, channelId, | |
| 278 | + InviteOKHandler(eventResult, ssrcInfo, mediaServerItem, device, channel.getChannelId(), | |
| 270 | 279 | timeOutTaskKey, callback, inviteInfo, InviteSessionType.PLAY); |
| 271 | 280 | }, (event) -> { |
| 272 | - logger.info("[点播失败] deviceId: {}, channelId:{}, {}: {}", device.getDeviceId(), channelId, event.statusCode, event.msg); | |
| 281 | + logger.info("[点播失败] deviceId: {}, channelId:{}, {}: {}", device.getDeviceId(), channel.getChannelId(), event.statusCode, event.msg); | |
| 273 | 282 | dynamicTask.stop(timeOutTaskKey); |
| 274 | 283 | mediaServerService.closeRTPServer(mediaServerItem, ssrcInfo.getStream()); |
| 275 | 284 | // 释放ssrc |
| 276 | 285 | mediaServerService.releaseSsrc(mediaServerItem.getId(), ssrcInfo.getSsrc()); |
| 277 | 286 | |
| 278 | - streamSession.remove(device.getDeviceId(), channelId, ssrcInfo.getStream()); | |
| 287 | + streamSession.remove(device.getDeviceId(), channel.getChannelId(), ssrcInfo.getStream()); | |
| 279 | 288 | |
| 280 | 289 | callback.run(InviteErrorCode.ERROR_FOR_SIGNALLING_ERROR.getCode(), |
| 281 | 290 | String.format("点播失败, 错误码: %s, %s", event.statusCode, event.msg), null); |
| 282 | - inviteStreamService.call(InviteSessionType.PLAY, device.getDeviceId(), channelId, null, | |
| 291 | + inviteStreamService.call(InviteSessionType.PLAY, device.getDeviceId(), channel.getChannelId(), null, | |
| 283 | 292 | InviteErrorCode.ERROR_FOR_RESET_SSRC.getCode(), |
| 284 | 293 | String.format("点播失败, 错误码: %s, %s", event.statusCode, event.msg), null); |
| 285 | 294 | |
| 286 | - inviteStreamService.removeInviteInfoByDeviceAndChannel(InviteSessionType.PLAY, device.getDeviceId(), channelId); | |
| 295 | + inviteStreamService.removeInviteInfoByDeviceAndChannel(InviteSessionType.PLAY, device.getDeviceId(), channel.getChannelId()); | |
| 287 | 296 | }); |
| 288 | 297 | } catch (InvalidArgumentException | SipException | ParseException e) { |
| 289 | 298 | |
| ... | ... | @@ -293,15 +302,15 @@ public class PlayServiceImpl implements IPlayService { |
| 293 | 302 | // 释放ssrc |
| 294 | 303 | mediaServerService.releaseSsrc(mediaServerItem.getId(), ssrcInfo.getSsrc()); |
| 295 | 304 | |
| 296 | - streamSession.remove(device.getDeviceId(), channelId, ssrcInfo.getStream()); | |
| 305 | + streamSession.remove(device.getDeviceId(), channel.getChannelId(), ssrcInfo.getStream()); | |
| 297 | 306 | |
| 298 | 307 | callback.run(InviteErrorCode.ERROR_FOR_SIP_SENDING_FAILED.getCode(), |
| 299 | 308 | InviteErrorCode.ERROR_FOR_SIP_SENDING_FAILED.getMsg(), null); |
| 300 | - inviteStreamService.call(InviteSessionType.PLAY, device.getDeviceId(), channelId, null, | |
| 309 | + inviteStreamService.call(InviteSessionType.PLAY, device.getDeviceId(), channel.getChannelId(), null, | |
| 301 | 310 | InviteErrorCode.ERROR_FOR_SIP_SENDING_FAILED.getCode(), |
| 302 | 311 | InviteErrorCode.ERROR_FOR_SIP_SENDING_FAILED.getMsg(), null); |
| 303 | 312 | |
| 304 | - inviteStreamService.removeInviteInfoByDeviceAndChannel(InviteSessionType.PLAY, device.getDeviceId(), channelId); | |
| 313 | + inviteStreamService.removeInviteInfoByDeviceAndChannel(InviteSessionType.PLAY, device.getDeviceId(), channel.getChannelId()); | |
| 305 | 314 | } |
| 306 | 315 | } |
| 307 | 316 | |
| ... | ... | @@ -438,7 +447,7 @@ public class PlayServiceImpl implements IPlayService { |
| 438 | 447 | |
| 439 | 448 | @Override |
| 440 | 449 | public void playBack(String deviceId, String channelId, String startTime, |
| 441 | - String endTime, ErrorCallback<Object> callback) { | |
| 450 | + String endTime, ErrorCallback<Object> callback) { | |
| 442 | 451 | Device device = storager.queryVideoDevice(deviceId); |
| 443 | 452 | if (device == null) { |
| 444 | 453 | logger.warn("[录像回放] 未找到设备 deviceId: {},channelId:{}", deviceId, channelId); |
| ... | ... | @@ -463,8 +472,8 @@ public class PlayServiceImpl implements IPlayService { |
| 463 | 472 | |
| 464 | 473 | @Override |
| 465 | 474 | public void playBack(MediaServerItem mediaServerItem, SSRCInfo ssrcInfo, |
| 466 | - String deviceId, String channelId, String startTime, | |
| 467 | - String endTime, ErrorCallback<Object> callback) { | |
| 475 | + String deviceId, String channelId, String startTime, | |
| 476 | + String endTime, ErrorCallback<Object> callback) { | |
| 468 | 477 | if (mediaServerItem == null || ssrcInfo == null) { |
| 469 | 478 | callback.run(InviteErrorCode.ERROR_FOR_PARAMETER_ERROR.getCode(), |
| 470 | 479 | InviteErrorCode.ERROR_FOR_PARAMETER_ERROR.getMsg(), |
| ... | ... | @@ -881,7 +890,7 @@ public class PlayServiceImpl implements IPlayService { |
| 881 | 890 | cmder.streamByeCmd(device, ssrcTransaction.getChannelId(), |
| 882 | 891 | ssrcTransaction.getStream(), null); |
| 883 | 892 | } catch (InvalidArgumentException | ParseException | SipException | |
| 884 | - SsrcTransactionNotFoundException e) { | |
| 893 | + SsrcTransactionNotFoundException e) { | |
| 885 | 894 | logger.error("[zlm离线]为正在使用此zlm的设备, 发送BYE失败 {}", e.getMessage()); |
| 886 | 895 | } |
| 887 | 896 | } |
| ... | ... | @@ -1031,16 +1040,16 @@ public class PlayServiceImpl implements IPlayService { |
| 1031 | 1040 | |
| 1032 | 1041 | MediaServerItem newMediaServerItem = getNewMediaServerItem(device); |
| 1033 | 1042 | play(newMediaServerItem, deviceId, channelId, null, (code, msg, data)->{ |
| 1034 | - if (code == InviteErrorCode.SUCCESS.getCode()) { | |
| 1035 | - InviteInfo inviteInfoForPlay = inviteStreamService.getInviteInfoByDeviceAndChannel(InviteSessionType.PLAY, deviceId, channelId); | |
| 1036 | - if (inviteInfoForPlay != null && inviteInfoForPlay.getStreamInfo() != null) { | |
| 1037 | - getSnap(deviceId, channelId, fileName, errorCallback); | |
| 1038 | - }else { | |
| 1039 | - errorCallback.run(InviteErrorCode.FAIL.getCode(), InviteErrorCode.FAIL.getMsg(), null); | |
| 1040 | - } | |
| 1041 | - }else { | |
| 1042 | - errorCallback.run(InviteErrorCode.FAIL.getCode(), InviteErrorCode.FAIL.getMsg(), null); | |
| 1043 | - } | |
| 1043 | + if (code == InviteErrorCode.SUCCESS.getCode()) { | |
| 1044 | + InviteInfo inviteInfoForPlay = inviteStreamService.getInviteInfoByDeviceAndChannel(InviteSessionType.PLAY, deviceId, channelId); | |
| 1045 | + if (inviteInfoForPlay != null && inviteInfoForPlay.getStreamInfo() != null) { | |
| 1046 | + getSnap(deviceId, channelId, fileName, errorCallback); | |
| 1047 | + }else { | |
| 1048 | + errorCallback.run(InviteErrorCode.FAIL.getCode(), InviteErrorCode.FAIL.getMsg(), null); | |
| 1049 | + } | |
| 1050 | + }else { | |
| 1051 | + errorCallback.run(InviteErrorCode.FAIL.getCode(), InviteErrorCode.FAIL.getMsg(), null); | |
| 1052 | + } | |
| 1044 | 1053 | }); |
| 1045 | 1054 | } |
| 1046 | 1055 | ... | ... |
src/main/java/com/genersoft/iot/vmp/storager/dao/DeviceChannelMapper.java
| ... | ... | @@ -20,11 +20,11 @@ public interface DeviceChannelMapper { |
| 20 | 20 | @Insert("INSERT INTO wvp_device_channel (channel_id, device_id, name, manufacture, model, owner, civil_code, block, " + |
| 21 | 21 | "address, parental, parent_id, safety_way, register_way, cert_num, certifiable, err_code, secrecy, " + |
| 22 | 22 | "ip_address, port, password, ptz_type, status, stream_id, longitude, latitude, longitude_gcj02, latitude_gcj02, " + |
| 23 | - "longitude_wgs84, latitude_wgs84, has_audio, create_time, update_time, business_group_id, gps_time) " + | |
| 23 | + "longitude_wgs84, latitude_wgs84, has_audio, create_time, update_time, business_group_id, gps_time, stream_identification) " + | |
| 24 | 24 | "VALUES (#{channelId}, #{deviceId}, #{name}, #{manufacture}, #{model}, #{owner}, #{civilCode}, #{block}," + |
| 25 | 25 | "#{address}, #{parental}, #{parentId}, #{safetyWay}, #{registerWay}, #{certNum}, #{certifiable}, #{errCode}, #{secrecy}, " + |
| 26 | 26 | "#{ipAddress}, #{port}, #{password}, #{PTZType}, #{status}, #{streamId}, #{longitude}, #{latitude}, #{longitudeGcj02}, " + |
| 27 | - "#{latitudeGcj02}, #{longitudeWgs84}, #{latitudeWgs84}, #{hasAudio}, #{createTime}, #{updateTime}, #{businessGroupId}, #{gpsTime})") | |
| 27 | + "#{latitudeGcj02}, #{longitudeWgs84}, #{latitudeWgs84}, #{hasAudio}, #{createTime}, #{updateTime}, #{businessGroupId}, #{gpsTime}, #{streamIdentification})") | |
| 28 | 28 | int add(DeviceChannel channel); |
| 29 | 29 | |
| 30 | 30 | @Update(value = {" <script>" + |
| ... | ... | @@ -60,6 +60,7 @@ public interface DeviceChannelMapper { |
| 60 | 60 | "<if test='latitudeWgs84 != null'>, latitude_wgs84=#{latitudeWgs84}</if>" + |
| 61 | 61 | "<if test='businessGroupId != null'>, business_group_id=#{businessGroupId}</if>" + |
| 62 | 62 | "<if test='gpsTime != null'>, gps_time=#{gpsTime}</if>" + |
| 63 | + "<if test='streamIdentification != null'>, stream_identification=#{streamIdentification}</if>" + | |
| 63 | 64 | "WHERE device_id=#{deviceId} AND channel_id=#{channelId}"+ |
| 64 | 65 | " </script>"}) |
| 65 | 66 | int update(DeviceChannel channel); |
| ... | ... | @@ -102,6 +103,7 @@ public interface DeviceChannelMapper { |
| 102 | 103 | "dc.longitude_wgs84, " + |
| 103 | 104 | "dc.latitude_wgs84, " + |
| 104 | 105 | "dc.business_group_id, " + |
| 106 | + "dc.stream_identification, " + | |
| 105 | 107 | "dc.gps_time " + |
| 106 | 108 | "from " + |
| 107 | 109 | "wvp_device_channel dc " + |
| ... | ... | @@ -241,7 +243,7 @@ public interface DeviceChannelMapper { |
| 241 | 243 | "(channel_id, device_id, name, manufacture, model, owner, civil_code, block, sub_count, " + |
| 242 | 244 | " address, parental, parent_id, safety_way, register_way, cert_num, certifiable, err_code, secrecy, " + |
| 243 | 245 | " ip_address,port,password,ptz_type,status,stream_id,longitude,latitude,longitude_gcj02,latitude_gcj02,"+ |
| 244 | - " longitude_wgs84,latitude_wgs84,has_audio,create_time,update_time,business_group_id,gps_time)"+ | |
| 246 | + " longitude_wgs84,latitude_wgs84,has_audio,create_time,update_time,business_group_id,gps_time,stream_identification)"+ | |
| 245 | 247 | "values " + |
| 246 | 248 | "<foreach collection='addChannels' index='index' item='item' separator=','> " + |
| 247 | 249 | "(#{item.channelId}, #{item.deviceId}, #{item.name}, #{item.manufacture}, #{item.model}, " + |
| ... | ... | @@ -251,7 +253,7 @@ public interface DeviceChannelMapper { |
| 251 | 253 | "#{item.ipAddress}, #{item.port}, #{item.password}, #{item.PTZType}, #{item.status}, " + |
| 252 | 254 | "#{item.streamId}, #{item.longitude}, #{item.latitude},#{item.longitudeGcj02}, " + |
| 253 | 255 | "#{item.latitudeGcj02},#{item.longitudeWgs84}, #{item.latitudeWgs84}, #{item.hasAudio}, now(), now(), " + |
| 254 | - "#{item.businessGroupId}, #{item.gpsTime}) " + | |
| 256 | + "#{item.businessGroupId}, #{item.gpsTime}, #{item.streamIdentification}) " + | |
| 255 | 257 | "</foreach> " + |
| 256 | 258 | "</script>") |
| 257 | 259 | int batchAdd(@Param("addChannels") List<DeviceChannel> addChannels); |
| ... | ... | @@ -349,6 +351,7 @@ public interface DeviceChannelMapper { |
| 349 | 351 | "<if test='item.latitudeWgs84 != null'>, latitude_wgs84=#{item.latitudeWgs84}</if>" + |
| 350 | 352 | "<if test='item.businessGroupId != null'>, business_group_id=#{item.businessGroupId}</if>" + |
| 351 | 353 | "<if test='item.gpsTime != null'>, gps_time=#{item.gpsTime}</if>" + |
| 354 | + "<if test='item.streamIdentification != null'>, stream_identification=#{item.streamIdentification}</if>" + | |
| 352 | 355 | "<if test='item.id > 0'>WHERE id=#{item.id}</if>" + |
| 353 | 356 | "<if test='item.id == 0'>WHERE device_id=#{item.deviceId} AND channel_id=#{item.channelId}</if>" + |
| 354 | 357 | "</foreach>" + |
| ... | ... | @@ -542,4 +545,9 @@ public interface DeviceChannelMapper { |
| 542 | 545 | " </script>"}) |
| 543 | 546 | List<DeviceChannel> getSubChannelsByDeviceId(@Param("deviceId") String deviceId, @Param("parentId") String parentId, @Param("onlyCatalog") boolean onlyCatalog); |
| 544 | 547 | |
| 548 | + @Update("<script>" + | |
| 549 | + "UPDATE wvp_device_channel SET stream_identification=#{streamIdentification} WHERE device_id=#{deviceId}" + | |
| 550 | + " <if test='channelId != null'> and channel_id = #{channelId} </if>" + | |
| 551 | + "</script>") | |
| 552 | + void updateChannelStreamIdentification(DeviceChannel channel); | |
| 545 | 553 | } | ... | ... |
src/main/java/com/genersoft/iot/vmp/storager/dao/DeviceMapper.java
| ... | ... | @@ -43,7 +43,6 @@ public interface DeviceMapper { |
| 43 | 43 | "geo_coord_sys," + |
| 44 | 44 | "on_line," + |
| 45 | 45 | "media_server_id," + |
| 46 | - "switch_primary_sub_stream," + | |
| 47 | 46 | "(SELECT count(0) FROM wvp_device_channel WHERE device_id=wvp_device.device_id) as channel_count "+ |
| 48 | 47 | " FROM wvp_device WHERE device_id = #{deviceId}") |
| 49 | 48 | Device getDeviceByDeviceId(String deviceId); |
| ... | ... | @@ -159,7 +158,6 @@ public interface DeviceMapper { |
| 159 | 158 | "geo_coord_sys,"+ |
| 160 | 159 | "on_line,"+ |
| 161 | 160 | "media_server_id,"+ |
| 162 | - "switch_primary_sub_stream switchPrimarySubStream,"+ | |
| 163 | 161 | "(SELECT count(0) FROM wvp_device_channel WHERE device_id=de.device_id) as channel_count " + |
| 164 | 162 | "FROM wvp_device de" + |
| 165 | 163 | "<if test=\"onLine != null\"> where on_line=${onLine}</if>"+ |
| ... | ... | @@ -249,7 +247,6 @@ public interface DeviceMapper { |
| 249 | 247 | "<if test=\"ssrcCheck != null\">, ssrc_check=#{ssrcCheck}</if>" + |
| 250 | 248 | "<if test=\"asMessageChannel != null\">, as_message_channel=#{asMessageChannel}</if>" + |
| 251 | 249 | "<if test=\"geoCoordSys != null\">, geo_coord_sys=#{geoCoordSys}</if>" + |
| 252 | - "<if test=\"switchPrimarySubStream != null\">, switch_primary_sub_stream=#{switchPrimarySubStream}</if>" + | |
| 253 | 250 | "<if test=\"mediaServerId != null\">, media_server_id=#{mediaServerId}</if>" + |
| 254 | 251 | "WHERE device_id=#{deviceId}"+ |
| 255 | 252 | " </script>"}) |
| ... | ... | @@ -267,8 +264,7 @@ public interface DeviceMapper { |
| 267 | 264 | "as_message_channel,"+ |
| 268 | 265 | "geo_coord_sys,"+ |
| 269 | 266 | "on_line,"+ |
| 270 | - "media_server_id,"+ | |
| 271 | - "switch_primary_sub_stream"+ | |
| 267 | + "media_server_id"+ | |
| 272 | 268 | ") VALUES (" + |
| 273 | 269 | "#{deviceId}," + |
| 274 | 270 | "#{name}," + |
| ... | ... | @@ -281,8 +277,7 @@ public interface DeviceMapper { |
| 281 | 277 | "#{asMessageChannel}," + |
| 282 | 278 | "#{geoCoordSys}," + |
| 283 | 279 | "#{onLine}," + |
| 284 | - "#{mediaServerId}," + | |
| 285 | - "#{switchPrimarySubStream}" + | |
| 280 | + "#{mediaServerId}" + | |
| 286 | 281 | ")") |
| 287 | 282 | void addCustomDevice(Device device); |
| 288 | 283 | ... | ... |
src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/device/DeviceQuery.java
| ... | ... | @@ -264,6 +264,14 @@ public class DeviceQuery { |
| 264 | 264 | deviceChannelService.updateChannel(deviceId, channel); |
| 265 | 265 | } |
| 266 | 266 | |
| 267 | + @Operation(summary = "修改通道的码流类型", security = @SecurityRequirement(name = JwtUtils.HEADER)) | |
| 268 | + @Parameter(name = "deviceId", description = "设备国标编号", required = true) | |
| 269 | + @Parameter(name = "channel", description = "通道信息", required = true) | |
| 270 | + @PostMapping("/channel/stream/identification/update/") | |
| 271 | + public void updateChannelStreamIdentification(DeviceChannel channel){ | |
| 272 | + deviceChannelService.updateChannelStreamIdentification(channel); | |
| 273 | + } | |
| 274 | + | |
| 267 | 275 | /** |
| 268 | 276 | * 修改数据流传输模式 |
| 269 | 277 | * @param deviceId 设备id | ... | ... |
web_src/src/components/channelList.vue
| ... | ... | @@ -13,24 +13,30 @@ |
| 13 | 13 | prefix-icon="el-icon-search" v-model="searchSrt" clearable></el-input> |
| 14 | 14 | |
| 15 | 15 | 通道类型: |
| 16 | - <el-select size="mini" @change="search" style="margin-right: 1rem;" v-model="channelType" placeholder="请选择" | |
| 16 | + <el-select size="mini" @change="search" style="width: 8rem; margin-right: 1rem;" v-model="channelType" placeholder="请选择" | |
| 17 | 17 | default-first-option> |
| 18 | 18 | <el-option label="全部" value=""></el-option> |
| 19 | 19 | <el-option label="设备" value="false"></el-option> |
| 20 | 20 | <el-option label="子目录" value="true"></el-option> |
| 21 | 21 | </el-select> |
| 22 | 22 | 在线状态: |
| 23 | - <el-select size="mini" style="margin-right: 1rem;" @change="search" v-model="online" placeholder="请选择" | |
| 23 | + <el-select size="mini" style="width: 8rem; margin-right: 1rem;" @change="search" v-model="online" placeholder="请选择" | |
| 24 | 24 | default-first-option> |
| 25 | 25 | <el-option label="全部" value=""></el-option> |
| 26 | 26 | <el-option label="在线" value="true"></el-option> |
| 27 | 27 | <el-option label="离线" value="false"></el-option> |
| 28 | 28 | </el-select> |
| 29 | - 清晰度: | |
| 30 | - <el-select size="mini" style="margin-right: 1rem;" @change="search" v-model="isSubStream" placeholder="请选择" | |
| 31 | - default-first-option> | |
| 32 | - <el-option label="原画" :value="false"></el-option> | |
| 33 | - <el-option label="流畅" :value="true"></el-option> | |
| 29 | + 码流类型重置: | |
| 30 | + <el-select size="mini" style="width: 16rem; margin-right: 1rem;" @change="subStreamChange" v-model="subStream" | |
| 31 | + placeholder="请选择码流类型" default-first-option > | |
| 32 | + <el-option label="stream:0(主码流)" value="stream:0"></el-option> | |
| 33 | + <el-option label="stream:1(子码流)" value="stream:1"></el-option> | |
| 34 | + <el-option label="streamnumber:0(主码流-2022)" value="streamnumber:0"></el-option> | |
| 35 | + <el-option label="streamnumber:1(子码流-2022)" value="streamnumber:1"></el-option> | |
| 36 | + <el-option label="streamprofile:0(主码流-大华)" value="streamprofile:0"></el-option> | |
| 37 | + <el-option label="streamprofile:1(子码流-大华)" value="streamprofile:1"></el-option> | |
| 38 | + <el-option label="streamMode:main(主码流-水星+TP-LINK)" value="streamMode:main"></el-option> | |
| 39 | + <el-option label="streamMode:sub(子码流-水星+TP-LINK)" value="streamMode:sub"></el-option> | |
| 34 | 40 | </el-select> |
| 35 | 41 | </div> |
| 36 | 42 | <el-button icon="el-icon-refresh-right" circle size="mini" @click="refresh()"></el-button> |
| ... | ... | @@ -46,11 +52,11 @@ |
| 46 | 52 | <el-main style="padding: 5px;"> |
| 47 | 53 | <el-table ref="channelListTable" :data="deviceChannelList" :height="winHeight" style="width: 100%" |
| 48 | 54 | header-row-class-name="table-header"> |
| 49 | - <el-table-column prop="channelId" label="通道编号" min-width="200"> | |
| 55 | + <el-table-column prop="channelId" label="通道编号" min-width="180"> | |
| 50 | 56 | </el-table-column> |
| 51 | - <el-table-column prop="deviceId" label="设备编号" min-width="200"> | |
| 57 | + <el-table-column prop="deviceId" label="设备编号" min-width="180"> | |
| 52 | 58 | </el-table-column> |
| 53 | - <el-table-column prop="name" label="通道名称" min-width="200"> | |
| 59 | + <el-table-column prop="name" label="通道名称" min-width="180"> | |
| 54 | 60 | <template v-slot:default="scope"> |
| 55 | 61 | <el-input |
| 56 | 62 | v-show="scope.row.edit" |
| ... | ... | @@ -63,7 +69,7 @@ |
| 63 | 69 | <span v-show="!scope.row.edit">{{ scope.row.name }}</span> |
| 64 | 70 | </template> |
| 65 | 71 | </el-table-column> |
| 66 | - <el-table-column label="快照" min-width="120"> | |
| 72 | + <el-table-column label="快照" min-width="100"> | |
| 67 | 73 | <template v-slot:default="scope"> |
| 68 | 74 | <el-image |
| 69 | 75 | :src="getSnap(scope.row)" |
| ... | ... | @@ -77,11 +83,11 @@ |
| 77 | 83 | </el-image> |
| 78 | 84 | </template> |
| 79 | 85 | </el-table-column> |
| 80 | - <el-table-column prop="subCount" label="子节点数" min-width="120"> | |
| 86 | + <el-table-column prop="subCount" label="子节点数" min-width="100"> | |
| 81 | 87 | </el-table-column> |
| 82 | - <el-table-column prop="manufacture" label="厂家" min-width="120"> | |
| 88 | + <el-table-column prop="manufacture" label="厂家" min-width="100"> | |
| 83 | 89 | </el-table-column> |
| 84 | - <el-table-column label="位置信息" min-width="200"> | |
| 90 | + <el-table-column label="位置信息" min-width="120"> | |
| 85 | 91 | <template v-slot:default="scope"> |
| 86 | 92 | <el-input |
| 87 | 93 | v-show="scope.row.edit" |
| ... | ... | @@ -94,7 +100,7 @@ |
| 94 | 100 | <span v-show="!scope.row.edit">{{ scope.row.location }}</span> |
| 95 | 101 | </template> |
| 96 | 102 | </el-table-column> |
| 97 | - <el-table-column prop="PTZType" label="云台类型" min-width="120"> | |
| 103 | + <el-table-column prop="PTZType" label="云台类型" min-width="100"> | |
| 98 | 104 | <template v-slot:default="scope"> |
| 99 | 105 | <el-select v-show="scope.row.edit" v-model="scope.row.PTZType" |
| 100 | 106 | placeholder="云台类型" filterable> |
| ... | ... | @@ -108,13 +114,28 @@ |
| 108 | 114 | <div v-show="!scope.row.edit">{{ scope.row.PTZTypeText }}</div> |
| 109 | 115 | </template> |
| 110 | 116 | </el-table-column> |
| 111 | - <el-table-column label="开启音频" min-width="120"> | |
| 117 | + <el-table-column label="开启音频" min-width="100"> | |
| 112 | 118 | <template slot-scope="scope"> |
| 113 | 119 | <el-switch @change="updateChannel(scope.row)" v-model="scope.row.hasAudio" active-color="#409EFF"> |
| 114 | 120 | </el-switch> |
| 115 | 121 | </template> |
| 116 | 122 | </el-table-column> |
| 117 | - <el-table-column label="状态" min-width="120"> | |
| 123 | + <el-table-column label="码流类型" min-width="180"> | |
| 124 | + <template slot-scope="scope"> | |
| 125 | + <el-select size="mini" style="margin-right: 1rem;" @change="channelSubStreamChange(scope.row)" v-model="scope.row.streamIdentification" | |
| 126 | + placeholder="请选择码流类型" default-first-option > | |
| 127 | + <el-option label="stream:0(主码流)" value="stream:0"></el-option> | |
| 128 | + <el-option label="stream:1(子码流)" value="stream:1"></el-option> | |
| 129 | + <el-option label="streamnumber:0(主码流-2022)" value="streamnumber:0"></el-option> | |
| 130 | + <el-option label="streamnumber:1(子码流-2022)" value="streamnumber:1"></el-option> | |
| 131 | + <el-option label="streamprofile:0(主码流-大华)" value="streamprofile:0"></el-option> | |
| 132 | + <el-option label="streamprofile:1(子码流-大华)" value="streamprofile:1"></el-option> | |
| 133 | + <el-option label="streamMode:main(主码流-水星+TP-LINK)" value="streamMode:main"></el-option> | |
| 134 | + <el-option label="streamMode:sub(子码流-水星+TP-LINK)" value="streamMode:sub"></el-option> | |
| 135 | + </el-select> | |
| 136 | + </template> | |
| 137 | + </el-table-column> | |
| 138 | + <el-table-column label="状态" min-width="100"> | |
| 118 | 139 | <template slot-scope="scope"> |
| 119 | 140 | <div slot="reference" class="name-wrapper"> |
| 120 | 141 | <el-tag size="medium" v-if="scope.row.status === true">在线</el-tag> |
| ... | ... | @@ -122,8 +143,6 @@ |
| 122 | 143 | </div> |
| 123 | 144 | </template> |
| 124 | 145 | </el-table-column> |
| 125 | - | |
| 126 | - | |
| 127 | 146 | <el-table-column label="操作" min-width="340" fixed="right"> |
| 128 | 147 | <template slot-scope="scope"> |
| 129 | 148 | <el-button size="medium" v-bind:disabled="device == null || device.online === 0" icon="el-icon-video-play" |
| ... | ... | @@ -213,7 +232,7 @@ export default { |
| 213 | 232 | searchSrt: "", |
| 214 | 233 | channelType: "", |
| 215 | 234 | online: "", |
| 216 | - isSubStream: false, | |
| 235 | + subStream: "", | |
| 217 | 236 | winHeight: window.innerHeight - 200, |
| 218 | 237 | currentPage: 1, |
| 219 | 238 | count: 15, |
| ... | ... | @@ -495,6 +514,43 @@ export default { |
| 495 | 514 | console.log(JSON.stringify(res)); |
| 496 | 515 | }); |
| 497 | 516 | }, |
| 517 | + subStreamChange: function () { | |
| 518 | + this.$confirm('确定重置所有通道的码流类型?', '提示', { | |
| 519 | + confirmButtonText: '确定', | |
| 520 | + cancelButtonText: '取消', | |
| 521 | + type: 'warning' | |
| 522 | + }).then(() => { | |
| 523 | + this.$axios({ | |
| 524 | + method: 'post', | |
| 525 | + url: `/api/device/query/channel/stream/identification/update/`, | |
| 526 | + params: { | |
| 527 | + deviceId: this.deviceId, | |
| 528 | + streamIdentification: this.subStream | |
| 529 | + } | |
| 530 | + }).then((res)=> { | |
| 531 | + console.log(JSON.stringify(res)); | |
| 532 | + this.initData() | |
| 533 | + }).finally(()=>{ | |
| 534 | + this.subStream = "" | |
| 535 | + }) | |
| 536 | + }).catch(() => { | |
| 537 | + this.subStream = "" | |
| 538 | + }); | |
| 539 | + | |
| 540 | + }, | |
| 541 | + channelSubStreamChange: function (row) { | |
| 542 | + this.$axios({ | |
| 543 | + method: 'post', | |
| 544 | + url: `/api/device/query/channel/stream/identification/update/`, | |
| 545 | + params: { | |
| 546 | + deviceId: this.deviceId, | |
| 547 | + channelId: row.channelId, | |
| 548 | + streamIdentification: row.streamIdentification | |
| 549 | + } | |
| 550 | + }).then(function (res) { | |
| 551 | + console.log(JSON.stringify(res)); | |
| 552 | + }); | |
| 553 | + }, | |
| 498 | 554 | refresh: function () { |
| 499 | 555 | this.initData(); |
| 500 | 556 | }, | ... | ... |
web_src/src/components/dialog/deviceEdit.vue
| ... | ... | @@ -58,12 +58,6 @@ |
| 58 | 58 | <el-form-item v-if="form.subscribeCycleForMobilePosition > 0" label="移动位置报送间隔" prop="subscribeCycleForCatalog" > |
| 59 | 59 | <el-input v-model="form.mobilePositionSubmissionInterval" clearable ></el-input> |
| 60 | 60 | </el-form-item> |
| 61 | - <el-form-item label="主子码流开关" prop="switchPrimarySubStream" > | |
| 62 | - <el-select v-model="form.switchPrimarySubStream" style="float: left; width: 100%" > | |
| 63 | - <el-option key="true" label="开启" :value="true"></el-option> | |
| 64 | - <el-option key="false" label="关闭" :value="false"></el-option> | |
| 65 | - </el-select> | |
| 66 | - </el-form-item> | |
| 67 | 61 | <el-form-item label="其他选项"> |
| 68 | 62 | <el-checkbox label="SSRC校验" v-model="form.ssrcCheck" style="float: left"></el-checkbox> |
| 69 | 63 | <el-checkbox label="作为消息通道" v-model="form.asMessageChannel" style="float: left"></el-checkbox> | ... | ... |
数据库/2.7.0/初始化-mysql-2.7.0.sql
0 → 100644
| 1 | +/*建表*/ | |
| 2 | +create table wvp_device ( | |
| 3 | + id serial primary key , | |
| 4 | + device_id character varying(50) not null , | |
| 5 | + name character varying(255), | |
| 6 | + manufacturer character varying(255), | |
| 7 | + model character varying(255), | |
| 8 | + firmware character varying(255), | |
| 9 | + transport character varying(50), | |
| 10 | + stream_mode character varying(50), | |
| 11 | + on_line bool default false, | |
| 12 | + register_time character varying(50), | |
| 13 | + keepalive_time character varying(50), | |
| 14 | + ip character varying(50), | |
| 15 | + create_time character varying(50), | |
| 16 | + update_time character varying(50), | |
| 17 | + port integer, | |
| 18 | + expires integer, | |
| 19 | + subscribe_cycle_for_catalog integer DEFAULT 0, | |
| 20 | + subscribe_cycle_for_mobile_position integer DEFAULT 0, | |
| 21 | + mobile_position_submission_interval integer DEFAULT 5, | |
| 22 | + subscribe_cycle_for_alarm integer DEFAULT 0, | |
| 23 | + host_address character varying(50), | |
| 24 | + charset character varying(50), | |
| 25 | + ssrc_check bool default false, | |
| 26 | + geo_coord_sys character varying(50), | |
| 27 | + media_server_id character varying(50), | |
| 28 | + custom_name character varying(255), | |
| 29 | + sdp_ip character varying(50), | |
| 30 | + local_ip character varying(50), | |
| 31 | + password character varying(255), | |
| 32 | + as_message_channel bool default false, | |
| 33 | + keepalive_interval_time integer, | |
| 34 | + switch_primary_sub_stream bool default false, | |
| 35 | + broadcast_push_after_ack bool default false, | |
| 36 | + constraint uk_device_device unique (device_id) | |
| 37 | +); | |
| 38 | + | |
| 39 | +create table wvp_device_alarm ( | |
| 40 | + id serial primary key , | |
| 41 | + device_id character varying(50) not null, | |
| 42 | + channel_id character varying(50) not null, | |
| 43 | + alarm_priority character varying(50), | |
| 44 | + alarm_method character varying(50), | |
| 45 | + alarm_time character varying(50), | |
| 46 | + alarm_description character varying(255), | |
| 47 | + longitude double precision, | |
| 48 | + latitude double precision, | |
| 49 | + alarm_type character varying(50), | |
| 50 | + create_time character varying(50) not null | |
| 51 | +); | |
| 52 | + | |
| 53 | +create table wvp_device_channel ( | |
| 54 | + id serial primary key , | |
| 55 | + channel_id character varying(50) not null, | |
| 56 | + name character varying(255), | |
| 57 | + custom_name character varying(255), | |
| 58 | + manufacture character varying(50), | |
| 59 | + model character varying(50), | |
| 60 | + owner character varying(50), | |
| 61 | + civil_code character varying(50), | |
| 62 | + block character varying(50), | |
| 63 | + address character varying(50), | |
| 64 | + parent_id character varying(50), | |
| 65 | + safety_way integer, | |
| 66 | + register_way integer, | |
| 67 | + cert_num character varying(50), | |
| 68 | + certifiable integer, | |
| 69 | + err_code integer, | |
| 70 | + end_time character varying(50), | |
| 71 | + secrecy character varying(50), | |
| 72 | + ip_address character varying(50), | |
| 73 | + port integer, | |
| 74 | + password character varying(255), | |
| 75 | + ptz_type integer, | |
| 76 | + custom_ptz_type integer, | |
| 77 | + status bool default false, | |
| 78 | + longitude double precision, | |
| 79 | + custom_longitude double precision, | |
| 80 | + latitude double precision, | |
| 81 | + custom_latitude double precision, | |
| 82 | + stream_id character varying(255), | |
| 83 | + device_id character varying(50) not null, | |
| 84 | + parental character varying(50), | |
| 85 | + has_audio bool default false, | |
| 86 | + create_time character varying(50) not null, | |
| 87 | + update_time character varying(50) not null, | |
| 88 | + sub_count integer, | |
| 89 | + longitude_gcj02 double precision, | |
| 90 | + latitude_gcj02 double precision, | |
| 91 | + longitude_wgs84 double precision, | |
| 92 | + latitude_wgs84 double precision, | |
| 93 | + business_group_id character varying(50), | |
| 94 | + gps_time character varying(50), | |
| 95 | + stream_identification character varying(50), | |
| 96 | + constraint uk_wvp_device_channel_unique_device_channel unique (device_id, channel_id) | |
| 97 | +); | |
| 98 | + | |
| 99 | +create table wvp_device_mobile_position ( | |
| 100 | + id serial primary key, | |
| 101 | + device_id character varying(50) not null, | |
| 102 | + channel_id character varying(50) not null, | |
| 103 | + device_name character varying(255), | |
| 104 | + time character varying(50), | |
| 105 | + longitude double precision, | |
| 106 | + latitude double precision, | |
| 107 | + altitude double precision, | |
| 108 | + speed double precision, | |
| 109 | + direction double precision, | |
| 110 | + report_source character varying(50), | |
| 111 | + longitude_gcj02 double precision, | |
| 112 | + latitude_gcj02 double precision, | |
| 113 | + longitude_wgs84 double precision, | |
| 114 | + latitude_wgs84 double precision, | |
| 115 | + create_time character varying(50) | |
| 116 | +); | |
| 117 | + | |
| 118 | +create table wvp_gb_stream ( | |
| 119 | + gb_stream_id serial primary key, | |
| 120 | + app character varying(255) not null, | |
| 121 | + stream character varying(255) not null, | |
| 122 | + gb_id character varying(50) not null, | |
| 123 | + name character varying(255), | |
| 124 | + longitude double precision, | |
| 125 | + latitude double precision, | |
| 126 | + stream_type character varying(50), | |
| 127 | + media_server_id character varying(50), | |
| 128 | + create_time character varying(50), | |
| 129 | + constraint uk_gb_stream_unique_gb_id unique (gb_id), | |
| 130 | + constraint uk_gb_stream_unique_app_stream unique (app, stream) | |
| 131 | +); | |
| 132 | + | |
| 133 | +create table wvp_log ( | |
| 134 | + id serial primary key , | |
| 135 | + name character varying(50), | |
| 136 | + type character varying(50), | |
| 137 | + uri character varying(200), | |
| 138 | + address character varying(50), | |
| 139 | + result character varying(50), | |
| 140 | + timing bigint, | |
| 141 | + username character varying(50), | |
| 142 | + create_time character varying(50) | |
| 143 | +); | |
| 144 | + | |
| 145 | +create table wvp_media_server ( | |
| 146 | + id character varying(255) primary key , | |
| 147 | + ip character varying(50), | |
| 148 | + hook_ip character varying(50), | |
| 149 | + sdp_ip character varying(50), | |
| 150 | + stream_ip character varying(50), | |
| 151 | + http_port integer, | |
| 152 | + http_ssl_port integer, | |
| 153 | + rtmp_port integer, | |
| 154 | + rtmp_ssl_port integer, | |
| 155 | + rtp_proxy_port integer, | |
| 156 | + rtsp_port integer, | |
| 157 | + rtsp_ssl_port integer, | |
| 158 | + auto_config bool default false, | |
| 159 | + secret character varying(50), | |
| 160 | + rtp_enable bool default false, | |
| 161 | + rtp_port_range character varying(50), | |
| 162 | + send_rtp_port_range character varying(50), | |
| 163 | + record_assist_port integer, | |
| 164 | + default_server bool default false, | |
| 165 | + create_time character varying(50), | |
| 166 | + update_time character varying(50), | |
| 167 | + hook_alive_interval integer, | |
| 168 | + record_path character varying(255), | |
| 169 | + record_day integer default 7, | |
| 170 | + constraint uk_media_server_unique_ip_http_port unique (ip, http_port) | |
| 171 | +); | |
| 172 | + | |
| 173 | +create table wvp_platform ( | |
| 174 | + id serial primary key , | |
| 175 | + enable bool default false, | |
| 176 | + name character varying(255), | |
| 177 | + server_gb_id character varying(50), | |
| 178 | + server_gb_domain character varying(50), | |
| 179 | + server_ip character varying(50), | |
| 180 | + server_port integer, | |
| 181 | + device_gb_id character varying(50), | |
| 182 | + device_ip character varying(50), | |
| 183 | + device_port character varying(50), | |
| 184 | + username character varying(255), | |
| 185 | + password character varying(50), | |
| 186 | + expires character varying(50), | |
| 187 | + keep_timeout character varying(50), | |
| 188 | + transport character varying(50), | |
| 189 | + character_set character varying(50), | |
| 190 | + catalog_id character varying(50), | |
| 191 | + ptz bool default false, | |
| 192 | + rtcp bool default false, | |
| 193 | + status bool default false, | |
| 194 | + start_offline_push bool default false, | |
| 195 | + administrative_division character varying(50), | |
| 196 | + catalog_group integer, | |
| 197 | + create_time character varying(50), | |
| 198 | + update_time character varying(50), | |
| 199 | + as_message_channel bool default false, | |
| 200 | + auto_push_channel bool default false, | |
| 201 | + constraint uk_platform_unique_server_gb_id unique (server_gb_id) | |
| 202 | +); | |
| 203 | + | |
| 204 | +create table wvp_platform_catalog ( | |
| 205 | + id character varying(50), | |
| 206 | + platform_id character varying(50), | |
| 207 | + name character varying(255), | |
| 208 | + parent_id character varying(50), | |
| 209 | + civil_code character varying(50), | |
| 210 | + business_group_id character varying(50), | |
| 211 | + constraint uk_platform_catalog_id_platform_id unique (id, platform_id) | |
| 212 | +); | |
| 213 | + | |
| 214 | +create table wvp_platform_gb_channel ( | |
| 215 | + id serial primary key , | |
| 216 | + platform_id character varying(50), | |
| 217 | + catalog_id character varying(50), | |
| 218 | + device_channel_id integer, | |
| 219 | + constraint uk_platform_gb_channel_platform_id_catalog_id_device_channel_id unique (platform_id, catalog_id, device_channel_id) | |
| 220 | +); | |
| 221 | + | |
| 222 | +create table wvp_platform_gb_stream ( | |
| 223 | + id serial primary key, | |
| 224 | + platform_id character varying(50), | |
| 225 | + catalog_id character varying(50), | |
| 226 | + gb_stream_id integer, | |
| 227 | + constraint uk_platform_gb_stream_platform_id_catalog_id_gb_stream_id unique (platform_id, catalog_id, gb_stream_id) | |
| 228 | +); | |
| 229 | + | |
| 230 | +create table wvp_stream_proxy ( | |
| 231 | + id serial primary key, | |
| 232 | + type character varying(50), | |
| 233 | + app character varying(255), | |
| 234 | + stream character varying(255), | |
| 235 | + url character varying(255), | |
| 236 | + src_url character varying(255), | |
| 237 | + dst_url character varying(255), | |
| 238 | + timeout_ms integer, | |
| 239 | + ffmpeg_cmd_key character varying(255), | |
| 240 | + rtp_type character varying(50), | |
| 241 | + media_server_id character varying(50), | |
| 242 | + enable_audio bool default false, | |
| 243 | + enable_mp4 bool default false, | |
| 244 | + enable bool default false, | |
| 245 | + status boolean, | |
| 246 | + enable_remove_none_reader bool default false, | |
| 247 | + create_time character varying(50), | |
| 248 | + name character varying(255), | |
| 249 | + update_time character varying(50), | |
| 250 | + stream_key character varying(255), | |
| 251 | + enable_disable_none_reader bool default false, | |
| 252 | + constraint uk_stream_proxy_app_stream unique (app, stream) | |
| 253 | +); | |
| 254 | + | |
| 255 | +create table wvp_stream_push ( | |
| 256 | + id serial primary key, | |
| 257 | + app character varying(255), | |
| 258 | + stream character varying(255), | |
| 259 | + total_reader_count character varying(50), | |
| 260 | + origin_type integer, | |
| 261 | + origin_type_str character varying(50), | |
| 262 | + create_time character varying(50), | |
| 263 | + alive_second integer, | |
| 264 | + media_server_id character varying(50), | |
| 265 | + server_id character varying(50), | |
| 266 | + push_time character varying(50), | |
| 267 | + status bool default false, | |
| 268 | + update_time character varying(50), | |
| 269 | + push_ing bool default false, | |
| 270 | + self bool default false, | |
| 271 | + constraint uk_stream_push_app_stream unique (app, stream) | |
| 272 | +); | |
| 273 | +create table wvp_cloud_record ( | |
| 274 | + id serial primary key, | |
| 275 | + app character varying(255), | |
| 276 | + stream character varying(255), | |
| 277 | + call_id character varying(255), | |
| 278 | + start_time bigint, | |
| 279 | + end_time bigint, | |
| 280 | + media_server_id character varying(50), | |
| 281 | + file_name character varying(255), | |
| 282 | + folder character varying(255), | |
| 283 | + file_path character varying(255), | |
| 284 | + collect bool default false, | |
| 285 | + file_size bigint, | |
| 286 | + time_len bigint, | |
| 287 | + constraint uk_stream_push_app_stream_path unique (app, stream, file_path) | |
| 288 | +); | |
| 289 | + | |
| 290 | +create table wvp_user ( | |
| 291 | + id serial primary key, | |
| 292 | + username character varying(255), | |
| 293 | + password character varying(255), | |
| 294 | + role_id integer, | |
| 295 | + create_time character varying(50), | |
| 296 | + update_time character varying(50), | |
| 297 | + push_key character varying(50), | |
| 298 | + constraint uk_user_username unique (username) | |
| 299 | +); | |
| 300 | + | |
| 301 | +create table wvp_user_role ( | |
| 302 | + id serial primary key, | |
| 303 | + name character varying(50), | |
| 304 | + authority character varying(50), | |
| 305 | + create_time character varying(50), | |
| 306 | + update_time character varying(50) | |
| 307 | +); | |
| 308 | +create table wvp_resources_tree ( | |
| 309 | + id serial primary key , | |
| 310 | + is_catalog bool default true, | |
| 311 | + device_channel_id integer , | |
| 312 | + gb_stream_id integer, | |
| 313 | + name character varying(255), | |
| 314 | + parentId integer, | |
| 315 | + path character varying(255) | |
| 316 | +); | |
| 317 | + | |
| 318 | + | |
| 319 | +/*初始数据*/ | |
| 320 | +INSERT INTO wvp_user VALUES (1, 'admin','21232f297a57a5a743894a0e4a801fc3',1,'2021-04-13 14:14:57','2021-04-13 14:14:57','3e80d1762a324d5b0ff636e0bd16f1e3'); | |
| 321 | +INSERT INTO wvp_user_role VALUES (1, 'admin','0','2021-04-13 14:14:57','2021-04-13 14:14:57'); | |
| 322 | + | |
| 323 | + | |
| 324 | + | ... | ... |
数据库/2.7.0/初始化-postgresql-kingbase-2.7.0.sql
0 → 100644
| 1 | +/*建表*/ | |
| 2 | +create table wvp_device ( | |
| 3 | + id serial primary key , | |
| 4 | + device_id character varying(50) not null , | |
| 5 | + name character varying(255), | |
| 6 | + manufacturer character varying(255), | |
| 7 | + model character varying(255), | |
| 8 | + firmware character varying(255), | |
| 9 | + transport character varying(50), | |
| 10 | + stream_mode character varying(50), | |
| 11 | + on_line bool default false, | |
| 12 | + register_time character varying(50), | |
| 13 | + keepalive_time character varying(50), | |
| 14 | + ip character varying(50), | |
| 15 | + create_time character varying(50), | |
| 16 | + update_time character varying(50), | |
| 17 | + port integer, | |
| 18 | + expires integer, | |
| 19 | + subscribe_cycle_for_catalog integer DEFAULT 0, | |
| 20 | + subscribe_cycle_for_mobile_position integer DEFAULT 0, | |
| 21 | + mobile_position_submission_interval integer DEFAULT 5, | |
| 22 | + subscribe_cycle_for_alarm integer DEFAULT 0, | |
| 23 | + host_address character varying(50), | |
| 24 | + charset character varying(50), | |
| 25 | + ssrc_check bool default false, | |
| 26 | + geo_coord_sys character varying(50), | |
| 27 | + media_server_id character varying(50), | |
| 28 | + custom_name character varying(255), | |
| 29 | + sdp_ip character varying(50), | |
| 30 | + local_ip character varying(50), | |
| 31 | + password character varying(255), | |
| 32 | + as_message_channel bool default false, | |
| 33 | + keepalive_interval_time integer, | |
| 34 | + switch_primary_sub_stream bool default false, | |
| 35 | + broadcast_push_after_ack bool default false, | |
| 36 | + constraint uk_device_device unique (device_id) | |
| 37 | +); | |
| 38 | + | |
| 39 | +create table wvp_device_alarm ( | |
| 40 | + id serial primary key , | |
| 41 | + device_id character varying(50) not null, | |
| 42 | + channel_id character varying(50) not null, | |
| 43 | + alarm_priority character varying(50), | |
| 44 | + alarm_method character varying(50), | |
| 45 | + alarm_time character varying(50), | |
| 46 | + alarm_description character varying(255), | |
| 47 | + longitude double precision, | |
| 48 | + latitude double precision, | |
| 49 | + alarm_type character varying(50), | |
| 50 | + create_time character varying(50) not null | |
| 51 | +); | |
| 52 | + | |
| 53 | +create table wvp_device_channel ( | |
| 54 | + id serial primary key , | |
| 55 | + channel_id character varying(50) not null, | |
| 56 | + name character varying(255), | |
| 57 | + custom_name character varying(255), | |
| 58 | + manufacture character varying(50), | |
| 59 | + model character varying(50), | |
| 60 | + owner character varying(50), | |
| 61 | + civil_code character varying(50), | |
| 62 | + block character varying(50), | |
| 63 | + address character varying(50), | |
| 64 | + parent_id character varying(50), | |
| 65 | + safety_way integer, | |
| 66 | + register_way integer, | |
| 67 | + cert_num character varying(50), | |
| 68 | + certifiable integer, | |
| 69 | + err_code integer, | |
| 70 | + end_time character varying(50), | |
| 71 | + secrecy character varying(50), | |
| 72 | + ip_address character varying(50), | |
| 73 | + port integer, | |
| 74 | + password character varying(255), | |
| 75 | + ptz_type integer, | |
| 76 | + custom_ptz_type integer, | |
| 77 | + status bool default false, | |
| 78 | + longitude double precision, | |
| 79 | + custom_longitude double precision, | |
| 80 | + latitude double precision, | |
| 81 | + custom_latitude double precision, | |
| 82 | + stream_id character varying(255), | |
| 83 | + device_id character varying(50) not null, | |
| 84 | + parental character varying(50), | |
| 85 | + has_audio bool default false, | |
| 86 | + create_time character varying(50) not null, | |
| 87 | + update_time character varying(50) not null, | |
| 88 | + sub_count integer, | |
| 89 | + longitude_gcj02 double precision, | |
| 90 | + latitude_gcj02 double precision, | |
| 91 | + longitude_wgs84 double precision, | |
| 92 | + latitude_wgs84 double precision, | |
| 93 | + business_group_id character varying(50), | |
| 94 | + gps_time character varying(50), | |
| 95 | + stream_identification character varying(50), | |
| 96 | + constraint uk_wvp_device_channel_unique_device_channel unique (device_id, channel_id) | |
| 97 | +); | |
| 98 | + | |
| 99 | +create table wvp_device_mobile_position ( | |
| 100 | + id serial primary key, | |
| 101 | + device_id character varying(50) not null, | |
| 102 | + channel_id character varying(50) not null, | |
| 103 | + device_name character varying(255), | |
| 104 | + time character varying(50), | |
| 105 | + longitude double precision, | |
| 106 | + latitude double precision, | |
| 107 | + altitude double precision, | |
| 108 | + speed double precision, | |
| 109 | + direction double precision, | |
| 110 | + report_source character varying(50), | |
| 111 | + longitude_gcj02 double precision, | |
| 112 | + latitude_gcj02 double precision, | |
| 113 | + longitude_wgs84 double precision, | |
| 114 | + latitude_wgs84 double precision, | |
| 115 | + create_time character varying(50) | |
| 116 | +); | |
| 117 | + | |
| 118 | +create table wvp_gb_stream ( | |
| 119 | + gb_stream_id serial primary key, | |
| 120 | + app character varying(255) not null, | |
| 121 | + stream character varying(255) not null, | |
| 122 | + gb_id character varying(50) not null, | |
| 123 | + name character varying(255), | |
| 124 | + longitude double precision, | |
| 125 | + latitude double precision, | |
| 126 | + stream_type character varying(50), | |
| 127 | + media_server_id character varying(50), | |
| 128 | + create_time character varying(50), | |
| 129 | + constraint uk_gb_stream_unique_gb_id unique (gb_id), | |
| 130 | + constraint uk_gb_stream_unique_app_stream unique (app, stream) | |
| 131 | +); | |
| 132 | + | |
| 133 | +create table wvp_log ( | |
| 134 | + id serial primary key , | |
| 135 | + name character varying(50), | |
| 136 | + type character varying(50), | |
| 137 | + uri character varying(200), | |
| 138 | + address character varying(50), | |
| 139 | + result character varying(50), | |
| 140 | + timing bigint, | |
| 141 | + username character varying(50), | |
| 142 | + create_time character varying(50) | |
| 143 | +); | |
| 144 | + | |
| 145 | +create table wvp_media_server ( | |
| 146 | + id character varying(255) primary key , | |
| 147 | + ip character varying(50), | |
| 148 | + hook_ip character varying(50), | |
| 149 | + sdp_ip character varying(50), | |
| 150 | + stream_ip character varying(50), | |
| 151 | + http_port integer, | |
| 152 | + http_ssl_port integer, | |
| 153 | + rtmp_port integer, | |
| 154 | + rtmp_ssl_port integer, | |
| 155 | + rtp_proxy_port integer, | |
| 156 | + rtsp_port integer, | |
| 157 | + rtsp_ssl_port integer, | |
| 158 | + auto_config bool default false, | |
| 159 | + secret character varying(50), | |
| 160 | + rtp_enable bool default false, | |
| 161 | + rtp_port_range character varying(50), | |
| 162 | + send_rtp_port_range character varying(50), | |
| 163 | + record_assist_port integer, | |
| 164 | + default_server bool default false, | |
| 165 | + create_time character varying(50), | |
| 166 | + update_time character varying(50), | |
| 167 | + hook_alive_interval integer, | |
| 168 | + record_path character varying(255), | |
| 169 | + record_day integer default 7, | |
| 170 | + constraint uk_media_server_unique_ip_http_port unique (ip, http_port) | |
| 171 | +); | |
| 172 | + | |
| 173 | +create table wvp_platform ( | |
| 174 | + id serial primary key , | |
| 175 | + enable bool default false, | |
| 176 | + name character varying(255), | |
| 177 | + server_gb_id character varying(50), | |
| 178 | + server_gb_domain character varying(50), | |
| 179 | + server_ip character varying(50), | |
| 180 | + server_port integer, | |
| 181 | + device_gb_id character varying(50), | |
| 182 | + device_ip character varying(50), | |
| 183 | + device_port character varying(50), | |
| 184 | + username character varying(255), | |
| 185 | + password character varying(50), | |
| 186 | + expires character varying(50), | |
| 187 | + keep_timeout character varying(50), | |
| 188 | + transport character varying(50), | |
| 189 | + character_set character varying(50), | |
| 190 | + catalog_id character varying(50), | |
| 191 | + ptz bool default false, | |
| 192 | + rtcp bool default false, | |
| 193 | + status bool default false, | |
| 194 | + start_offline_push bool default false, | |
| 195 | + administrative_division character varying(50), | |
| 196 | + catalog_group integer, | |
| 197 | + create_time character varying(50), | |
| 198 | + update_time character varying(50), | |
| 199 | + as_message_channel bool default false, | |
| 200 | + auto_push_channel bool default false, | |
| 201 | + constraint uk_platform_unique_server_gb_id unique (server_gb_id) | |
| 202 | +); | |
| 203 | + | |
| 204 | +create table wvp_platform_catalog ( | |
| 205 | + id character varying(50), | |
| 206 | + platform_id character varying(50), | |
| 207 | + name character varying(255), | |
| 208 | + parent_id character varying(50), | |
| 209 | + civil_code character varying(50), | |
| 210 | + business_group_id character varying(50), | |
| 211 | + constraint uk_platform_catalog_id_platform_id unique (id, platform_id) | |
| 212 | +); | |
| 213 | + | |
| 214 | +create table wvp_platform_gb_channel ( | |
| 215 | + id serial primary key , | |
| 216 | + platform_id character varying(50), | |
| 217 | + catalog_id character varying(50), | |
| 218 | + device_channel_id integer, | |
| 219 | + constraint uk_platform_gb_channel_platform_id_catalog_id_device_channel_id unique (platform_id, catalog_id, device_channel_id) | |
| 220 | +); | |
| 221 | + | |
| 222 | +create table wvp_platform_gb_stream ( | |
| 223 | + id serial primary key, | |
| 224 | + platform_id character varying(50), | |
| 225 | + catalog_id character varying(50), | |
| 226 | + gb_stream_id integer, | |
| 227 | + constraint uk_platform_gb_stream_platform_id_catalog_id_gb_stream_id unique (platform_id, catalog_id, gb_stream_id) | |
| 228 | +); | |
| 229 | + | |
| 230 | +create table wvp_stream_proxy ( | |
| 231 | + id serial primary key, | |
| 232 | + type character varying(50), | |
| 233 | + app character varying(255), | |
| 234 | + stream character varying(255), | |
| 235 | + url character varying(255), | |
| 236 | + src_url character varying(255), | |
| 237 | + dst_url character varying(255), | |
| 238 | + timeout_ms integer, | |
| 239 | + ffmpeg_cmd_key character varying(255), | |
| 240 | + rtp_type character varying(50), | |
| 241 | + media_server_id character varying(50), | |
| 242 | + enable_audio bool default false, | |
| 243 | + enable_mp4 bool default false, | |
| 244 | + enable bool default false, | |
| 245 | + status boolean, | |
| 246 | + enable_remove_none_reader bool default false, | |
| 247 | + create_time character varying(50), | |
| 248 | + name character varying(255), | |
| 249 | + update_time character varying(50), | |
| 250 | + stream_key character varying(255), | |
| 251 | + enable_disable_none_reader bool default false, | |
| 252 | + constraint uk_stream_proxy_app_stream unique (app, stream) | |
| 253 | +); | |
| 254 | + | |
| 255 | +create table wvp_stream_push ( | |
| 256 | + id serial primary key, | |
| 257 | + app character varying(255), | |
| 258 | + stream character varying(255), | |
| 259 | + total_reader_count character varying(50), | |
| 260 | + origin_type integer, | |
| 261 | + origin_type_str character varying(50), | |
| 262 | + create_time character varying(50), | |
| 263 | + alive_second integer, | |
| 264 | + media_server_id character varying(50), | |
| 265 | + server_id character varying(50), | |
| 266 | + push_time character varying(50), | |
| 267 | + status bool default false, | |
| 268 | + update_time character varying(50), | |
| 269 | + push_ing bool default false, | |
| 270 | + self bool default false, | |
| 271 | + constraint uk_stream_push_app_stream unique (app, stream) | |
| 272 | +); | |
| 273 | +create table wvp_cloud_record ( | |
| 274 | + id serial primary key, | |
| 275 | + app character varying(255), | |
| 276 | + stream character varying(255), | |
| 277 | + call_id character varying(255), | |
| 278 | + start_time int8, | |
| 279 | + end_time int8, | |
| 280 | + media_server_id character varying(50), | |
| 281 | + file_name character varying(255), | |
| 282 | + folder character varying(255), | |
| 283 | + file_path character varying(255), | |
| 284 | + collect bool default false, | |
| 285 | + file_size int8, | |
| 286 | + time_len int8, | |
| 287 | + constraint uk_stream_push_app_stream_path unique (app, stream, file_path) | |
| 288 | +); | |
| 289 | + | |
| 290 | +create table wvp_user ( | |
| 291 | + id serial primary key, | |
| 292 | + username character varying(255), | |
| 293 | + password character varying(255), | |
| 294 | + role_id integer, | |
| 295 | + create_time character varying(50), | |
| 296 | + update_time character varying(50), | |
| 297 | + push_key character varying(50), | |
| 298 | + constraint uk_user_username unique (username) | |
| 299 | +); | |
| 300 | + | |
| 301 | +create table wvp_user_role ( | |
| 302 | + id serial primary key, | |
| 303 | + name character varying(50), | |
| 304 | + authority character varying(50), | |
| 305 | + create_time character varying(50), | |
| 306 | + update_time character varying(50) | |
| 307 | +); | |
| 308 | +create table wvp_resources_tree ( | |
| 309 | + id serial primary key , | |
| 310 | + is_catalog bool default true, | |
| 311 | + device_channel_id integer , | |
| 312 | + gb_stream_id integer, | |
| 313 | + name character varying(255), | |
| 314 | + parentId integer, | |
| 315 | + path character varying(255) | |
| 316 | +); | |
| 317 | + | |
| 318 | + | |
| 319 | +/*初始数据*/ | |
| 320 | +INSERT INTO wvp_user VALUES (1, 'admin','21232f297a57a5a743894a0e4a801fc3',1,'2021-04-13 14:14:57','2021-04-13 14:14:57','3e80d1762a324d5b0ff636e0bd16f1e3'); | |
| 321 | +INSERT INTO wvp_user_role VALUES (1, 'admin','0','2021-04-13 14:14:57','2021-04-13 14:14:57'); | |
| 322 | + | |
| 323 | + | |
| 324 | + | ... | ... |
数据库/2.7.0/更新-mysql-2.7.0.sql
0 → 100644