├── .github └── ISSUE_TEMPLATE │ ├── bug.md │ ├── new.md │ └── solve.md ├── .gitignore ├── .gitmodules ├── LICENSE ├── README.md ├── bin └── wvp.sh ├── bootstrap.sh ├── buildPackage.sh ├── doc ├── README.md ├── _content │ ├── ability │ │ ├── _media │ │ │ ├── cascade1.png │ │ │ ├── cascade2.png │ │ │ ├── cascade3.png │ │ │ ├── cascade4.png │ │ │ ├── img.png │ │ │ ├── img_1.png │ │ │ ├── img_10.png │ │ │ ├── img_11.png │ │ │ ├── img_12.png │ │ │ ├── img_13.png │ │ │ ├── img_14.png │ │ │ ├── img_15.png │ │ │ ├── img_16.png │ │ │ ├── img_17.png │ │ │ ├── img_18.png │ │ │ ├── img_19.png │ │ │ ├── img_2.png │ │ │ ├── img_20.png │ │ │ ├── img_21.png │ │ │ ├── img_22.png │ │ │ ├── img_23.png │ │ │ ├── img_24.png │ │ │ ├── img_25.png │ │ │ ├── img_3.png │ │ │ ├── img_4.png │ │ │ ├── img_5.png │ │ │ ├── img_6.png │ │ │ ├── img_7.png │ │ │ ├── img_8.png │ │ │ └── img_9.png │ │ ├── auto_play.md │ │ ├── cascade.md │ │ ├── cascade2.md │ │ ├── channel.md │ │ ├── cloud_record.md │ │ ├── continuous_broadcast.md │ │ ├── continuous_recording.md │ │ ├── device.md │ │ ├── device_use.md │ │ ├── gis.md │ │ ├── node_manager.md │ │ ├── online_doc.md │ │ ├── proxy.md │ │ ├── push.md │ │ └── user.md │ ├── about_doc.md │ ├── broadcast.md │ ├── disclaimers.md │ ├── introduction │ │ ├── _media │ │ │ ├── img.png │ │ │ ├── img_1.png │ │ │ └── img_2.png │ │ ├── compile.md │ │ ├── config.md │ │ └── deployment.md │ ├── qa │ │ ├── _media │ │ │ ├── img.png │ │ │ ├── img_1.png │ │ │ ├── img_2.png │ │ │ ├── img_3.png │ │ │ ├── img_4.png │ │ │ └── img_5.png │ │ ├── bug.md │ │ ├── development.md │ │ ├── img.png │ │ ├── play_error.md │ │ ├── regiser_error.md │ │ └── start_error.md │ ├── skill │ │ ├── _media │ │ │ ├── img.png │ │ │ ├── img_1.png │ │ │ └── img_2.png │ │ └── tcpdump.md │ └── theory │ │ ├── _media │ │ ├── img.png │ │ ├── img_1.png │ │ ├── img_2.png │ │ ├── img_3.png │ │ ├── img_4.png │ │ ├── img_5.png │ │ ├── img_6.png │ │ ├── img_7.png │ │ ├── img_8.png │ │ └── img_9.png │ │ ├── broadcast_cascade.md │ │ ├── code.md │ │ ├── img.png │ │ ├── play.md │ │ └── register.md ├── _coverpage.md ├── _media │ ├── 1.png │ ├── 1372762149.jpg │ ├── 2.png │ ├── 3.png │ ├── 4.png │ ├── 5.png │ ├── 6.png │ ├── 7.png │ ├── 8.png │ ├── 903207146.jpg │ ├── favicon.ico │ ├── log.jpg │ ├── logo-mini.png │ ├── logo.jpg │ ├── logo.png │ ├── shequ.png │ ├── weixin.jpg │ └── zhifubao.jpg ├── _navbar.md ├── _sidebar.md ├── index.html └── lib │ ├── css │ └── vue.css │ └── js │ ├── docsify-copy-code.min.js │ ├── docsify-plantuml.min.js │ ├── docsify@4.js │ ├── search.min.js │ └── zoom-image.min.js ├── docker ├── build.sh ├── docker-compose.yml ├── docker-upgrade.sh ├── media │ ├── Dockerfile │ ├── build.sh │ └── config.ini ├── mysql │ ├── Dockerfile │ ├── build.sh │ └── db │ │ ├── privileges.sql │ │ └── wvp.sql ├── nginx │ ├── Dockerfile │ ├── build.sh │ ├── conf │ │ └── nginx.conf │ └── config.js ├── push.sh ├── redis │ ├── Dockerfile │ ├── build.sh │ └── conf │ │ └── redis.conf └── wvp │ ├── Dockerfile │ ├── build.sh │ └── wvp │ ├── application-base.yml │ ├── application-docker.yml │ └── application.yml ├── install.sh ├── libs ├── jdbc-aarch │ ├── kingbase8-8.6.0.jar │ ├── kingbase8-8.6.0.jre7.jar │ ├── postgresql-42.2.9.jar │ └── postgresql-42.2.9.jre7.jar └── jdbc-x86 │ ├── bcprov-jdk15on-1.70.jar │ ├── kingbase8-8.6.0.jar │ ├── kingbase8-8.6.0.jre6.jar │ ├── kingbase8-8.6.0.jre7.jar │ ├── postgresql-42.2.9.jar │ ├── postgresql-42.2.9.jre6.jar │ └── postgresql-42.2.9.jre7.jar ├── pom.xml ├── run.sh ├── src ├── main │ ├── java │ │ └── com │ │ │ └── genersoft │ │ │ └── iot │ │ │ └── vmp │ │ │ ├── VManageBootstrap.java │ │ │ ├── common │ │ │ ├── CivilCodePo.java │ │ │ ├── CommonCallback.java │ │ │ ├── DeviceStatusCallback.java │ │ │ ├── InviteInfo.java │ │ │ ├── InviteSessionStatus.java │ │ │ ├── InviteSessionType.java │ │ │ ├── RemoteAddressInfo.java │ │ │ ├── ServerInfo.java │ │ │ ├── StatisticsInfo.java │ │ │ ├── StreamInfo.java │ │ │ ├── StreamURL.java │ │ │ ├── SubscribeCallback.java │ │ │ ├── SystemAllInfo.java │ │ │ ├── VersionPo.java │ │ │ ├── VideoManagerConstants.java │ │ │ └── enums │ │ │ │ ├── ChannelDataType.java │ │ │ │ └── DeviceControlType.java │ │ │ ├── conf │ │ │ ├── CivilCodeFileConf.java │ │ │ ├── CloudRecordTimer.java │ │ │ ├── DynamicTask.java │ │ │ ├── GlobalExceptionHandler.java │ │ │ ├── GlobalResponseAdvice.java │ │ │ ├── MediaConfig.java │ │ │ ├── MediaStatusTimerTask.java │ │ │ ├── MybatisConfig.java │ │ │ ├── ProxyServletConfig.java │ │ │ ├── ScheduleConfig.java │ │ │ ├── ServiceInfo.java │ │ │ ├── SipConfig.java │ │ │ ├── SpringDocConfig.java │ │ │ ├── StatisticsInfoTask.java │ │ │ ├── SystemInfoTimerTask.java │ │ │ ├── ThreadPoolTaskConfig.java │ │ │ ├── UserSetting.java │ │ │ ├── VersionConfig.java │ │ │ ├── VersionInfo.java │ │ │ ├── WVPTimerTask.java │ │ │ ├── exception │ │ │ │ ├── ControllerException.java │ │ │ │ ├── ServiceException.java │ │ │ │ └── SsrcTransactionNotFoundException.java │ │ │ ├── redis │ │ │ │ ├── RedisMsgListenConfig.java │ │ │ │ ├── RedisRpcConfig.java │ │ │ │ ├── RedisTemplateConfig.java │ │ │ │ └── bean │ │ │ │ │ ├── RedisRpcClassHandler.java │ │ │ │ │ ├── RedisRpcMessage.java │ │ │ │ │ ├── RedisRpcRequest.java │ │ │ │ │ └── RedisRpcResponse.java │ │ │ ├── security │ │ │ │ ├── AnonymousAuthenticationEntryPoint.java │ │ │ │ ├── DefaultUserDetailsServiceImpl.java │ │ │ │ ├── JwtAuthenticationFilter.java │ │ │ │ ├── JwtUtils.java │ │ │ │ ├── LogoutHandler.java │ │ │ │ ├── SecurityUtils.java │ │ │ │ ├── WebSecurityConfig.java │ │ │ │ └── dto │ │ │ │ │ ├── JwtUser.java │ │ │ │ │ └── LoginUser.java │ │ │ ├── webLog │ │ │ │ ├── LogChannel.java │ │ │ │ └── WebSocketAppender.java │ │ │ └── websocket │ │ │ │ └── WebSocketConfig.java │ │ │ ├── gb28181 │ │ │ ├── SipLayer.java │ │ │ ├── auth │ │ │ │ └── DigestServerAuthenticationHelper.java │ │ │ ├── bean │ │ │ │ ├── AlarmChannelMessage.java │ │ │ │ ├── AudioBroadcastCatch.java │ │ │ │ ├── AudioBroadcastCatchStatus.java │ │ │ │ ├── BaiduPoint.java │ │ │ │ ├── BasicParam.java │ │ │ │ ├── CatalogChannelEvent.java │ │ │ │ ├── CatalogData.java │ │ │ │ ├── ChannelIdType.java │ │ │ │ ├── CmdType.java │ │ │ │ ├── CommonGBChannel.java │ │ │ │ ├── Device.java │ │ │ │ ├── DeviceAlarm.java │ │ │ │ ├── DeviceAlarmMethod.java │ │ │ │ ├── DeviceChannel.java │ │ │ │ ├── DeviceChannelInPlatform.java │ │ │ │ ├── DeviceNotFoundEvent.java │ │ │ │ ├── DeviceType.java │ │ │ │ ├── DeviceTypeEnum.java │ │ │ │ ├── DragZoomParam.java │ │ │ │ ├── DragZoomRequest.java │ │ │ │ ├── FrontEndCode.java │ │ │ │ ├── FrontEndControlCodeForAuxiliary.java │ │ │ │ ├── FrontEndControlCodeForFI.java │ │ │ │ ├── FrontEndControlCodeForPTZ.java │ │ │ │ ├── FrontEndControlCodeForPreset.java │ │ │ │ ├── FrontEndControlCodeForScan.java │ │ │ │ ├── FrontEndControlCodeForTour.java │ │ │ │ ├── FrontEndControlType.java │ │ │ │ ├── GBStringMsgParser.java │ │ │ │ ├── Gb28181Sdp.java │ │ │ │ ├── GbCode.java │ │ │ │ ├── GbSipDate.java │ │ │ │ ├── GbSteamIdentification.java │ │ │ │ ├── GbStream.java │ │ │ │ ├── GbStringMsgParserFactory.java │ │ │ │ ├── Group.java │ │ │ │ ├── GroupTree.java │ │ │ │ ├── HandlerCatchData.java │ │ │ │ ├── HomePositionRequest.java │ │ │ │ ├── Host.java │ │ │ │ ├── IFrontEndControlCode.java │ │ │ │ ├── IndustryCodeType.java │ │ │ │ ├── IndustryCodeTypeEnum.java │ │ │ │ ├── InviteDecodeException.java │ │ │ │ ├── InviteMessageInfo.java │ │ │ │ ├── InviteStreamCallback.java │ │ │ │ ├── InviteStreamInfo.java │ │ │ │ ├── InviteStreamType.java │ │ │ │ ├── MobilePosition.java │ │ │ │ ├── NetworkIdentificationType.java │ │ │ │ ├── NetworkIdentificationTypeEnum.java │ │ │ │ ├── NotifyCatalogChannel.java │ │ │ │ ├── OpenRTPServerResult.java │ │ │ │ ├── Platform.java │ │ │ │ ├── PlatformCatalog.java │ │ │ │ ├── PlatformCatch.java │ │ │ │ ├── PlatformChannel.java │ │ │ │ ├── PlatformGbStream.java │ │ │ │ ├── PlatformKeepaliveCallback.java │ │ │ │ ├── PlatformRegister.java │ │ │ │ ├── PlayException.java │ │ │ │ ├── Preset.java │ │ │ │ ├── RecordInfo.java │ │ │ │ ├── RecordItem.java │ │ │ │ ├── Region.java │ │ │ │ ├── RegionTree.java │ │ │ │ ├── SDPInfo.java │ │ │ │ ├── SendRtpInfo.java │ │ │ │ ├── SipMsgInfo.java │ │ │ │ ├── SipTransactionInfo.java │ │ │ │ ├── SsrcTransaction.java │ │ │ │ ├── SubscribeHolder.java │ │ │ │ ├── SubscribeInfo.java │ │ │ │ └── SyncStatus.java │ │ │ ├── conf │ │ │ │ ├── DefaultProperties.java │ │ │ │ ├── ServerLoggerImpl.java │ │ │ │ └── StackLoggerImpl.java │ │ │ ├── controller │ │ │ │ ├── AlarmController.java │ │ │ │ ├── CommonChannelController.java │ │ │ │ ├── DeviceConfig.java │ │ │ │ ├── DeviceControl.java │ │ │ │ ├── DeviceQuery.java │ │ │ │ ├── GBRecordController.java │ │ │ │ ├── GroupController.java │ │ │ │ ├── MediaController.java │ │ │ │ ├── MobilePositionController.java │ │ │ │ ├── PlatformController.java │ │ │ │ ├── PlayController.java │ │ │ │ ├── PlaybackController.java │ │ │ │ ├── PtzController.java │ │ │ │ ├── RegionController.java │ │ │ │ ├── SseController.java │ │ │ │ └── bean │ │ │ │ │ ├── AudioBroadcastEvent.java │ │ │ │ │ ├── ChannelReduce.java │ │ │ │ │ ├── ChannelToGroupByGbDeviceParam.java │ │ │ │ │ ├── ChannelToGroupParam.java │ │ │ │ │ ├── ChannelToRegionByGbDeviceParam.java │ │ │ │ │ ├── ChannelToRegionParam.java │ │ │ │ │ ├── PlayResult.java │ │ │ │ │ └── UpdateChannelParam.java │ │ │ ├── dao │ │ │ │ ├── CommonGBChannelMapper.java │ │ │ │ ├── DeviceAlarmMapper.java │ │ │ │ ├── DeviceChannelMapper.java │ │ │ │ ├── DeviceMapper.java │ │ │ │ ├── DeviceMobilePositionMapper.java │ │ │ │ ├── GroupMapper.java │ │ │ │ ├── PlatformChannelMapper.java │ │ │ │ ├── PlatformMapper.java │ │ │ │ ├── RegionMapper.java │ │ │ │ └── provider │ │ │ │ │ ├── ChannelProvider.java │ │ │ │ │ └── DeviceChannelProvider.java │ │ │ ├── event │ │ │ │ ├── EventPublisher.java │ │ │ │ ├── MessageSubscribe.java │ │ │ │ ├── SipSubscribe.java │ │ │ │ ├── alarm │ │ │ │ │ ├── AlarmEvent.java │ │ │ │ │ └── AlarmEventListener.java │ │ │ │ ├── record │ │ │ │ │ ├── RecordInfoEndEvent.java │ │ │ │ │ ├── RecordInfoEvent.java │ │ │ │ │ └── RecordInfoEventListener.java │ │ │ │ ├── sip │ │ │ │ │ ├── MessageEvent.java │ │ │ │ │ └── SipEvent.java │ │ │ │ └── subscribe │ │ │ │ │ ├── catalog │ │ │ │ │ ├── CatalogEvent.java │ │ │ │ │ └── CatalogEventLister.java │ │ │ │ │ └── mobilePosition │ │ │ │ │ ├── MobilePositionEvent.java │ │ │ │ │ └── MobilePositionEventLister.java │ │ │ ├── service │ │ │ │ ├── IDeviceAlarmService.java │ │ │ │ ├── IDeviceChannelService.java │ │ │ │ ├── IDeviceService.java │ │ │ │ ├── IGbChannelControlService.java │ │ │ │ ├── IGbChannelPlayService.java │ │ │ │ ├── IGbChannelService.java │ │ │ │ ├── IGroupService.java │ │ │ │ ├── IInviteStreamService.java │ │ │ │ ├── IPTZService.java │ │ │ │ ├── IPlatformChannelService.java │ │ │ │ ├── IPlatformService.java │ │ │ │ ├── IPlayService.java │ │ │ │ ├── IRegionService.java │ │ │ │ └── impl │ │ │ │ │ ├── DeviceAlarmServiceImpl.java │ │ │ │ │ ├── DeviceChannelServiceImpl.java │ │ │ │ │ ├── DeviceServiceImpl.java │ │ │ │ │ ├── GbChannelControlServiceImpl.java │ │ │ │ │ ├── GbChannelPlayServiceImpl.java │ │ │ │ │ ├── GbChannelServiceImpl.java │ │ │ │ │ ├── GroupServiceImpl.java │ │ │ │ │ ├── InviteStreamServiceImpl.java │ │ │ │ │ ├── PTZServiceImpl.java │ │ │ │ │ ├── PlatformChannelServiceImpl.java │ │ │ │ │ ├── PlatformServiceImpl.java │ │ │ │ │ ├── PlayServiceImpl.java │ │ │ │ │ └── RegionServiceImpl.java │ │ │ ├── session │ │ │ │ ├── AudioBroadcastManager.java │ │ │ │ ├── CatalogDataManager.java │ │ │ │ ├── CommonSessionManager.java │ │ │ │ ├── SSRCFactory.java │ │ │ │ ├── SipInviteSessionManager.java │ │ │ │ └── SseSessionManager.java │ │ │ ├── task │ │ │ │ ├── deviceStatus │ │ │ │ │ ├── DeviceStatusTask.java │ │ │ │ │ ├── DeviceStatusTaskInfo.java │ │ │ │ │ └── DeviceStatusTaskRunner.java │ │ │ │ ├── deviceSubscribe │ │ │ │ │ ├── SubscribeTask.java │ │ │ │ │ ├── SubscribeTaskInfo.java │ │ │ │ │ ├── SubscribeTaskRunner.java │ │ │ │ │ └── impl │ │ │ │ │ │ ├── SubscribeTaskForCatalog.java │ │ │ │ │ │ └── SubscribeTaskForMobilPosition.java │ │ │ │ └── platformStatus │ │ │ │ │ ├── PlatformKeepaliveTask.java │ │ │ │ │ ├── PlatformRegisterTask.java │ │ │ │ │ ├── PlatformRegisterTaskInfo.java │ │ │ │ │ └── PlatformStatusTaskRunner.java │ │ │ ├── transmit │ │ │ │ ├── ISIPProcessorObserver.java │ │ │ │ ├── SIPProcessorObserver.java │ │ │ │ ├── SIPSender.java │ │ │ │ ├── callback │ │ │ │ │ ├── DeferredResultHolder.java │ │ │ │ │ └── RequestMessage.java │ │ │ │ ├── cmd │ │ │ │ │ ├── ISIPCommander.java │ │ │ │ │ ├── ISIPCommanderForPlatform.java │ │ │ │ │ ├── SIPRequestHeaderPlarformProvider.java │ │ │ │ │ ├── SIPRequestHeaderProvider.java │ │ │ │ │ └── impl │ │ │ │ │ │ ├── SIPCommander.java │ │ │ │ │ │ └── SIPCommanderForPlatform.java │ │ │ │ └── event │ │ │ │ │ ├── request │ │ │ │ │ ├── ISIPRequestProcessor.java │ │ │ │ │ ├── SIPRequestProcessorParent.java │ │ │ │ │ └── impl │ │ │ │ │ │ ├── AckRequestProcessor.java │ │ │ │ │ │ ├── ByeRequestProcessor.java │ │ │ │ │ │ ├── CancelRequestProcessor.java │ │ │ │ │ │ ├── InviteRequestProcessor.java │ │ │ │ │ │ ├── NotifyRequestForCatalogProcessor.java │ │ │ │ │ │ ├── NotifyRequestForMobilePositionProcessor.java │ │ │ │ │ │ ├── NotifyRequestProcessor.java │ │ │ │ │ │ ├── RegisterRequestProcessor.java │ │ │ │ │ │ ├── SubscribeRequestProcessor.java │ │ │ │ │ │ ├── info │ │ │ │ │ │ └── InfoRequestProcessor.java │ │ │ │ │ │ └── message │ │ │ │ │ │ ├── IMessageHandler.java │ │ │ │ │ │ ├── MessageHandlerAbstract.java │ │ │ │ │ │ ├── MessageRequestProcessor.java │ │ │ │ │ │ ├── control │ │ │ │ │ │ ├── ControlMessageHandler.java │ │ │ │ │ │ └── cmd │ │ │ │ │ │ │ └── DeviceControlQueryMessageHandler.java │ │ │ │ │ │ ├── notify │ │ │ │ │ │ ├── NotifyMessageHandler.java │ │ │ │ │ │ └── cmd │ │ │ │ │ │ │ ├── AlarmNotifyMessageHandler.java │ │ │ │ │ │ │ ├── BroadcastNotifyMessageHandler.java │ │ │ │ │ │ │ ├── KeepaliveNotifyMessageHandler.java │ │ │ │ │ │ │ ├── MediaStatusNotifyMessageHandler.java │ │ │ │ │ │ │ └── MobilePositionNotifyMessageHandler.java │ │ │ │ │ │ ├── query │ │ │ │ │ │ ├── QueryMessageHandler.java │ │ │ │ │ │ └── cmd │ │ │ │ │ │ │ ├── AlarmQueryMessageHandler.java │ │ │ │ │ │ │ ├── CatalogQueryMessageHandler.java │ │ │ │ │ │ │ ├── DeviceInfoQueryMessageHandler.java │ │ │ │ │ │ │ ├── DeviceStatusQueryMessageHandler.java │ │ │ │ │ │ │ └── RecordInfoQueryMessageHandler.java │ │ │ │ │ │ └── response │ │ │ │ │ │ ├── ResponseMessageHandler.java │ │ │ │ │ │ └── cmd │ │ │ │ │ │ ├── AlarmResponseMessageHandler.java │ │ │ │ │ │ ├── BroadcastResponseMessageHandler.java │ │ │ │ │ │ ├── CatalogResponseMessageHandler.java │ │ │ │ │ │ ├── ConfigDownloadResponseMessageHandler.java │ │ │ │ │ │ ├── DeviceInfoResponseMessageHandler.java │ │ │ │ │ │ ├── DeviceStatusResponseMessageHandler.java │ │ │ │ │ │ ├── MobilePositionResponseMessageHandler.java │ │ │ │ │ │ ├── PresetQueryResponseMessageHandler.java │ │ │ │ │ │ └── RecordInfoResponseMessageHandler.java │ │ │ │ │ └── response │ │ │ │ │ ├── ISIPResponseProcessor.java │ │ │ │ │ ├── SIPResponseProcessorAbstract.java │ │ │ │ │ └── impl │ │ │ │ │ ├── ByeResponseProcessor.java │ │ │ │ │ ├── CancelResponseProcessor.java │ │ │ │ │ ├── InviteResponseProcessor.java │ │ │ │ │ └── RegisterResponseProcessor.java │ │ │ └── utils │ │ │ │ ├── Coordtransform.java │ │ │ │ ├── MessageElement.java │ │ │ │ ├── MessageElementForCatalog.java │ │ │ │ ├── NumericUtil.java │ │ │ │ ├── SipUtils.java │ │ │ │ └── XmlUtil.java │ │ │ ├── jt1078 │ │ │ ├── annotation │ │ │ │ └── MsgId.java │ │ │ ├── cmd │ │ │ │ └── JT1078Template.java │ │ │ ├── codec │ │ │ │ ├── decode │ │ │ │ │ └── Jt808Decoder.java │ │ │ │ ├── encode │ │ │ │ │ ├── Jt808Encoder.java │ │ │ │ │ └── Jt808EncoderCmd.java │ │ │ │ └── netty │ │ │ │ │ ├── Jt808Handler.java │ │ │ │ │ └── TcpServer.java │ │ │ ├── config │ │ │ │ ├── JT1078AutoConfiguration.java │ │ │ │ └── JT1078Controller.java │ │ │ ├── proc │ │ │ │ ├── Header.java │ │ │ │ ├── entity │ │ │ │ │ └── Cmd.java │ │ │ │ ├── factory │ │ │ │ │ └── CodecFactory.java │ │ │ │ ├── request │ │ │ │ │ ├── J0001.java │ │ │ │ │ ├── J0002.java │ │ │ │ │ ├── J0004.java │ │ │ │ │ ├── J0100.java │ │ │ │ │ ├── J0102.java │ │ │ │ │ ├── J0200.java │ │ │ │ │ ├── J1205.java │ │ │ │ │ └── Re.java │ │ │ │ └── response │ │ │ │ │ ├── J8001.java │ │ │ │ │ ├── J8100.java │ │ │ │ │ ├── J9101.java │ │ │ │ │ ├── J9102.java │ │ │ │ │ ├── J9201.java │ │ │ │ │ ├── J9202.java │ │ │ │ │ ├── J9205.java │ │ │ │ │ └── Rs.java │ │ │ ├── session │ │ │ │ ├── Session.java │ │ │ │ └── SessionManager.java │ │ │ └── util │ │ │ │ ├── Bin.java │ │ │ │ └── ClassUtil.java │ │ │ ├── media │ │ │ ├── MediaServerConfig.java │ │ │ ├── bean │ │ │ │ ├── MediaInfo.java │ │ │ │ ├── MediaServer.java │ │ │ │ ├── RecordInfo.java │ │ │ │ └── ResultForOnPublish.java │ │ │ ├── event │ │ │ │ ├── hook │ │ │ │ │ ├── Hook.java │ │ │ │ │ ├── HookData.java │ │ │ │ │ ├── HookSubscribe.java │ │ │ │ │ └── HookType.java │ │ │ │ ├── media │ │ │ │ │ ├── MediaArrivalEvent.java │ │ │ │ │ ├── MediaDepartureEvent.java │ │ │ │ │ ├── MediaEvent.java │ │ │ │ │ ├── MediaNotFoundEvent.java │ │ │ │ │ ├── MediaPublishEvent.java │ │ │ │ │ ├── MediaRecordMp4Event.java │ │ │ │ │ └── MediaRtpServerTimeoutEvent.java │ │ │ │ └── mediaServer │ │ │ │ │ ├── MediaSendRtpStoppedEvent.java │ │ │ │ │ ├── MediaServerChangeEvent.java │ │ │ │ │ ├── MediaServerDeleteEvent.java │ │ │ │ │ ├── MediaServerEventAbstract.java │ │ │ │ │ ├── MediaServerOfflineEvent.java │ │ │ │ │ ├── MediaServerOnlineEvent.java │ │ │ │ │ └── MediaServerStatusEventListener.java │ │ │ ├── service │ │ │ │ ├── IMediaNodeServerService.java │ │ │ │ ├── IMediaServerService.java │ │ │ │ └── impl │ │ │ │ │ └── MediaServerServiceImpl.java │ │ │ └── zlm │ │ │ │ ├── AssistRESTfulUtils.java │ │ │ │ ├── ZLMHttpHookListener.java │ │ │ │ ├── ZLMMediaNodeServerService.java │ │ │ │ ├── ZLMMediaServerStatusManager.java │ │ │ │ ├── ZLMRESTfulUtils.java │ │ │ │ ├── ZLMServerFactory.java │ │ │ │ ├── dto │ │ │ │ ├── ChannelOnlineEvent.java │ │ │ │ ├── ServerKeepaliveData.java │ │ │ │ ├── StreamAuthorityInfo.java │ │ │ │ ├── ZLMRunInfo.java │ │ │ │ ├── ZLMServerConfig.java │ │ │ │ └── hook │ │ │ │ │ ├── HookParam.java │ │ │ │ │ ├── HookResult.java │ │ │ │ │ ├── HookResultForOnPublish.java │ │ │ │ │ ├── OnPlayHookParam.java │ │ │ │ │ ├── OnPublishHookParam.java │ │ │ │ │ ├── OnRecordMp4HookParam.java │ │ │ │ │ ├── OnRtpServerTimeoutHookParam.java │ │ │ │ │ ├── OnSendRtpStoppedHookParam.java │ │ │ │ │ ├── OnServerKeepaliveHookParam.java │ │ │ │ │ ├── OnStreamChangedHookParam.java │ │ │ │ │ ├── OnStreamNoneReaderHookParam.java │ │ │ │ │ ├── OnStreamNotFoundHookParam.java │ │ │ │ │ └── OriginType.java │ │ │ │ └── event │ │ │ │ ├── HookZlmServerKeepaliveEvent.java │ │ │ │ └── HookZlmServerStartEvent.java │ │ │ ├── service │ │ │ ├── ICloudRecordService.java │ │ │ ├── ILogService.java │ │ │ ├── IMediaService.java │ │ │ ├── IMobilePositionService.java │ │ │ ├── IReceiveRtpServerService.java │ │ │ ├── IRecordPlanService.java │ │ │ ├── IRoleService.java │ │ │ ├── ISendRtpServerService.java │ │ │ ├── IUserApiKeyService.java │ │ │ ├── IUserService.java │ │ │ ├── bean │ │ │ │ ├── CloudRecordItem.java │ │ │ │ ├── DownloadFileInfo.java │ │ │ │ ├── ErrorCallback.java │ │ │ │ ├── GPSMsgInfo.java │ │ │ │ ├── InviteErrorCode.java │ │ │ │ ├── InviteTimeOutCallback.java │ │ │ │ ├── LogFileInfo.java │ │ │ │ ├── MediaServerLoad.java │ │ │ │ ├── MessageForPushChannel.java │ │ │ │ ├── MessageForPushChannelResponse.java │ │ │ │ ├── PlayBackCallback.java │ │ │ │ ├── PlayBackResult.java │ │ │ │ ├── PushStreamStatusChangeFromRedisDto.java │ │ │ │ ├── RTPServerParam.java │ │ │ │ ├── RecordPlan.java │ │ │ │ ├── RecordPlanItem.java │ │ │ │ ├── RequestPushStreamMsg.java │ │ │ │ ├── RequestSendItemMsg.java │ │ │ │ ├── RequestStopPushStreamMsg.java │ │ │ │ ├── ResponseSendItemMsg.java │ │ │ │ ├── SSRCInfo.java │ │ │ │ ├── StreamPushItemFromRedis.java │ │ │ │ ├── ThirdPartyGB.java │ │ │ │ ├── WvpRedisMsg.java │ │ │ │ └── WvpRedisMsgCmd.java │ │ │ ├── impl │ │ │ │ ├── CloudRecordServiceImpl.java │ │ │ │ ├── LogServiceImpl.java │ │ │ │ ├── MediaServiceImpl.java │ │ │ │ ├── MobilePositionServiceImpl.java │ │ │ │ ├── RecordPlanServiceImpl.java │ │ │ │ ├── RoleServerImpl.java │ │ │ │ ├── RtpServerServiceImpl.java │ │ │ │ ├── SendRtpServerServiceImpl.java │ │ │ │ ├── UserApiKeyServiceImpl.java │ │ │ │ └── UserServiceImpl.java │ │ │ └── redisMsg │ │ │ │ ├── IRedisRpcPlayService.java │ │ │ │ ├── IRedisRpcService.java │ │ │ │ ├── RedisAlarmMsgListener.java │ │ │ │ ├── RedisCloseStreamMsgListener.java │ │ │ │ ├── RedisGpsMsgListener.java │ │ │ │ ├── RedisPushStreamListMsgListener.java │ │ │ │ ├── RedisPushStreamResponseListener.java │ │ │ │ ├── RedisPushStreamStatusMsgListener.java │ │ │ │ ├── control │ │ │ │ ├── RedisRpcChannelPlayController.java │ │ │ │ ├── RedisRpcCloudRecordController.java │ │ │ │ ├── RedisRpcDeviceController.java │ │ │ │ ├── RedisRpcDevicePlayController.java │ │ │ │ ├── RedisRpcGbDeviceController.java │ │ │ │ ├── RedisRpcPlatformController.java │ │ │ │ ├── RedisRpcSendRtpController.java │ │ │ │ ├── RedisRpcStreamProxyController.java │ │ │ │ └── RedisRpcStreamPushController.java │ │ │ │ ├── dto │ │ │ │ ├── RedisRpcController.java │ │ │ │ ├── RedisRpcMapping.java │ │ │ │ └── RpcController.java │ │ │ │ └── service │ │ │ │ ├── RedisRpcPlayServiceImpl.java │ │ │ │ └── RedisRpcServiceImpl.java │ │ │ ├── storager │ │ │ ├── IRedisCatchStorage.java │ │ │ ├── dao │ │ │ │ ├── CloudRecordServiceMapper.java │ │ │ │ ├── MediaServerMapper.java │ │ │ │ ├── RecordPlanMapper.java │ │ │ │ ├── RoleMapper.java │ │ │ │ ├── UserApiKeyMapper.java │ │ │ │ ├── UserMapper.java │ │ │ │ └── dto │ │ │ │ │ ├── ChannelSourceInfo.java │ │ │ │ │ ├── LogDto.java │ │ │ │ │ ├── PlatformRegisterInfo.java │ │ │ │ │ ├── RecordInfo.java │ │ │ │ │ ├── Role.java │ │ │ │ │ ├── User.java │ │ │ │ │ └── UserApiKey.java │ │ │ └── impl │ │ │ │ └── RedisCatchStorageImpl.java │ │ │ ├── streamProxy │ │ │ ├── bean │ │ │ │ ├── StreamProxy.java │ │ │ │ └── StreamProxyParam.java │ │ │ ├── controller │ │ │ │ └── StreamProxyController.java │ │ │ ├── dao │ │ │ │ ├── StreamProxyMapper.java │ │ │ │ └── provider │ │ │ │ │ └── StreamProxyProvider.java │ │ │ └── service │ │ │ │ ├── IStreamProxyPlayService.java │ │ │ │ ├── IStreamProxyService.java │ │ │ │ └── impl │ │ │ │ ├── StreamProxyPlayServiceImpl.java │ │ │ │ └── StreamProxyServiceImpl.java │ │ │ ├── streamPush │ │ │ ├── bean │ │ │ │ ├── BatchRemoveParam.java │ │ │ │ ├── RedisPushStreamMessage.java │ │ │ │ ├── StreamPush.java │ │ │ │ └── StreamPushExcelDto.java │ │ │ ├── controller │ │ │ │ └── StreamPushController.java │ │ │ ├── dao │ │ │ │ └── StreamPushMapper.java │ │ │ ├── enent │ │ │ │ └── StreamPushUploadFileHandler.java │ │ │ └── service │ │ │ │ ├── IStreamPushPlayService.java │ │ │ │ ├── IStreamPushService.java │ │ │ │ └── impl │ │ │ │ ├── StreamPushPlayServiceImpl.java │ │ │ │ └── StreamPushServiceImpl.java │ │ │ ├── utils │ │ │ ├── CivilCodeUtil.java │ │ │ ├── CloudRecordUtils.java │ │ │ ├── Coordtransform.java │ │ │ ├── DateUtil.java │ │ │ ├── GitUtil.java │ │ │ ├── GpsUtil.java │ │ │ ├── JsonUtil.java │ │ │ ├── MediaServerUtils.java │ │ │ ├── SSLSocketClientUtil.java │ │ │ ├── SpringBeanFactory.java │ │ │ ├── SystemInfoUtils.java │ │ │ ├── UJson.java │ │ │ └── redis │ │ │ │ ├── FastJsonRedisSerializer.java │ │ │ │ ├── RedisUtil.java │ │ │ │ └── RedisUtil2.java │ │ │ ├── vmanager │ │ │ ├── TestController.java │ │ │ ├── bean │ │ │ │ ├── AudioBroadcastResult.java │ │ │ │ ├── BatchGBStreamParam.java │ │ │ │ ├── DeferredResultEx.java │ │ │ │ ├── DeferredResultFilter.java │ │ │ │ ├── ErrorCode.java │ │ │ │ ├── OtherPsSendInfo.java │ │ │ │ ├── OtherRtpSendInfo.java │ │ │ │ ├── PlayTypeEnum.java │ │ │ │ ├── RecordFile.java │ │ │ │ ├── ResourceBaseInfo.java │ │ │ │ ├── ResourceInfo.java │ │ │ │ ├── SnapPath.java │ │ │ │ ├── StreamContent.java │ │ │ │ ├── SystemConfigInfo.java │ │ │ │ ├── TablePageInfo.java │ │ │ │ └── WVPResult.java │ │ │ ├── cloudRecord │ │ │ │ ├── CloudRecordController.java │ │ │ │ └── bean │ │ │ │ │ └── CloudRecordUrl.java │ │ │ ├── log │ │ │ │ └── LogController.java │ │ │ ├── ps │ │ │ │ └── PsController.java │ │ │ ├── recordPlan │ │ │ │ ├── RecordPlanController.java │ │ │ │ └── bean │ │ │ │ │ └── RecordPlanParam.java │ │ │ ├── rtp │ │ │ │ └── RtpController.java │ │ │ ├── server │ │ │ │ └── ServerController.java │ │ │ └── user │ │ │ │ ├── RoleController.java │ │ │ │ ├── UserApiKeyController.java │ │ │ │ └── UserController.java │ │ │ └── web │ │ │ └── gb28181 │ │ │ ├── ApiControlController.java │ │ │ ├── ApiController.java │ │ │ ├── ApiDeviceController.java │ │ │ ├── ApiStreamController.java │ │ │ ├── AuthController.java │ │ │ └── dto │ │ │ └── DeviceChannelExtend.java │ └── resources │ │ ├── application-dev.yml │ │ ├── application-docker.yml │ │ ├── application.yml │ │ ├── banner.txt │ │ ├── civilCode.csv │ │ ├── index.html │ │ ├── install.sh │ │ ├── jwk.json │ │ ├── local.jks │ │ ├── logback-spring.xml │ │ └── 配置详情.yml └── test │ └── java │ └── com │ └── genersoft │ └── iot │ └── vmp │ └── jt1078 │ └── JT1078ServerTest.java ├── web ├── .editorconfig ├── .env.development ├── .env.production ├── .env.staging ├── .eslintignore ├── .eslintrc.js ├── .gitignore ├── .travis.yml ├── LICENSE ├── README-zh.md ├── README.md ├── babel.config.js ├── build │ └── index.js ├── jest.config.js ├── jsconfig.json ├── mock │ ├── index.js │ ├── mock-server.js │ ├── table.js │ ├── user.js │ └── utils.js ├── package.json ├── postcss.config.js ├── public │ ├── favicon.ico │ ├── index.html │ ├── libDecoder.wasm │ └── static │ │ ├── images │ │ ├── abl-logo.jpg │ │ ├── arrow.png │ │ ├── bg13.png │ │ ├── bg14.png │ │ ├── bg17.png │ │ ├── bg18.png │ │ ├── bg19.png │ │ ├── gis │ │ │ ├── camera-offline.png │ │ │ ├── camera.png │ │ │ ├── camera1-offline.png │ │ │ ├── camera1.png │ │ │ ├── camera2-offline.png │ │ │ ├── camera2.png │ │ │ ├── camera3-offline.png │ │ │ └── camera3.png │ │ └── zlm-logo.png │ │ └── js │ │ ├── ZLMRTCClient.js │ │ ├── config.js │ │ ├── h265web │ │ ├── h265webjs-v20221106.js │ │ ├── index.d.ts │ │ ├── index.js │ │ ├── missile-v20221120.wasm │ │ └── missile.js │ │ └── jessibuca │ │ ├── decoder.js │ │ ├── decoder.wasm │ │ ├── jessibuca.d.ts │ │ └── jessibuca.js ├── src │ ├── App.vue │ ├── api │ │ ├── cloudRecord.js │ │ ├── commonChannel.js │ │ ├── device.js │ │ ├── frontEnd.js │ │ ├── gbRecord.js │ │ ├── group.js │ │ ├── log.js │ │ ├── platform.js │ │ ├── play.js │ │ ├── playback.js │ │ ├── recordPlan.js │ │ ├── region.js │ │ ├── role.js │ │ ├── server.js │ │ ├── streamProxy.js │ │ ├── streamPush.js │ │ ├── table.js │ │ ├── user.js │ │ └── userApiKey.js │ ├── assets │ │ ├── 404_images │ │ │ ├── 404.png │ │ │ └── 404_cloud.png │ │ ├── abl-logo.jpg │ │ ├── bg.jpg │ │ ├── icons.png │ │ ├── loading.png │ │ ├── login-bg.jpg │ │ ├── login-cloud.png │ │ ├── logo.png │ │ ├── play.png │ │ └── zlm-logo.png │ ├── components │ │ ├── Breadcrumb │ │ │ └── index.vue │ │ ├── Hamburger │ │ │ └── index.vue │ │ └── SvgIcon │ │ │ └── index.vue │ ├── directive │ │ └── el-drag-dialog │ │ │ ├── drag.js │ │ │ └── index.js │ ├── icons │ │ ├── index.js │ │ ├── svg │ │ │ ├── channelManger.svg │ │ │ ├── cloudRecord.svg │ │ │ ├── dashboard.svg │ │ │ ├── device.svg │ │ │ ├── example.svg │ │ │ ├── eye-open.svg │ │ │ ├── eye.svg │ │ │ ├── form.svg │ │ │ ├── group.svg │ │ │ ├── historyLog.svg │ │ │ ├── link.svg │ │ │ ├── live.svg │ │ │ ├── mediaServerList.svg │ │ │ ├── nested.svg │ │ │ ├── operations.svg │ │ │ ├── password.svg │ │ │ ├── platform.svg │ │ │ ├── realLog.svg │ │ │ ├── recordPlan.svg │ │ │ ├── region.svg │ │ │ ├── setting.svg │ │ │ ├── streamProxy.svg │ │ │ ├── streamPush.svg │ │ │ ├── systemInfo.svg │ │ │ ├── table.svg │ │ │ ├── tree.svg │ │ │ └── user.svg │ │ └── svgo.yml │ ├── layout │ │ ├── components │ │ │ ├── AppMain.vue │ │ │ ├── Navbar.vue │ │ │ ├── Sidebar │ │ │ │ ├── FixiOSBug.js │ │ │ │ ├── Item.vue │ │ │ │ ├── Link.vue │ │ │ │ ├── Logo.vue │ │ │ │ ├── SidebarItem.vue │ │ │ │ └── index.vue │ │ │ ├── TagsView │ │ │ │ ├── ScrollPane.vue │ │ │ │ └── index.vue │ │ │ ├── dialog │ │ │ │ └── changePassword.vue │ │ │ └── index.js │ │ ├── index.vue │ │ └── mixin │ │ │ └── ResizeHandler.js │ ├── main.js │ ├── permission.js │ ├── router │ │ └── index.js │ ├── settings.js │ ├── store │ │ ├── getters.js │ │ ├── index.js │ │ └── modules │ │ │ ├── app.js │ │ │ ├── cloudRecord.js │ │ │ ├── commonChanel.js │ │ │ ├── device.js │ │ │ ├── frontEnd.js │ │ │ ├── gbRecord.js │ │ │ ├── group.js │ │ │ ├── log.js │ │ │ ├── platform.js │ │ │ ├── play.js │ │ │ ├── playback.js │ │ │ ├── recordPlan.js │ │ │ ├── region.js │ │ │ ├── role.js │ │ │ ├── server.js │ │ │ ├── settings.js │ │ │ ├── streamProxy.js │ │ │ ├── streamPush.js │ │ │ ├── tagsView.js │ │ │ ├── user.js │ │ │ └── userApiKeys.js │ ├── styles │ │ ├── element-ui.scss │ │ ├── iconfont.scss │ │ ├── iconfont.woff2 │ │ ├── index.scss │ │ ├── mixin.scss │ │ ├── sidebar.scss │ │ ├── transition.scss │ │ └── variables.scss │ ├── utils │ │ ├── auth.js │ │ ├── get-page-title.js │ │ ├── index.js │ │ ├── request.js │ │ └── validate.js │ └── views │ │ ├── 404.vue │ │ ├── channel │ │ ├── group │ │ │ └── index.vue │ │ └── region │ │ │ └── index.vue │ │ ├── cloudRecord │ │ ├── detail.vue │ │ └── index.vue │ │ ├── common │ │ ├── CommonChannelEdit.vue │ │ ├── DeviceTree.vue │ │ ├── GroupTree.vue │ │ ├── MapComponent.vue │ │ ├── RegionTree.vue │ │ ├── VideoTimeLine │ │ │ ├── WindowListItem.vue │ │ │ ├── constant.js │ │ │ └── index.vue │ │ ├── h265web.vue │ │ ├── jessibuca.vue │ │ ├── mediaInfo.vue │ │ ├── ptzCruising.vue │ │ ├── ptzPreset.vue │ │ ├── ptzScan.vue │ │ ├── ptzSwitch.vue │ │ ├── ptzWiper.vue │ │ ├── rtcPlayer.vue │ │ └── weekTimePicker.vue │ │ ├── dashboard │ │ ├── console │ │ │ ├── ConsoleCPU.vue │ │ │ ├── ConsoleDisk.vue │ │ │ ├── ConsoleMEM.vue │ │ │ ├── ConsoleMediaServer.vue │ │ │ ├── ConsoleNet.vue │ │ │ ├── ConsoleNodeLoad.vue │ │ │ └── ConsoleResource.vue │ │ └── index.vue │ │ ├── device │ │ ├── channel │ │ │ ├── edit.vue │ │ │ ├── index.vue │ │ │ └── record.vue │ │ ├── index.vue │ │ └── list.vue │ │ ├── dialog │ │ ├── GbChannelSelect.vue │ │ ├── GbDeviceSelect.vue │ │ ├── MediaServerEdit.vue │ │ ├── SyncChannelProgress.vue │ │ ├── UnusualGroupChannelSelect.vue │ │ ├── UnusualRegionChannelSelect.vue │ │ ├── addUser.vue │ │ ├── addUserApiKey.vue │ │ ├── catalogEdit.vue │ │ ├── changePasswordForAdmin.vue │ │ ├── changePushKey.vue │ │ ├── channelCode.vue │ │ ├── channelMapInfobox.vue │ │ ├── chooseCivilCode.vue │ │ ├── chooseGroup.vue │ │ ├── chooseTimeRange.vue │ │ ├── configInfo.vue │ │ ├── deviceEdit.vue │ │ ├── devicePlayer.vue │ │ ├── editRecordPlan.vue │ │ ├── groupEdit.vue │ │ ├── importChannel.vue │ │ ├── importChannelShowErrorData.vue │ │ ├── linkChannelRecord.vue │ │ ├── pushStreamEdit.vue │ │ ├── queryTrace.vue │ │ ├── recordDownload.vue │ │ ├── regionCode.vue │ │ ├── regionEdit.vue │ │ ├── remarkUserApiKey.vue │ │ ├── shareChannel.vue │ │ └── shareChannelAdd.vue │ │ ├── form │ │ └── index.vue │ │ ├── live │ │ └── index.vue │ │ ├── login │ │ └── index.vue │ │ ├── mediaServer │ │ └── index.vue │ │ ├── operations │ │ ├── historyLog.vue │ │ ├── realLog.vue │ │ ├── showLog.vue │ │ └── systemInfo.vue │ │ ├── platform │ │ ├── edit.vue │ │ └── index.vue │ │ ├── recordPlan │ │ └── index.vue │ │ ├── streamProxy │ │ ├── edit.vue │ │ └── index.vue │ │ ├── streamPush │ │ ├── edit.vue │ │ └── index.vue │ │ └── user │ │ ├── apiKeyManager.vue │ │ └── index.vue ├── tests │ └── unit │ │ ├── .eslintrc.js │ │ ├── components │ │ ├── Breadcrumb.spec.js │ │ ├── Hamburger.spec.js │ │ └── SvgIcon.spec.js │ │ └── utils │ │ ├── formatTime.spec.js │ │ ├── param2Obj.spec.js │ │ ├── parseTime.spec.js │ │ └── validate.spec.js └── vue.config.js ├── web_src ├── .babelrc ├── .editorconfig ├── .gitignore ├── .postcssrc.js ├── README.md ├── build │ ├── build.js │ ├── check-versions.js │ ├── logo.png │ ├── utils.js │ ├── vue-loader.conf.js │ ├── webpack.base.conf.js │ ├── webpack.dev.conf.js │ └── webpack.prod.conf.js ├── config │ ├── dev.env.js │ ├── index.js │ └── prod.env.js ├── index.html ├── package.json ├── src │ ├── App.vue │ ├── assets │ │ ├── icons.png │ │ ├── loading.png │ │ ├── login-bg.jpg │ │ ├── login-cloud.png │ │ ├── logo.png │ │ ├── play.png │ │ └── zlm-log.png │ ├── components │ │ ├── ChannelEdit.vue │ │ ├── CloudRecord.vue │ │ ├── CloudRecordDetail.vue │ │ ├── DeviceList.vue │ │ ├── GBRecordDetail.vue │ │ ├── GeoConvertTools.js │ │ ├── Login.vue │ │ ├── MediaServerManger.vue │ │ ├── PlatformEdit.vue │ │ ├── PlatformList.vue │ │ ├── RecordPLan.vue │ │ ├── StreamProxyEdit.vue │ │ ├── StreamProxyList.vue │ │ ├── StreamPushEdit.vue │ │ ├── StreamPushList.vue │ │ ├── UserApiKeyManager.vue │ │ ├── UserManager.vue │ │ ├── channelList.vue │ │ ├── common │ │ │ ├── CommonChannelEdit.vue │ │ │ ├── DeviceTree.vue │ │ │ ├── GroupTree.vue │ │ │ ├── MapComponent.vue │ │ │ ├── RegionTree.vue │ │ │ ├── easyPlayer.vue │ │ │ ├── h265web.vue │ │ │ ├── jessibuca.vue │ │ │ ├── mediaInfo.vue │ │ │ ├── ptzCruising.vue │ │ │ ├── ptzPreset.vue │ │ │ ├── ptzScan.vue │ │ │ ├── ptzSwitch.vue │ │ │ └── ptzWiper.vue │ │ ├── console.vue │ │ ├── console │ │ │ ├── ConsoleCPU.vue │ │ │ ├── ConsoleDisk.vue │ │ │ ├── ConsoleMEM.vue │ │ │ ├── ConsoleMediaServer.vue │ │ │ ├── ConsoleNet.vue │ │ │ ├── ConsoleNodeLoad.vue │ │ │ └── ConsoleResource.vue │ │ ├── dialog │ │ │ ├── GbChannelSelect.vue │ │ │ ├── GbDeviceSelect.vue │ │ │ ├── MediaServerEdit.vue │ │ │ ├── StreamProxyEdit.vue │ │ │ ├── SyncChannelProgress.vue │ │ │ ├── UnusualGroupChannelSelect.vue │ │ │ ├── UnusualRegionChannelSelect.vue │ │ │ ├── addUser.vue │ │ │ ├── addUserApiKey.vue │ │ │ ├── catalogEdit.vue │ │ │ ├── changePassword.vue │ │ │ ├── changePasswordForAdmin.vue │ │ │ ├── changePushKey.vue │ │ │ ├── channelCode.vue │ │ │ ├── channelMapInfobox.vue │ │ │ ├── chooseCivilCode.vue │ │ │ ├── chooseGroup.vue │ │ │ ├── configInfo.vue │ │ │ ├── deviceEdit.vue │ │ │ ├── devicePlayer.vue │ │ │ ├── editRecordPlan.vue │ │ │ ├── groupEdit.vue │ │ │ ├── importChannel.vue │ │ │ ├── importChannelShowErrorData.vue │ │ │ ├── linkChannelRecord.vue │ │ │ ├── onvifEdit.vue │ │ │ ├── operationsFoShowLog.vue │ │ │ ├── pushStreamEdit.vue │ │ │ ├── queryTrace.vue │ │ │ ├── recordDownload.vue │ │ │ ├── regionCode.vue │ │ │ ├── regionEdit.vue │ │ │ ├── remarkUserApiKey.vue │ │ │ ├── rtcPlayer.vue │ │ │ ├── shareChannel.vue │ │ │ └── shareChannelAdd.vue │ │ ├── group.vue │ │ ├── live.vue │ │ ├── map.vue │ │ ├── operations.vue │ │ ├── operationsForHistoryLog.vue │ │ ├── operationsForRealLog.vue │ │ ├── operationsForSystemInfo.vue │ │ ├── region.vue │ │ ├── service │ │ │ ├── DeviceService.js │ │ │ ├── MediaServer.js │ │ │ └── UserService.js │ │ └── setting │ │ │ ├── Media.vue │ │ │ ├── Sip.vue │ │ │ └── Web.vue │ ├── layout │ │ ├── UiHeader.vue │ │ └── index.vue │ ├── main.js │ └── router │ │ └── index.js └── static │ ├── .gitkeep │ ├── EasyPlayer.swf │ ├── css │ ├── iconfont.css │ ├── iconfont.woff2 │ └── login.css │ ├── favicon.ico │ ├── file │ └── 推流通道导入.zip │ ├── fonts │ └── poppins │ │ ├── Poppins-Bold.ttf │ │ ├── Poppins-Medium.ttf │ │ ├── Poppins-Regular.ttf │ │ └── Poppins-SemiBold.ttf │ ├── images │ ├── abl-logo.jpg │ ├── arrow.png │ ├── gis │ │ ├── camera-offline.png │ │ ├── camera.png │ │ ├── camera1-offline.png │ │ ├── camera1.png │ │ ├── camera2-offline.png │ │ ├── camera2.png │ │ ├── camera3-offline.png │ │ └── camera3.png │ └── zlm-logo.png │ ├── js │ ├── EasyWasmPlayer.js │ ├── ZLMRTCClient.js │ ├── ZLMRTCClient.js.map │ ├── config.js │ ├── h265web │ │ ├── h265webjs-v20221106.js │ │ ├── index.d.ts │ │ ├── index.js │ │ ├── missile-v20221120.wasm │ │ └── missile.js │ └── jessibuca │ │ ├── decoder.js │ │ ├── decoder.wasm │ │ ├── jessibuca.d.ts │ │ └── jessibuca.js │ ├── libDecoder.wasm │ └── logo.png ├── zlm.md ├── 打包 └── config │ └── config.ini └── 数据库 ├── 2.6.9 ├── 初始化-mysql-2.6.9.sql ├── 初始化-postgresql-kingbase-2.6.9.sql ├── 更新-mysql-2.6.9.sql └── 更新-postgresql-kingbase-2.6.9.sql ├── 2.7.0 ├── 初始化-mysql-2.7.0.sql ├── 初始化-postgresql-kingbase-2.7.0.sql ├── 更新-mysql-2.7.0.sql └── 更新-postgresql-kingbase-2.7.0.sql ├── 2.7.1 ├── 初始化-mysql-2.7.1.sql ├── 初始化-postgresql-kingbase-2.7.1.sql ├── 更新-mysql-2.7.1.sql └── 更新-postgresql-kingbase-2.7.1.sql ├── 2.7.3 ├── 初始化-mysql-2.7.3.sql ├── 初始化-postgresql-kingbase-2.7.3.sql ├── 更新-mysql-2.7.1升级到2.7.3.sql ├── 更新-mysql-2.7.3.sql ├── 更新-postgresql-kingbase-2.7.1升级到2.7.3.sql └── 更新-postgresql-kingbase-2.7.3.sql ├── 2.7.4 ├── 初始化-mysql-2.7.4.sql └── 初始化-postgresql-kingbase-2.7.4.sql └── old ├── 2.6.6-2.6.7更新.sql ├── 2.6.8升级2.6.9.sql ├── 2.6.8补丁更新.sql └── clean.sql /.github/ISSUE_TEMPLATE/bug.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: "[ BUG ] " 3 | about: 关于wvp的bug,与zlm有关的建议直接在zlm的issue中提问 4 | title: 'BUG' 5 | labels: 'wvp的bug' 6 | assignees: '' 7 | 8 | --- 9 | 10 | **环境信息:** 11 | 12 | - 1. 部署方式 wvp-pro docker / zlm(docker) + 编译wvp-pro/ wvp-prp + zlm都是编译部署/ 13 | - 2. 部署环境 windows / ubuntu/ centos ... 14 | - 3. 端口开放情况 15 | - 4. 是否是公网部署 16 | - 5. 是否使用https 17 | - 6. 接入设备/平台品牌 18 | - 7. 你做过哪些尝试 19 | - 8. 代码更新时间 20 | - 9. 是否是4G设备接入 21 | 22 | **描述错误** 23 | 描述下您遇到的问题 24 | 25 | **如何复现** 26 | 有明确复现步骤的问题会很容易被解决 27 | 28 | **截图** 29 | 30 | **抓包文件** 31 | 32 | **日志** 33 | ``` 34 | 日志内容放这里, 文件的话请直接上传 35 | ``` 36 | 37 | 38 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/new.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: "[ 新功能 ]" 3 | about: 新功能 4 | title: '希望wVP实现的新功能,此功能应与你的具体业务无关' 5 | labels: '' 6 | assignees: '' 7 | 8 | --- 9 | 10 | **项目的详细需求** 11 | 12 | **这样的实现什么作用** 13 | 14 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/solve.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: "[ 技术咨询 ] " 3 | about: 对于使用中遇到问题 4 | title: '技术咨询' 5 | labels: '技术咨询' 6 | assignees: '' 7 | 8 | --- 9 | 10 | **环境信息:** 11 | 12 | - 1. 部署方式 wvp-pro docker / zlm(docker) + 编译wvp-pro/ wvp-prp + zlm都是编译部署/ 13 | - 2. 部署环境 windows / ubuntu/ centos ... 14 | - 3. 端口开放情况 15 | - 4. 是否是公网部署 16 | - 5. 是否使用https 17 | - 6. 方便的话提供下使用的设备品牌或平台 18 | - 7. 你做过哪些尝试 19 | - 8. 代码更新时间(旧版本请更新最新版本代码测试) 20 | 21 | 22 | **内容描述:** 23 | 24 | **截图** 25 | 26 | **抓包文件** 27 | 28 | **日志** 29 | ``` 30 | 日志内容放这里, 文件的话请直接上传 31 | ``` 32 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Compiled class file 2 | *.class 3 | 4 | # Log file 5 | *.log 6 | logs/* 7 | # BlueJ files 8 | *.ctxt 9 | 10 | # Mobile Tools for Java (J2ME) 11 | .mtj.tmp/ 12 | src/main/resources/application-*.yml 13 | # Package Files # 14 | #*.jar 15 | *.war 16 | *.nar 17 | *.ear 18 | *.zip 19 | *.tar.gz 20 | *.rar 21 | *.iml 22 | # virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml 23 | hs_err_pid* 24 | /.idea/* 25 | /target/* 26 | /.idea/ 27 | /target/ 28 | 29 | /src/main/resources/static/ 30 | certificates 31 | -------------------------------------------------------------------------------- /.gitmodules: -------------------------------------------------------------------------------- 1 | [submodule "be.teletask.onvif-java"] 2 | path = be.teletask.onvif-java 3 | url = https://gitee.com/pan648540858/be.teletask.onvif-java.git 4 | -------------------------------------------------------------------------------- /buildPackage.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # 获取当前日期并格式化为 YYYY-MM-DD 的形式 4 | current_date=$(date +"%Y-%m-%d") 5 | 6 | mkdir -p "$current_date"/数据库 7 | 8 | cp -r ./数据库/2.7.3 "$current_date"/数据库 9 | 10 | cp src/main/resources/配置详情.yml "$current_date" 11 | cp src/main/resources/application-dev.yml "$current_date"/application.yml 12 | 13 | cp ./target/wvp-pro-*.jar "$current_date" 14 | 15 | zip -r "$current_date".zip "$current_date" 16 | 17 | rm -rf "$current_date" 18 | 19 | exit 0 20 | 21 | -------------------------------------------------------------------------------- /doc/_content/ability/_media/cascade1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/648540858/wvp-GB28181-pro/f9300d01ec37321abf11673a3fe70f04278927c5/doc/_content/ability/_media/cascade1.png -------------------------------------------------------------------------------- /doc/_content/ability/_media/cascade2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/648540858/wvp-GB28181-pro/f9300d01ec37321abf11673a3fe70f04278927c5/doc/_content/ability/_media/cascade2.png -------------------------------------------------------------------------------- /doc/_content/ability/_media/cascade3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/648540858/wvp-GB28181-pro/f9300d01ec37321abf11673a3fe70f04278927c5/doc/_content/ability/_media/cascade3.png -------------------------------------------------------------------------------- /doc/_content/ability/_media/cascade4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/648540858/wvp-GB28181-pro/f9300d01ec37321abf11673a3fe70f04278927c5/doc/_content/ability/_media/cascade4.png -------------------------------------------------------------------------------- /doc/_content/ability/_media/img.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/648540858/wvp-GB28181-pro/f9300d01ec37321abf11673a3fe70f04278927c5/doc/_content/ability/_media/img.png -------------------------------------------------------------------------------- /doc/_content/ability/_media/img_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/648540858/wvp-GB28181-pro/f9300d01ec37321abf11673a3fe70f04278927c5/doc/_content/ability/_media/img_1.png -------------------------------------------------------------------------------- /doc/_content/ability/_media/img_10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/648540858/wvp-GB28181-pro/f9300d01ec37321abf11673a3fe70f04278927c5/doc/_content/ability/_media/img_10.png -------------------------------------------------------------------------------- /doc/_content/ability/_media/img_11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/648540858/wvp-GB28181-pro/f9300d01ec37321abf11673a3fe70f04278927c5/doc/_content/ability/_media/img_11.png -------------------------------------------------------------------------------- /doc/_content/ability/_media/img_12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/648540858/wvp-GB28181-pro/f9300d01ec37321abf11673a3fe70f04278927c5/doc/_content/ability/_media/img_12.png -------------------------------------------------------------------------------- /doc/_content/ability/_media/img_13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/648540858/wvp-GB28181-pro/f9300d01ec37321abf11673a3fe70f04278927c5/doc/_content/ability/_media/img_13.png -------------------------------------------------------------------------------- /doc/_content/ability/_media/img_14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/648540858/wvp-GB28181-pro/f9300d01ec37321abf11673a3fe70f04278927c5/doc/_content/ability/_media/img_14.png -------------------------------------------------------------------------------- /doc/_content/ability/_media/img_15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/648540858/wvp-GB28181-pro/f9300d01ec37321abf11673a3fe70f04278927c5/doc/_content/ability/_media/img_15.png -------------------------------------------------------------------------------- /doc/_content/ability/_media/img_16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/648540858/wvp-GB28181-pro/f9300d01ec37321abf11673a3fe70f04278927c5/doc/_content/ability/_media/img_16.png -------------------------------------------------------------------------------- /doc/_content/ability/_media/img_17.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/648540858/wvp-GB28181-pro/f9300d01ec37321abf11673a3fe70f04278927c5/doc/_content/ability/_media/img_17.png -------------------------------------------------------------------------------- /doc/_content/ability/_media/img_18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/648540858/wvp-GB28181-pro/f9300d01ec37321abf11673a3fe70f04278927c5/doc/_content/ability/_media/img_18.png -------------------------------------------------------------------------------- /doc/_content/ability/_media/img_19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/648540858/wvp-GB28181-pro/f9300d01ec37321abf11673a3fe70f04278927c5/doc/_content/ability/_media/img_19.png -------------------------------------------------------------------------------- /doc/_content/ability/_media/img_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/648540858/wvp-GB28181-pro/f9300d01ec37321abf11673a3fe70f04278927c5/doc/_content/ability/_media/img_2.png -------------------------------------------------------------------------------- /doc/_content/ability/_media/img_20.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/648540858/wvp-GB28181-pro/f9300d01ec37321abf11673a3fe70f04278927c5/doc/_content/ability/_media/img_20.png -------------------------------------------------------------------------------- /doc/_content/ability/_media/img_21.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/648540858/wvp-GB28181-pro/f9300d01ec37321abf11673a3fe70f04278927c5/doc/_content/ability/_media/img_21.png -------------------------------------------------------------------------------- /doc/_content/ability/_media/img_22.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/648540858/wvp-GB28181-pro/f9300d01ec37321abf11673a3fe70f04278927c5/doc/_content/ability/_media/img_22.png -------------------------------------------------------------------------------- /doc/_content/ability/_media/img_23.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/648540858/wvp-GB28181-pro/f9300d01ec37321abf11673a3fe70f04278927c5/doc/_content/ability/_media/img_23.png -------------------------------------------------------------------------------- /doc/_content/ability/_media/img_24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/648540858/wvp-GB28181-pro/f9300d01ec37321abf11673a3fe70f04278927c5/doc/_content/ability/_media/img_24.png -------------------------------------------------------------------------------- /doc/_content/ability/_media/img_25.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/648540858/wvp-GB28181-pro/f9300d01ec37321abf11673a3fe70f04278927c5/doc/_content/ability/_media/img_25.png -------------------------------------------------------------------------------- /doc/_content/ability/_media/img_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/648540858/wvp-GB28181-pro/f9300d01ec37321abf11673a3fe70f04278927c5/doc/_content/ability/_media/img_3.png -------------------------------------------------------------------------------- /doc/_content/ability/_media/img_4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/648540858/wvp-GB28181-pro/f9300d01ec37321abf11673a3fe70f04278927c5/doc/_content/ability/_media/img_4.png -------------------------------------------------------------------------------- /doc/_content/ability/_media/img_5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/648540858/wvp-GB28181-pro/f9300d01ec37321abf11673a3fe70f04278927c5/doc/_content/ability/_media/img_5.png -------------------------------------------------------------------------------- /doc/_content/ability/_media/img_6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/648540858/wvp-GB28181-pro/f9300d01ec37321abf11673a3fe70f04278927c5/doc/_content/ability/_media/img_6.png -------------------------------------------------------------------------------- /doc/_content/ability/_media/img_7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/648540858/wvp-GB28181-pro/f9300d01ec37321abf11673a3fe70f04278927c5/doc/_content/ability/_media/img_7.png -------------------------------------------------------------------------------- /doc/_content/ability/_media/img_8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/648540858/wvp-GB28181-pro/f9300d01ec37321abf11673a3fe70f04278927c5/doc/_content/ability/_media/img_8.png -------------------------------------------------------------------------------- /doc/_content/ability/_media/img_9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/648540858/wvp-GB28181-pro/f9300d01ec37321abf11673a3fe70f04278927c5/doc/_content/ability/_media/img_9.png -------------------------------------------------------------------------------- /doc/_content/ability/auto_play.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | # 自动点播 4 | -------------------------------------------------------------------------------- /doc/_content/ability/channel.md: -------------------------------------------------------------------------------- 1 | # 通道管理 2 | 3 | 通道管理为了对已经分配国标编号的通道进行统一的行政区划和业务分组管理,国标中对于组织结构有两种表示方式,一种是按照行政区划,一种是业务分组+虚拟组织的方式. 4 | 行政区划结构固定,比如: 北京/市辖区/昌平区, 通道可以挂载道何一级行政区划下. 业务分组比较灵活, 可以按照自己的随意取名, 5 | 但是通道只能放在业务分组下的虚拟组织里,不能放在业务分组下. 6 | 7 | ## 行政区划 8 | 9 | 左侧树结构为行政区划结构, 通过数据鼠标右键可以操作,包括: 刷新节点,新建节点,编辑节点,删除节点,添加设备( 10 | 可以将某个国标设备下的通道全部添加道某一个节点下),移除设备(可以将某个国标设备下的通道全部从这个节点移除) 11 | 右侧伪通道列表, 对于非国标接入的设备只有配置了国标编号后才可以在这里进行操作。 12 | 选择左侧的节点后,可以点击右侧的“添加通道”, 选择需要的通道添加到改节点下,如果找不到通道, 可以选择“异常挂载通道”,点击清理后重新回来选择。 13 | ![行政区划](_media/img_21.png) 14 | 15 | ## 业务分组 16 | 17 | 左侧树结构为业务分组结构, 通过数据鼠标右键可以操作,包括: 刷新节点,新建节点,编辑节点,删除节点,添加设备( 18 | 可以将某个国标设备下的通道全部添加道某一个节点下),移除设备(可以将某个国标设备下的通道全部从这个节点移除) 19 | 业务分组下不能挂载设备,所以没有选择该节点的单选框. 20 | 右侧为通道列表, 对于非国标接入的设备只有配置了国标编号后才可以在这里进行操作。 21 | 22 | 选择左侧的节点后,可以点击右侧的“添加通道”, 选择需要的通道添加到改节点下。 23 | 如果找不到通道, 可以选择“异常挂载通道”,点击清理后重新回来选择。 24 | 注意,根资源组下的那一级为业务分组类型不可以直接挂载设备,需要继续建立节点,后续的节点的都是虚拟组织类型, 就可以挂载通道了。 25 | ![业务分组](_media/img_22.png) 26 | -------------------------------------------------------------------------------- /doc/_content/ability/cloud_record.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | # 云端录像 4 | 5 | ![云端录像](_media/img_26.png) 6 | 云端录像是对录制在zlm服务下的录像文件的管理,录像的文件路径默认在ZLM/www/record下。 7 | 8 | - 国标设备是否录像: 可以再WVP的配置中user-settings.record-sip设置为true那么每次点播以及录像回放都会录像; 9 | - 推流设备是否录像: 可以再WVP的配置中user-settings.record-push-live设置为true; 10 | - 拉流代理的是否录像: 在添加和编辑拉流代理时可以指定, 每次点播都会进行录像 11 | - 录像文件存储路径配置: 可以修改media.record-path来修改录像路径,但是如果有旧的录像文件,请不要迁移,因为数据库记录了每一个录像的绝对路径,一旦修改会造成找到文件,无法定时移除以及播放 12 | - 录像保存时间: 可以修改media.record-day来修改录像保存时间,单位是天; 13 | 14 | -------------------------------------------------------------------------------- /doc/_content/ability/continuous_recording.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | # 7*24不间断录像 4 | 5 | 目前如果要实现不间断录像如果只是关闭无人观看停止推流是不够的,设备可能经历断网,重启,都会导致录像的中断,目前给大家提供一种可用的临时方案。 6 | 7 | **原理:** wvp支持使用流地址自动点播,即你拿到一个流地址直接去播放,即使设备处于未点播状态,wvp会自动帮你点播;ZLM 8 | 的拉流代理成功后会无限重试,只要流一恢复就可以拉起来,基于这两个原理。 9 | **方案如下:** 10 | 11 | 1. wvp的配置中user-settings->auto-apply-play设置为团true,开启自动点播; 12 | 2. 点击你要录像的通道,点击播放页面左下角的“更多地址”,点击rtsp,此时复制了rtsp地址到剪贴板; 13 | 3. 在拉流代理中添加一路流,地址填写你复制的地址,启用成功即可。 14 | **前提:** 15 | 1. wvp使用多端口收流,不然你无法得到一个固定的流地址,也就无法实现自动点播。 16 | 17 | -------------------------------------------------------------------------------- /doc/_content/ability/gis.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | # 电子地图 4 | 5 | WVP提供了简单的电子地图用于设备的定位以及移动设备的轨迹信息,电子地图基于开源的地图引擎openlayers开发。 6 | 7 | ### 查看设备定位 8 | 9 | 1. 可以在设备列表点击“定位”按钮,自动跳转到电子地图页面; 10 | 2. 在电子地图页面在设备上右键点击“定位”获取设备/平台下的所有通道位置。 11 | 3. 单击通道信息可以定位到具体的通道 12 | 13 | ### 查询设备轨迹 14 | 15 | 查询轨迹需要提前配置save-position-history选项开启轨迹信息的保存,目前WVP此处未支持分库分表,对于大数据量的轨迹信息无法胜任,有需求请自行二次开发或者定制开发。 16 | 在电子地图页面在设备上右键点击“查询轨迹”获取设备轨迹信息。 17 | 18 | PS: 目前的底图仅用用作演示和学习,商用情况请自行购买授权使用。 19 | 20 | ### 更换底图以及底图配置 21 | 22 | 目前WVP支持使用了更换底图,配置文件在web_src/static/js/config.js,请修改后重新编译前端文件。 23 | 24 | ```javascript 25 | window.mapParam = { 26 | // 开启/关闭地图功能 27 | enable: true, 28 | // 坐标系 GCJ-02 WGS-84, 29 | coordinateSystem: "GCJ-02", 30 | // 地图瓦片地址 31 | tilesUrl: "http://webrd0{1-4}.is.autonavi.com/appmaptile?x={x}&y={y}&z={z}&lang=zh_cn&size=1&scale=1&style=8", 32 | // 瓦片大小 33 | tileSize: 256, 34 | // 默认层级 35 | zoom:10, 36 | // 默认地图中心点 37 | center:[116.41020, 39.915119], 38 | // 地图最大层级 39 | maxZoom:18, 40 | // 地图最小层级 41 | minZoom: 3 42 | } 43 | ``` 44 | -------------------------------------------------------------------------------- /doc/_content/ability/node_manager.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | # 节点管理 4 | 5 | ![节点管理](_media/img_26.png) 6 | 7 | WVP支持单个WVP多个ZLM的方案来扩展WVP的视频并发能力,并发点播是因为带宽和性能的原因,单个ZLM节点能支持的路数有限,所以WVP增加了ZLM集群来扩展并发并且保证ZLM的高可用。 8 | 9 | ## 默认节点 10 | 11 | WVP中为了保证功能的完整性,ZLM节点至少要有一个默认节点,这个节点不是在管理页面添加的,而是在WVP的配置文件中配置的,这个节点不可在页面删除。每次启动会自动从配置文件中读取配置写入数据库备用。 12 | 13 | ## 新增节点 14 | 15 | 启动你要添加的zlm节点,然后点击“添加节点”按钮输入zlm的ip, 16 | http端口,SECRET。点击测试测试完成则开始对节点进行详细的设置,如果你的zlm是使用docker启动的,可能存在zlm使用的端口与宿主机端口不一致的情况,需要在这里一一配置。 17 | 18 | ## wvp使用多个节点的原理 19 | 20 | wvp会把连接的节点统一记录在redis中,并记录zlm的负载情况,当新的请求到来时,会取出负载最低的那个zlm进行使用。以此保证节点负载均衡。 21 | -------------------------------------------------------------------------------- /doc/_content/ability/online_doc.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | # 在线文档 4 | -------------------------------------------------------------------------------- /doc/_content/ability/proxy.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | # 拉流代理 4 | 5 | 不是所有的摄像机都支持国标或者推流的,但是这些设备可以得到一个视频播放地址,通常为rtsp协议, 6 | 以大华为例: 7 | 8 | ```text 9 | rtsp://{user}:{passwd}@{ipc_ip}:{rtsp_port}/cam/realmonitor?channel=1&subtype=0 10 | ``` 11 | 12 | 可以得到这样一个流地址,可以直接用vlc进行播放,此时我们可以通过拉流代理功能将这个设备推送给其他国标平台了。 13 | 流程如下: 14 | 15 | ```plantuml 16 | @startuml 17 | "摄像机" <- "ZLMediaKit": 1. 流去流信息到ZLM 18 | "ZLMediaKit" -> "WVP-PRO": 2. 收到hook通知得到流信息 19 | "上级国标平台" -> "WVP-PRO": 3. 点播这路视频 20 | "WVP-PRO" -> "ZLMediaKit": 4. 通知推流到上级国标平台 21 | @enduml 22 | ``` 23 | 24 | ## 添加代理 25 | 26 | 拉流代理支持两种方式: 27 | 28 | 1. ZLM中直接代理流,支持RTSP/RTMP,不支持转码; 29 | 2. 借助ffmpeg完成拉转,可以通过修改ffmpeg拉转参数完成转码。 30 | 点击页面的“添加代理”,添加信息后保存即可,如果你需要共享推流信息到其他国标平台,那么你需要编辑/国标通道配置,配置国标编码. 31 | 32 | `PS: ffmpeg默认模板不需修改,需要修改`参数自行去ZLM配置文件中添加一个即可。 33 | -------------------------------------------------------------------------------- /doc/_content/ability/user.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | # 用户管理 4 | -------------------------------------------------------------------------------- /doc/_content/about_doc.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | # 关于本文档 4 | 5 | 本文档开源在gitee上,[https://gitee.com/pan648540858/wvp-pro-doc.git](https://gitee.com/pan648540858/wvp-pro-doc.git) 6 | ,如果文档出现任何错误或者不易理解的语句,请大家提ISSUE帮助我及时更正。欢迎大家提交PR一起维护这份文档,让更多的人可以使用到这个开源的视频平台。 7 | 8 | -------------------------------------------------------------------------------- /doc/_content/broadcast.md: -------------------------------------------------------------------------------- 1 | # 原理图 2 | 3 | ## 使用ffmpeg测试语音对讲原理 4 | 5 | ```plantuml 6 | @startuml 7 | "FFMPEG" -> "ZLMediaKit": 推流到zlm 8 | "WVP-PRO" <- "ZLMediaKit": 通知收到语音对讲推流,携带设备和通道信息 9 | "WVP-PRO" -> "设备": 开始语音对讲 10 | "WVP-PRO" <-- "设备": 语音对讲建立成功,携带收流端口 11 | "WVP-PRO" -> "ZLMediaKit": 通知zlm将流推送到设备收流端口 12 | "ZLMediaKit" -> "设备": 向设备推流 13 | @enduml 14 | ``` 15 | 16 | ## 使用网页测试语音对讲原理 17 | 18 | ```plantuml 19 | @startuml 20 | "前端页面" -> "WVP-PRO": 请求推流地址 21 | "前端页面" <-- "WVP-PRO": 返回推流地址 22 | "前端页面" -> "ZLMediaKit": 使用webrtc推流到zlm,以下过程相同 23 | "WVP-PRO" <- "ZLMediaKit": 通知收到语音对讲推流,携带设备和通道信息 24 | "WVP-PRO" -> "设备": 开始语音对讲 25 | "WVP-PRO" <-- "设备": 语音对讲建立成功,携带收流端口 26 | "WVP-PRO" -> "ZLMediaKit": 通知zlm将流推送到设备收流端口 27 | "ZLMediaKit" -> "设备": 向设备推流 28 | @enduml 29 | ``` -------------------------------------------------------------------------------- /doc/_content/disclaimers.md: -------------------------------------------------------------------------------- 1 | # 免责声明 2 | 3 | WVP-PRO自有代码使用宽松的MIT协议,在保留版权信息的情况下可以自由应用于各自商用、非商业的项目。 4 | 但是本项目也零碎的使用了一些其他的开源代码,在商用的情况下请自行替代或剔除; 由于使用本项目而产生的商业纠纷或侵权行为一概与本项目及开发者无关,请自行承担法律风险。 5 | 在使用本项目代码时,也应该在授权协议中同时表明本项目依赖的第三方库的协议 -------------------------------------------------------------------------------- /doc/_content/introduction/_media/img.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/648540858/wvp-GB28181-pro/f9300d01ec37321abf11673a3fe70f04278927c5/doc/_content/introduction/_media/img.png -------------------------------------------------------------------------------- /doc/_content/introduction/_media/img_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/648540858/wvp-GB28181-pro/f9300d01ec37321abf11673a3fe70f04278927c5/doc/_content/introduction/_media/img_1.png -------------------------------------------------------------------------------- /doc/_content/introduction/_media/img_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/648540858/wvp-GB28181-pro/f9300d01ec37321abf11673a3fe70f04278927c5/doc/_content/introduction/_media/img_2.png -------------------------------------------------------------------------------- /doc/_content/qa/_media/img.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/648540858/wvp-GB28181-pro/f9300d01ec37321abf11673a3fe70f04278927c5/doc/_content/qa/_media/img.png -------------------------------------------------------------------------------- /doc/_content/qa/_media/img_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/648540858/wvp-GB28181-pro/f9300d01ec37321abf11673a3fe70f04278927c5/doc/_content/qa/_media/img_1.png -------------------------------------------------------------------------------- /doc/_content/qa/_media/img_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/648540858/wvp-GB28181-pro/f9300d01ec37321abf11673a3fe70f04278927c5/doc/_content/qa/_media/img_2.png -------------------------------------------------------------------------------- /doc/_content/qa/_media/img_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/648540858/wvp-GB28181-pro/f9300d01ec37321abf11673a3fe70f04278927c5/doc/_content/qa/_media/img_3.png -------------------------------------------------------------------------------- /doc/_content/qa/_media/img_4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/648540858/wvp-GB28181-pro/f9300d01ec37321abf11673a3fe70f04278927c5/doc/_content/qa/_media/img_4.png -------------------------------------------------------------------------------- /doc/_content/qa/_media/img_5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/648540858/wvp-GB28181-pro/f9300d01ec37321abf11673a3fe70f04278927c5/doc/_content/qa/_media/img_5.png -------------------------------------------------------------------------------- /doc/_content/qa/bug.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | # 反馈bug 4 | 5 | 代码是在不断的完善的,不断修改会修复旧的问题也有可能引入新的问题,所以遇到BUG是很正常的一件事。所以遇到问题不要烦燥,咱们就事论事就好了。 6 | 7 | ## 如何反馈 8 | 9 | 1. 在知识星球提问。 10 | 2. 更新代码,很可能你遇到问题别人已经更早的遇到了,或者是作者自己发现了,已经解决了,所以你可以更新代码再次进行测试; 11 | 3. 可以在github提ISSUE,我几乎每天都会去看issue,你的问题我会尽快给予答复; 12 | 13 | > 有偿支持可以给我发邮件, 648540858@qq.com 14 | 15 | ## 社群 16 | 17 | [![社群](../../_media/shequ.png "shequ")](https://t.zsxq.com/0d8VAD3Dm) 18 | > 收费是为了提供更好的服务,也是对作者更大的激励。加入星球的用户三天后可以私信我留下微信号,我会拉大家入群。加入三天内不满意可以直接退款,大家不需要有顾虑,来白嫖三天也不是不可以。 -------------------------------------------------------------------------------- /doc/_content/qa/development.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | # 参与到开发中来 4 | 5 | 非常欢迎有兴趣的小伙伴一起来维护这个项目 6 | 7 | ## 与开发有关的信息 8 | 9 | - 开发语言:后端java + 前端vue; 10 | - jdk版本: 1.8; 11 | - 作者自用开发ide: jetbrains intellij idea; 12 | - nodejs/npm版本:v10.19.0/6.14.4; 13 | - 后端使用Spring boot框架开发; 14 | - 项目大量使用了异步操作; 15 | - 跟代码学流程需要参考28181文档,只看代码你会很懵的; 16 | - 必须学会[抓包](_content/skill/tcpdump.md),这是必须的 17 | 18 | ## 提交代码 19 | 20 | 大家可以通过fork项目的方式提交自己的代码,然后提交PR,我来合并到主线。提交代码的过程中我们需要遵循“**阿里编码规约** 21 | ”,现有代码也有很多代码没有做到,但是我们在朝这个方向努力。 -------------------------------------------------------------------------------- /doc/_content/qa/img.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/648540858/wvp-GB28181-pro/f9300d01ec37321abf11673a3fe70f04278927c5/doc/_content/qa/img.png -------------------------------------------------------------------------------- /doc/_content/qa/regiser_error.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | # 设备注册不上来的解决办法 4 | 5 | 一般的原因有两个 6 | 7 | 1. 信息填写错误,比如密码错误; 8 | 2. 网络不通导致注册消息无法发送到WVP; 9 | 10 | 遇到问题首先仔细校验填写信息,例如海康可能需要勾选鉴权才可以输入密码。网络问题请自行测试。 -------------------------------------------------------------------------------- /doc/_content/qa/start_error.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | # 启动时报错 4 | 5 | 启动时的报错大部分时候是因为你的配置有问题,比如mysql没连接上,redis没连接上,18080/15060端口占用了,这些都会导致启动是报错,修改配置配置之后都可以解决; 6 | 下面我整理的一些常见的错误,大家可以先对号入座的简单排查下。 7 | > **常见错误** 8 | 9 | ![_media/img.png](_media/img.png) 10 | **错误原因:** redis配置错误,可能原因: redis未启动/ip错误/端口错误/网络不通 11 | --- 12 | ![_media/img_1.png](_media/img_1.png) 13 | **错误原因:** redis配置错误,可能原因: 密码错误 14 | --- 15 | ![_media/img_2.png](_media/img_2.png) 16 | **错误原因:** mysql配置错误,可能原因: mysql未启动/ip错误/端口错误/网络不通 17 | --- 18 | ![_media/img_3.png](_media/img_3.png) 19 | **错误原因:** mysql配置错误,可能原因: 用户名/密码错误 20 | --- 21 | ![_media/img_4.png](_media/img_4.png) 22 | **错误原因:** SIP配置错误,可能原因: SIP端口被占用 23 | --- 24 | ![_media/img_5.png](_media/img_5.png) 25 | **错误原因:** WVP Tomcat端口配置错误,可能原因: server.port端口被占用 26 | --- -------------------------------------------------------------------------------- /doc/_content/skill/_media/img.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/648540858/wvp-GB28181-pro/f9300d01ec37321abf11673a3fe70f04278927c5/doc/_content/skill/_media/img.png -------------------------------------------------------------------------------- /doc/_content/skill/_media/img_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/648540858/wvp-GB28181-pro/f9300d01ec37321abf11673a3fe70f04278927c5/doc/_content/skill/_media/img_1.png -------------------------------------------------------------------------------- /doc/_content/skill/_media/img_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/648540858/wvp-GB28181-pro/f9300d01ec37321abf11673a3fe70f04278927c5/doc/_content/skill/_media/img_2.png -------------------------------------------------------------------------------- /doc/_content/theory/_media/img.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/648540858/wvp-GB28181-pro/f9300d01ec37321abf11673a3fe70f04278927c5/doc/_content/theory/_media/img.png -------------------------------------------------------------------------------- /doc/_content/theory/_media/img_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/648540858/wvp-GB28181-pro/f9300d01ec37321abf11673a3fe70f04278927c5/doc/_content/theory/_media/img_1.png -------------------------------------------------------------------------------- /doc/_content/theory/_media/img_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/648540858/wvp-GB28181-pro/f9300d01ec37321abf11673a3fe70f04278927c5/doc/_content/theory/_media/img_2.png -------------------------------------------------------------------------------- /doc/_content/theory/_media/img_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/648540858/wvp-GB28181-pro/f9300d01ec37321abf11673a3fe70f04278927c5/doc/_content/theory/_media/img_3.png -------------------------------------------------------------------------------- /doc/_content/theory/_media/img_4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/648540858/wvp-GB28181-pro/f9300d01ec37321abf11673a3fe70f04278927c5/doc/_content/theory/_media/img_4.png -------------------------------------------------------------------------------- /doc/_content/theory/_media/img_5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/648540858/wvp-GB28181-pro/f9300d01ec37321abf11673a3fe70f04278927c5/doc/_content/theory/_media/img_5.png -------------------------------------------------------------------------------- /doc/_content/theory/_media/img_6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/648540858/wvp-GB28181-pro/f9300d01ec37321abf11673a3fe70f04278927c5/doc/_content/theory/_media/img_6.png -------------------------------------------------------------------------------- /doc/_content/theory/_media/img_7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/648540858/wvp-GB28181-pro/f9300d01ec37321abf11673a3fe70f04278927c5/doc/_content/theory/_media/img_7.png -------------------------------------------------------------------------------- /doc/_content/theory/_media/img_8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/648540858/wvp-GB28181-pro/f9300d01ec37321abf11673a3fe70f04278927c5/doc/_content/theory/_media/img_8.png -------------------------------------------------------------------------------- /doc/_content/theory/_media/img_9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/648540858/wvp-GB28181-pro/f9300d01ec37321abf11673a3fe70f04278927c5/doc/_content/theory/_media/img_9.png -------------------------------------------------------------------------------- /doc/_content/theory/code.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | # 统一编码规则 4 | 5 | ## D.1 编码规则 A 6 | 7 | >   编码规则 A 由中心编码(8位)、行业编码(2位)、类型编码(3位)和序号(7位)四个码段共20位十 8 | > 进制数字字符构成,即系统编码 =中心编码 + 行业编码 + 类型编码 + 序号。 9 | >   编码规则 A 的详细说明见表 D.1。其中,中心编码指用户或设备所归属的监控中心的编码,按照监控中心所在地的行政区划代码确定, 10 | > 当不是基层单位时空余位为0。行政区划代码采用 GB/T2260— 2007规定的行政区划代码表示。行业编码是指用户或设备所归属的行业,行业编码对照表见 11 | > D.3。 12 | > 类型编码指定了设备或用户的具体类型,其中的前端设备包含公安系统和非公安系统的前端设备,终端用 13 | > 户包含公安系统和非公安系统的终端用户。 14 | ![img_7.png](_media/img_7.png) 15 | ![img_1.png](_media/img_1.png) 16 | ![img_2.png](_media/img_2.png) 17 | 18 | ## D.2 编码规则 B 19 | 20 | >   编码规则 B由中心编码(8位)、行业编码(2位)、序号(4位)和类型编码(2位)四个码段构成,即系 21 | > 统编码 =中心编码 + 行业编码 +序号+类型编码。编码规则 B的详细说明见表 D.2。 22 | ![img_3.png](_media/img_3.png) 23 | ![img_4.png](_media/img_4.png) 24 | 25 | ## D.3 行业编码对照表 26 | 27 | >   行业编码对照表见表 D.3。 28 | ![img_5.png](_media/img_5.png) 29 | ![img_6.png](_media/img_6.png) -------------------------------------------------------------------------------- /doc/_content/theory/img.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/648540858/wvp-GB28181-pro/f9300d01ec37321abf11673a3fe70f04278927c5/doc/_content/theory/img.png -------------------------------------------------------------------------------- /doc/_content/theory/play.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | # 点播流程 4 | 5 | > 以下为WVP-PRO点播流程。点播成功前的任何一个环节出现问题都可能出现点播超时,这也是排查点播超时的依据。 6 | 7 | ```plantuml 8 | @startuml 9 | "WEB用户" -> "WVP-PRO": 1. 发起点播请求 10 | "设备" <- "WVP-PRO": 2. Invite(携带SDP消息体) 11 | "设备" --> "WVP-PRO": 3. 200OK(携带SDP消息体) 12 | "设备" <-- "WVP-PRO": 4. Ack 13 | "设备" -> "ZLMediaKit": 5. 发送实时流 14 | "WVP-PRO" <- "ZLMediaKit": 6. 流改变事件 15 | "WEB用户" <-- "WVP-PRO": 7. 回复流播放地址(携带流地址) 16 | "WVP-PRO" <- "ZLMediaKit": 8. 无人观看事件 17 | "设备" <- "WVP-PRO": 9 Bye消息 18 | "设备" --> "WVP-PRO": 10 200OK 19 | @enduml 20 | ``` 21 | 22 | ## 注册流程描述如下: 23 | 24 | 1. 用户从网页或调用接口发起点播请求; 25 | 2. WVP-PRO向摄像机发送Invite消息,消息头域中携带 Subject字段,表明点播的视频源ID、发送方媒体流序列号、ZLMediaKit接收流使用的IP、端口号、 26 | 接收端媒体流序列号等参数,SDP消息体中 s字段为“Play”代表实时点播,y字段描述SSRC值,f字段描述媒体参数。 27 | 3. 摄像机向WVP-PRO回复200OK,消息体中描述了媒体流发送者发送媒体流的IP、端口、媒体格式、SSRC字段等内容。 28 | 4. WVP-PRO向设备回复Ack, 会话建立成功。 29 | 5. 设备向ZLMediaKit发送实时流。 30 | 6. ZLMediaKit向WVP-PRO发送流改变事件。 31 | 7. WVP-PRO向WEB用户回复播放地址。 32 | 8. ZLMediaKit向WVP发送流无人观看事件。 33 | 9. WVP-PRO向设备回复Bye, 结束会话。 34 | 10. 设备回复200OK,会话结束成功。 35 | -------------------------------------------------------------------------------- /doc/_content/theory/register.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | # 注册流程 4 | 5 | WVP-PRO目前仅支持国标中描述的基本注册流程,也是最常用的, 6 | > 基本注册即采用IETFRFC3261规定的基于数字摘要的挑战应答式安全技术进行注册. 7 | 8 | ```plantuml 9 | @startuml 10 | "设备" -> "WVP-PRO": 1. Register 11 | "设备" <-- "WVP-PRO": 2. 401 Unauthorized 12 | "设备" -> "WVP-PRO": 3. Register 13 | "设备" <-- "WVP-PRO": 4. 200 OK 14 | @enduml 15 | ``` 16 | 17 | > 注册流程描述如下: 18 | > 1. 摄像机向WVP-PRO服务器发送 Register请求; 19 | > 2. WVP-PRO向摄像机发送响应401,并在响应的消息头 WWW_Authenticate字段中给出适合摄像机的认证体制和参数; 20 | > 3. 摄像机重新向WVP-PRO发送 Register请求,在请求的 Authorization字段给出信任书, 包含认证信息; 21 | > 4. WVP-PRO对请求进行验证,如果检查出 摄像机身份合法,向摄像机发送成功响应 200OK,如果身份不合法则发送拒绝服务应答。 22 | -------------------------------------------------------------------------------- /doc/_coverpage.md: -------------------------------------------------------------------------------- 1 | 2 | ![logo](_media/logo-mini.png) 3 | 4 | # WVP-PRO 2.0 5 | 6 | > 开箱即用的28181协议视频平台。 7 | 8 | - 基于GB/T28181-2016标准信令实现,兼容GB/T28181-2011。 9 | - 自带完整前端页面,开箱即用。 10 | - 完全开源,且使用MIT许可协议。可以在保留版权信息的基础上商用。 11 | 12 | [GitHub](https://github.com/648540858/wvp-GB28181-pro) 13 | [Gitee](https://gitee.com/pan648540858/wvp-GB28181-pro) 14 | 15 | 16 | 17 | [//]: # ([comment]: <> (![color](#f0f0f0))) 18 | -------------------------------------------------------------------------------- /doc/_media/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/648540858/wvp-GB28181-pro/f9300d01ec37321abf11673a3fe70f04278927c5/doc/_media/1.png -------------------------------------------------------------------------------- /doc/_media/1372762149.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/648540858/wvp-GB28181-pro/f9300d01ec37321abf11673a3fe70f04278927c5/doc/_media/1372762149.jpg -------------------------------------------------------------------------------- /doc/_media/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/648540858/wvp-GB28181-pro/f9300d01ec37321abf11673a3fe70f04278927c5/doc/_media/2.png -------------------------------------------------------------------------------- /doc/_media/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/648540858/wvp-GB28181-pro/f9300d01ec37321abf11673a3fe70f04278927c5/doc/_media/3.png -------------------------------------------------------------------------------- /doc/_media/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/648540858/wvp-GB28181-pro/f9300d01ec37321abf11673a3fe70f04278927c5/doc/_media/4.png -------------------------------------------------------------------------------- /doc/_media/5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/648540858/wvp-GB28181-pro/f9300d01ec37321abf11673a3fe70f04278927c5/doc/_media/5.png -------------------------------------------------------------------------------- /doc/_media/6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/648540858/wvp-GB28181-pro/f9300d01ec37321abf11673a3fe70f04278927c5/doc/_media/6.png -------------------------------------------------------------------------------- /doc/_media/7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/648540858/wvp-GB28181-pro/f9300d01ec37321abf11673a3fe70f04278927c5/doc/_media/7.png -------------------------------------------------------------------------------- /doc/_media/8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/648540858/wvp-GB28181-pro/f9300d01ec37321abf11673a3fe70f04278927c5/doc/_media/8.png -------------------------------------------------------------------------------- /doc/_media/903207146.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/648540858/wvp-GB28181-pro/f9300d01ec37321abf11673a3fe70f04278927c5/doc/_media/903207146.jpg -------------------------------------------------------------------------------- /doc/_media/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/648540858/wvp-GB28181-pro/f9300d01ec37321abf11673a3fe70f04278927c5/doc/_media/favicon.ico -------------------------------------------------------------------------------- /doc/_media/log.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/648540858/wvp-GB28181-pro/f9300d01ec37321abf11673a3fe70f04278927c5/doc/_media/log.jpg -------------------------------------------------------------------------------- /doc/_media/logo-mini.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/648540858/wvp-GB28181-pro/f9300d01ec37321abf11673a3fe70f04278927c5/doc/_media/logo-mini.png -------------------------------------------------------------------------------- /doc/_media/logo.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/648540858/wvp-GB28181-pro/f9300d01ec37321abf11673a3fe70f04278927c5/doc/_media/logo.jpg -------------------------------------------------------------------------------- /doc/_media/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/648540858/wvp-GB28181-pro/f9300d01ec37321abf11673a3fe70f04278927c5/doc/_media/logo.png -------------------------------------------------------------------------------- /doc/_media/shequ.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/648540858/wvp-GB28181-pro/f9300d01ec37321abf11673a3fe70f04278927c5/doc/_media/shequ.png -------------------------------------------------------------------------------- /doc/_media/weixin.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/648540858/wvp-GB28181-pro/f9300d01ec37321abf11673a3fe70f04278927c5/doc/_media/weixin.jpg -------------------------------------------------------------------------------- /doc/_media/zhifubao.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/648540858/wvp-GB28181-pro/f9300d01ec37321abf11673a3fe70f04278927c5/doc/_media/zhifubao.jpg -------------------------------------------------------------------------------- /doc/_navbar.md: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /docker/build.sh: -------------------------------------------------------------------------------- 1 | #/bin/bash 2 | set -e 3 | 4 | version=2.7.3 5 | 6 | git clone https://gitee.com/pan648540858/wvp-GB28181-pro.git 7 | cd wvp-GB28181-pro/web_src && \ 8 | npm install && \ 9 | npm run build 10 | 11 | cd ../../ 12 | mkdir -p ./nginx/dist 13 | cp -r wvp-GB28181-pro/src/main/resources/static/* ./nginx/dist 14 | 15 | echo "构建ZLM容器" 16 | cd ./media/ 17 | chmod +x ./build.sh 18 | ./build.sh 19 | cd ../ 20 | 21 | echo "构建数据库容器" 22 | cd ./mysql/ 23 | chmod +x ./build.sh 24 | ./build.sh 25 | cd ../ 26 | 27 | echo "构建Redis容器" 28 | cd ./redis/ 29 | chmod +x ./build.sh 30 | ./build.sh 31 | cd ../ 32 | 33 | echo "构建WVP容器" 34 | cd ./wvp/ 35 | chmod +x ./build.sh 36 | ./build.sh 37 | cd ../ 38 | 39 | echo "构建Nginx容器" 40 | cd ./nginx/ 41 | chmod +x ./build.sh 42 | ./build.sh 43 | cd ../ 44 | 45 | ./push.sh 46 | -------------------------------------------------------------------------------- /docker/docker-upgrade.sh: -------------------------------------------------------------------------------- 1 | #/bin/bash 2 | set -e 3 | 4 | docker compose down 5 | docker compose up -d --remove-orphans -------------------------------------------------------------------------------- /docker/media/build.sh: -------------------------------------------------------------------------------- 1 | #/bin/bash 2 | set -e 3 | 4 | version=2.7.3 5 | 6 | docker build -t polaris-media:${version} . 7 | docker tag polaris-media:${version} polaris-tian-docker.pkg.coding.net/qt/polaris/polaris-media:${version} 8 | docker tag polaris-media:${version} polaris-tian-docker.pkg.coding.net/qt/polaris/polaris-media:latest -------------------------------------------------------------------------------- /docker/mysql/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM mysql:8.0.32 2 | 3 | ADD ./db/*.sql /docker-entrypoint-initdb.d/ -------------------------------------------------------------------------------- /docker/mysql/build.sh: -------------------------------------------------------------------------------- 1 | #/bin/bash 2 | set -e 3 | 4 | version=2.7.3 5 | 6 | docker build -t polaris-mysql:${version} . 7 | docker tag polaris-mysql:${version} polaris-tian-docker.pkg.coding.net/qt/polaris/polaris-mysql:${version} 8 | docker tag polaris-mysql:${version} polaris-tian-docker.pkg.coding.net/qt/polaris/polaris-mysql:latest -------------------------------------------------------------------------------- /docker/mysql/db/privileges.sql: -------------------------------------------------------------------------------- 1 | use mysql; 2 | grant all privileges on wvp.* to 'ylcx'@'%'; 3 | flush privileges; -------------------------------------------------------------------------------- /docker/nginx/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM nginx:alpine 2 | 3 | RUN apk add --no-cache bash 4 | 5 | ARG TZ=Asia/Shanghai 6 | RUN \ 7 | sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories && \ 8 | apk update && \ 9 | apk add tzdata 10 | RUN ln -sf /usr/share/zoneinfo/${TZ} /etc/localtime && \ 11 | echo '${TZ}' > /etc/timezone 12 | 13 | RUN rm -rf /etc/nginx/conf.d/* 14 | RUN mkdir /opt/dist 15 | COPY ./dist /opt/dist 16 | COPY ./conf/nginx.conf /etc/nginx/conf.d 17 | 18 | CMD ["nginx","-g","daemon off;"] 19 | 20 | -------------------------------------------------------------------------------- /docker/nginx/build.sh: -------------------------------------------------------------------------------- 1 | #/bin/bash 2 | set -e 3 | 4 | version=2.7.3 5 | 6 | rm ./dist/static/js/config.js 7 | cp ./config.js ./dist/static/js/ 8 | 9 | docker build -t polaris-nginx:${version} . 10 | docker tag polaris-nginx:${version} polaris-tian-docker.pkg.coding.net/qt/polaris/polaris-nginx:${version} 11 | docker tag polaris-nginx:${version} polaris-tian-docker.pkg.coding.net/qt/polaris/polaris-nginx:latest -------------------------------------------------------------------------------- /docker/nginx/config.js: -------------------------------------------------------------------------------- 1 | 2 | window.baseUrl = "http://10.10.1.124:18978" 3 | 4 | // map组件全局参数, 注释此内容可以关闭地图功能 5 | window.mapParam = { 6 | // 开启/关闭地图功能 7 | enable: true, 8 | // 坐标系 GCJ-02 WGS-84, 9 | coordinateSystem: "GCJ-02", 10 | // 地图瓦片地址 11 | tilesUrl: "http://webrd0{1-4}.is.autonavi.com/appmaptile?x={x}&y={y}&z={z}&lang=zh_cn&size=1&scale=1&style=8", 12 | // 瓦片大小 13 | tileSize: 256, 14 | // 默认层级 15 | zoom:10, 16 | // 默认地图中心点 17 | center:[116.41020, 39.915119], 18 | // 地图最大层级 19 | maxZoom:18, 20 | // 地图最小层级 21 | minZoom: 3 22 | } 23 | -------------------------------------------------------------------------------- /docker/push.sh: -------------------------------------------------------------------------------- 1 | #/bin/bash 2 | set -e 3 | 4 | version=2.7.3 5 | 6 | docker push polaris-tian-docker.pkg.coding.net/qt/polaris/ylcx-media:latest 7 | docker push polaris-tian-docker.pkg.coding.net/qt/polaris/ylcx-mysql:latest 8 | docker push polaris-tian-docker.pkg.coding.net/qt/polaris/ylcx-redis:latest 9 | docker push polaris-tian-docker.pkg.coding.net/qt/polaris/ylcx-wvp:latest 10 | docker push polaris-tian-docker.pkg.coding.net/qt/polaris/ylcx-nginx:latest 11 | docker push polaris-tian-docker.pkg.coding.net/qt/polaris/ylcx-media:${version} 12 | docker push polaris-tian-docker.pkg.coding.net/qt/polaris/ylcx-mysql:${version} 13 | docker push polaris-tian-docker.pkg.coding.net/qt/polaris/ylcx-redis:${version} 14 | docker push polaris-tian-docker.pkg.coding.net/qt/polaris/ylcx-wvp:${version} 15 | docker push polaris-tian-docker.pkg.coding.net/qt/polaris/ylcx-nginx:${version} -------------------------------------------------------------------------------- /docker/redis/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM redis 2 | 3 | RUN mkdir -p /opt/polaris/redis 4 | WORKDIR /opt/polaris/redis 5 | COPY ./conf/redis.conf /opt/polaris/redis/redis.conf -------------------------------------------------------------------------------- /docker/redis/build.sh: -------------------------------------------------------------------------------- 1 | #/bin/bash 2 | set -e 3 | 4 | version=2.7.3 5 | 6 | docker build -t polaris-redis:${version} . 7 | docker tag polaris-redis:${version} polaris-tian-docker.pkg.coding.net/qt/polaris/polaris-redis:${version} 8 | docker tag polaris-redis:${version} polaris-tian-docker.pkg.coding.net/qt/polaris/polaris-redis:latest -------------------------------------------------------------------------------- /docker/redis/conf/redis.conf: -------------------------------------------------------------------------------- 1 | #requirepass root 2 | bind 0.0.0.0 -------------------------------------------------------------------------------- /docker/wvp/build.sh: -------------------------------------------------------------------------------- 1 | #/bin/bash 2 | set -e 3 | 4 | version=2.7.3 5 | 6 | docker build -t polaris-wvp:${version} . 7 | docker tag polaris-wvp:${version} polaris-tian-docker.pkg.coding.net/qt/polaris/polaris-wvp:${version} 8 | docker tag polaris-wvp:${version} polaris-tian-docker.pkg.coding.net/qt/polaris/polaris-wvp:latest -------------------------------------------------------------------------------- /docker/wvp/wvp/application.yml: -------------------------------------------------------------------------------- 1 | spring: 2 | application: 3 | name: wvp 4 | profiles: 5 | active: docker -------------------------------------------------------------------------------- /libs/jdbc-aarch/kingbase8-8.6.0.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/648540858/wvp-GB28181-pro/f9300d01ec37321abf11673a3fe70f04278927c5/libs/jdbc-aarch/kingbase8-8.6.0.jar -------------------------------------------------------------------------------- /libs/jdbc-aarch/kingbase8-8.6.0.jre7.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/648540858/wvp-GB28181-pro/f9300d01ec37321abf11673a3fe70f04278927c5/libs/jdbc-aarch/kingbase8-8.6.0.jre7.jar -------------------------------------------------------------------------------- /libs/jdbc-aarch/postgresql-42.2.9.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/648540858/wvp-GB28181-pro/f9300d01ec37321abf11673a3fe70f04278927c5/libs/jdbc-aarch/postgresql-42.2.9.jar -------------------------------------------------------------------------------- /libs/jdbc-aarch/postgresql-42.2.9.jre7.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/648540858/wvp-GB28181-pro/f9300d01ec37321abf11673a3fe70f04278927c5/libs/jdbc-aarch/postgresql-42.2.9.jre7.jar -------------------------------------------------------------------------------- /libs/jdbc-x86/bcprov-jdk15on-1.70.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/648540858/wvp-GB28181-pro/f9300d01ec37321abf11673a3fe70f04278927c5/libs/jdbc-x86/bcprov-jdk15on-1.70.jar -------------------------------------------------------------------------------- /libs/jdbc-x86/kingbase8-8.6.0.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/648540858/wvp-GB28181-pro/f9300d01ec37321abf11673a3fe70f04278927c5/libs/jdbc-x86/kingbase8-8.6.0.jar -------------------------------------------------------------------------------- /libs/jdbc-x86/kingbase8-8.6.0.jre6.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/648540858/wvp-GB28181-pro/f9300d01ec37321abf11673a3fe70f04278927c5/libs/jdbc-x86/kingbase8-8.6.0.jre6.jar -------------------------------------------------------------------------------- /libs/jdbc-x86/kingbase8-8.6.0.jre7.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/648540858/wvp-GB28181-pro/f9300d01ec37321abf11673a3fe70f04278927c5/libs/jdbc-x86/kingbase8-8.6.0.jre7.jar -------------------------------------------------------------------------------- /libs/jdbc-x86/postgresql-42.2.9.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/648540858/wvp-GB28181-pro/f9300d01ec37321abf11673a3fe70f04278927c5/libs/jdbc-x86/postgresql-42.2.9.jar -------------------------------------------------------------------------------- /libs/jdbc-x86/postgresql-42.2.9.jre6.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/648540858/wvp-GB28181-pro/f9300d01ec37321abf11673a3fe70f04278927c5/libs/jdbc-x86/postgresql-42.2.9.jre6.jar -------------------------------------------------------------------------------- /libs/jdbc-x86/postgresql-42.2.9.jre7.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/648540858/wvp-GB28181-pro/f9300d01ec37321abf11673a3fe70f04278927c5/libs/jdbc-x86/postgresql-42.2.9.jre7.jar -------------------------------------------------------------------------------- /src/main/java/com/genersoft/iot/vmp/common/CommonCallback.java: -------------------------------------------------------------------------------- 1 | package com.genersoft.iot.vmp.common; 2 | 3 | public interface CommonCallback{ 4 | public void run(T t); 5 | } 6 | -------------------------------------------------------------------------------- /src/main/java/com/genersoft/iot/vmp/common/DeviceStatusCallback.java: -------------------------------------------------------------------------------- 1 | package com.genersoft.iot.vmp.common; 2 | 3 | import com.genersoft.iot.vmp.gb28181.bean.SipTransactionInfo; 4 | 5 | public interface DeviceStatusCallback { 6 | public void run(String deviceId, SipTransactionInfo transactionInfo); 7 | } 8 | -------------------------------------------------------------------------------- /src/main/java/com/genersoft/iot/vmp/common/InviteSessionStatus.java: -------------------------------------------------------------------------------- 1 | package com.genersoft.iot.vmp.common; 2 | 3 | /** 4 | * 标识invite消息发出后的各个状态, 5 | * 收到ok钱停止invite发送cancel, 6 | * 收到200ok后发送BYE停止invite 7 | */ 8 | public enum InviteSessionStatus { 9 | ready, 10 | ok, 11 | } 12 | -------------------------------------------------------------------------------- /src/main/java/com/genersoft/iot/vmp/common/InviteSessionType.java: -------------------------------------------------------------------------------- 1 | package com.genersoft.iot.vmp.common; 2 | 3 | public enum InviteSessionType { 4 | PLAY, 5 | PLAYBACK, 6 | DOWNLOAD, 7 | BROADCAST, 8 | TALK 9 | } 10 | -------------------------------------------------------------------------------- /src/main/java/com/genersoft/iot/vmp/common/RemoteAddressInfo.java: -------------------------------------------------------------------------------- 1 | package com.genersoft.iot.vmp.common; 2 | 3 | public class RemoteAddressInfo { 4 | private String ip; 5 | private int port; 6 | 7 | public RemoteAddressInfo(String ip, int port) { 8 | this.ip = ip; 9 | this.port = port; 10 | } 11 | 12 | public String getIp() { 13 | return ip; 14 | } 15 | 16 | public void setIp(String ip) { 17 | this.ip = ip; 18 | } 19 | 20 | public int getPort() { 21 | return port; 22 | } 23 | 24 | public void setPort(int port) { 25 | this.port = port; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/main/java/com/genersoft/iot/vmp/common/ServerInfo.java: -------------------------------------------------------------------------------- 1 | package com.genersoft.iot.vmp.common; 2 | 3 | import com.genersoft.iot.vmp.utils.DateUtil; 4 | import lombok.Data; 5 | 6 | @Data 7 | public class ServerInfo { 8 | 9 | private String ip; 10 | private int port; 11 | /** 12 | * 现在使用的线程数 13 | */ 14 | private String createTime; 15 | 16 | public static ServerInfo create(String ip, int port) { 17 | ServerInfo serverInfo = new ServerInfo(); 18 | serverInfo.setIp(ip); 19 | serverInfo.setPort(port); 20 | serverInfo.setCreateTime(DateUtil.getNow()); 21 | return serverInfo; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/main/java/com/genersoft/iot/vmp/common/SubscribeCallback.java: -------------------------------------------------------------------------------- 1 | package com.genersoft.iot.vmp.common; 2 | 3 | import com.genersoft.iot.vmp.gb28181.bean.SipTransactionInfo; 4 | 5 | public interface SubscribeCallback{ 6 | public void run(String deviceId, SipTransactionInfo transactionInfo); 7 | } 8 | -------------------------------------------------------------------------------- /src/main/java/com/genersoft/iot/vmp/common/enums/ChannelDataType.java: -------------------------------------------------------------------------------- 1 | package com.genersoft.iot.vmp.common.enums; 2 | 3 | /** 4 | * 支持的通道数据类型 5 | */ 6 | 7 | public enum ChannelDataType { 8 | 9 | GB28181(1,"国标28181"), 10 | STREAM_PUSH(2,"推流设备"), 11 | STREAM_PROXY(3,"拉流代理"); 12 | 13 | public final int value; 14 | 15 | public final String desc; 16 | 17 | ChannelDataType(Integer value, String desc) { 18 | this.value = value; 19 | this.desc = desc; 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/main/java/com/genersoft/iot/vmp/conf/MediaStatusTimerTask.java: -------------------------------------------------------------------------------- 1 | package com.genersoft.iot.vmp.conf; 2 | 3 | import org.springframework.scheduling.annotation.Scheduled; 4 | 5 | /** 6 | * 定时向zlm同步媒体流状态 7 | */ 8 | public class MediaStatusTimerTask { 9 | 10 | 11 | // @Scheduled(fixedRate = 2 * 1000) //每3秒执行一次 12 | public void execute(){ 13 | 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/main/java/com/genersoft/iot/vmp/conf/ServiceInfo.java: -------------------------------------------------------------------------------- 1 | package com.genersoft.iot.vmp.conf; 2 | 3 | import lombok.extern.slf4j.Slf4j; 4 | import org.springframework.boot.web.context.WebServerInitializedEvent; 5 | import org.springframework.context.ApplicationListener; 6 | import org.springframework.stereotype.Component; 7 | 8 | @Slf4j 9 | @Component 10 | public class ServiceInfo implements ApplicationListener { 11 | 12 | private static int serverPort; 13 | 14 | public static int getServerPort() { 15 | return serverPort; 16 | } 17 | 18 | @Override 19 | public void onApplicationEvent(WebServerInitializedEvent event) { 20 | // 项目启动获取启动的端口号 21 | ServiceInfo.serverPort = event.getWebServer().getPort(); 22 | log.info("项目启动获取启动的端口号: " + ServiceInfo.serverPort); 23 | } 24 | 25 | public void setServerPort(int serverPort) { 26 | ServiceInfo.serverPort = serverPort; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/com/genersoft/iot/vmp/conf/SipConfig.java: -------------------------------------------------------------------------------- 1 | package com.genersoft.iot.vmp.conf; 2 | 3 | 4 | import lombok.Data; 5 | import org.springframework.boot.context.properties.ConfigurationProperties; 6 | import org.springframework.core.annotation.Order; 7 | import org.springframework.stereotype.Component; 8 | 9 | import java.util.List; 10 | 11 | @Component 12 | @ConfigurationProperties(prefix = "sip", ignoreInvalidFields = true) 13 | @Order(0) 14 | @Data 15 | public class SipConfig { 16 | 17 | private String ip; 18 | 19 | private String showIp; 20 | 21 | private List monitorIps; 22 | 23 | private Integer port; 24 | 25 | private String domain; 26 | 27 | private String id; 28 | 29 | private String password; 30 | 31 | Integer ptzSpeed = 50; 32 | 33 | Integer registerTimeInterval = 120; 34 | 35 | private boolean alarm = false; 36 | 37 | private long timeout = 1000; 38 | } 39 | -------------------------------------------------------------------------------- /src/main/java/com/genersoft/iot/vmp/conf/VersionInfo.java: -------------------------------------------------------------------------------- 1 | package com.genersoft.iot.vmp.conf; 2 | 3 | import com.genersoft.iot.vmp.common.VersionPo; 4 | import com.genersoft.iot.vmp.utils.GitUtil; 5 | import org.springframework.beans.factory.annotation.Autowired; 6 | import org.springframework.stereotype.Component; 7 | 8 | @Component 9 | public class VersionInfo { 10 | 11 | @Autowired 12 | GitUtil gitUtil; 13 | 14 | public VersionPo getVersion() { 15 | VersionPo versionPo = new VersionPo(); 16 | versionPo.setGIT_Revision(gitUtil.getGitCommitId()); 17 | versionPo.setGIT_BRANCH(gitUtil.getBranch()); 18 | versionPo.setGIT_URL(gitUtil.getGitUrl()); 19 | versionPo.setBUILD_DATE(gitUtil.getBuildDate()); 20 | versionPo.setGIT_Revision_SHORT(gitUtil.getCommitIdShort()); 21 | versionPo.setVersion(gitUtil.getBuildVersion()); 22 | versionPo.setGIT_DATE(gitUtil.getCommitTime()); 23 | 24 | return versionPo; 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/main/java/com/genersoft/iot/vmp/conf/WVPTimerTask.java: -------------------------------------------------------------------------------- 1 | package com.genersoft.iot.vmp.conf; 2 | 3 | import com.genersoft.iot.vmp.common.ServerInfo; 4 | import com.genersoft.iot.vmp.storager.IRedisCatchStorage; 5 | import org.springframework.beans.factory.annotation.Autowired; 6 | import org.springframework.beans.factory.annotation.Value; 7 | import org.springframework.scheduling.annotation.Scheduled; 8 | import org.springframework.stereotype.Component; 9 | 10 | import java.util.concurrent.TimeUnit; 11 | 12 | @Component 13 | public class WVPTimerTask { 14 | 15 | @Autowired 16 | private IRedisCatchStorage redisCatchStorage; 17 | 18 | @Value("${server.port}") 19 | private int serverPort; 20 | 21 | @Autowired 22 | private SipConfig sipConfig; 23 | 24 | @Scheduled(fixedDelay = 2, timeUnit = TimeUnit.SECONDS) //每3秒执行一次 25 | public void execute(){ 26 | redisCatchStorage.updateWVPInfo(ServerInfo.create(sipConfig.getShowIp(), serverPort), 3); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/com/genersoft/iot/vmp/conf/exception/ControllerException.java: -------------------------------------------------------------------------------- 1 | package com.genersoft.iot.vmp.conf.exception; 2 | 3 | import com.genersoft.iot.vmp.vmanager.bean.ErrorCode; 4 | 5 | /** 6 | * 自定义异常,controller出现错误时直接抛出异常由全局异常捕获并返回结果 7 | */ 8 | public class ControllerException extends RuntimeException{ 9 | 10 | private int code; 11 | private String msg; 12 | 13 | public ControllerException(int code, String msg) { 14 | this.code = code; 15 | this.msg = msg; 16 | } 17 | public ControllerException(ErrorCode errorCode) { 18 | this.code = errorCode.getCode(); 19 | this.msg = errorCode.getMsg(); 20 | } 21 | 22 | public int getCode() { 23 | return code; 24 | } 25 | 26 | public void setCode(int code) { 27 | this.code = code; 28 | } 29 | 30 | public String getMsg() { 31 | return msg; 32 | } 33 | 34 | public void setMsg(String msg) { 35 | this.msg = msg; 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /src/main/java/com/genersoft/iot/vmp/conf/exception/ServiceException.java: -------------------------------------------------------------------------------- 1 | package com.genersoft.iot.vmp.conf.exception; 2 | 3 | /** 4 | * @author lin 5 | */ 6 | public class ServiceException extends Exception{ 7 | private String msg; 8 | 9 | 10 | 11 | public ServiceException(String msg) { 12 | this.msg = msg; 13 | } 14 | 15 | public String getMsg() { 16 | return msg; 17 | } 18 | 19 | public void setMsg(String msg) { 20 | this.msg = msg; 21 | } 22 | 23 | @Override 24 | public String getMessage() { 25 | return msg; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/main/java/com/genersoft/iot/vmp/conf/redis/bean/RedisRpcClassHandler.java: -------------------------------------------------------------------------------- 1 | package com.genersoft.iot.vmp.conf.redis.bean; 2 | 3 | import com.genersoft.iot.vmp.service.redisMsg.dto.RpcController; 4 | import lombok.Data; 5 | 6 | import java.lang.reflect.Method; 7 | 8 | @Data 9 | public class RedisRpcClassHandler { 10 | 11 | private RpcController controller; 12 | private Method method; 13 | 14 | public RedisRpcClassHandler(RpcController controller, Method method) { 15 | this.controller = controller; 16 | this.method = method; 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/com/genersoft/iot/vmp/conf/redis/bean/RedisRpcMessage.java: -------------------------------------------------------------------------------- 1 | package com.genersoft.iot.vmp.conf.redis.bean; 2 | 3 | public class RedisRpcMessage { 4 | 5 | private RedisRpcRequest request; 6 | 7 | private RedisRpcResponse response; 8 | 9 | public RedisRpcRequest getRequest() { 10 | return request; 11 | } 12 | 13 | public void setRequest(RedisRpcRequest request) { 14 | this.request = request; 15 | } 16 | 17 | public RedisRpcResponse getResponse() { 18 | return response; 19 | } 20 | 21 | public void setResponse(RedisRpcResponse response) { 22 | this.response = response; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/main/java/com/genersoft/iot/vmp/conf/security/LogoutHandler.java: -------------------------------------------------------------------------------- 1 | package com.genersoft.iot.vmp.conf.security; 2 | 3 | import lombok.extern.slf4j.Slf4j; 4 | import org.springframework.security.core.Authentication; 5 | import org.springframework.security.web.authentication.logout.LogoutSuccessHandler; 6 | import org.springframework.stereotype.Component; 7 | 8 | import javax.servlet.ServletException; 9 | import javax.servlet.http.HttpServletRequest; 10 | import javax.servlet.http.HttpServletResponse; 11 | import java.io.IOException; 12 | 13 | /** 14 | * 退出登录成功 15 | */ 16 | @Slf4j 17 | @Component 18 | public class LogoutHandler implements LogoutSuccessHandler { 19 | 20 | @Override 21 | public void onLogoutSuccess(HttpServletRequest request, HttpServletResponse httpServletResponse, Authentication authentication) throws IOException, ServletException { 22 | String username = request.getParameter("username"); 23 | log.info("[退出登录成功] - [{}]", username); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /src/main/java/com/genersoft/iot/vmp/conf/webLog/WebSocketAppender.java: -------------------------------------------------------------------------------- 1 | package com.genersoft.iot.vmp.conf.webLog; 2 | 3 | import ch.qos.logback.classic.encoder.PatternLayoutEncoder; 4 | import ch.qos.logback.classic.spi.ILoggingEvent; 5 | import ch.qos.logback.core.AppenderBase; 6 | import lombok.Data; 7 | import lombok.EqualsAndHashCode; 8 | 9 | import java.nio.charset.StandardCharsets; 10 | 11 | @Data 12 | @EqualsAndHashCode(callSuper = true) 13 | public class WebSocketAppender extends AppenderBase { 14 | 15 | private PatternLayoutEncoder encoder; 16 | 17 | @Override 18 | protected void append(ILoggingEvent loggingEvent) { 19 | byte[] data = this.encoder.encode(loggingEvent); 20 | // Push to client. 21 | // LogChannel.push(DateUtil.timestampMsTo_yyyy_MM_dd_HH_mm_ss(loggingEvent.getTimeStamp()) + " " + loggingEvent.getFormattedMessage()); 22 | LogChannel.push(new String(data, StandardCharsets.UTF_8)); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/main/java/com/genersoft/iot/vmp/conf/websocket/WebSocketConfig.java: -------------------------------------------------------------------------------- 1 | package com.genersoft.iot.vmp.conf.websocket; 2 | 3 | import com.genersoft.iot.vmp.conf.webLog.LogChannel; 4 | import org.springframework.context.annotation.Bean; 5 | import org.springframework.context.annotation.Configuration; 6 | import org.springframework.web.socket.server.standard.ServerEndpointExporter; 7 | 8 | @Configuration 9 | public class WebSocketConfig { 10 | 11 | @Bean 12 | public ServerEndpointExporter serverEndpointExporter(){ 13 | ServerEndpointExporter endpointExporter = new ServerEndpointExporter(); 14 | 15 | endpointExporter.setAnnotatedEndpointClasses(LogChannel.class); 16 | 17 | return endpointExporter; 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/com/genersoft/iot/vmp/gb28181/bean/AlarmChannelMessage.java: -------------------------------------------------------------------------------- 1 | package com.genersoft.iot.vmp.gb28181.bean; 2 | 3 | 4 | import lombok.Data; 5 | 6 | /** 7 | * 通过redis分发报警消息 8 | */ 9 | @Data 10 | public class AlarmChannelMessage { 11 | /** 12 | * 通道国标编号 13 | */ 14 | private String gbId; 15 | 16 | /** 17 | * 报警编号 18 | */ 19 | private int alarmSn; 20 | 21 | /** 22 | * 告警类型 23 | */ 24 | private int alarmType; 25 | 26 | /** 27 | * 报警描述 28 | */ 29 | private String alarmDescription; 30 | } 31 | -------------------------------------------------------------------------------- /src/main/java/com/genersoft/iot/vmp/gb28181/bean/AudioBroadcastCatchStatus.java: -------------------------------------------------------------------------------- 1 | package com.genersoft.iot.vmp.gb28181.bean; 2 | 3 | /** 4 | * 语音广播状态 5 | * @author lin 6 | */ 7 | public enum AudioBroadcastCatchStatus { 8 | 9 | // 发送语音广播消息等待对方回复语音广播 10 | Ready, 11 | // 收到回复等待invite消息 12 | WaiteInvite, 13 | // 收到invite消息 14 | Ok, 15 | } 16 | -------------------------------------------------------------------------------- /src/main/java/com/genersoft/iot/vmp/gb28181/bean/BaiduPoint.java: -------------------------------------------------------------------------------- 1 | package com.genersoft.iot.vmp.gb28181.bean; 2 | 3 | public class BaiduPoint { 4 | 5 | String bdLng; 6 | 7 | String bdLat; 8 | 9 | public String getBdLng() { 10 | return bdLng; 11 | } 12 | 13 | public void setBdLng(String bdLng) { 14 | this.bdLng = bdLng; 15 | } 16 | 17 | public String getBdLat() { 18 | return bdLat; 19 | } 20 | 21 | public void setBdLat(String bdLat) { 22 | this.bdLat = bdLat; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/main/java/com/genersoft/iot/vmp/gb28181/bean/CatalogData.java: -------------------------------------------------------------------------------- 1 | package com.genersoft.iot.vmp.gb28181.bean; 2 | 3 | import lombok.Data; 4 | 5 | import java.time.Instant; 6 | import java.util.HashSet; 7 | import java.util.Set; 8 | 9 | /** 10 | * @author lin 11 | */ 12 | @Data 13 | public class CatalogData { 14 | /** 15 | * 命令序列号 16 | */ 17 | private int sn; 18 | private Integer total; 19 | private Instant time; 20 | private Device device; 21 | private String errorMsg; 22 | private Set redisKeysForChannel = new HashSet<>(); 23 | private Set errorChannel = new HashSet<>(); 24 | private Set redisKeysForRegion = new HashSet<>(); 25 | private Set redisKeysForGroup = new HashSet<>(); 26 | 27 | public enum CatalogDataStatus{ 28 | ready, runIng, end 29 | } 30 | private CatalogDataStatus status; 31 | 32 | } 33 | -------------------------------------------------------------------------------- /src/main/java/com/genersoft/iot/vmp/gb28181/bean/ChannelIdType.java: -------------------------------------------------------------------------------- 1 | package com.genersoft.iot.vmp.gb28181.bean; 2 | 3 | /** 4 | * 国标类型编码,国标编码中11-13位为类型编码 5 | * 详见 附 录 D 编码规则 A 6 | * @author lin 7 | */ 8 | public class ChannelIdType { 9 | /** 10 | * 中心信令控制服务器编码 11 | */ 12 | public final static String CENTRAL_SIGNALING_CONTROL_SERVER = "200"; 13 | 14 | /** 15 | * 业务分组编码 16 | */ 17 | public final static String BUSINESS_GROUP = "215"; 18 | 19 | /** 20 | * 虚拟组织编码 21 | */ 22 | public final static String VIRTUAL_ORGANIZATION = "216"; 23 | } 24 | -------------------------------------------------------------------------------- /src/main/java/com/genersoft/iot/vmp/gb28181/bean/CmdType.java: -------------------------------------------------------------------------------- 1 | package com.genersoft.iot.vmp.gb28181.bean; 2 | 3 | public class CmdType { 4 | 5 | public static final String CATALOG = "Catalog"; 6 | public static final String ALARM = "Alarm"; 7 | public static final String MOBILE_POSITION = "MobilePosition"; 8 | } 9 | -------------------------------------------------------------------------------- /src/main/java/com/genersoft/iot/vmp/gb28181/bean/DeviceChannelInPlatform.java: -------------------------------------------------------------------------------- 1 | package com.genersoft.iot.vmp.gb28181.bean; 2 | 3 | public class DeviceChannelInPlatform extends DeviceChannel{ 4 | 5 | private String platFormId; 6 | private String catalogId; 7 | 8 | public String getPlatFormId() { 9 | return platFormId; 10 | } 11 | 12 | public void setPlatFormId(String platFormId) { 13 | this.platFormId = platFormId; 14 | } 15 | 16 | public String getCatalogId() { 17 | return catalogId; 18 | } 19 | 20 | public void setCatalogId(String catalogId) { 21 | this.catalogId = catalogId; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/main/java/com/genersoft/iot/vmp/gb28181/bean/DeviceNotFoundEvent.java: -------------------------------------------------------------------------------- 1 | package com.genersoft.iot.vmp.gb28181.bean; 2 | 3 | import lombok.Data; 4 | 5 | import javax.sip.Dialog; 6 | import java.util.EventObject; 7 | 8 | @Data 9 | public class DeviceNotFoundEvent { 10 | 11 | private String callId; 12 | 13 | public DeviceNotFoundEvent(String callId) { 14 | this.callId = callId; 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /src/main/java/com/genersoft/iot/vmp/gb28181/bean/DragZoomRequest.java: -------------------------------------------------------------------------------- 1 | package com.genersoft.iot.vmp.gb28181.bean; 2 | 3 | import com.genersoft.iot.vmp.gb28181.utils.MessageElement; 4 | import lombok.Data; 5 | 6 | /** 7 | * 设备信息查询响应 8 | * 9 | * @author Y.G 10 | * @version 1.0 11 | * @date 2022/6/28 14:55 12 | */ 13 | @Data 14 | public class DragZoomRequest { 15 | /** 16 | * 序列号 17 | */ 18 | @MessageElement("SN") 19 | private String sn; 20 | 21 | @MessageElement("DeviceID") 22 | private String deviceId; 23 | 24 | @MessageElement(value = "DragZoomIn") 25 | private DragZoomParam dragZoomIn; 26 | 27 | @MessageElement(value = "DragZoomOut") 28 | private DragZoomParam dragZoomOut; 29 | 30 | } 31 | -------------------------------------------------------------------------------- /src/main/java/com/genersoft/iot/vmp/gb28181/bean/FrontEndControlCodeForAuxiliary.java: -------------------------------------------------------------------------------- 1 | package com.genersoft.iot.vmp.gb28181.bean; 2 | 3 | 4 | import lombok.Getter; 5 | import lombok.Setter; 6 | 7 | public class FrontEndControlCodeForAuxiliary implements IFrontEndControlCode { 8 | 9 | private final FrontEndControlType type = FrontEndControlType.AUXILIARY; 10 | 11 | @Override 12 | public FrontEndControlType getType() { 13 | return type; 14 | } 15 | 16 | /** 17 | * 辅助开关控制指令: 1为开, 2为关, 3为设置自动扫描右边界, 4为设置自动扫描速度 18 | */ 19 | @Getter 20 | @Setter 21 | private Integer code; 22 | 23 | /** 24 | * 辅助开关编号 25 | */ 26 | @Getter 27 | @Setter 28 | private Integer auxiliaryId; 29 | 30 | @Override 31 | public String encode() { 32 | return ""; 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /src/main/java/com/genersoft/iot/vmp/gb28181/bean/FrontEndControlCodeForFI.java: -------------------------------------------------------------------------------- 1 | package com.genersoft.iot.vmp.gb28181.bean; 2 | 3 | 4 | import lombok.Getter; 5 | import lombok.Setter; 6 | 7 | public class FrontEndControlCodeForFI implements IFrontEndControlCode { 8 | 9 | private final FrontEndControlType type = FrontEndControlType.FI; 10 | 11 | @Override 12 | public FrontEndControlType getType() { 13 | return type; 14 | } 15 | 16 | /** 17 | * 光圈,0为缩小 1为放大 18 | */ 19 | @Getter 20 | @Setter 21 | private Integer iris; 22 | 23 | /** 24 | * 聚焦 0 近, 1远 25 | */ 26 | @Getter 27 | @Setter 28 | private Integer focus; 29 | 30 | /** 31 | * 聚焦速度 32 | */ 33 | @Getter 34 | @Setter 35 | private Integer focusSpeed; 36 | 37 | /** 38 | * 光圈速度 39 | */ 40 | @Getter 41 | @Setter 42 | private Integer irisSpeed; 43 | 44 | @Override 45 | public String encode() { 46 | return ""; 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /src/main/java/com/genersoft/iot/vmp/gb28181/bean/FrontEndControlCodeForPreset.java: -------------------------------------------------------------------------------- 1 | package com.genersoft.iot.vmp.gb28181.bean; 2 | 3 | 4 | import lombok.Getter; 5 | import lombok.Setter; 6 | 7 | public class FrontEndControlCodeForPreset implements IFrontEndControlCode { 8 | 9 | private final FrontEndControlType type = FrontEndControlType.PRESET; 10 | 11 | @Override 12 | public FrontEndControlType getType() { 13 | return type; 14 | } 15 | 16 | /** 17 | * 预置位指令: 1为设置预置位, 2为调用预置位, 3为删除预置位 18 | */ 19 | @Getter 20 | @Setter 21 | private Integer code; 22 | 23 | /** 24 | * 预置位编号 25 | */ 26 | @Getter 27 | @Setter 28 | private Integer presetId; 29 | 30 | 31 | @Override 32 | public String encode() { 33 | return ""; 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /src/main/java/com/genersoft/iot/vmp/gb28181/bean/FrontEndControlCodeForScan.java: -------------------------------------------------------------------------------- 1 | package com.genersoft.iot.vmp.gb28181.bean; 2 | 3 | 4 | import lombok.Getter; 5 | import lombok.Setter; 6 | 7 | public class FrontEndControlCodeForScan implements IFrontEndControlCode { 8 | 9 | private final FrontEndControlType type = FrontEndControlType.SCAN; 10 | 11 | @Override 12 | public FrontEndControlType getType() { 13 | return type; 14 | } 15 | 16 | /** 17 | * 预置位指令: 1为开始自动扫描, 2为设置自动扫描左边界, 3为设置自动扫描右边界, 4为设置自动扫描速度 18 | */ 19 | @Getter 20 | @Setter 21 | private Integer code; 22 | 23 | /** 24 | * 自动扫描速度 25 | */ 26 | @Getter 27 | @Setter 28 | private Integer scanSpeed; 29 | 30 | /** 31 | * 扫描组号 32 | */ 33 | @Getter 34 | @Setter 35 | private Integer scanId; 36 | 37 | @Override 38 | public String encode() { 39 | return ""; 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /src/main/java/com/genersoft/iot/vmp/gb28181/bean/FrontEndControlType.java: -------------------------------------------------------------------------------- 1 | package com.genersoft.iot.vmp.gb28181.bean; 2 | 3 | public enum FrontEndControlType { 4 | 5 | PTZ,FI,PRESET,TOUR,SCAN,AUXILIARY 6 | } 7 | -------------------------------------------------------------------------------- /src/main/java/com/genersoft/iot/vmp/gb28181/bean/GbStringMsgParserFactory.java: -------------------------------------------------------------------------------- 1 | package com.genersoft.iot.vmp.gb28181.bean; 2 | 3 | import gov.nist.javax.sip.parser.MessageParser; 4 | import gov.nist.javax.sip.parser.MessageParserFactory; 5 | import gov.nist.javax.sip.stack.SIPTransactionStack; 6 | 7 | public class GbStringMsgParserFactory implements MessageParserFactory { 8 | 9 | /** 10 | * msg parser is completely stateless, reuse isntance for the whole stack 11 | * fixes https://github.com/RestComm/jain-sip/issues/92 12 | */ 13 | private static GBStringMsgParser msgParser = new GBStringMsgParser(); 14 | /* 15 | * (non-Javadoc) 16 | * @see gov.nist.javax.sip.parser.MessageParserFactory#createMessageParser(gov.nist.javax.sip.stack.SIPTransactionStack) 17 | */ 18 | public MessageParser createMessageParser(SIPTransactionStack stack) { 19 | return msgParser; 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/main/java/com/genersoft/iot/vmp/gb28181/bean/GroupTree.java: -------------------------------------------------------------------------------- 1 | package com.genersoft.iot.vmp.gb28181.bean; 2 | 3 | import io.swagger.v3.oas.annotations.media.Schema; 4 | import lombok.Data; 5 | import lombok.EqualsAndHashCode; 6 | 7 | /** 8 | * 业务分组 9 | */ 10 | @EqualsAndHashCode(callSuper = true) 11 | @Data 12 | @Schema(description = "业务分组树") 13 | public class GroupTree extends Group{ 14 | 15 | @Schema(description = "树节点ID") 16 | private String treeId; 17 | 18 | @Schema(description = "是否有子节点") 19 | private boolean isLeaf; 20 | 21 | @Schema(description = "类型, 行政区划:0 摄像头: 1") 22 | private int type; 23 | 24 | @Schema(description = "在线状态") 25 | private String status; 26 | 27 | } 28 | -------------------------------------------------------------------------------- /src/main/java/com/genersoft/iot/vmp/gb28181/bean/Host.java: -------------------------------------------------------------------------------- 1 | package com.genersoft.iot.vmp.gb28181.bean; 2 | 3 | 4 | 5 | public class Host { 6 | 7 | private String ip; 8 | private int port; 9 | private String address; 10 | 11 | 12 | public String getIp() { 13 | return ip; 14 | } 15 | 16 | public void setIp(String ip) { 17 | this.ip = ip; 18 | } 19 | 20 | public int getPort() { 21 | return port; 22 | } 23 | 24 | public void setPort(int port) { 25 | this.port = port; 26 | } 27 | 28 | public String getAddress() { 29 | return address; 30 | } 31 | 32 | public void setAddress(String address) { 33 | this.address = address; 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /src/main/java/com/genersoft/iot/vmp/gb28181/bean/IFrontEndControlCode.java: -------------------------------------------------------------------------------- 1 | package com.genersoft.iot.vmp.gb28181.bean; 2 | 3 | public interface IFrontEndControlCode { 4 | 5 | FrontEndControlType getType(); 6 | String encode(); 7 | } 8 | -------------------------------------------------------------------------------- /src/main/java/com/genersoft/iot/vmp/gb28181/bean/InviteDecodeException.java: -------------------------------------------------------------------------------- 1 | package com.genersoft.iot.vmp.gb28181.bean; 2 | 3 | import lombok.Data; 4 | 5 | @Data 6 | public class InviteDecodeException extends RuntimeException{ 7 | private int code; 8 | private String msg; 9 | 10 | public InviteDecodeException(int code, String msg) { 11 | this.code = code; 12 | this.msg = msg; 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/main/java/com/genersoft/iot/vmp/gb28181/bean/InviteMessageInfo.java: -------------------------------------------------------------------------------- 1 | package com.genersoft.iot.vmp.gb28181.bean; 2 | 3 | import lombok.Data; 4 | 5 | // 从INVITE消息中解析需要的信息 6 | @Data 7 | public class InviteMessageInfo { 8 | private String requesterId; 9 | private String targetChannelId; 10 | private String sourceChannelId; 11 | private String sessionName; 12 | private String ssrc; 13 | private boolean tcp; 14 | private boolean tcpActive; 15 | private String callId; 16 | private Long startTime; 17 | private Long stopTime; 18 | private String downloadSpeed; 19 | private String ip; 20 | private int port; 21 | 22 | } 23 | -------------------------------------------------------------------------------- /src/main/java/com/genersoft/iot/vmp/gb28181/bean/InviteStreamCallback.java: -------------------------------------------------------------------------------- 1 | package com.genersoft.iot.vmp.gb28181.bean; 2 | 3 | public interface InviteStreamCallback { 4 | void call(InviteStreamInfo inviteStreamInfo); 5 | } 6 | -------------------------------------------------------------------------------- /src/main/java/com/genersoft/iot/vmp/gb28181/bean/InviteStreamType.java: -------------------------------------------------------------------------------- 1 | package com.genersoft.iot.vmp.gb28181.bean; 2 | 3 | public enum InviteStreamType { 4 | 5 | PLAY,PLAYBACK,DOWNLOAD,PUSH,PROXY,CLOUD_RECORD_PUSH,CLOUD_RECORD_PROXY,BROADCAST,TALK 6 | 7 | 8 | } 9 | -------------------------------------------------------------------------------- /src/main/java/com/genersoft/iot/vmp/gb28181/bean/NotifyCatalogChannel.java: -------------------------------------------------------------------------------- 1 | package com.genersoft.iot.vmp.gb28181.bean; 2 | 3 | 4 | public class NotifyCatalogChannel { 5 | 6 | private Type type; 7 | 8 | private DeviceChannel channel; 9 | 10 | 11 | public enum Type { 12 | ADD, DELETE, UPDATE, STATUS_CHANGED 13 | } 14 | 15 | 16 | public static NotifyCatalogChannel getInstance(Type type, DeviceChannel channel) { 17 | NotifyCatalogChannel notifyCatalogChannel = new NotifyCatalogChannel(); 18 | notifyCatalogChannel.setType(type); 19 | notifyCatalogChannel.setChannel(channel); 20 | return notifyCatalogChannel; 21 | } 22 | 23 | public Type getType() { 24 | return type; 25 | } 26 | 27 | public void setType(Type type) { 28 | this.type = type; 29 | } 30 | 31 | public DeviceChannel getChannel() { 32 | return channel; 33 | } 34 | 35 | public void setChannel(DeviceChannel channel) { 36 | this.channel = channel; 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/main/java/com/genersoft/iot/vmp/gb28181/bean/OpenRTPServerResult.java: -------------------------------------------------------------------------------- 1 | package com.genersoft.iot.vmp.gb28181.bean; 2 | 3 | import com.genersoft.iot.vmp.media.event.hook.HookData; 4 | import com.genersoft.iot.vmp.service.bean.SSRCInfo; 5 | import lombok.Data; 6 | 7 | @Data 8 | public class OpenRTPServerResult { 9 | 10 | private SSRCInfo ssrcInfo; 11 | private HookData hookData; 12 | } 13 | -------------------------------------------------------------------------------- /src/main/java/com/genersoft/iot/vmp/gb28181/bean/PlatformCatch.java: -------------------------------------------------------------------------------- 1 | package com.genersoft.iot.vmp.gb28181.bean; 2 | 3 | import lombok.Data; 4 | 5 | @Data 6 | public class PlatformCatch { 7 | 8 | private String id; 9 | 10 | /** 11 | * 心跳未回复次数 12 | */ 13 | private int keepAliveReply; 14 | 15 | // 注册未回复次数 16 | private int registerAliveReply; 17 | 18 | private String callId; 19 | 20 | private Platform platform; 21 | 22 | private SipTransactionInfo sipTransactionInfo; 23 | 24 | } 25 | -------------------------------------------------------------------------------- /src/main/java/com/genersoft/iot/vmp/gb28181/bean/PlatformGbStream.java: -------------------------------------------------------------------------------- 1 | package com.genersoft.iot.vmp.gb28181.bean; 2 | 3 | import io.swagger.v3.oas.annotations.media.Schema; 4 | 5 | public class PlatformGbStream { 6 | 7 | @Schema(description = "ID") 8 | private int gbStreamId; 9 | 10 | @Schema(description = "平台ID") 11 | private String platformId; 12 | 13 | @Schema(description = "目录ID") 14 | private String catalogId; 15 | 16 | public Integer getGbStreamId() { 17 | return gbStreamId; 18 | } 19 | 20 | public void setGbStreamId(Integer gbStreamId) { 21 | this.gbStreamId = gbStreamId; 22 | } 23 | 24 | public String getPlatformId() { 25 | return platformId; 26 | } 27 | 28 | public void setPlatformId(String platformId) { 29 | this.platformId = platformId; 30 | } 31 | 32 | public String getCatalogId() { 33 | return catalogId; 34 | } 35 | 36 | public void setCatalogId(String catalogId) { 37 | this.catalogId = catalogId; 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /src/main/java/com/genersoft/iot/vmp/gb28181/bean/PlatformKeepaliveCallback.java: -------------------------------------------------------------------------------- 1 | package com.genersoft.iot.vmp.gb28181.bean; 2 | 3 | public interface PlatformKeepaliveCallback { 4 | public void run(String platformServerGbId, int failCount); 5 | } 6 | -------------------------------------------------------------------------------- /src/main/java/com/genersoft/iot/vmp/gb28181/bean/PlatformRegister.java: -------------------------------------------------------------------------------- 1 | package com.genersoft.iot.vmp.gb28181.bean; 2 | 3 | public class PlatformRegister { 4 | 5 | // 未回复次数 6 | private int reply; 7 | 8 | public int getReply() { 9 | return reply; 10 | } 11 | 12 | public void setReply(int reply) { 13 | this.reply = reply; 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/main/java/com/genersoft/iot/vmp/gb28181/bean/PlayException.java: -------------------------------------------------------------------------------- 1 | package com.genersoft.iot.vmp.gb28181.bean; 2 | 3 | import lombok.Data; 4 | 5 | @Data 6 | public class PlayException extends RuntimeException{ 7 | private int code; 8 | private String msg; 9 | 10 | public PlayException(int code, String msg) { 11 | this.code = code; 12 | this.msg = msg; 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/main/java/com/genersoft/iot/vmp/gb28181/bean/Preset.java: -------------------------------------------------------------------------------- 1 | package com.genersoft.iot.vmp.gb28181.bean; 2 | 3 | 4 | import lombok.Data; 5 | 6 | @Data 7 | public class Preset { 8 | 9 | private String presetId; 10 | 11 | private String presetName; 12 | } 13 | -------------------------------------------------------------------------------- /src/main/java/com/genersoft/iot/vmp/gb28181/bean/RegionTree.java: -------------------------------------------------------------------------------- 1 | package com.genersoft.iot.vmp.gb28181.bean; 2 | 3 | import io.swagger.v3.oas.annotations.media.Schema; 4 | import lombok.Data; 5 | import lombok.EqualsAndHashCode; 6 | 7 | /** 8 | * 区域 9 | */ 10 | @EqualsAndHashCode(callSuper = true) 11 | @Data 12 | @Schema(description = "区域树") 13 | public class RegionTree extends Region { 14 | 15 | @Schema(description = "树节点ID") 16 | private String treeId; 17 | 18 | @Schema(description = "是否有子节点") 19 | private boolean isLeaf; 20 | 21 | @Schema(description = "类型, 行政区划:0 摄像头: 1") 22 | private int type; 23 | 24 | @Schema(description = "在线状态") 25 | private String status; 26 | } 27 | -------------------------------------------------------------------------------- /src/main/java/com/genersoft/iot/vmp/gb28181/bean/SDPInfo.java: -------------------------------------------------------------------------------- 1 | package com.genersoft.iot.vmp.gb28181.bean; 2 | 3 | import javax.sdp.SessionDescription; 4 | 5 | public class SDPInfo { 6 | private byte[] source; 7 | private SessionDescription sdpSource; 8 | private String sessionName; 9 | private Long startTime; 10 | private Long stopTime; 11 | private String username; 12 | private String address; 13 | private String ssrc; 14 | } 15 | -------------------------------------------------------------------------------- /src/main/java/com/genersoft/iot/vmp/gb28181/bean/SyncStatus.java: -------------------------------------------------------------------------------- 1 | package com.genersoft.iot.vmp.gb28181.bean; 2 | 3 | import io.swagger.v3.oas.annotations.media.Schema; 4 | import lombok.Data; 5 | 6 | import java.time.Instant; 7 | 8 | /** 9 | * 摄像机同步状态 10 | * @author lin 11 | */ 12 | @Data 13 | @Schema(description = "摄像机同步状态") 14 | public class SyncStatus { 15 | 16 | @Schema(description = "总数") 17 | private Integer total; 18 | 19 | @Schema(description = "当前更新多少") 20 | private Integer current; 21 | 22 | @Schema(description = "错误描述") 23 | private String errorMsg; 24 | 25 | @Schema(description = "是否同步中") 26 | private Boolean syncIng; 27 | 28 | @Schema(description = "时间") 29 | private Instant time; 30 | 31 | } 32 | -------------------------------------------------------------------------------- /src/main/java/com/genersoft/iot/vmp/gb28181/controller/bean/AudioBroadcastEvent.java: -------------------------------------------------------------------------------- 1 | package com.genersoft.iot.vmp.gb28181.controller.bean; 2 | 3 | 4 | /** 5 | * @author lin 6 | */ 7 | public interface AudioBroadcastEvent { 8 | void call(String msg); 9 | } 10 | -------------------------------------------------------------------------------- /src/main/java/com/genersoft/iot/vmp/gb28181/controller/bean/ChannelToGroupByGbDeviceParam.java: -------------------------------------------------------------------------------- 1 | package com.genersoft.iot.vmp.gb28181.controller.bean; 2 | 3 | import lombok.Data; 4 | 5 | import java.util.List; 6 | 7 | @Data 8 | public class ChannelToGroupByGbDeviceParam { 9 | private List deviceIds; 10 | private String parentId; 11 | private String businessGroup; 12 | } 13 | -------------------------------------------------------------------------------- /src/main/java/com/genersoft/iot/vmp/gb28181/controller/bean/ChannelToGroupParam.java: -------------------------------------------------------------------------------- 1 | package com.genersoft.iot.vmp.gb28181.controller.bean; 2 | 3 | import lombok.Data; 4 | 5 | import java.util.List; 6 | 7 | @Data 8 | public class ChannelToGroupParam { 9 | 10 | private String parentId; 11 | private String businessGroup; 12 | private List channelIds; 13 | 14 | } 15 | -------------------------------------------------------------------------------- /src/main/java/com/genersoft/iot/vmp/gb28181/controller/bean/ChannelToRegionByGbDeviceParam.java: -------------------------------------------------------------------------------- 1 | package com.genersoft.iot.vmp.gb28181.controller.bean; 2 | 3 | import lombok.Data; 4 | 5 | import java.util.List; 6 | 7 | @Data 8 | public class ChannelToRegionByGbDeviceParam { 9 | private List deviceIds; 10 | private String civilCode; 11 | } 12 | -------------------------------------------------------------------------------- /src/main/java/com/genersoft/iot/vmp/gb28181/controller/bean/ChannelToRegionParam.java: -------------------------------------------------------------------------------- 1 | package com.genersoft.iot.vmp.gb28181.controller.bean; 2 | 3 | import io.swagger.v3.oas.annotations.media.Schema; 4 | import lombok.Data; 5 | 6 | import java.util.List; 7 | 8 | @Data 9 | @Schema(description="提交行政区划关联多个通道的参数") 10 | public class ChannelToRegionParam { 11 | 12 | @Schema(description = "行政区划编号") 13 | private String civilCode; 14 | 15 | @Schema(description = "选择的通道, 和all参数二选一") 16 | private List channelIds; 17 | 18 | @Schema(description = "所有通道, 和channelIds参数二选一") 19 | private Boolean all; 20 | 21 | } 22 | -------------------------------------------------------------------------------- /src/main/java/com/genersoft/iot/vmp/gb28181/controller/bean/UpdateChannelParam.java: -------------------------------------------------------------------------------- 1 | package com.genersoft.iot.vmp.gb28181.controller.bean; 2 | 3 | import io.swagger.v3.oas.annotations.media.Schema; 4 | import lombok.Data; 5 | 6 | import java.util.List; 7 | 8 | @Data 9 | @Schema(description = "通道关联参数") 10 | public class UpdateChannelParam { 11 | 12 | @Schema(description = "上级平台的数据库ID") 13 | private Integer platformId; 14 | 15 | 16 | @Schema(description = "关联所有通道") 17 | private boolean all; 18 | 19 | @Schema(description = "待关联的通道ID") 20 | List channelIds; 21 | 22 | @Schema(description = "待关联的设备ID") 23 | List deviceIds; 24 | } 25 | -------------------------------------------------------------------------------- /src/main/java/com/genersoft/iot/vmp/gb28181/event/alarm/AlarmEvent.java: -------------------------------------------------------------------------------- 1 | package com.genersoft.iot.vmp.gb28181.event.alarm; 2 | 3 | import com.genersoft.iot.vmp.gb28181.bean.DeviceAlarm; 4 | import org.springframework.context.ApplicationEvent; 5 | 6 | /** 7 | * @description: 报警事件 8 | * @author: lawrencehj 9 | * @data: 2021-01-20 10 | */ 11 | 12 | public class AlarmEvent extends ApplicationEvent { 13 | /** 14 | * 15 | */ 16 | private static final long serialVersionUID = 1L; 17 | 18 | public AlarmEvent(Object source) { 19 | super(source); 20 | } 21 | 22 | private DeviceAlarm deviceAlarm; 23 | 24 | public DeviceAlarm getAlarmInfo() { 25 | return deviceAlarm; 26 | } 27 | 28 | public void setAlarmInfo(DeviceAlarm deviceAlarm) { 29 | this.deviceAlarm = deviceAlarm; 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /src/main/java/com/genersoft/iot/vmp/gb28181/event/record/RecordInfoEndEvent.java: -------------------------------------------------------------------------------- 1 | package com.genersoft.iot.vmp.gb28181.event.record; 2 | 3 | import com.genersoft.iot.vmp.gb28181.bean.RecordInfo; 4 | import lombok.Getter; 5 | import lombok.Setter; 6 | import org.springframework.context.ApplicationEvent; 7 | 8 | /** 9 | * @description: 录像查询结束时间 10 | * @author: pan 11 | * @data: 2022-02-23 12 | */ 13 | @Setter 14 | @Getter 15 | public class RecordInfoEndEvent extends ApplicationEvent { 16 | /** 17 | * 18 | */ 19 | private static final long serialVersionUID = 1L; 20 | 21 | public RecordInfoEndEvent(Object source) { 22 | super(source); 23 | } 24 | 25 | private RecordInfo recordInfo; 26 | 27 | } 28 | -------------------------------------------------------------------------------- /src/main/java/com/genersoft/iot/vmp/gb28181/event/record/RecordInfoEvent.java: -------------------------------------------------------------------------------- 1 | package com.genersoft.iot.vmp.gb28181.event.record; 2 | 3 | import com.genersoft.iot.vmp.gb28181.bean.RecordInfo; 4 | import lombok.Getter; 5 | import lombok.Setter; 6 | import org.springframework.context.ApplicationEvent; 7 | 8 | /** 9 | * @description: 录像查询结束时间 10 | * @author: pan 11 | * @data: 2022-02-23 12 | */ 13 | 14 | @Setter 15 | @Getter 16 | public class RecordInfoEvent extends ApplicationEvent { 17 | /** 18 | * 19 | */ 20 | private static final long serialVersionUID = 1L; 21 | 22 | public RecordInfoEvent(Object source) { 23 | super(source); 24 | } 25 | 26 | private RecordInfo recordInfo; 27 | } 28 | -------------------------------------------------------------------------------- /src/main/java/com/genersoft/iot/vmp/gb28181/event/subscribe/mobilePosition/MobilePositionEvent.java: -------------------------------------------------------------------------------- 1 | package com.genersoft.iot.vmp.gb28181.event.subscribe.mobilePosition; 2 | 3 | import com.genersoft.iot.vmp.gb28181.bean.MobilePosition; 4 | import lombok.Getter; 5 | import lombok.Setter; 6 | import org.springframework.context.ApplicationEvent; 7 | 8 | 9 | public class MobilePositionEvent extends ApplicationEvent { 10 | public MobilePositionEvent(Object source) { 11 | super(source); 12 | } 13 | 14 | @Getter 15 | @Setter 16 | private MobilePosition mobilePosition; 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/com/genersoft/iot/vmp/gb28181/service/IGroupService.java: -------------------------------------------------------------------------------- 1 | package com.genersoft.iot.vmp.gb28181.service; 2 | 3 | import com.genersoft.iot.vmp.gb28181.bean.Group; 4 | import com.genersoft.iot.vmp.gb28181.bean.GroupTree; 5 | 6 | import java.util.List; 7 | 8 | 9 | public interface IGroupService { 10 | 11 | void add(Group group); 12 | 13 | void update(Group group); 14 | 15 | Group queryGroupByDeviceId(String regionDeviceId); 16 | 17 | List queryForTree(String query, Integer parent, Boolean hasChannel); 18 | 19 | void syncFromChannel(); 20 | 21 | boolean delete(int id); 22 | 23 | boolean batchAdd(List groupList); 24 | 25 | List getPath(String deviceId, String businessGroup); 26 | } 27 | -------------------------------------------------------------------------------- /src/main/java/com/genersoft/iot/vmp/gb28181/service/IPTZService.java: -------------------------------------------------------------------------------- 1 | package com.genersoft.iot.vmp.gb28181.service; 2 | 3 | 4 | import com.genersoft.iot.vmp.gb28181.bean.CommonGBChannel; 5 | import com.genersoft.iot.vmp.gb28181.bean.Device; 6 | import com.genersoft.iot.vmp.gb28181.bean.Preset; 7 | 8 | import java.util.List; 9 | 10 | public interface IPTZService { 11 | 12 | 13 | List queryPresetList(String deviceId, String channelDeviceId); 14 | 15 | void addPreset(Preset preset); 16 | 17 | void deletePreset(Integer qq); 18 | 19 | void ptz(Device device, String channelId, int cmdCode, int horizonSpeed, int verticalSpeed, int zoomSpeed); 20 | 21 | void frontEndCommand(Device device, String channelId, int cmdCode, int parameter1, int parameter2, int combindCode2); 22 | 23 | void frontEndCommand(CommonGBChannel channel, Integer cmdCode, Integer parameter1, Integer parameter2, Integer combindCode2); 24 | } 25 | -------------------------------------------------------------------------------- /src/main/java/com/genersoft/iot/vmp/gb28181/task/deviceStatus/DeviceStatusTaskInfo.java: -------------------------------------------------------------------------------- 1 | package com.genersoft.iot.vmp.gb28181.task.deviceStatus; 2 | 3 | import com.genersoft.iot.vmp.gb28181.bean.SipTransactionInfo; 4 | import lombok.Data; 5 | 6 | @Data 7 | public class DeviceStatusTaskInfo{ 8 | 9 | private String deviceId; 10 | 11 | private SipTransactionInfo transactionInfo; 12 | 13 | /** 14 | * 过期时间 15 | */ 16 | private long expireTime; 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/com/genersoft/iot/vmp/gb28181/task/deviceSubscribe/SubscribeTaskInfo.java: -------------------------------------------------------------------------------- 1 | package com.genersoft.iot.vmp.gb28181.task.deviceSubscribe; 2 | 3 | import com.genersoft.iot.vmp.gb28181.bean.SipTransactionInfo; 4 | import lombok.Data; 5 | 6 | @Data 7 | public class SubscribeTaskInfo { 8 | 9 | private String deviceId; 10 | 11 | private SipTransactionInfo transactionInfo; 12 | 13 | private String name; 14 | 15 | private String key; 16 | 17 | /** 18 | * 过期时间 19 | */ 20 | private long expireTime; 21 | 22 | } 23 | -------------------------------------------------------------------------------- /src/main/java/com/genersoft/iot/vmp/gb28181/task/platformStatus/PlatformRegisterTaskInfo.java: -------------------------------------------------------------------------------- 1 | package com.genersoft.iot.vmp.gb28181.task.platformStatus; 2 | 3 | import com.genersoft.iot.vmp.common.CommonCallback; 4 | import com.genersoft.iot.vmp.gb28181.bean.SipTransactionInfo; 5 | import lombok.Data; 6 | import lombok.Getter; 7 | import lombok.Setter; 8 | import lombok.extern.slf4j.Slf4j; 9 | import org.jetbrains.annotations.NotNull; 10 | 11 | import java.util.concurrent.Delayed; 12 | import java.util.concurrent.TimeUnit; 13 | 14 | /** 15 | * 平台注册任务可序列化的信息 16 | */ 17 | @Slf4j 18 | @Data 19 | public class PlatformRegisterTaskInfo{ 20 | 21 | private String platformServerId; 22 | 23 | private SipTransactionInfo sipTransactionInfo; 24 | 25 | /** 26 | * 过期时间 27 | */ 28 | private long expireTime; 29 | } 30 | -------------------------------------------------------------------------------- /src/main/java/com/genersoft/iot/vmp/gb28181/transmit/ISIPProcessorObserver.java: -------------------------------------------------------------------------------- 1 | package com.genersoft.iot.vmp.gb28181.transmit; 2 | 3 | import javax.sip.SipListener; 4 | 5 | public interface ISIPProcessorObserver extends SipListener { 6 | } 7 | -------------------------------------------------------------------------------- /src/main/java/com/genersoft/iot/vmp/gb28181/transmit/callback/RequestMessage.java: -------------------------------------------------------------------------------- 1 | package com.genersoft.iot.vmp.gb28181.transmit.callback; 2 | 3 | import lombok.Data; 4 | 5 | /** 6 | * @description: 请求信息定义 7 | * @author: swwheihei 8 | * @date: 2020年5月8日 下午1:09:18 9 | */ 10 | @Data 11 | public class RequestMessage { 12 | 13 | private String id; 14 | 15 | private String key; 16 | 17 | private Object data; 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/ISIPRequestProcessor.java: -------------------------------------------------------------------------------- 1 | package com.genersoft.iot.vmp.gb28181.transmit.event.request; 2 | 3 | import javax.sip.RequestEvent; 4 | 5 | /** 6 | * @description: 对SIP事件进行处理,包括request, response, timeout, ioException, transactionTerminated,dialogTerminated 7 | * @author: panlinlin 8 | * @date: 2021年11月5日 15:47 9 | */ 10 | public interface ISIPRequestProcessor { 11 | 12 | void process(RequestEvent event); 13 | 14 | } 15 | -------------------------------------------------------------------------------- /src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/IMessageHandler.java: -------------------------------------------------------------------------------- 1 | package com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message; 2 | 3 | import com.genersoft.iot.vmp.gb28181.bean.Device; 4 | import com.genersoft.iot.vmp.gb28181.bean.Platform; 5 | import org.dom4j.Element; 6 | 7 | import javax.sip.RequestEvent; 8 | 9 | public interface IMessageHandler { 10 | /** 11 | * 处理来自设备的信息 12 | * @param evt 13 | * @param device 14 | */ 15 | void handForDevice(RequestEvent evt, Device device, Element element); 16 | 17 | /** 18 | * 处理来自平台的信息 19 | * @param evt 20 | * @param parentPlatform 21 | */ 22 | void handForPlatform(RequestEvent evt, Platform parentPlatform, Element element); 23 | } 24 | -------------------------------------------------------------------------------- /src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/response/ISIPResponseProcessor.java: -------------------------------------------------------------------------------- 1 | package com.genersoft.iot.vmp.gb28181.transmit.event.response; 2 | 3 | import org.springframework.scheduling.annotation.Async; 4 | 5 | import javax.sip.ResponseEvent; 6 | 7 | /** 8 | * @description:处理接收IPCamera发来的SIP协议响应消息 9 | * @author: swwheihei 10 | * @date: 2020年5月3日 下午4:42:22 11 | */ 12 | public interface ISIPResponseProcessor { 13 | 14 | 15 | void process(ResponseEvent evt); 16 | 17 | 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/response/SIPResponseProcessorAbstract.java: -------------------------------------------------------------------------------- 1 | package com.genersoft.iot.vmp.gb28181.transmit.event.response; 2 | 3 | import org.springframework.beans.factory.InitializingBean; 4 | 5 | public abstract class SIPResponseProcessorAbstract implements InitializingBean, ISIPResponseProcessor { 6 | 7 | 8 | } 9 | -------------------------------------------------------------------------------- /src/main/java/com/genersoft/iot/vmp/gb28181/utils/MessageElement.java: -------------------------------------------------------------------------------- 1 | package com.genersoft.iot.vmp.gb28181.utils; 2 | 3 | import java.lang.annotation.*; 4 | 5 | /** 6 | * @author gaofuwang 7 | * @version 1.0 8 | * @date 2022/6/28 14:58 9 | */ 10 | @Target({ElementType.FIELD}) 11 | @Retention(RetentionPolicy.RUNTIME) 12 | @Documented 13 | public @interface MessageElement { 14 | String value(); 15 | 16 | String subVal() default ""; 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/com/genersoft/iot/vmp/gb28181/utils/MessageElementForCatalog.java: -------------------------------------------------------------------------------- 1 | package com.genersoft.iot.vmp.gb28181.utils; 2 | 3 | import java.lang.annotation.*; 4 | 5 | /** 6 | * @author gaofuwang 7 | * @version 1.0 8 | * @date 2022/6/28 14:58 9 | */ 10 | @Target({ElementType.FIELD}) 11 | @Retention(RetentionPolicy.RUNTIME) 12 | @Documented 13 | public @interface MessageElementForCatalog { 14 | String[] value(); 15 | 16 | String subVal() default ""; 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/com/genersoft/iot/vmp/jt1078/annotation/MsgId.java: -------------------------------------------------------------------------------- 1 | package com.genersoft.iot.vmp.jt1078.annotation; 2 | 3 | import java.lang.annotation.*; 4 | 5 | /** 6 | * @author QingtaiJiang 7 | * @date 2023/4/27 18:31 8 | * @email qingtaij@163.com 9 | */ 10 | @Target(ElementType.TYPE) 11 | @Retention(RetentionPolicy.RUNTIME) 12 | @Documented 13 | public @interface MsgId { 14 | String id(); 15 | } 16 | -------------------------------------------------------------------------------- /src/main/java/com/genersoft/iot/vmp/jt1078/proc/request/J0002.java: -------------------------------------------------------------------------------- 1 | package com.genersoft.iot.vmp.jt1078.proc.request; 2 | 3 | import com.genersoft.iot.vmp.jt1078.annotation.MsgId; 4 | import com.genersoft.iot.vmp.jt1078.proc.Header; 5 | import com.genersoft.iot.vmp.jt1078.proc.response.J8001; 6 | import com.genersoft.iot.vmp.jt1078.proc.response.Rs; 7 | import com.genersoft.iot.vmp.jt1078.session.Session; 8 | import io.netty.buffer.ByteBuf; 9 | 10 | /** 11 | * 终端心跳 12 | * 13 | * @author QingtaiJiang 14 | * @date 2023/4/27 18:04 15 | * @email qingtaij@163.com 16 | */ 17 | @MsgId(id = "0002") 18 | public class J0002 extends Re { 19 | @Override 20 | protected Rs decode0(ByteBuf buf, Header header, Session session) { 21 | return null; 22 | } 23 | 24 | @Override 25 | protected Rs handler(Header header, Session session) { 26 | J8001 j8001 = new J8001(); 27 | j8001.setRespNo(header.getSn()); 28 | j8001.setRespId(header.getMsgId()); 29 | j8001.setResult(J8001.SUCCESS); 30 | return j8001; 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/main/java/com/genersoft/iot/vmp/jt1078/proc/request/J0004.java: -------------------------------------------------------------------------------- 1 | package com.genersoft.iot.vmp.jt1078.proc.request; 2 | 3 | import com.genersoft.iot.vmp.jt1078.annotation.MsgId; 4 | import com.genersoft.iot.vmp.jt1078.proc.Header; 5 | import com.genersoft.iot.vmp.jt1078.proc.response.Rs; 6 | import com.genersoft.iot.vmp.jt1078.session.Session; 7 | import io.netty.buffer.ByteBuf; 8 | 9 | /** 10 | * 查询服务器时间 11 | * 12 | * @author QingtaiJiang 13 | * @date 2023/4/27 18:06 14 | * @email qingtaij@163.com 15 | */ 16 | @MsgId(id = "0004") 17 | public class J0004 extends Re { 18 | @Override 19 | protected Rs decode0(ByteBuf buf, Header header, Session session) { 20 | return null; 21 | } 22 | 23 | @Override 24 | protected Rs handler(Header header, Session session) { 25 | return null; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/main/java/com/genersoft/iot/vmp/jt1078/proc/request/J0200.java: -------------------------------------------------------------------------------- 1 | package com.genersoft.iot.vmp.jt1078.proc.request; 2 | 3 | import com.genersoft.iot.vmp.jt1078.annotation.MsgId; 4 | import com.genersoft.iot.vmp.jt1078.proc.Header; 5 | import com.genersoft.iot.vmp.jt1078.proc.response.J8001; 6 | import com.genersoft.iot.vmp.jt1078.proc.response.Rs; 7 | import com.genersoft.iot.vmp.jt1078.session.Session; 8 | import io.netty.buffer.ByteBuf; 9 | 10 | /** 11 | * 实时消息上报 12 | * 13 | * @author QingtaiJiang 14 | * @date 2023/4/27 18:06 15 | * @email qingtaij@163.com 16 | */ 17 | @MsgId(id = "0200") 18 | public class J0200 extends Re { 19 | @Override 20 | protected Rs decode0(ByteBuf buf, Header header, Session session) { 21 | return null; 22 | } 23 | 24 | @Override 25 | protected Rs handler(Header header, Session session) { 26 | J8001 j8001 = new J8001(); 27 | j8001.setRespNo(header.getSn()); 28 | j8001.setRespId(header.getMsgId()); 29 | j8001.setResult(J8001.SUCCESS); 30 | return j8001; 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/main/java/com/genersoft/iot/vmp/jt1078/proc/response/Rs.java: -------------------------------------------------------------------------------- 1 | package com.genersoft.iot.vmp.jt1078.proc.response; 2 | 3 | 4 | import com.genersoft.iot.vmp.jt1078.proc.Header; 5 | import io.netty.buffer.ByteBuf; 6 | 7 | 8 | /** 9 | * @author QingtaiJiang 10 | * @date 2021/8/30 18:54 11 | * @email qingtaij@163.com 12 | */ 13 | 14 | public abstract class Rs { 15 | private Header header; 16 | 17 | public abstract ByteBuf encode(); 18 | 19 | 20 | public Header getHeader() { 21 | return header; 22 | } 23 | 24 | public void setHeader(Header header) { 25 | this.header = header; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/main/java/com/genersoft/iot/vmp/media/event/hook/HookType.java: -------------------------------------------------------------------------------- 1 | package com.genersoft.iot.vmp.media.event.hook; 2 | 3 | /** 4 | * hook类型 5 | * @author lin 6 | */ 7 | 8 | public enum HookType { 9 | 10 | on_publish, 11 | on_record_mp4, 12 | on_media_arrival, 13 | on_media_departure, 14 | on_rtp_server_timeout, 15 | } 16 | -------------------------------------------------------------------------------- /src/main/java/com/genersoft/iot/vmp/media/event/media/MediaDepartureEvent.java: -------------------------------------------------------------------------------- 1 | package com.genersoft.iot.vmp.media.event.media; 2 | 3 | import com.genersoft.iot.vmp.media.bean.MediaServer; 4 | import com.genersoft.iot.vmp.media.zlm.dto.hook.OnStreamChangedHookParam; 5 | 6 | /** 7 | * 流离开事件 8 | */ 9 | public class MediaDepartureEvent extends MediaEvent { 10 | public MediaDepartureEvent(Object source) { 11 | super(source); 12 | } 13 | 14 | public static MediaDepartureEvent getInstance(Object source, OnStreamChangedHookParam hookParam, MediaServer mediaServer){ 15 | MediaDepartureEvent mediaDepartureEven = new MediaDepartureEvent(source); 16 | mediaDepartureEven.setApp(hookParam.getApp()); 17 | mediaDepartureEven.setStream(hookParam.getStream()); 18 | mediaDepartureEven.setSchema(hookParam.getSchema()); 19 | mediaDepartureEven.setMediaServer(mediaServer); 20 | return mediaDepartureEven; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/main/java/com/genersoft/iot/vmp/media/event/media/MediaNotFoundEvent.java: -------------------------------------------------------------------------------- 1 | package com.genersoft.iot.vmp.media.event.media; 2 | 3 | import com.genersoft.iot.vmp.media.bean.MediaServer; 4 | import com.genersoft.iot.vmp.media.zlm.dto.hook.OnStreamNotFoundHookParam; 5 | 6 | /** 7 | * 流未找到 8 | */ 9 | public class MediaNotFoundEvent extends MediaEvent { 10 | public MediaNotFoundEvent(Object source) { 11 | super(source); 12 | } 13 | 14 | public static MediaNotFoundEvent getInstance(Object source, OnStreamNotFoundHookParam hookParam, MediaServer mediaServer){ 15 | MediaNotFoundEvent mediaDepartureEven = new MediaNotFoundEvent(source); 16 | mediaDepartureEven.setApp(hookParam.getApp()); 17 | mediaDepartureEven.setStream(hookParam.getStream()); 18 | mediaDepartureEven.setSchema(hookParam.getSchema()); 19 | mediaDepartureEven.setMediaServer(mediaServer); 20 | return mediaDepartureEven; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/main/java/com/genersoft/iot/vmp/media/event/media/MediaRtpServerTimeoutEvent.java: -------------------------------------------------------------------------------- 1 | package com.genersoft.iot.vmp.media.event.media; 2 | 3 | import com.genersoft.iot.vmp.media.bean.MediaServer; 4 | import com.genersoft.iot.vmp.media.zlm.dto.hook.OnStreamChangedHookParam; 5 | 6 | /** 7 | * RtpServer收流超时事件 8 | */ 9 | public class MediaRtpServerTimeoutEvent extends MediaEvent { 10 | public MediaRtpServerTimeoutEvent(Object source) { 11 | super(source); 12 | } 13 | 14 | public static MediaRtpServerTimeoutEvent getInstance(Object source, OnStreamChangedHookParam hookParam, MediaServer mediaServer){ 15 | MediaRtpServerTimeoutEvent mediaDepartureEven = new MediaRtpServerTimeoutEvent(source); 16 | mediaDepartureEven.setApp(hookParam.getApp()); 17 | mediaDepartureEven.setStream(hookParam.getStream()); 18 | mediaDepartureEven.setSchema(hookParam.getSchema()); 19 | mediaDepartureEven.setMediaServer(mediaServer); 20 | return mediaDepartureEven; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/main/java/com/genersoft/iot/vmp/media/event/mediaServer/MediaServerDeleteEvent.java: -------------------------------------------------------------------------------- 1 | package com.genersoft.iot.vmp.media.event.mediaServer; 2 | 3 | /** 4 | * zlm在线事件 5 | */ 6 | public class MediaServerDeleteEvent extends MediaServerEventAbstract { 7 | 8 | public MediaServerDeleteEvent(Object source) { 9 | super(source); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /src/main/java/com/genersoft/iot/vmp/media/event/mediaServer/MediaServerEventAbstract.java: -------------------------------------------------------------------------------- 1 | package com.genersoft.iot.vmp.media.event.mediaServer; 2 | 3 | import com.genersoft.iot.vmp.media.bean.MediaServer; 4 | import lombok.Getter; 5 | import lombok.Setter; 6 | import org.springframework.context.ApplicationEvent; 7 | 8 | 9 | public abstract class MediaServerEventAbstract extends ApplicationEvent { 10 | 11 | 12 | private static final long serialVersionUID = 1L; 13 | 14 | @Getter 15 | @Setter 16 | private MediaServer mediaServer; 17 | 18 | 19 | public MediaServerEventAbstract(Object source) { 20 | super(source); 21 | } 22 | 23 | } 24 | -------------------------------------------------------------------------------- /src/main/java/com/genersoft/iot/vmp/media/event/mediaServer/MediaServerOfflineEvent.java: -------------------------------------------------------------------------------- 1 | package com.genersoft.iot.vmp.media.event.mediaServer; 2 | 3 | /** 4 | * zlm离线事件类 5 | */ 6 | public class MediaServerOfflineEvent extends MediaServerEventAbstract { 7 | 8 | public MediaServerOfflineEvent(Object source) { 9 | super(source); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /src/main/java/com/genersoft/iot/vmp/media/event/mediaServer/MediaServerOnlineEvent.java: -------------------------------------------------------------------------------- 1 | package com.genersoft.iot.vmp.media.event.mediaServer; 2 | 3 | /** 4 | * zlm在线事件 5 | */ 6 | public class MediaServerOnlineEvent extends MediaServerEventAbstract { 7 | 8 | public MediaServerOnlineEvent(Object source) { 9 | super(source); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /src/main/java/com/genersoft/iot/vmp/media/zlm/dto/ChannelOnlineEvent.java: -------------------------------------------------------------------------------- 1 | package com.genersoft.iot.vmp.media.zlm.dto; 2 | 3 | import com.genersoft.iot.vmp.gb28181.bean.SendRtpInfo; 4 | 5 | import java.text.ParseException; 6 | 7 | /** 8 | * @author lin 9 | */ 10 | public interface ChannelOnlineEvent { 11 | 12 | void run(SendRtpInfo sendRtpItem) throws ParseException; 13 | } 14 | -------------------------------------------------------------------------------- /src/main/java/com/genersoft/iot/vmp/media/zlm/dto/ServerKeepaliveData.java: -------------------------------------------------------------------------------- 1 | package com.genersoft.iot.vmp.media.zlm.dto; 2 | 3 | public class ServerKeepaliveData { 4 | } 5 | -------------------------------------------------------------------------------- /src/main/java/com/genersoft/iot/vmp/media/zlm/dto/ZLMRunInfo.java: -------------------------------------------------------------------------------- 1 | package com.genersoft.iot.vmp.media.zlm.dto; 2 | 3 | /** 4 | * 记录zlm运行中一些参数 5 | */ 6 | public class ZLMRunInfo { 7 | 8 | /** 9 | * zlm当前流数量 10 | */ 11 | private int mediaCount; 12 | 13 | /** 14 | * 在线状态 15 | */ 16 | private boolean online; 17 | 18 | public int getMediaCount() { 19 | return mediaCount; 20 | } 21 | 22 | public void setMediaCount(int mediaCount) { 23 | this.mediaCount = mediaCount; 24 | } 25 | 26 | public boolean isOnline() { 27 | return online; 28 | } 29 | 30 | public void setOnline(boolean online) { 31 | this.online = online; 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /src/main/java/com/genersoft/iot/vmp/media/zlm/dto/hook/HookParam.java: -------------------------------------------------------------------------------- 1 | package com.genersoft.iot.vmp.media.zlm.dto.hook; 2 | 3 | import lombok.Data; 4 | 5 | /** 6 | * zlm hook事件的参数 7 | * @author lin 8 | */ 9 | @Data 10 | public class HookParam { 11 | private String mediaServerId; 12 | 13 | } 14 | -------------------------------------------------------------------------------- /src/main/java/com/genersoft/iot/vmp/media/zlm/dto/hook/HookResult.java: -------------------------------------------------------------------------------- 1 | package com.genersoft.iot.vmp.media.zlm.dto.hook; 2 | 3 | public class HookResult { 4 | 5 | private int code; 6 | private String msg; 7 | 8 | 9 | public HookResult() { 10 | } 11 | 12 | public HookResult(int code, String msg) { 13 | this.code = code; 14 | this.msg = msg; 15 | } 16 | 17 | public static HookResult SUCCESS(){ 18 | return new HookResult(0, "success"); 19 | } 20 | 21 | public static HookResultForOnPublish Fail(){ 22 | return new HookResultForOnPublish(-1, "fail"); 23 | } 24 | 25 | public int getCode() { 26 | return code; 27 | } 28 | 29 | public void setCode(int code) { 30 | this.code = code; 31 | } 32 | 33 | public String getMsg() { 34 | return msg; 35 | } 36 | 37 | public void setMsg(String msg) { 38 | this.msg = msg; 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /src/main/java/com/genersoft/iot/vmp/media/zlm/dto/hook/OnSendRtpStoppedHookParam.java: -------------------------------------------------------------------------------- 1 | package com.genersoft.iot.vmp.media.zlm.dto.hook; 2 | 3 | /** 4 | * zlm hook事件中的on_send_rtp_stopped事件的参数 5 | * @author lin 6 | */ 7 | public class OnSendRtpStoppedHookParam extends HookParam{ 8 | private String app; 9 | private String stream; 10 | 11 | 12 | public String getApp() { 13 | return app; 14 | } 15 | 16 | public void setApp(String app) { 17 | this.app = app; 18 | } 19 | 20 | public String getStream() { 21 | return stream; 22 | } 23 | 24 | public void setStream(String stream) { 25 | this.stream = stream; 26 | } 27 | 28 | @Override 29 | public String toString() { 30 | return "OnSendRtpStoppedHookParam{" + 31 | "app='" + app + '\'' + 32 | ", stream='" + stream + '\'' + 33 | '}'; 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /src/main/java/com/genersoft/iot/vmp/media/zlm/dto/hook/OnServerKeepaliveHookParam.java: -------------------------------------------------------------------------------- 1 | package com.genersoft.iot.vmp.media.zlm.dto.hook; 2 | 3 | import com.genersoft.iot.vmp.media.zlm.dto.ServerKeepaliveData; 4 | 5 | /** 6 | * zlm hook事件中的on_play事件的参数 7 | * @author lin 8 | */ 9 | public class OnServerKeepaliveHookParam extends HookParam{ 10 | 11 | private ServerKeepaliveData data; 12 | 13 | public ServerKeepaliveData getData() { 14 | return data; 15 | } 16 | 17 | public void setData(ServerKeepaliveData data) { 18 | this.data = data; 19 | } 20 | 21 | @Override 22 | public String toString() { 23 | return "OnServerKeepaliveHookParam{" + 24 | "data=" + data + 25 | '}'; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/main/java/com/genersoft/iot/vmp/media/zlm/dto/hook/OriginType.java: -------------------------------------------------------------------------------- 1 | package com.genersoft.iot.vmp.media.zlm.dto.hook; 2 | 3 | public enum OriginType { 4 | // 不可调整顺序 5 | UNKNOWN("UNKNOWN"), 6 | RTMP_PUSH("PUSH"), 7 | RTSP_PUSH("PUSH"), 8 | RTP_PUSH("RTP"), 9 | PULL("PULL"), 10 | FFMPEG_PULL("PULL"), 11 | MP4_VOD("MP4_VOD"), 12 | DEVICE_CHN("DEVICE_CHN"), 13 | RTC_PUSH("PUSH"); 14 | 15 | private final String type; 16 | OriginType(String type) { 17 | this.type = type; 18 | } 19 | 20 | public String getType() { 21 | return type; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/main/java/com/genersoft/iot/vmp/media/zlm/event/HookZlmServerKeepaliveEvent.java: -------------------------------------------------------------------------------- 1 | package com.genersoft.iot.vmp.media.zlm.event; 2 | 3 | import com.genersoft.iot.vmp.media.bean.MediaServer; 4 | import org.springframework.context.ApplicationEvent; 5 | 6 | /** 7 | * zlm 心跳事件 8 | */ 9 | public class HookZlmServerKeepaliveEvent extends ApplicationEvent { 10 | 11 | public HookZlmServerKeepaliveEvent(Object source) { 12 | super(source); 13 | } 14 | 15 | private MediaServer mediaServerItem; 16 | 17 | public MediaServer getMediaServerItem() { 18 | return mediaServerItem; 19 | } 20 | 21 | public void setMediaServerItem(MediaServer mediaServerItem) { 22 | this.mediaServerItem = mediaServerItem; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/main/java/com/genersoft/iot/vmp/media/zlm/event/HookZlmServerStartEvent.java: -------------------------------------------------------------------------------- 1 | package com.genersoft.iot.vmp.media.zlm.event; 2 | 3 | import com.genersoft.iot.vmp.media.bean.MediaServer; 4 | import org.springframework.context.ApplicationEvent; 5 | 6 | /** 7 | * zlm server_start事件 8 | */ 9 | public class HookZlmServerStartEvent extends ApplicationEvent { 10 | 11 | public HookZlmServerStartEvent(Object source) { 12 | super(source); 13 | } 14 | 15 | private MediaServer mediaServerItem; 16 | 17 | public MediaServer getMediaServerItem() { 18 | return mediaServerItem; 19 | } 20 | 21 | public void setMediaServerItem(MediaServer mediaServerItem) { 22 | this.mediaServerItem = mediaServerItem; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/main/java/com/genersoft/iot/vmp/service/ILogService.java: -------------------------------------------------------------------------------- 1 | package com.genersoft.iot.vmp.service; 2 | 3 | import com.genersoft.iot.vmp.service.bean.LogFileInfo; 4 | 5 | import java.io.File; 6 | import java.util.List; 7 | 8 | public interface ILogService { 9 | List queryList(String query, String startTime, String endTime); 10 | 11 | File getFileByName(String fileName); 12 | } 13 | -------------------------------------------------------------------------------- /src/main/java/com/genersoft/iot/vmp/service/IMediaService.java: -------------------------------------------------------------------------------- 1 | package com.genersoft.iot.vmp.service; 2 | 3 | import com.genersoft.iot.vmp.media.bean.ResultForOnPublish; 4 | import com.genersoft.iot.vmp.media.bean.MediaServer; 5 | 6 | /** 7 | * 媒体信息业务 8 | */ 9 | public interface IMediaService { 10 | 11 | /** 12 | * 播放鉴权 13 | */ 14 | boolean authenticatePlay(String app, String stream, String callId); 15 | 16 | ResultForOnPublish authenticatePublish(MediaServer mediaServer, String app, String stream, String params); 17 | 18 | boolean closeStreamOnNoneReader(String mediaServerId, String app, String stream, String schema); 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/com/genersoft/iot/vmp/service/IMobilePositionService.java: -------------------------------------------------------------------------------- 1 | package com.genersoft.iot.vmp.service; 2 | 3 | 4 | import com.genersoft.iot.vmp.gb28181.bean.MobilePosition; 5 | import com.genersoft.iot.vmp.gb28181.bean.Platform; 6 | import com.genersoft.iot.vmp.service.bean.GPSMsgInfo; 7 | 8 | import java.util.List; 9 | 10 | public interface IMobilePositionService { 11 | 12 | void add(List mobilePositionList); 13 | 14 | void add(MobilePosition mobilePosition); 15 | 16 | List queryMobilePositions(String deviceId, String channelId, String startTime, String endTime); 17 | 18 | List queryEnablePlatformListWithAsMessageChannel(); 19 | 20 | MobilePosition queryLatestPosition(String deviceId); 21 | 22 | void updateStreamGPS(List gpsMsgInfoList); 23 | 24 | } 25 | -------------------------------------------------------------------------------- /src/main/java/com/genersoft/iot/vmp/service/IReceiveRtpServerService.java: -------------------------------------------------------------------------------- 1 | package com.genersoft.iot.vmp.service; 2 | 3 | import com.genersoft.iot.vmp.gb28181.bean.OpenRTPServerResult; 4 | import com.genersoft.iot.vmp.media.bean.MediaServer; 5 | import com.genersoft.iot.vmp.service.bean.ErrorCallback; 6 | import com.genersoft.iot.vmp.service.bean.RTPServerParam; 7 | import com.genersoft.iot.vmp.service.bean.SSRCInfo; 8 | 9 | public interface IReceiveRtpServerService { 10 | SSRCInfo openRTPServer(RTPServerParam rtpServerParam, ErrorCallback callback); 11 | 12 | void closeRTPServer(MediaServer mediaServer, SSRCInfo ssrcInfo); 13 | } 14 | -------------------------------------------------------------------------------- /src/main/java/com/genersoft/iot/vmp/service/IRecordPlanService.java: -------------------------------------------------------------------------------- 1 | package com.genersoft.iot.vmp.service; 2 | 3 | import com.genersoft.iot.vmp.gb28181.bean.CommonGBChannel; 4 | import com.genersoft.iot.vmp.service.bean.RecordPlan; 5 | import com.github.pagehelper.PageInfo; 6 | 7 | import java.util.List; 8 | 9 | public interface IRecordPlanService { 10 | 11 | 12 | RecordPlan get(Integer planId); 13 | 14 | void update(RecordPlan plan); 15 | 16 | void delete(Integer planId); 17 | 18 | PageInfo query(Integer page, Integer count, String query); 19 | 20 | void add(RecordPlan plan); 21 | 22 | void link(List channelIds, Integer planId); 23 | 24 | PageInfo queryChannelList(int page, int count, String query, Integer channelType, Boolean online, Integer planId, Boolean hasLink); 25 | 26 | void linkAll(Integer planId); 27 | 28 | void cleanAll(Integer planId); 29 | 30 | Integer recording(String app, String stream); 31 | } 32 | -------------------------------------------------------------------------------- /src/main/java/com/genersoft/iot/vmp/service/IRoleService.java: -------------------------------------------------------------------------------- 1 | package com.genersoft.iot.vmp.service; 2 | 3 | import com.genersoft.iot.vmp.storager.dao.dto.Role; 4 | 5 | import java.util.List; 6 | 7 | public interface IRoleService { 8 | 9 | Role getRoleById(int id); 10 | 11 | int add(Role role); 12 | 13 | int delete(int id); 14 | 15 | List getAll(); 16 | 17 | int update(Role role); 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/com/genersoft/iot/vmp/service/IUserApiKeyService.java: -------------------------------------------------------------------------------- 1 | package com.genersoft.iot.vmp.service; 2 | 3 | import com.genersoft.iot.vmp.storager.dao.dto.UserApiKey; 4 | import com.github.pagehelper.PageInfo; 5 | 6 | public interface IUserApiKeyService { 7 | int addApiKey(UserApiKey userApiKey); 8 | 9 | boolean isApiKeyExists(String apiKey); 10 | 11 | PageInfo getUserApiKeys(int page, int count); 12 | 13 | int enable(Integer id); 14 | 15 | int disable(Integer id); 16 | 17 | int remark(Integer id, String remark); 18 | 19 | int delete(Integer id); 20 | 21 | UserApiKey getUserApiKeyById(Integer id); 22 | 23 | int reset(Integer id, String apiKey); 24 | 25 | } 26 | -------------------------------------------------------------------------------- /src/main/java/com/genersoft/iot/vmp/service/IUserService.java: -------------------------------------------------------------------------------- 1 | package com.genersoft.iot.vmp.service; 2 | 3 | import com.genersoft.iot.vmp.storager.dao.dto.User; 4 | import com.github.pagehelper.PageInfo; 5 | 6 | import java.util.List; 7 | 8 | public interface IUserService { 9 | 10 | User getUser(String username, String password); 11 | 12 | boolean changePassword(int id, String password); 13 | 14 | User getUserById(int id); 15 | 16 | User getUserByUsername(String username); 17 | 18 | int addUser(User user); 19 | 20 | int deleteUser(int id); 21 | 22 | List getAllUsers(); 23 | 24 | int updateUsers(User user); 25 | 26 | boolean checkPushAuthority(String callId, String sign); 27 | 28 | PageInfo getUsers(int page, int count); 29 | 30 | int changePushKey(int id, String pushKey); 31 | } 32 | -------------------------------------------------------------------------------- /src/main/java/com/genersoft/iot/vmp/service/bean/ErrorCallback.java: -------------------------------------------------------------------------------- 1 | package com.genersoft.iot.vmp.service.bean; 2 | 3 | public interface ErrorCallback { 4 | 5 | void run(int code, String msg, T data); 6 | } 7 | -------------------------------------------------------------------------------- /src/main/java/com/genersoft/iot/vmp/service/bean/InviteTimeOutCallback.java: -------------------------------------------------------------------------------- 1 | package com.genersoft.iot.vmp.service.bean; 2 | 3 | public interface InviteTimeOutCallback { 4 | 5 | void run(int code, String msg); // code: 0 sip超时, 1 收流超时 6 | } 7 | -------------------------------------------------------------------------------- /src/main/java/com/genersoft/iot/vmp/service/bean/LogFileInfo.java: -------------------------------------------------------------------------------- 1 | package com.genersoft.iot.vmp.service.bean; 2 | 3 | import lombok.Data; 4 | 5 | @Data 6 | public class LogFileInfo { 7 | 8 | private String fileName; 9 | private Long fileSize; 10 | private Long startTime; 11 | private Long endTime; 12 | 13 | } 14 | -------------------------------------------------------------------------------- /src/main/java/com/genersoft/iot/vmp/service/bean/PlayBackCallback.java: -------------------------------------------------------------------------------- 1 | package com.genersoft.iot.vmp.service.bean; 2 | 3 | public interface PlayBackCallback { 4 | 5 | void call(PlayBackResult msg); 6 | 7 | } 8 | -------------------------------------------------------------------------------- /src/main/java/com/genersoft/iot/vmp/service/bean/PushStreamStatusChangeFromRedisDto.java: -------------------------------------------------------------------------------- 1 | package com.genersoft.iot.vmp.service.bean; 2 | 3 | import lombok.Data; 4 | 5 | import java.util.List; 6 | 7 | /** 8 | * 收到redis通知修改推流通道状态 9 | * @author lin 10 | */ 11 | @Data 12 | public class PushStreamStatusChangeFromRedisDto { 13 | 14 | private boolean setAllOffline; 15 | 16 | private List onlineStreams; 17 | 18 | private List offlineStreams; 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/com/genersoft/iot/vmp/service/bean/RTPServerParam.java: -------------------------------------------------------------------------------- 1 | package com.genersoft.iot.vmp.service.bean; 2 | 3 | import com.genersoft.iot.vmp.media.bean.MediaServer; 4 | import lombok.Data; 5 | 6 | @Data 7 | public class RTPServerParam { 8 | 9 | private MediaServer mediaServerItem; 10 | private String streamId; 11 | private String presetSsrc; 12 | private boolean ssrcCheck; 13 | private boolean playback; 14 | private Integer port; 15 | private boolean onlyAuto; 16 | private boolean disableAudio; 17 | private boolean reUsePort; 18 | 19 | /** 20 | * tcp模式,0时为不启用tcp监听,1时为启用tcp监听,2时为tcp主动连接模式 21 | */ 22 | private Integer tcpMode; 23 | 24 | 25 | } 26 | -------------------------------------------------------------------------------- /src/main/java/com/genersoft/iot/vmp/service/bean/RecordPlan.java: -------------------------------------------------------------------------------- 1 | package com.genersoft.iot.vmp.service.bean; 2 | 3 | import io.swagger.v3.oas.annotations.media.Schema; 4 | import lombok.Data; 5 | 6 | import java.util.List; 7 | 8 | @Data 9 | @Schema(description = "录制计划") 10 | public class RecordPlan { 11 | 12 | @Schema(description = "计划数据库ID") 13 | private int id; 14 | 15 | @Schema(description = "计划名称") 16 | private String name; 17 | 18 | @Schema(description = "计划关联通道数量") 19 | private int channelCount; 20 | 21 | @Schema(description = "是否开启定时截图") 22 | private Boolean snap; 23 | 24 | @Schema(description = "创建时间") 25 | private String createTime; 26 | 27 | @Schema(description = "更新时间") 28 | private String updateTime; 29 | 30 | @Schema(description = "计划内容") 31 | private List planItemList; 32 | } 33 | -------------------------------------------------------------------------------- /src/main/java/com/genersoft/iot/vmp/service/bean/RecordPlanItem.java: -------------------------------------------------------------------------------- 1 | package com.genersoft.iot.vmp.service.bean; 2 | 3 | import io.swagger.v3.oas.annotations.media.Schema; 4 | import lombok.Data; 5 | 6 | @Data 7 | @Schema(description = "录制计划项") 8 | public class RecordPlanItem { 9 | 10 | @Schema(description = "计划项数据库ID") 11 | private int id; 12 | 13 | @Schema(description = "计划开始时间的序号, 从0点开始,每半个小时增加1") 14 | private Integer start; 15 | 16 | @Schema(description = "计划结束时间的序号, 从0点开始,每半个小时增加1") 17 | private Integer stop; 18 | 19 | @Schema(description = "计划周几执行") 20 | private Integer weekDay; 21 | 22 | @Schema(description = "所属计划ID") 23 | private Integer planId; 24 | 25 | } 26 | -------------------------------------------------------------------------------- /src/main/java/com/genersoft/iot/vmp/service/bean/ResponseSendItemMsg.java: -------------------------------------------------------------------------------- 1 | package com.genersoft.iot.vmp.service.bean; 2 | 3 | import com.genersoft.iot.vmp.gb28181.bean.SendRtpInfo; 4 | import com.genersoft.iot.vmp.media.bean.MediaServer; 5 | 6 | /** 7 | * redis消息:下级回复推送信息 8 | * @author lin 9 | */ 10 | public class ResponseSendItemMsg { 11 | 12 | private SendRtpInfo sendRtpItem; 13 | 14 | private MediaServer mediaServerItem; 15 | 16 | public SendRtpInfo getSendRtpItem() { 17 | return sendRtpItem; 18 | } 19 | 20 | public void setSendRtpItem(SendRtpInfo sendRtpItem) { 21 | this.sendRtpItem = sendRtpItem; 22 | } 23 | 24 | public MediaServer getMediaServerItem() { 25 | return mediaServerItem; 26 | } 27 | 28 | public void setMediaServerItem(MediaServer mediaServerItem) { 29 | this.mediaServerItem = mediaServerItem; 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /src/main/java/com/genersoft/iot/vmp/service/bean/SSRCInfo.java: -------------------------------------------------------------------------------- 1 | package com.genersoft.iot.vmp.service.bean; 2 | 3 | import lombok.Data; 4 | 5 | @Data 6 | public class SSRCInfo { 7 | 8 | private int port; 9 | private String ssrc; 10 | private String app; 11 | private String Stream; 12 | private String timeOutTaskKey; 13 | 14 | public SSRCInfo(int port, String ssrc, String app, String stream, String timeOutTaskKey) { 15 | this.port = port; 16 | this.ssrc = ssrc; 17 | this.app = app; 18 | this.Stream = stream; 19 | this.timeOutTaskKey = timeOutTaskKey; 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/main/java/com/genersoft/iot/vmp/service/bean/StreamPushItemFromRedis.java: -------------------------------------------------------------------------------- 1 | package com.genersoft.iot.vmp.service.bean; 2 | 3 | 4 | public class StreamPushItemFromRedis { 5 | private String app; 6 | private String stream; 7 | private long timeStamp; 8 | 9 | public String getApp() { 10 | return app; 11 | } 12 | 13 | public void setApp(String app) { 14 | this.app = app; 15 | } 16 | 17 | public String getStream() { 18 | return stream; 19 | } 20 | 21 | public void setStream(String stream) { 22 | this.stream = stream; 23 | } 24 | 25 | public long getTimeStamp() { 26 | return timeStamp; 27 | } 28 | 29 | public void setTimeStamp(long timeStamp) { 30 | this.timeStamp = timeStamp; 31 | } 32 | } 33 | 34 | 35 | -------------------------------------------------------------------------------- /src/main/java/com/genersoft/iot/vmp/service/bean/ThirdPartyGB.java: -------------------------------------------------------------------------------- 1 | package com.genersoft.iot.vmp.service.bean; 2 | 3 | public class ThirdPartyGB { 4 | 5 | private String name; 6 | private String nationalStandardNo; 7 | 8 | public String getName() { 9 | return name; 10 | } 11 | 12 | public void setName(String name) { 13 | this.name = name; 14 | } 15 | 16 | public String getNationalStandardNo() { 17 | return nationalStandardNo; 18 | } 19 | 20 | public void setNationalStandardNo(String nationalStandardNo) { 21 | this.nationalStandardNo = nationalStandardNo; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/main/java/com/genersoft/iot/vmp/service/bean/WvpRedisMsgCmd.java: -------------------------------------------------------------------------------- 1 | package com.genersoft.iot.vmp.service.bean; 2 | 3 | /** 4 | * @author lin 5 | */ 6 | 7 | public class WvpRedisMsgCmd { 8 | 9 | /** 10 | * 请求获取推流信息 11 | */ 12 | public static final String GET_SEND_ITEM = "GetSendItem"; 13 | /** 14 | * 请求推流的请求 15 | */ 16 | public static final String REQUEST_PUSH_STREAM = "RequestPushStream"; 17 | /** 18 | * 停止推流的请求 19 | */ 20 | public static final String REQUEST_STOP_PUSH_STREAM = "RequestStopPushStream"; 21 | 22 | } 23 | -------------------------------------------------------------------------------- /src/main/java/com/genersoft/iot/vmp/service/redisMsg/dto/RedisRpcController.java: -------------------------------------------------------------------------------- 1 | package com.genersoft.iot.vmp.service.redisMsg.dto; 2 | 3 | import java.lang.annotation.*; 4 | 5 | @Target(ElementType.TYPE) 6 | @Retention(RetentionPolicy.RUNTIME) 7 | @Documented 8 | public @interface RedisRpcController { 9 | /** 10 | * 请求路径 11 | */ 12 | String value() default ""; 13 | } 14 | -------------------------------------------------------------------------------- /src/main/java/com/genersoft/iot/vmp/service/redisMsg/dto/RedisRpcMapping.java: -------------------------------------------------------------------------------- 1 | package com.genersoft.iot.vmp.service.redisMsg.dto; 2 | 3 | import java.lang.annotation.*; 4 | 5 | @Target(ElementType.METHOD) 6 | @Retention(RetentionPolicy.RUNTIME) 7 | @Documented 8 | public @interface RedisRpcMapping { 9 | /** 10 | * 请求路径 11 | */ 12 | String value() default ""; 13 | } 14 | -------------------------------------------------------------------------------- /src/main/java/com/genersoft/iot/vmp/storager/dao/dto/ChannelSourceInfo.java: -------------------------------------------------------------------------------- 1 | package com.genersoft.iot.vmp.storager.dao.dto; 2 | 3 | public class ChannelSourceInfo { 4 | private String name; 5 | private int count; 6 | 7 | public String getName() { 8 | return name; 9 | } 10 | 11 | public void setName(String name) { 12 | this.name = name; 13 | } 14 | 15 | public int getCount() { 16 | return count; 17 | } 18 | 19 | public void setCount(int count) { 20 | this.count = count; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/main/java/com/genersoft/iot/vmp/streamProxy/service/IStreamProxyPlayService.java: -------------------------------------------------------------------------------- 1 | package com.genersoft.iot.vmp.streamProxy.service; 2 | 3 | import com.genersoft.iot.vmp.common.StreamInfo; 4 | import com.genersoft.iot.vmp.service.bean.ErrorCallback; 5 | import com.genersoft.iot.vmp.streamProxy.bean.StreamProxy; 6 | 7 | public interface IStreamProxyPlayService { 8 | 9 | StreamInfo start(int id, Boolean record, ErrorCallback callback); 10 | 11 | void start(int id, ErrorCallback callback); 12 | 13 | StreamInfo startProxy(StreamProxy streamProxy); 14 | 15 | void stop(int id); 16 | 17 | void stopProxy(StreamProxy streamProxy); 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/com/genersoft/iot/vmp/streamPush/bean/BatchRemoveParam.java: -------------------------------------------------------------------------------- 1 | package com.genersoft.iot.vmp.streamPush.bean; 2 | 3 | import lombok.Data; 4 | 5 | import java.util.Set; 6 | 7 | @Data 8 | public class BatchRemoveParam { 9 | private Set ids; 10 | } 11 | -------------------------------------------------------------------------------- /src/main/java/com/genersoft/iot/vmp/streamPush/bean/RedisPushStreamMessage.java: -------------------------------------------------------------------------------- 1 | package com.genersoft.iot.vmp.streamPush.bean; 2 | 3 | import lombok.Data; 4 | 5 | @Data 6 | public class RedisPushStreamMessage { 7 | 8 | private String gbId; 9 | private String app; 10 | private String stream; 11 | private String name; 12 | private boolean status; 13 | 14 | public StreamPush buildstreamPush() { 15 | StreamPush push = new StreamPush(); 16 | push.setApp(app); 17 | push.setStream(stream); 18 | push.setGbName(name); 19 | push.setGbDeviceId(gbId); 20 | push.setStartOfflinePush(true); 21 | push.setGbStatus(status?"ON":"OFF"); 22 | return push; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/main/java/com/genersoft/iot/vmp/streamPush/bean/StreamPushExcelDto.java: -------------------------------------------------------------------------------- 1 | package com.genersoft.iot.vmp.streamPush.bean; 2 | 3 | import com.alibaba.excel.annotation.ExcelProperty; 4 | import io.swagger.v3.oas.annotations.media.Schema; 5 | import lombok.Data; 6 | 7 | @Data 8 | public class StreamPushExcelDto { 9 | 10 | @ExcelProperty("名称") 11 | private String name; 12 | 13 | @ExcelProperty("应用名") 14 | private String app; 15 | 16 | @ExcelProperty("流ID") 17 | private String stream; 18 | 19 | @ExcelProperty("国标ID") 20 | private String gbDeviceId; 21 | 22 | @ExcelProperty("在线状态") 23 | private boolean status; 24 | 25 | @Schema(description = "经度 WGS-84坐标系") 26 | private Double longitude; 27 | 28 | @Schema(description = "纬度 WGS-84坐标系") 29 | private Double latitude; 30 | } 31 | -------------------------------------------------------------------------------- /src/main/java/com/genersoft/iot/vmp/streamPush/service/IStreamPushPlayService.java: -------------------------------------------------------------------------------- 1 | package com.genersoft.iot.vmp.streamPush.service; 2 | 3 | import com.genersoft.iot.vmp.common.StreamInfo; 4 | import com.genersoft.iot.vmp.service.bean.ErrorCallback; 5 | 6 | public interface IStreamPushPlayService { 7 | void start(Integer id, ErrorCallback callback, String platformDeviceId, String platformName ); 8 | 9 | void stop(String app, String stream); 10 | 11 | void stop(Integer id); 12 | } 13 | -------------------------------------------------------------------------------- /src/main/java/com/genersoft/iot/vmp/utils/CloudRecordUtils.java: -------------------------------------------------------------------------------- 1 | package com.genersoft.iot.vmp.utils; 2 | 3 | import com.genersoft.iot.vmp.media.bean.MediaServer; 4 | import com.genersoft.iot.vmp.service.bean.DownloadFileInfo; 5 | 6 | public class CloudRecordUtils { 7 | 8 | public static DownloadFileInfo getDownloadFilePath(MediaServer mediaServerItem, String filePath) { 9 | DownloadFileInfo downloadFileInfo = new DownloadFileInfo(); 10 | 11 | String pathTemplate = "%s://%s:%s/index/api/downloadFile?file_path=" + filePath; 12 | 13 | downloadFileInfo.setHttpPath(String.format(pathTemplate, "http", mediaServerItem.getStreamIp(), 14 | mediaServerItem.getHttpPort())); 15 | 16 | if (mediaServerItem.getHttpSSlPort() > 0) { 17 | downloadFileInfo.setHttpsPath(String.format(pathTemplate, "https", mediaServerItem.getStreamIp(), 18 | mediaServerItem.getHttpSSlPort())); 19 | } 20 | return downloadFileInfo; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/main/java/com/genersoft/iot/vmp/utils/MediaServerUtils.java: -------------------------------------------------------------------------------- 1 | package com.genersoft.iot.vmp.utils; 2 | 3 | import org.springframework.util.ObjectUtils; 4 | 5 | import java.util.HashMap; 6 | import java.util.Map; 7 | 8 | public class MediaServerUtils { 9 | public static Map urlParamToMap(String params) { 10 | HashMap map = new HashMap<>(); 11 | if (ObjectUtils.isEmpty(params)) { 12 | return map; 13 | } 14 | String[] paramsArray = params.split("&"); 15 | if (paramsArray.length == 0) { 16 | return map; 17 | } 18 | for (String param : paramsArray) { 19 | String[] paramArray = param.split("="); 20 | if (paramArray.length == 2) { 21 | map.put(paramArray[0], paramArray[1]); 22 | } 23 | } 24 | return map; 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/main/java/com/genersoft/iot/vmp/vmanager/bean/BatchGBStreamParam.java: -------------------------------------------------------------------------------- 1 | package com.genersoft.iot.vmp.vmanager.bean; 2 | 3 | import com.genersoft.iot.vmp.gb28181.bean.GbStream; 4 | import io.swagger.v3.oas.annotations.media.Schema; 5 | 6 | import java.util.List; 7 | 8 | /** 9 | * @author lin 10 | */ 11 | @Schema(description = "多个推流信息") 12 | public class BatchGBStreamParam { 13 | @Schema(description = "推流信息列表") 14 | private List gbStreams; 15 | 16 | public List getGbStreams() { 17 | return gbStreams; 18 | } 19 | 20 | public void setGbStreams(List gbStreams) { 21 | this.gbStreams = gbStreams; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/main/java/com/genersoft/iot/vmp/vmanager/bean/DeferredResultEx.java: -------------------------------------------------------------------------------- 1 | package com.genersoft.iot.vmp.vmanager.bean; 2 | 3 | import org.springframework.web.context.request.async.DeferredResult; 4 | 5 | public class DeferredResultEx { 6 | 7 | private DeferredResult deferredResult; 8 | 9 | private DeferredResultFilter filter; 10 | 11 | public DeferredResultEx(DeferredResult result) { 12 | this.deferredResult = result; 13 | } 14 | 15 | 16 | public DeferredResult getDeferredResult() { 17 | return deferredResult; 18 | } 19 | 20 | public void setDeferredResult(DeferredResult deferredResult) { 21 | this.deferredResult = deferredResult; 22 | } 23 | 24 | public DeferredResultFilter getFilter() { 25 | return filter; 26 | } 27 | 28 | public void setFilter(DeferredResultFilter filter) { 29 | this.filter = filter; 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /src/main/java/com/genersoft/iot/vmp/vmanager/bean/DeferredResultFilter.java: -------------------------------------------------------------------------------- 1 | package com.genersoft.iot.vmp.vmanager.bean; 2 | 3 | public interface DeferredResultFilter { 4 | 5 | Object handler(Object o); 6 | } 7 | -------------------------------------------------------------------------------- /src/main/java/com/genersoft/iot/vmp/vmanager/bean/ErrorCode.java: -------------------------------------------------------------------------------- 1 | package com.genersoft.iot.vmp.vmanager.bean; 2 | 3 | /** 4 | * 全局错误码 5 | */ 6 | public enum ErrorCode { 7 | SUCCESS(0, "成功"), 8 | ERROR100(100, "失败"), 9 | ERROR400(400, "参数或方法错误"), 10 | ERROR404(404, "资源未找到"), 11 | ERROR403(403, "无权限操作"), 12 | ERROR486(486, "超时或无响应"), 13 | ERROR401(401, "请登录后重新请求"), 14 | ERROR500(500, "系统异常"); 15 | 16 | private final int code; 17 | private final String msg; 18 | 19 | ErrorCode(int code, String msg) { 20 | this.code = code; 21 | this.msg = msg; 22 | } 23 | 24 | public int getCode() { 25 | return code; 26 | } 27 | 28 | public String getMsg() { 29 | return msg; 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /src/main/java/com/genersoft/iot/vmp/vmanager/bean/PlayTypeEnum.java: -------------------------------------------------------------------------------- 1 | package com.genersoft.iot.vmp.vmanager.bean; 2 | 3 | public enum PlayTypeEnum { 4 | 5 | PLAY("0", "直播"), 6 | PLAY_BACK("1", "回放"); 7 | 8 | private String value; 9 | private String name; 10 | 11 | PlayTypeEnum(String value, String name) { 12 | this.value = value; 13 | this.name = name; 14 | } 15 | 16 | public String getValue() { 17 | return value; 18 | } 19 | 20 | public String getName() { 21 | return name; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/main/java/com/genersoft/iot/vmp/vmanager/bean/ResourceBaseInfo.java: -------------------------------------------------------------------------------- 1 | package com.genersoft.iot.vmp.vmanager.bean; 2 | 3 | public class ResourceBaseInfo { 4 | private int total; 5 | private int online; 6 | 7 | public ResourceBaseInfo() { 8 | } 9 | 10 | public ResourceBaseInfo(int total, int online) { 11 | this.total = total; 12 | this.online = online; 13 | } 14 | 15 | public int getTotal() { 16 | return total; 17 | } 18 | 19 | public void setTotal(int total) { 20 | this.total = total; 21 | } 22 | 23 | public int getOnline() { 24 | return online; 25 | } 26 | 27 | public void setOnline(int online) { 28 | this.online = online; 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /src/main/java/com/genersoft/iot/vmp/vmanager/bean/SystemConfigInfo.java: -------------------------------------------------------------------------------- 1 | package com.genersoft.iot.vmp.vmanager.bean; 2 | 3 | import com.genersoft.iot.vmp.common.VersionPo; 4 | import com.genersoft.iot.vmp.conf.SipConfig; 5 | import com.genersoft.iot.vmp.conf.UserSetting; 6 | import lombok.Data; 7 | 8 | @Data 9 | public class SystemConfigInfo { 10 | 11 | private int serverPort; 12 | private SipConfig sip; 13 | private UserSetting addOn; 14 | private VersionPo version; 15 | 16 | } 17 | 18 | -------------------------------------------------------------------------------- /src/main/java/com/genersoft/iot/vmp/vmanager/cloudRecord/bean/CloudRecordUrl.java: -------------------------------------------------------------------------------- 1 | package com.genersoft.iot.vmp.vmanager.cloudRecord.bean; 2 | 3 | public class CloudRecordUrl { 4 | 5 | private String playUrl; 6 | private String downloadUrl; 7 | private int id; 8 | 9 | public String getPlayUrl() { 10 | return playUrl; 11 | } 12 | 13 | public void setPlayUrl(String playUrl) { 14 | this.playUrl = playUrl; 15 | } 16 | 17 | public String getDownloadUrl() { 18 | return downloadUrl; 19 | } 20 | 21 | public void setDownloadUrl(String downloadUrl) { 22 | this.downloadUrl = downloadUrl; 23 | } 24 | 25 | public int getId() { 26 | return id; 27 | } 28 | 29 | public void setId(int id) { 30 | this.id = id; 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/main/java/com/genersoft/iot/vmp/vmanager/recordPlan/bean/RecordPlanParam.java: -------------------------------------------------------------------------------- 1 | package com.genersoft.iot.vmp.vmanager.recordPlan.bean; 2 | 3 | import io.swagger.v3.oas.annotations.media.Schema; 4 | import lombok.Data; 5 | 6 | import java.util.List; 7 | 8 | @Data 9 | @Schema(description = "录制计划-添加/编辑参数") 10 | public class RecordPlanParam { 11 | 12 | @Schema(description = "关联的通道ID") 13 | private List channelIds; 14 | 15 | @Schema(description = "关联的设备ID,会为设备下的所有通道关联此录制计划,channelId存在是此项不生效,") 16 | private List deviceDbIds; 17 | 18 | @Schema(description = "全部关联/全部取消关联") 19 | private Boolean allLink; 20 | 21 | @Schema(description = "录制计划ID, ID为空是删除关联的计划") 22 | private Integer planId; 23 | } 24 | -------------------------------------------------------------------------------- /src/main/java/com/genersoft/iot/vmp/web/gb28181/AuthController.java: -------------------------------------------------------------------------------- 1 | package com.genersoft.iot.vmp.web.gb28181; 2 | 3 | import com.genersoft.iot.vmp.service.IUserService; 4 | import com.genersoft.iot.vmp.storager.dao.dto.User; 5 | import org.springframework.beans.factory.annotation.Autowired; 6 | import org.springframework.web.bind.annotation.*; 7 | 8 | 9 | @RestController 10 | @RequestMapping(value = "/auth") 11 | public class AuthController { 12 | 13 | @Autowired 14 | private IUserService userService; 15 | 16 | @GetMapping("/login") 17 | public String devices(String name, String passwd){ 18 | User user = userService.getUser(name, passwd); 19 | if (user != null) { 20 | return "success"; 21 | }else { 22 | return "fail"; 23 | } 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /src/main/resources/application.yml: -------------------------------------------------------------------------------- 1 | spring: 2 | application: 3 | name: wvp 4 | profiles: 5 | active: 274 6 | -------------------------------------------------------------------------------- /src/main/resources/banner.txt: -------------------------------------------------------------------------------- 1 | ___ __ ___ ___ ________ ________ ________ ________ 2 | |\ \ |\ \|\ \ / /|\ __ \ |\ __ \|\ __ \|\ __ \ 3 | \ \ \ \ \ \ \ \ / / | \ \|\ \ ____________\ \ \|\ \ \ \|\ \ \ \|\ \ 4 | \ \ \ __\ \ \ \ \/ / / \ \ ____\\____________\ \ ____\ \ _ _\ \ \\\ \ 5 | \ \ \|\__\_\ \ \ / / \ \ \___\|____________|\ \ \___|\ \ \\ \\ \ \\\ \ 6 | \ \____________\ \__/ / \ \__\ \ \__\ \ \__\\ _\\ \_______\ 7 | \|____________|\|__|/ \|__| \|__| \|__|\|__|\|_______| 8 | -------------------------------------------------------------------------------- /src/main/resources/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Title 6 | 7 | 8 | 111 9 | 10 | -------------------------------------------------------------------------------- /src/main/resources/local.jks: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/648540858/wvp-GB28181-pro/f9300d01ec37321abf11673a3fe70f04278927c5/src/main/resources/local.jks -------------------------------------------------------------------------------- /web/.editorconfig: -------------------------------------------------------------------------------- 1 | # http://editorconfig.org 2 | root = true 3 | 4 | [*] 5 | charset = utf-8 6 | indent_style = space 7 | indent_size = 2 8 | end_of_line = lf 9 | insert_final_newline = true 10 | trim_trailing_whitespace = true 11 | 12 | [*.md] 13 | insert_final_newline = false 14 | trim_trailing_whitespace = false 15 | -------------------------------------------------------------------------------- /web/.env.development: -------------------------------------------------------------------------------- 1 | # just a flag 2 | ENV = 'development' 3 | 4 | # base api 5 | VUE_APP_BASE_API = '/dev-api' 6 | -------------------------------------------------------------------------------- /web/.env.production: -------------------------------------------------------------------------------- 1 | # just a flag 2 | ENV = 'production' 3 | 4 | # base api 5 | VUE_APP_BASE_API = '' 6 | 7 | -------------------------------------------------------------------------------- /web/.env.staging: -------------------------------------------------------------------------------- 1 | NODE_ENV = production 2 | 3 | # just a flag 4 | ENV = 'staging' 5 | 6 | # base api 7 | VUE_APP_BASE_API = '/stage-api' 8 | 9 | -------------------------------------------------------------------------------- /web/.eslintignore: -------------------------------------------------------------------------------- 1 | build/*.js 2 | src/assets 3 | public 4 | dist 5 | -------------------------------------------------------------------------------- /web/.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules/ 3 | dist/ 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | package-lock.json 8 | tests/**/coverage/ 9 | 10 | # Editor directories and files 11 | .idea 12 | .vscode 13 | *.suo 14 | *.ntvs* 15 | *.njsproj 16 | *.sln 17 | -------------------------------------------------------------------------------- /web/.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | node_js: 10 3 | script: npm run test 4 | notifications: 5 | email: false 6 | -------------------------------------------------------------------------------- /web/babel.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | presets: [ 3 | // https://github.com/vuejs/vue-cli/tree/master/packages/@vue/babel-preset-app 4 | '@vue/cli-plugin-babel/preset' 5 | ], 6 | 'env': { 7 | 'development': { 8 | // babel-plugin-dynamic-import-node plugin only does one thing by converting all import() to require(). 9 | // This plugin can significantly increase the speed of hot updates, when you have a large number of pages. 10 | // https://panjiachen.github.io/vue-element-admin-site/guide/advanced/lazy-loading.html 11 | 'plugins': ['dynamic-import-node'] 12 | } 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /web/jest.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | moduleFileExtensions: ['js', 'jsx', 'json', 'vue'], 3 | transform: { 4 | '^.+\\.vue$': 'vue-jest', 5 | '.+\\.(css|styl|less|sass|scss|svg|png|jpg|ttf|woff|woff2)$': 6 | 'jest-transform-stub', 7 | '^.+\\.jsx?$': 'babel-jest' 8 | }, 9 | moduleNameMapper: { 10 | '^@/(.*)$': '/src/$1' 11 | }, 12 | snapshotSerializers: ['jest-serializer-vue'], 13 | testMatch: [ 14 | '**/tests/unit/**/*.spec.(js|jsx|ts|tsx)|**/__tests__/*.(js|jsx|ts|tsx)' 15 | ], 16 | collectCoverageFrom: ['src/utils/**/*.{js,vue}', '!src/utils/auth.js', '!src/utils/request.js', 'src/components/**/*.{js,vue}'], 17 | coverageDirectory: '/tests/unit/coverage', 18 | // 'collectCoverage': true, 19 | 'coverageReporters': [ 20 | 'lcov', 21 | 'text-summary' 22 | ], 23 | testURL: 'http://localhost/' 24 | } 25 | -------------------------------------------------------------------------------- /web/jsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "baseUrl": "./", 4 | "paths": { 5 | "@/*": ["src/*"] 6 | } 7 | }, 8 | "exclude": ["node_modules", "dist"] 9 | } 10 | -------------------------------------------------------------------------------- /web/mock/table.js: -------------------------------------------------------------------------------- 1 | const Mock = require('mockjs') 2 | 3 | const data = Mock.mock({ 4 | 'items|30': [{ 5 | id: '@id', 6 | title: '@sentence(10, 20)', 7 | 'status|1': ['published', 'draft', 'deleted'], 8 | author: 'name', 9 | display_time: '@datetime', 10 | pageviews: '@integer(300, 5000)' 11 | }] 12 | }) 13 | 14 | module.exports = [ 15 | { 16 | url: '/vue-admin-template/table/list', 17 | type: 'get', 18 | response: config => { 19 | const items = data.items 20 | return { 21 | code: 20000, 22 | data: { 23 | total: items.length, 24 | items: items 25 | } 26 | } 27 | } 28 | } 29 | ] 30 | -------------------------------------------------------------------------------- /web/mock/utils.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @param {string} url 3 | * @returns {Object} 4 | */ 5 | function param2Obj(url) { 6 | const search = decodeURIComponent(url.split('?')[1]).replace(/\+/g, ' ') 7 | if (!search) { 8 | return {} 9 | } 10 | const obj = {} 11 | const searchArr = search.split('&') 12 | searchArr.forEach(v => { 13 | const index = v.indexOf('=') 14 | if (index !== -1) { 15 | const name = v.substring(0, index) 16 | const val = v.substring(index + 1, v.length) 17 | obj[name] = val 18 | } 19 | }) 20 | return obj 21 | } 22 | 23 | module.exports = { 24 | param2Obj 25 | } 26 | -------------------------------------------------------------------------------- /web/postcss.config.js: -------------------------------------------------------------------------------- 1 | // https://github.com/michael-ciniawsky/postcss-load-config 2 | 3 | module.exports = { 4 | 'plugins': { 5 | // to edit target browsers: use "browserslist" field in package.json 6 | 'autoprefixer': {} 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /web/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/648540858/wvp-GB28181-pro/f9300d01ec37321abf11673a3fe70f04278927c5/web/public/favicon.ico -------------------------------------------------------------------------------- /web/public/libDecoder.wasm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/648540858/wvp-GB28181-pro/f9300d01ec37321abf11673a3fe70f04278927c5/web/public/libDecoder.wasm -------------------------------------------------------------------------------- /web/public/static/images/abl-logo.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/648540858/wvp-GB28181-pro/f9300d01ec37321abf11673a3fe70f04278927c5/web/public/static/images/abl-logo.jpg -------------------------------------------------------------------------------- /web/public/static/images/arrow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/648540858/wvp-GB28181-pro/f9300d01ec37321abf11673a3fe70f04278927c5/web/public/static/images/arrow.png -------------------------------------------------------------------------------- /web/public/static/images/bg13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/648540858/wvp-GB28181-pro/f9300d01ec37321abf11673a3fe70f04278927c5/web/public/static/images/bg13.png -------------------------------------------------------------------------------- /web/public/static/images/bg14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/648540858/wvp-GB28181-pro/f9300d01ec37321abf11673a3fe70f04278927c5/web/public/static/images/bg14.png -------------------------------------------------------------------------------- /web/public/static/images/bg17.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/648540858/wvp-GB28181-pro/f9300d01ec37321abf11673a3fe70f04278927c5/web/public/static/images/bg17.png -------------------------------------------------------------------------------- /web/public/static/images/bg18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/648540858/wvp-GB28181-pro/f9300d01ec37321abf11673a3fe70f04278927c5/web/public/static/images/bg18.png -------------------------------------------------------------------------------- /web/public/static/images/bg19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/648540858/wvp-GB28181-pro/f9300d01ec37321abf11673a3fe70f04278927c5/web/public/static/images/bg19.png -------------------------------------------------------------------------------- /web/public/static/images/gis/camera-offline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/648540858/wvp-GB28181-pro/f9300d01ec37321abf11673a3fe70f04278927c5/web/public/static/images/gis/camera-offline.png -------------------------------------------------------------------------------- /web/public/static/images/gis/camera.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/648540858/wvp-GB28181-pro/f9300d01ec37321abf11673a3fe70f04278927c5/web/public/static/images/gis/camera.png -------------------------------------------------------------------------------- /web/public/static/images/gis/camera1-offline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/648540858/wvp-GB28181-pro/f9300d01ec37321abf11673a3fe70f04278927c5/web/public/static/images/gis/camera1-offline.png -------------------------------------------------------------------------------- /web/public/static/images/gis/camera1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/648540858/wvp-GB28181-pro/f9300d01ec37321abf11673a3fe70f04278927c5/web/public/static/images/gis/camera1.png -------------------------------------------------------------------------------- /web/public/static/images/gis/camera2-offline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/648540858/wvp-GB28181-pro/f9300d01ec37321abf11673a3fe70f04278927c5/web/public/static/images/gis/camera2-offline.png -------------------------------------------------------------------------------- /web/public/static/images/gis/camera2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/648540858/wvp-GB28181-pro/f9300d01ec37321abf11673a3fe70f04278927c5/web/public/static/images/gis/camera2.png -------------------------------------------------------------------------------- /web/public/static/images/gis/camera3-offline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/648540858/wvp-GB28181-pro/f9300d01ec37321abf11673a3fe70f04278927c5/web/public/static/images/gis/camera3-offline.png -------------------------------------------------------------------------------- /web/public/static/images/gis/camera3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/648540858/wvp-GB28181-pro/f9300d01ec37321abf11673a3fe70f04278927c5/web/public/static/images/gis/camera3.png -------------------------------------------------------------------------------- /web/public/static/images/zlm-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/648540858/wvp-GB28181-pro/f9300d01ec37321abf11673a3fe70f04278927c5/web/public/static/images/zlm-logo.png -------------------------------------------------------------------------------- /web/public/static/js/config.js: -------------------------------------------------------------------------------- 1 | 2 | window.baseUrl = "" 3 | 4 | // map组件全局参数, 注释此内容可以关闭地图功能 5 | window.mapParam = { 6 | // 开启/关闭地图功能 7 | enable: true, 8 | // 坐标系 GCJ-02 WGS-84, 9 | coordinateSystem: "GCJ-02", 10 | // 地图瓦片地址 11 | tilesUrl: "http://webrd0{1-4}.is.autonavi.com/appmaptile?x={x}&y={y}&z={z}&lang=zh_cn&size=1&scale=1&style=8", 12 | // 瓦片大小 13 | tileSize: 256, 14 | // 默认层级 15 | zoom:10, 16 | // 默认地图中心点 17 | center:[116.41020, 39.915119], 18 | // 地图最大层级 19 | maxZoom:18, 20 | // 地图最小层级 21 | minZoom: 3 22 | } 23 | -------------------------------------------------------------------------------- /web/public/static/js/h265web/index.js: -------------------------------------------------------------------------------- 1 | /********************************************************* 2 | * LICENSE: LICENSE-Free_CN.MD 3 | * 4 | * Author: Numberwolf - ChangYanlong 5 | * QQ: 531365872 6 | * QQ Group:925466059 7 | * Wechat: numberwolf11 8 | * Discord: numberwolf#8694 9 | * E-Mail: porschegt23@foxmail.com 10 | * Github: https://github.com/numberwolf/h265web.js 11 | * 12 | * 作者: 小老虎(Numberwolf)(常炎隆) 13 | * QQ: 531365872 14 | * QQ群: 531365872 15 | * 微信: numberwolf11 16 | * Discord: numberwolf#8694 17 | * 邮箱: porschegt23@foxmail.com 18 | * 博客: https://www.jianshu.com/u/9c09c1e00fd1 19 | * Github: https://github.com/numberwolf/h265web.js 20 | * 21 | **********************************************************/ 22 | require('./h265webjs-v20221106'); 23 | export default class h265webjs { 24 | static createPlayer(videoURL, config) { 25 | return window.new265webjs(videoURL, config); 26 | } 27 | 28 | static clear() { 29 | global.STATICE_MEM_playerCount = -1; 30 | global.STATICE_MEM_playerIndexPtr = 0; 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /web/public/static/js/h265web/missile-v20221120.wasm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/648540858/wvp-GB28181-pro/f9300d01ec37321abf11673a3fe70f04278927c5/web/public/static/js/h265web/missile-v20221120.wasm -------------------------------------------------------------------------------- /web/public/static/js/jessibuca/decoder.wasm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/648540858/wvp-GB28181-pro/f9300d01ec37321abf11673a3fe70f04278927c5/web/public/static/js/jessibuca/decoder.wasm -------------------------------------------------------------------------------- /web/src/App.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 12 | -------------------------------------------------------------------------------- /web/src/api/log.js: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request' 2 | 3 | export function queryList(params) { 4 | const { query, startTime, endTime } = params 5 | return request({ 6 | method: 'get', 7 | url: `/api/log/list`, 8 | params: { 9 | query: query, 10 | startTime: startTime, 11 | endTime: endTime 12 | } 13 | }) 14 | } 15 | 16 | -------------------------------------------------------------------------------- /web/src/api/play.js: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request' 2 | 3 | // 实时流播放API 4 | 5 | export function play(deviceId, channelId) { 6 | return request({ 7 | method: 'get', 8 | url: '/api/play/start/' + deviceId + '/' + channelId 9 | }) 10 | } 11 | export function stop(deviceId, channelId) { 12 | return request({ 13 | method: 'get', 14 | url: '/api/play/stop/' + deviceId + "/" + channelId, 15 | }) 16 | } 17 | export function broadcastStart(deviceId, channelId, broadcastMode) { 18 | return request({ 19 | method: 'get', 20 | url: '/api/play/broadcast/' + deviceId + '/' + channelId + "?timeout=30&broadcastMode=" + broadcastMode 21 | }) 22 | } 23 | export function broadcastStop(deviceId, channelId, ) { 24 | return request({ 25 | method: 'get', 26 | url: '/api/play/broadcast/stop/' + deviceId + '/' + channelId 27 | }) 28 | } 29 | -------------------------------------------------------------------------------- /web/src/api/playback.js: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request' 2 | 3 | // 回放流播放API 4 | 5 | export function play([deviceId, channelId, startTime, endTime]) { 6 | return request({ 7 | method: 'get', 8 | url: '/api/playback/start/' + deviceId + '/' + channelId + '?startTime=' + startTime + '&endTime=' + endTime 9 | }) 10 | } 11 | export function resume(streamId) { 12 | return request({ 13 | method: 'get', 14 | url: '/api/playback/resume/' + streamId 15 | }) 16 | } 17 | export function pause(streamId) { 18 | return request({ 19 | method: 'get', 20 | url: '/api/playback/pause/' + streamId 21 | }) 22 | } 23 | export function setSpeed([streamId, speed]) { 24 | return request({ 25 | method: 'get', 26 | url: `/api/playback/speed/${streamId}/${speed}` 27 | }) 28 | } 29 | export function stop(deviceId, channelId, streamId) { 30 | return request({ 31 | method: 'get', 32 | url: '/api/playback/stop/' + deviceId + '/' + channelId + '/' + streamId 33 | }) 34 | } 35 | -------------------------------------------------------------------------------- /web/src/api/role.js: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request' 2 | 3 | // 云端录像API 4 | 5 | export function getAll() { 6 | return request({ 7 | method: 'get', 8 | url: '/api/role/all' 9 | }) 10 | } 11 | 12 | -------------------------------------------------------------------------------- /web/src/api/table.js: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request' 2 | 3 | export function getList(params) { 4 | return request({ 5 | url: '/vue-admin-template/table/list', 6 | method: 'get', 7 | params 8 | }) 9 | } 10 | -------------------------------------------------------------------------------- /web/src/assets/404_images/404.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/648540858/wvp-GB28181-pro/f9300d01ec37321abf11673a3fe70f04278927c5/web/src/assets/404_images/404.png -------------------------------------------------------------------------------- /web/src/assets/404_images/404_cloud.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/648540858/wvp-GB28181-pro/f9300d01ec37321abf11673a3fe70f04278927c5/web/src/assets/404_images/404_cloud.png -------------------------------------------------------------------------------- /web/src/assets/abl-logo.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/648540858/wvp-GB28181-pro/f9300d01ec37321abf11673a3fe70f04278927c5/web/src/assets/abl-logo.jpg -------------------------------------------------------------------------------- /web/src/assets/bg.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/648540858/wvp-GB28181-pro/f9300d01ec37321abf11673a3fe70f04278927c5/web/src/assets/bg.jpg -------------------------------------------------------------------------------- /web/src/assets/icons.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/648540858/wvp-GB28181-pro/f9300d01ec37321abf11673a3fe70f04278927c5/web/src/assets/icons.png -------------------------------------------------------------------------------- /web/src/assets/loading.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/648540858/wvp-GB28181-pro/f9300d01ec37321abf11673a3fe70f04278927c5/web/src/assets/loading.png -------------------------------------------------------------------------------- /web/src/assets/login-bg.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/648540858/wvp-GB28181-pro/f9300d01ec37321abf11673a3fe70f04278927c5/web/src/assets/login-bg.jpg -------------------------------------------------------------------------------- /web/src/assets/login-cloud.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/648540858/wvp-GB28181-pro/f9300d01ec37321abf11673a3fe70f04278927c5/web/src/assets/login-cloud.png -------------------------------------------------------------------------------- /web/src/assets/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/648540858/wvp-GB28181-pro/f9300d01ec37321abf11673a3fe70f04278927c5/web/src/assets/logo.png -------------------------------------------------------------------------------- /web/src/assets/play.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/648540858/wvp-GB28181-pro/f9300d01ec37321abf11673a3fe70f04278927c5/web/src/assets/play.png -------------------------------------------------------------------------------- /web/src/assets/zlm-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/648540858/wvp-GB28181-pro/f9300d01ec37321abf11673a3fe70f04278927c5/web/src/assets/zlm-logo.png -------------------------------------------------------------------------------- /web/src/directive/el-drag-dialog/index.js: -------------------------------------------------------------------------------- 1 | import drag from './drag' 2 | 3 | const install = function(Vue) { 4 | Vue.directive('el-drag-dialog', drag) 5 | } 6 | 7 | if (window.Vue) { 8 | window['el-drag-dialog'] = drag 9 | Vue.use(install); // eslint-disable-line 10 | } 11 | 12 | drag.install = install 13 | export default drag 14 | -------------------------------------------------------------------------------- /web/src/icons/index.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import SvgIcon from '@/components/SvgIcon'// svg component 3 | 4 | // register globally 5 | Vue.component('svg-icon', SvgIcon) 6 | 7 | const req = require.context('./svg', false, /\.svg$/) 8 | const requireAll = requireContext => requireContext.keys().map(requireContext) 9 | requireAll(req) 10 | -------------------------------------------------------------------------------- /web/src/icons/svg/channelManger.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /web/src/icons/svg/device.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /web/src/icons/svg/example.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /web/src/icons/svg/eye.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /web/src/icons/svg/link.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /web/src/icons/svg/live.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /web/src/icons/svg/nested.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /web/src/icons/svg/operations.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /web/src/icons/svg/password.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /web/src/icons/svg/realLog.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /web/src/icons/svg/recordPlan.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /web/src/icons/svg/table.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /web/src/icons/svg/user.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /web/src/icons/svgo.yml: -------------------------------------------------------------------------------- 1 | # replace default config 2 | 3 | # multipass: true 4 | # full: true 5 | 6 | plugins: 7 | 8 | # - name 9 | # 10 | # or: 11 | # - name: false 12 | # - name: true 13 | # 14 | # or: 15 | # - name: 16 | # param1: 1 17 | # param2: 2 18 | 19 | - removeAttrs: 20 | attrs: 21 | - 'fill' 22 | - 'fill-rule' 23 | -------------------------------------------------------------------------------- /web/src/layout/components/AppMain.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 24 | 25 | 37 | 38 | 46 | -------------------------------------------------------------------------------- /web/src/layout/components/Sidebar/FixiOSBug.js: -------------------------------------------------------------------------------- 1 | export default { 2 | computed: { 3 | device() { 4 | return this.$store.state.app.device 5 | } 6 | }, 7 | mounted() { 8 | // In order to fix the click on menu on the ios device will trigger the mouseleave bug 9 | // https://github.com/PanJiaChen/vue-element-admin/issues/1135 10 | this.fixBugIniOS() 11 | }, 12 | methods: { 13 | fixBugIniOS() { 14 | const $subMenu = this.$refs.subMenu 15 | if ($subMenu) { 16 | const handleMouseleave = $subMenu.handleMouseleave 17 | $subMenu.handleMouseleave = (e) => { 18 | if (this.device === 'mobile') { 19 | return 20 | } 21 | handleMouseleave(e) 22 | } 23 | } 24 | } 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /web/src/layout/components/Sidebar/Item.vue: -------------------------------------------------------------------------------- 1 | 34 | 35 | 42 | -------------------------------------------------------------------------------- /web/src/layout/components/Sidebar/Link.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 44 | -------------------------------------------------------------------------------- /web/src/layout/components/index.js: -------------------------------------------------------------------------------- 1 | export { default as Navbar } from './Navbar' 2 | export { default as Sidebar } from './Sidebar' 3 | export { default as AppMain } from './AppMain' 4 | export { default as TagsView } from './TagsView' 5 | -------------------------------------------------------------------------------- /web/src/settings.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | 3 | title: 'WVP视频平台', 4 | 5 | /** 6 | * @type {boolean} true | false 7 | * @description Whether fix the header 8 | */ 9 | fixedHeader: false, 10 | 11 | /** 12 | * @type {boolean} true | false 13 | * @description Whether show the logo in sidebar 14 | */ 15 | sidebarLogo: false, 16 | 17 | tagsView: true 18 | } 19 | -------------------------------------------------------------------------------- /web/src/store/getters.js: -------------------------------------------------------------------------------- 1 | const getters = { 2 | sidebar: state => state.app.sidebar, 3 | device: state => state.app.device, 4 | token: state => state.user.token, 5 | serverId: state => state.user.serverId, 6 | name: state => state.user.name, 7 | visitedViews: state => state.tagsView.visitedViews, 8 | cachedViews: state => state.tagsView.cachedViews 9 | } 10 | export default getters 11 | -------------------------------------------------------------------------------- /web/src/store/modules/log.js: -------------------------------------------------------------------------------- 1 | import { queryList } from '@/api/log' 2 | 3 | const actions = { 4 | queryList({ commit }, params) { 5 | return new Promise((resolve, reject) => { 6 | queryList(params).then(response => { 7 | const { data } = response 8 | resolve(data) 9 | }).catch(error => { 10 | reject(error) 11 | }) 12 | }) 13 | } 14 | } 15 | 16 | export default { 17 | namespaced: true, 18 | actions 19 | } 20 | 21 | -------------------------------------------------------------------------------- /web/src/store/modules/role.js: -------------------------------------------------------------------------------- 1 | import { getAll } from '@/api/role' 2 | 3 | const actions = { 4 | getAll({ commit }) { 5 | return new Promise((resolve, reject) => { 6 | getAll().then(response => { 7 | const { data } = response 8 | resolve(data) 9 | }).catch(error => { 10 | reject(error) 11 | }) 12 | }) 13 | } 14 | } 15 | 16 | export default { 17 | namespaced: true, 18 | actions 19 | } 20 | 21 | -------------------------------------------------------------------------------- /web/src/store/modules/settings.js: -------------------------------------------------------------------------------- 1 | import defaultSettings from '@/settings' 2 | 3 | const { showSettings, fixedHeader, sidebarLogo, tagsViews } = defaultSettings 4 | 5 | const state = { 6 | showSettings: showSettings, 7 | fixedHeader: fixedHeader, 8 | sidebarLogo: sidebarLogo, 9 | tagsViews: tagsViews 10 | } 11 | 12 | const mutations = { 13 | CHANGE_SETTING: (state, { key, value }) => { 14 | // eslint-disable-next-line no-prototype-builtins 15 | if (state.hasOwnProperty(key)) { 16 | state[key] = value 17 | } 18 | } 19 | } 20 | 21 | const actions = { 22 | changeSetting({ commit }, data) { 23 | commit('CHANGE_SETTING', data) 24 | } 25 | } 26 | 27 | export default { 28 | namespaced: true, 29 | state, 30 | mutations, 31 | actions 32 | } 33 | 34 | -------------------------------------------------------------------------------- /web/src/styles/element-ui.scss: -------------------------------------------------------------------------------- 1 | // cover some element-ui styles 2 | 3 | .el-breadcrumb__inner, 4 | .el-breadcrumb__inner a { 5 | font-weight: 400 !important; 6 | } 7 | 8 | .el-upload { 9 | input[type="file"] { 10 | display: none !important; 11 | } 12 | } 13 | 14 | .el-upload__input { 15 | display: none; 16 | } 17 | 18 | 19 | // to fixed https://github.com/ElemeFE/element/issues/2461 20 | .el-dialog { 21 | transform: none; 22 | left: 0; 23 | position: relative; 24 | margin: 0 auto; 25 | } 26 | 27 | // refine element ui upload 28 | .upload-container { 29 | .el-upload { 30 | width: 100%; 31 | 32 | .el-upload-dragger { 33 | width: 100%; 34 | height: 200px; 35 | } 36 | } 37 | } 38 | 39 | // dropdown 40 | .el-dropdown-menu { 41 | a { 42 | display: block 43 | } 44 | } 45 | 46 | // to fix el-date-picker css style 47 | .el-range-separator { 48 | box-sizing: content-box; 49 | } 50 | -------------------------------------------------------------------------------- /web/src/styles/iconfont.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/648540858/wvp-GB28181-pro/f9300d01ec37321abf11673a3fe70f04278927c5/web/src/styles/iconfont.woff2 -------------------------------------------------------------------------------- /web/src/styles/mixin.scss: -------------------------------------------------------------------------------- 1 | @mixin clearfix { 2 | &:after { 3 | content: ""; 4 | display: table; 5 | clear: both; 6 | } 7 | } 8 | 9 | @mixin scrollBar { 10 | &::-webkit-scrollbar-track-piece { 11 | background: #d3dce6; 12 | } 13 | 14 | &::-webkit-scrollbar { 15 | width: 6px; 16 | } 17 | 18 | &::-webkit-scrollbar-thumb { 19 | background: #99a9bf; 20 | border-radius: 20px; 21 | } 22 | } 23 | 24 | @mixin relative { 25 | position: relative; 26 | width: 100%; 27 | height: 100%; 28 | } 29 | -------------------------------------------------------------------------------- /web/src/styles/transition.scss: -------------------------------------------------------------------------------- 1 | // global transition css 2 | 3 | /* fade */ 4 | .fade-enter-active, 5 | .fade-leave-active { 6 | transition: opacity 0.28s; 7 | } 8 | 9 | .fade-enter, 10 | .fade-leave-active { 11 | opacity: 0; 12 | } 13 | 14 | /* fade-transform */ 15 | .fade-transform-leave-active, 16 | .fade-transform-enter-active { 17 | transition: all .5s; 18 | } 19 | 20 | .fade-transform-enter { 21 | opacity: 0; 22 | transform: translateX(-30px); 23 | } 24 | 25 | .fade-transform-leave-to { 26 | opacity: 0; 27 | transform: translateX(30px); 28 | } 29 | 30 | /* breadcrumb transition */ 31 | .breadcrumb-enter-active, 32 | .breadcrumb-leave-active { 33 | transition: all .5s; 34 | } 35 | 36 | .breadcrumb-enter, 37 | .breadcrumb-leave-active { 38 | opacity: 0; 39 | transform: translateX(20px); 40 | } 41 | 42 | .breadcrumb-move { 43 | transition: all .5s; 44 | } 45 | 46 | .breadcrumb-leave-active { 47 | position: absolute; 48 | } 49 | -------------------------------------------------------------------------------- /web/src/styles/variables.scss: -------------------------------------------------------------------------------- 1 | // sidebar 2 | $menuText:#bfcbd9; 3 | $menuActiveText:#409EFF; 4 | $subMenuActiveText: #f4f4f5; //https://github.com/ElemeFE/element/issues/12951 5 | 6 | $menuBg: #304156; 7 | $menuHover:#263445; 8 | 9 | $subMenuBg:#1f2d3d; 10 | $subMenuHover:#001528; 11 | 12 | $sideBarWidth: 210px; 13 | 14 | // the :export directive is the magic sauce for webpack 15 | // https://www.bluematador.com/blog/how-to-share-variables-between-js-and-sass 16 | :export { 17 | menuText: $menuText; 18 | menuActiveText: $menuActiveText; 19 | subMenuActiveText: $subMenuActiveText; 20 | menuBg: $menuBg; 21 | menuHover: $menuHover; 22 | subMenuBg: $subMenuBg; 23 | subMenuHover: $subMenuHover; 24 | sideBarWidth: $sideBarWidth; 25 | } 26 | -------------------------------------------------------------------------------- /web/src/utils/auth.js: -------------------------------------------------------------------------------- 1 | import Cookies from 'js-cookie' 2 | 3 | const TokenKey = 'wvp_token' 4 | const NameKey = 'wvp_username' 5 | const serverIdKey = 'wvp_server_id' 6 | 7 | export function getToken() { 8 | console.log('Getting token...') 9 | return Cookies.get(TokenKey) 10 | } 11 | 12 | export function setToken(token) { 13 | return Cookies.set(TokenKey, token) 14 | } 15 | 16 | export function removeToken() { 17 | return Cookies.remove(TokenKey) 18 | } 19 | 20 | export function getName() { 21 | return Cookies.get(NameKey) 22 | } 23 | 24 | export function setName(name) { 25 | return Cookies.set(NameKey, name) 26 | } 27 | 28 | export function removeName() { 29 | return Cookies.remove(NameKey) 30 | } 31 | 32 | export function getServerId() { 33 | return Cookies.get(serverIdKey) 34 | } 35 | 36 | export function setServerId(serverId) { 37 | return Cookies.set(serverIdKey, serverId) 38 | } 39 | 40 | export function removeServerId() { 41 | return Cookies.remove(serverIdKey) 42 | } 43 | -------------------------------------------------------------------------------- /web/src/utils/get-page-title.js: -------------------------------------------------------------------------------- 1 | import defaultSettings from '@/settings' 2 | 3 | const title = defaultSettings.title || 'WVP视频平台' 4 | 5 | export default function getPageTitle(pageTitle) { 6 | if (pageTitle) { 7 | return `${pageTitle} - ${title}` 8 | } 9 | return `${title}` 10 | } 11 | -------------------------------------------------------------------------------- /web/src/utils/validate.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Created by PanJiaChen on 16/11/18. 3 | */ 4 | 5 | /** 6 | * @param {string} path 7 | * @returns {Boolean} 8 | */ 9 | export function isExternal(path) { 10 | return /^(https?:|mailto:|tel:)/.test(path) 11 | } 12 | 13 | /** 14 | * @param {string} str 15 | * @returns {Boolean} 16 | */ 17 | export function validUsername(str) { 18 | return str.length >= 0 19 | } 20 | -------------------------------------------------------------------------------- /web/src/views/device/channel/edit.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 31 | -------------------------------------------------------------------------------- /web/src/views/device/index.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 33 | -------------------------------------------------------------------------------- /web/tests/unit/.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | env: { 3 | jest: true 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /web/tests/unit/components/Hamburger.spec.js: -------------------------------------------------------------------------------- 1 | import { shallowMount } from '@vue/test-utils' 2 | import Hamburger from '@/components/Hamburger/index.vue' 3 | describe('Hamburger.vue', () => { 4 | it('toggle click', () => { 5 | const wrapper = shallowMount(Hamburger) 6 | const mockFn = jest.fn() 7 | wrapper.vm.$on('toggleClick', mockFn) 8 | wrapper.find('.hamburger').trigger('click') 9 | expect(mockFn).toBeCalled() 10 | }) 11 | it('prop isActive', () => { 12 | const wrapper = shallowMount(Hamburger) 13 | wrapper.setProps({ isActive: true }) 14 | expect(wrapper.contains('.is-active')).toBe(true) 15 | wrapper.setProps({ isActive: false }) 16 | expect(wrapper.contains('.is-active')).toBe(false) 17 | }) 18 | }) 19 | -------------------------------------------------------------------------------- /web/tests/unit/components/SvgIcon.spec.js: -------------------------------------------------------------------------------- 1 | import { shallowMount } from '@vue/test-utils' 2 | import SvgIcon from '@/components/SvgIcon/index.vue' 3 | describe('SvgIcon.vue', () => { 4 | it('iconClass', () => { 5 | const wrapper = shallowMount(SvgIcon, { 6 | propsData: { 7 | iconClass: 'test' 8 | } 9 | }) 10 | expect(wrapper.find('use').attributes().href).toBe('#icon-test') 11 | }) 12 | it('className', () => { 13 | const wrapper = shallowMount(SvgIcon, { 14 | propsData: { 15 | iconClass: 'test' 16 | } 17 | }) 18 | expect(wrapper.classes().length).toBe(1) 19 | wrapper.setProps({ className: 'test' }) 20 | expect(wrapper.classes().includes('test')).toBe(true) 21 | }) 22 | }) 23 | -------------------------------------------------------------------------------- /web/tests/unit/utils/param2Obj.spec.js: -------------------------------------------------------------------------------- 1 | import { param2Obj } from '@/utils/index.js' 2 | describe('Utils:param2Obj', () => { 3 | const url = 'https://github.com/PanJiaChen/vue-element-admin?name=bill&age=29&sex=1&field=dGVzdA==&key=%E6%B5%8B%E8%AF%95' 4 | 5 | it('param2Obj test', () => { 6 | expect(param2Obj(url)).toEqual({ 7 | name: 'bill', 8 | age: '29', 9 | sex: '1', 10 | field: window.btoa('test'), 11 | key: '测试' 12 | }) 13 | }) 14 | }) 15 | -------------------------------------------------------------------------------- /web/tests/unit/utils/validate.spec.js: -------------------------------------------------------------------------------- 1 | import { validUsername, isExternal } from '@/utils/validate.js' 2 | 3 | describe('Utils:validate', () => { 4 | it('validUsername', () => { 5 | expect(validUsername('admin')).toBe(true) 6 | expect(validUsername('editor')).toBe(true) 7 | expect(validUsername('xxxx')).toBe(false) 8 | }) 9 | it('isExternal', () => { 10 | expect(isExternal('https://github.com/PanJiaChen/vue-element-admin')).toBe(true) 11 | expect(isExternal('http://github.com/PanJiaChen/vue-element-admin')).toBe(true) 12 | expect(isExternal('github.com/PanJiaChen/vue-element-admin')).toBe(false) 13 | expect(isExternal('/dashboard')).toBe(false) 14 | expect(isExternal('./dashboard')).toBe(false) 15 | expect(isExternal('dashboard')).toBe(false) 16 | }) 17 | }) 18 | -------------------------------------------------------------------------------- /web_src/.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "presets": [ 3 | ["env", { 4 | "modules": false, 5 | "targets": { 6 | "browsers": ["> 1%", "last 2 versions", "not ie <= 8"] 7 | } 8 | }], 9 | "stage-2" 10 | ], 11 | "plugins": ["transform-vue-jsx", "transform-runtime"] 12 | } 13 | -------------------------------------------------------------------------------- /web_src/.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | charset = utf-8 5 | indent_style = space 6 | indent_size = 2 7 | end_of_line = lf 8 | insert_final_newline = true 9 | trim_trailing_whitespace = true 10 | -------------------------------------------------------------------------------- /web_src/.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules/ 3 | /dist/ 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | 8 | # Editor directories and files 9 | .idea 10 | .vscode 11 | *.suo 12 | *.ntvs* 13 | *.njsproj 14 | *.sln 15 | -------------------------------------------------------------------------------- /web_src/.postcssrc.js: -------------------------------------------------------------------------------- 1 | // https://github.com/michael-ciniawsky/postcss-load-config 2 | 3 | module.exports = { 4 | "plugins": { 5 | "postcss-import": {}, 6 | "postcss-url": {}, 7 | // to edit target browsers: use "browserslist" field in package.json 8 | "autoprefixer": {}, 9 | 'postcss-pxtorem': { 10 | rootValue: 16, 11 | propList: ['font-size'] // 只转化font-size 12 | } 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /web_src/README.md: -------------------------------------------------------------------------------- 1 | # gb_web 2 | 3 | > A Vue.js project 4 | 5 | ## Build Setup 6 | 7 | ``` bash 8 | # install dependencies 9 | npm install 10 | 11 | # serve with hot reload at localhost:8080 12 | npm run dev 13 | 14 | # build for production with minification 15 | npm run build 16 | 17 | # build for production and view the bundle analyzer report 18 | npm run build --report 19 | ``` 20 | 21 | For a detailed explanation on how things work, check out the [guide](http://vuejs-templates.github.io/webpack/) and [docs for vue-loader](http://vuejs.github.io/vue-loader). 22 | -------------------------------------------------------------------------------- /web_src/build/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/648540858/wvp-GB28181-pro/f9300d01ec37321abf11673a3fe70f04278927c5/web_src/build/logo.png -------------------------------------------------------------------------------- /web_src/build/vue-loader.conf.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | const utils = require('./utils') 3 | const config = require('../config') 4 | const isProduction = process.env.NODE_ENV === 'production' 5 | const sourceMapEnabled = isProduction 6 | ? config.build.productionSourceMap 7 | : config.dev.cssSourceMap 8 | 9 | module.exports = { 10 | loaders: utils.cssLoaders({ 11 | sourceMap: sourceMapEnabled, 12 | extract: isProduction 13 | }), 14 | cssSourceMap: sourceMapEnabled, 15 | cacheBusting: config.dev.cacheBusting, 16 | transformToRequire: { 17 | video: ['src', 'poster'], 18 | source: 'src', 19 | img: 'src', 20 | image: 'xlink:href' 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /web_src/config/dev.env.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | const merge = require('webpack-merge') 3 | const prodEnv = require('./prod.env') 4 | 5 | module.exports = merge(prodEnv, { 6 | NODE_ENV: '"development"', 7 | BASE_API: '"/debug"' 8 | }) 9 | -------------------------------------------------------------------------------- /web_src/config/prod.env.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | module.exports = { 3 | NODE_ENV: '"production"' 4 | } 5 | -------------------------------------------------------------------------------- /web_src/src/assets/icons.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/648540858/wvp-GB28181-pro/f9300d01ec37321abf11673a3fe70f04278927c5/web_src/src/assets/icons.png -------------------------------------------------------------------------------- /web_src/src/assets/loading.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/648540858/wvp-GB28181-pro/f9300d01ec37321abf11673a3fe70f04278927c5/web_src/src/assets/loading.png -------------------------------------------------------------------------------- /web_src/src/assets/login-bg.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/648540858/wvp-GB28181-pro/f9300d01ec37321abf11673a3fe70f04278927c5/web_src/src/assets/login-bg.jpg -------------------------------------------------------------------------------- /web_src/src/assets/login-cloud.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/648540858/wvp-GB28181-pro/f9300d01ec37321abf11673a3fe70f04278927c5/web_src/src/assets/login-cloud.png -------------------------------------------------------------------------------- /web_src/src/assets/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/648540858/wvp-GB28181-pro/f9300d01ec37321abf11673a3fe70f04278927c5/web_src/src/assets/logo.png -------------------------------------------------------------------------------- /web_src/src/assets/play.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/648540858/wvp-GB28181-pro/f9300d01ec37321abf11673a3fe70f04278927c5/web_src/src/assets/play.png -------------------------------------------------------------------------------- /web_src/src/assets/zlm-log.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/648540858/wvp-GB28181-pro/f9300d01ec37321abf11673a3fe70f04278927c5/web_src/src/assets/zlm-log.png -------------------------------------------------------------------------------- /web_src/src/components/service/UserService.js: -------------------------------------------------------------------------------- 1 | 2 | export default { 3 | 4 | /** 5 | * 存储用户信息 6 | * @param username 7 | * @param token 8 | */ 9 | setUser(user){ 10 | localStorage.setItem("wvp-user", JSON.stringify(user)); 11 | }, 12 | 13 | /** 14 | * 获取用户 15 | */ 16 | getUser(){ 17 | return JSON.parse(localStorage.getItem("wvp-user")); 18 | }, 19 | 20 | 21 | /** 22 | * 获取登录token 23 | */ 24 | getToken(){ 25 | return localStorage.getItem("wvp-token"); 26 | }, 27 | 28 | /** 29 | * 清理用户信息 30 | */ 31 | clearUserInfo(){ 32 | localStorage.removeItem("wvp-user"); 33 | localStorage.removeItem("wvp-token"); 34 | }, 35 | /** 36 | * 更新token 37 | * @param header 38 | */ 39 | setToken(token) { 40 | localStorage.setItem("wvp-token", token); 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /web_src/static/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/648540858/wvp-GB28181-pro/f9300d01ec37321abf11673a3fe70f04278927c5/web_src/static/.gitkeep -------------------------------------------------------------------------------- /web_src/static/EasyPlayer.swf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/648540858/wvp-GB28181-pro/f9300d01ec37321abf11673a3fe70f04278927c5/web_src/static/EasyPlayer.swf -------------------------------------------------------------------------------- /web_src/static/css/iconfont.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/648540858/wvp-GB28181-pro/f9300d01ec37321abf11673a3fe70f04278927c5/web_src/static/css/iconfont.woff2 -------------------------------------------------------------------------------- /web_src/static/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/648540858/wvp-GB28181-pro/f9300d01ec37321abf11673a3fe70f04278927c5/web_src/static/favicon.ico -------------------------------------------------------------------------------- /web_src/static/file/推流通道导入.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/648540858/wvp-GB28181-pro/f9300d01ec37321abf11673a3fe70f04278927c5/web_src/static/file/推流通道导入.zip -------------------------------------------------------------------------------- /web_src/static/fonts/poppins/Poppins-Bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/648540858/wvp-GB28181-pro/f9300d01ec37321abf11673a3fe70f04278927c5/web_src/static/fonts/poppins/Poppins-Bold.ttf -------------------------------------------------------------------------------- /web_src/static/fonts/poppins/Poppins-Medium.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/648540858/wvp-GB28181-pro/f9300d01ec37321abf11673a3fe70f04278927c5/web_src/static/fonts/poppins/Poppins-Medium.ttf -------------------------------------------------------------------------------- /web_src/static/fonts/poppins/Poppins-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/648540858/wvp-GB28181-pro/f9300d01ec37321abf11673a3fe70f04278927c5/web_src/static/fonts/poppins/Poppins-Regular.ttf -------------------------------------------------------------------------------- /web_src/static/fonts/poppins/Poppins-SemiBold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/648540858/wvp-GB28181-pro/f9300d01ec37321abf11673a3fe70f04278927c5/web_src/static/fonts/poppins/Poppins-SemiBold.ttf -------------------------------------------------------------------------------- /web_src/static/images/abl-logo.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/648540858/wvp-GB28181-pro/f9300d01ec37321abf11673a3fe70f04278927c5/web_src/static/images/abl-logo.jpg -------------------------------------------------------------------------------- /web_src/static/images/arrow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/648540858/wvp-GB28181-pro/f9300d01ec37321abf11673a3fe70f04278927c5/web_src/static/images/arrow.png -------------------------------------------------------------------------------- /web_src/static/images/gis/camera-offline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/648540858/wvp-GB28181-pro/f9300d01ec37321abf11673a3fe70f04278927c5/web_src/static/images/gis/camera-offline.png -------------------------------------------------------------------------------- /web_src/static/images/gis/camera.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/648540858/wvp-GB28181-pro/f9300d01ec37321abf11673a3fe70f04278927c5/web_src/static/images/gis/camera.png -------------------------------------------------------------------------------- /web_src/static/images/gis/camera1-offline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/648540858/wvp-GB28181-pro/f9300d01ec37321abf11673a3fe70f04278927c5/web_src/static/images/gis/camera1-offline.png -------------------------------------------------------------------------------- /web_src/static/images/gis/camera1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/648540858/wvp-GB28181-pro/f9300d01ec37321abf11673a3fe70f04278927c5/web_src/static/images/gis/camera1.png -------------------------------------------------------------------------------- /web_src/static/images/gis/camera2-offline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/648540858/wvp-GB28181-pro/f9300d01ec37321abf11673a3fe70f04278927c5/web_src/static/images/gis/camera2-offline.png -------------------------------------------------------------------------------- /web_src/static/images/gis/camera2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/648540858/wvp-GB28181-pro/f9300d01ec37321abf11673a3fe70f04278927c5/web_src/static/images/gis/camera2.png -------------------------------------------------------------------------------- /web_src/static/images/gis/camera3-offline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/648540858/wvp-GB28181-pro/f9300d01ec37321abf11673a3fe70f04278927c5/web_src/static/images/gis/camera3-offline.png -------------------------------------------------------------------------------- /web_src/static/images/gis/camera3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/648540858/wvp-GB28181-pro/f9300d01ec37321abf11673a3fe70f04278927c5/web_src/static/images/gis/camera3.png -------------------------------------------------------------------------------- /web_src/static/images/zlm-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/648540858/wvp-GB28181-pro/f9300d01ec37321abf11673a3fe70f04278927c5/web_src/static/images/zlm-logo.png -------------------------------------------------------------------------------- /web_src/static/js/config.js: -------------------------------------------------------------------------------- 1 | 2 | window.baseUrl = "" 3 | 4 | // map组件全局参数, 注释此内容可以关闭地图功能 5 | window.mapParam = { 6 | // 开启/关闭地图功能 7 | enable: true, 8 | // 坐标系 GCJ-02 WGS-84, 9 | coordinateSystem: "GCJ-02", 10 | // 地图瓦片地址 11 | tilesUrl: "http://webrd0{1-4}.is.autonavi.com/appmaptile?x={x}&y={y}&z={z}&lang=zh_cn&size=1&scale=1&style=8", 12 | // 瓦片大小 13 | tileSize: 256, 14 | // 默认层级 15 | zoom:10, 16 | // 默认地图中心点 17 | center:[116.41020, 39.915119], 18 | // 地图最大层级 19 | maxZoom:18, 20 | // 地图最小层级 21 | minZoom: 3 22 | } 23 | -------------------------------------------------------------------------------- /web_src/static/js/h265web/index.js: -------------------------------------------------------------------------------- 1 | /********************************************************* 2 | * LICENSE: LICENSE-Free_CN.MD 3 | * 4 | * Author: Numberwolf - ChangYanlong 5 | * QQ: 531365872 6 | * QQ Group:925466059 7 | * Wechat: numberwolf11 8 | * Discord: numberwolf#8694 9 | * E-Mail: porschegt23@foxmail.com 10 | * Github: https://github.com/numberwolf/h265web.js 11 | * 12 | * 作者: 小老虎(Numberwolf)(常炎隆) 13 | * QQ: 531365872 14 | * QQ群: 531365872 15 | * 微信: numberwolf11 16 | * Discord: numberwolf#8694 17 | * 邮箱: porschegt23@foxmail.com 18 | * 博客: https://www.jianshu.com/u/9c09c1e00fd1 19 | * Github: https://github.com/numberwolf/h265web.js 20 | * 21 | **********************************************************/ 22 | require('./h265webjs-v20221106'); 23 | export default class h265webjs { 24 | static createPlayer(videoURL, config) { 25 | return window.new265webjs(videoURL, config); 26 | } 27 | 28 | static clear() { 29 | global.STATICE_MEM_playerCount = -1; 30 | global.STATICE_MEM_playerIndexPtr = 0; 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /web_src/static/js/h265web/missile-v20221120.wasm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/648540858/wvp-GB28181-pro/f9300d01ec37321abf11673a3fe70f04278927c5/web_src/static/js/h265web/missile-v20221120.wasm -------------------------------------------------------------------------------- /web_src/static/js/jessibuca/decoder.wasm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/648540858/wvp-GB28181-pro/f9300d01ec37321abf11673a3fe70f04278927c5/web_src/static/js/jessibuca/decoder.wasm -------------------------------------------------------------------------------- /web_src/static/libDecoder.wasm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/648540858/wvp-GB28181-pro/f9300d01ec37321abf11673a3fe70f04278927c5/web_src/static/libDecoder.wasm -------------------------------------------------------------------------------- /web_src/static/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/648540858/wvp-GB28181-pro/f9300d01ec37321abf11673a3fe70f04278927c5/web_src/static/logo.png -------------------------------------------------------------------------------- /zlm.md: -------------------------------------------------------------------------------- 1 | 1. 增加接口:用来返回hook调用耗时。 2 | 参数: sn, 3 | 返回值: hook耗时 4 | 功能: zlm收到调用后立即调用心跳hook,hook中携带sn信息, zlm收到hook返回后计算此次hook的耗时,然后返回耗时 5 | 用途: 1. 可以用来检测hook配置是否正常 6 | 2. 检测wvp与zlm连接的健康程度 7 | 2. 增加接口:查询loadMP4File的录像播放位置 8 | 参数: app, steam, 9 | 返回: 当前播放的hook位置 10 | 功能: zlm收到请求后查询流的seek位置并返回 11 | 用途: 1. 获取当前播放位置,可以在页面同步显示时间 12 | 2. 用来时快进五秒 快退五秒类似的操作 13 | 3. loadMP4File扩展, 增加默认seek值和默认倍速,开始时直接从这个位置开始,并使用指定的倍速 14 | 4. 支持下载指定取件的mp4文件,这个区间可能包括多个文件和文件的一部分。 15 | 5. 希望seek接口和倍速接口可以去除schema的必选,作为可选项,不传则默认全部 16 | -------------------------------------------------------------------------------- /数据库/2.7.0/更新-mysql-2.7.0.sql: -------------------------------------------------------------------------------- 1 | alter table wvp_device_channel 2 | add stream_identification character varying(50); 3 | 4 | alter table wvp_device 5 | drop switch_primary_sub_stream; 6 | 7 | # 第一个补丁包 8 | alter table wvp_platform 9 | add send_stream_ip character varying(50); 10 | 11 | alter table wvp_device 12 | change on_line on_line bool default false; 13 | 14 | alter table wvp_device 15 | change id id serial primary key; 16 | 17 | alter table wvp_device 18 | change ssrc_check ssrc_check bool default false; -------------------------------------------------------------------------------- /数据库/2.7.0/更新-postgresql-kingbase-2.7.0.sql: -------------------------------------------------------------------------------- 1 | alter table wvp_device_channel 2 | add stream_identification character varying(50); 3 | 4 | alter table wvp_device 5 | drop switch_primary_sub_stream; 6 | 7 | # 第一个补丁包 8 | alter table wvp_platform 9 | add send_stream_ip character varying(50); 10 | 11 | alter table wvp_device 12 | change on_line on_line bool default false; 13 | 14 | alter table wvp_device 15 | change id id serial primary key; 16 | 17 | alter table wvp_device 18 | change ssrc_check ssrc_check bool default false; -------------------------------------------------------------------------------- /数据库/old/2.6.6-2.6.7更新.sql: -------------------------------------------------------------------------------- 1 | alter table device 2 | add asMessageChannel int default 0; 3 | 4 | alter table parent_platform 5 | add asMessageChannel int default 0; 6 | 7 | alter table device 8 | add mediaServerId varchar(50) default null; 9 | 10 | ALTER TABLE device 11 | ADD COLUMN `switchPrimarySubStream` bit(1) NOT NULL DEFAULT b'0' COMMENT '开启主子码流切换的开关(0-不开启,1-开启)现在已知支持设备为 大华、TP——LINK全系设备' AFTER `keepalive_interval_time` 12 | 13 | 14 | -------------------------------------------------------------------------------- /数据库/old/2.6.8补丁更新.sql: -------------------------------------------------------------------------------- 1 | alter table media_server 2 | add sendRtpPortRange varchar(50) not null; -------------------------------------------------------------------------------- /数据库/old/clean.sql: -------------------------------------------------------------------------------- 1 | delete from wvp-device; 2 | delete from wvp-device_alarm; 3 | delete from wvp-device_channel; 4 | delete from wvp-device_mobile_position; 5 | delete from wvp-gb_stream; 6 | delete from wvp-log; 7 | delete from wvp-media_server; 8 | delete from wvp-parent_platform; 9 | delete from wvp-platform_catalog; 10 | delete from wvp-platform_gb_channel; 11 | delete from wvp-platform_gb_stream; 12 | delete from wvp-stream_proxy; 13 | delete from wvp-stream_push; --------------------------------------------------------------------------------