Merge branch 'wvp-28181-2.0' into main-dev
# Conflicts:
# src/main/java/com/genersoft/iot/vmp/gb28181/bean/Device.java
# src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java
# src/main/java/com/genersoft/iot/vmp/service/IPlayService.java
# src/main/java/com/genersoft/iot/vmp/service/impl/DeviceServiceImpl.java
# src/main/java/com/genersoft/iot/vmp/service/impl/PlayServiceImpl.java
# src/main/java/com/genersoft/iot/vmp/storager/dao/DeviceMapper.java
| | |
| | | - [X] æ¯æçµåå°å¾ï¼æ¯ææ¥å
¥WGS84åGCJ02两ç§åæ ç³»ï¼å¹¶ä¸èªå¨è½¬å为åéçåæ ç³»è¿è¡å±ç¤ºååå |
| | | - [X] æ¥å
¥è®¾å¤ |
| | | - [X] è§é¢é¢è§ |
| | | - [X] æ¯æä¸»ç æµåç æµåæ¢ |
| | | - [X] æ éå¶æ¥å
¥è·¯æ°ï¼è½æ¥å
¥å¤å°è®¾å¤åªåå³äºä½ çæå¡å¨æ§è½ |
| | | - [X] äºå°æ§å¶ï¼æ§å¶è®¾å¤è½¬åï¼æè¿ï¼æè¿ |
| | | - [X] é¢ç½®ä½æ¥è¯¢ï¼ä½¿ç¨ä¸è®¾ç½® |
| | |
| | | package com.genersoft.iot.vmp.common; |
| | | |
| | | import com.genersoft.iot.vmp.service.bean.SSRCInfo; |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | |
| | | /** |
| | | * è®°å½æ¯æ¬¡åéinviteæ¶æ¯çç¶æ |
| | |
| | | public void setStreamMode(String streamMode) { |
| | | this.streamMode = streamMode; |
| | | } |
| | | |
| | | |
| | | /*=========================设å¤ä¸»åç æµé»è¾START====================*/ |
| | | @Schema(description = "æ¯å¦ä¸ºåç æµ(true-æ¯ï¼false-ä¸»ç æµ)") |
| | | private boolean subStream; |
| | | |
| | | public boolean isSubStream() { |
| | | return subStream; |
| | | } |
| | | |
| | | public void setSubStream(boolean subStream) { |
| | | this.subStream = subStream; |
| | | } |
| | | |
| | | |
| | | |
| | | |
| | | } |
| | |
| | | public void setSipTransactionInfo(SipTransactionInfo sipTransactionInfo) { |
| | | this.sipTransactionInfo = sipTransactionInfo; |
| | | } |
| | | public boolean isBroadcastPushAfterAck() { |
| | | return broadcastPushAfterAck; |
| | | } |
| | | |
| | | /*======================设å¤ä¸»åç æµé»è¾START=========================*/ |
| | | @Schema(description = "å¼å¯ä¸»åç æµåæ¢çå¼å
³ï¼false-ä¸å¼å¯ï¼true-å¼å¯ï¼") |
| | | private boolean switchPrimarySubStream; |
| | | |
| | | public boolean isSwitchPrimarySubStream() { |
| | | return switchPrimarySubStream; |
| | | } |
| | | |
| | | public void setSwitchPrimarySubStream(boolean switchPrimarySubStream) { |
| | | this.switchPrimarySubStream = switchPrimarySubStream; |
| | | } |
| | | |
| | | /*======================设å¤ä¸»åç æµé»è¾END=========================*/ |
| | | |
| | | |
| | | public boolean isBroadcastPushAfterAck() { |
| | | return broadcastPushAfterAck; |
| | | } |
| | | |
| | | public void setBroadcastPushAfterAck(boolean broadcastPushAfterAck) { |
| | | this.broadcastPushAfterAck = broadcastPushAfterAck; |
| | | } |
| | | public void setBroadcastPushAfterAck(boolean broadcastPushAfterAck) { |
| | | this.broadcastPushAfterAck = broadcastPushAfterAck; |
| | | } |
| | | } |
| | |
| | | @Schema(description = "GPSçæ´æ°æ¶é´") |
| | | private String gpsTime; |
| | | |
| | | @Schema(description = "ç æµæ è¯ï¼ä¼å
级é«äºè®¾å¤ä¸ç æµæ è¯ï¼" + |
| | | "ç¨äºéæ©ç æµæ¶ç»æç æµæ è¯ãé»è®¤ä¸ºnullï¼ä¸è®¾ç½®ãå¯éå¼: stream/streamnumber/streamprofile/streamMode") |
| | | private String streamIdentification; |
| | | |
| | | public int getId() { |
| | | return id; |
| | | } |
| | |
| | | public void setGpsTime(String gpsTime) { |
| | | this.gpsTime = gpsTime; |
| | | } |
| | | |
| | | public String getStreamIdentification() { |
| | | return streamIdentification; |
| | | } |
| | | |
| | | public void setStreamIdentification(String streamIdentification) { |
| | | this.streamIdentification = streamIdentification; |
| | | } |
| | | } |
New file |
| | |
| | | package com.genersoft.iot.vmp.gb28181.bean; |
| | | |
| | | /** |
| | | * ç æµç´¢å¼æ è¯ |
| | | */ |
| | | public enum GbSteamIdentification { |
| | | /** |
| | | * ä¸»ç æµ stream:0 |
| | | * åç æµ stream:1s |
| | | */ |
| | | streamMain("stream", new String[]{"0","1"}), |
| | | /** |
| | | * 彿 28181-2022å®ä¹çæ¹å¼ |
| | | * ä¸»ç æµ streamnumber:0 |
| | | * åç æµ streamnumber:1 |
| | | */ |
| | | streamnumber("streamnumber", new String[]{"0","1"}), |
| | | /** |
| | | * ä¸»ç æµ streamprofile:0 |
| | | * åç æµ streamprofile:1 |
| | | */ |
| | | streamprofile("streamprofile", new String[]{"0","1"}), |
| | | /** |
| | | * éç¨çåçï¼ TP-LINK |
| | | */ |
| | | streamMode("streamMode", new String[]{"main","sub"}), |
| | | ; |
| | | |
| | | GbSteamIdentification(String value, String[] indexArray) { |
| | | this.value = value; |
| | | this.indexArray = indexArray; |
| | | } |
| | | |
| | | private String value; |
| | | private String[] indexArray; |
| | | |
| | | public String getValue() { |
| | | return value; |
| | | } |
| | | |
| | | public String[] getIndexArray() { |
| | | return indexArray; |
| | | } |
| | | } |
| | |
| | | Runnable runnable = dynamicTask.get(taskOverdueKey); |
| | | if (runnable instanceof ISubscribeTask) { |
| | | ISubscribeTask subscribeTask = (ISubscribeTask) runnable; |
| | | subscribeTask.stop(); |
| | | subscribeTask.stop(null); |
| | | } |
| | | // æ·»å ä»»å¡å¤ç订é
è¿æ |
| | | dynamicTask.stop(taskOverdueKey); |
| | |
| | | Runnable runnable = dynamicTask.get(taskOverdueKey); |
| | | if (runnable instanceof ISubscribeTask) { |
| | | ISubscribeTask subscribeTask = (ISubscribeTask) runnable; |
| | | subscribeTask.stop(); |
| | | subscribeTask.stop(null); |
| | | } |
| | | // æ·»å ä»»å¡å¤ç订é
è¿æ |
| | | dynamicTask.stop(taskOverdueKey); |
| | |
| | | |
| | | import com.genersoft.iot.vmp.gb28181.bean.DeviceNotFoundEvent; |
| | | import gov.nist.javax.sip.message.SIPRequest; |
| | | import gov.nist.javax.sip.message.SIPResponse; |
| | | import org.apache.commons.lang3.ObjectUtils; |
| | | import org.slf4j.Logger; |
| | | import org.slf4j.LoggerFactory; |
| | | import org.springframework.scheduling.annotation.Scheduled; |
| | |
| | | import javax.sip.ResponseEvent; |
| | | import javax.sip.TimeoutEvent; |
| | | import javax.sip.TransactionTerminatedEvent; |
| | | import javax.sip.header.CallIdHeader; |
| | | import javax.sip.message.Response; |
| | | import javax.sip.header.WarningHeader; |
| | | import java.time.Instant; |
| | | import java.util.Map; |
| | | import java.util.concurrent.ConcurrentHashMap; |
| | |
| | | this.event = event; |
| | | if (event instanceof ResponseEvent) { |
| | | ResponseEvent responseEvent = (ResponseEvent)event; |
| | | Response response = responseEvent.getResponse(); |
| | | SIPResponse response = (SIPResponse)responseEvent.getResponse(); |
| | | this.type = EventResultType.response; |
| | | if (response != null) { |
| | | this.msg = response.getReasonPhrase(); |
| | | WarningHeader warningHeader = (WarningHeader)response.getHeader(WarningHeader.NAME); |
| | | if (warningHeader != null && !ObjectUtils.isEmpty(warningHeader.getText())) { |
| | | this.msg = ""; |
| | | if (warningHeader.getCode() > 0) { |
| | | this.msg += warningHeader.getCode() + ":"; |
| | | } |
| | | if (warningHeader.getAgent() != null) { |
| | | this.msg += warningHeader.getCode() + ":"; |
| | | } |
| | | if (warningHeader.getText() != null) { |
| | | this.msg += warningHeader.getText(); |
| | | } |
| | | }else { |
| | | this.msg = response.getReasonPhrase(); |
| | | } |
| | | this.statusCode = response.getStatusCode(); |
| | | this.callId = response.getCallIdHeader().getCallId(); |
| | | } |
| | | this.callId = ((CallIdHeader)response.getHeader(CallIdHeader.NAME)).getCallId(); |
| | | |
| | | }else if (event instanceof TimeoutEvent) { |
| | | TimeoutEvent timeoutEvent = (TimeoutEvent)event; |
| | | this.type = EventResultType.timeout; |
New file |
| | |
| | | package com.genersoft.iot.vmp.gb28181.session; |
| | | |
| | | import com.genersoft.iot.vmp.common.CommonCallback; |
| | | import org.springframework.scheduling.annotation.Scheduled; |
| | | import org.springframework.stereotype.Component; |
| | | |
| | | import java.util.Calendar; |
| | | import java.util.Map; |
| | | import java.util.concurrent.ConcurrentHashMap; |
| | | |
| | | /** |
| | | * éç¨åè°ç®¡ç |
| | | */ |
| | | @Component |
| | | public class CommonSessionManager { |
| | | |
| | | public static Map<String, CommonSession> callbackMap = new ConcurrentHashMap<>(); |
| | | |
| | | /** |
| | | * åå¨åè°ç¸å
³çä¿¡æ¯ |
| | | */ |
| | | class CommonSession{ |
| | | public String session; |
| | | public long createTime; |
| | | public int timeout; |
| | | |
| | | public CommonCallback<Object> callback; |
| | | public CommonCallback<String> timeoutCallback; |
| | | } |
| | | |
| | | /** |
| | | * æ·»å åè° |
| | | * @param sessionId å¯ä¸æ è¯ |
| | | * @param callback åè° |
| | | * @param timeout è¶
æ¶æ¶é´, åä½åé |
| | | */ |
| | | public void add(String sessionId, CommonCallback<Object> callback, CommonCallback<String> timeoutCallback, |
| | | Integer timeout) { |
| | | CommonSession commonSession = new CommonSession(); |
| | | commonSession.session = sessionId; |
| | | commonSession.callback = callback; |
| | | commonSession.createTime = System.currentTimeMillis(); |
| | | if (timeoutCallback != null) { |
| | | commonSession.timeoutCallback = timeoutCallback; |
| | | } |
| | | if (timeout != null) { |
| | | commonSession.timeout = timeout; |
| | | } |
| | | callbackMap.put(sessionId, commonSession); |
| | | } |
| | | |
| | | public void add(String sessionId, CommonCallback<Object> callback) { |
| | | add(sessionId, callback, null, 1); |
| | | } |
| | | |
| | | public CommonCallback<Object> get(String sessionId, boolean destroy) { |
| | | CommonSession commonSession = callbackMap.get(sessionId); |
| | | if (destroy) { |
| | | callbackMap.remove(sessionId); |
| | | } |
| | | return commonSession.callback; |
| | | } |
| | | |
| | | public CommonCallback<Object> get(String sessionId) { |
| | | return get(sessionId, false); |
| | | } |
| | | |
| | | public void delete(String sessionID) { |
| | | callbackMap.remove(sessionID); |
| | | } |
| | | |
| | | @Scheduled(fixedRate= 60) //æ¯åéæ§è¡ä¸æ¬¡ |
| | | public void execute(){ |
| | | Calendar cal = Calendar.getInstance(); |
| | | cal.add(Calendar.MINUTE, -1); |
| | | for (String session : callbackMap.keySet()) { |
| | | if (callbackMap.get(session).createTime < cal.getTimeInMillis()) { |
| | | // è¶
æ¶ |
| | | if (callbackMap.get(session).timeoutCallback != null) { |
| | | callbackMap.get(session).timeoutCallback.run("timeout"); |
| | | } |
| | | callbackMap.remove(session); |
| | | } |
| | | } |
| | | } |
| | | } |
| | |
| | | package com.genersoft.iot.vmp.gb28181.task; |
| | | |
| | | import javax.sip.DialogState; |
| | | import com.genersoft.iot.vmp.common.CommonCallback; |
| | | |
| | | /** |
| | | * @author lin |
| | | */ |
| | | public interface ISubscribeTask extends Runnable{ |
| | | void stop(); |
| | | void stop(CommonCallback<Boolean> callback); |
| | | } |
| | |
| | | package com.genersoft.iot.vmp.gb28181.task.impl; |
| | | |
| | | import com.genersoft.iot.vmp.common.CommonCallback; |
| | | import com.genersoft.iot.vmp.conf.DynamicTask; |
| | | import com.genersoft.iot.vmp.gb28181.bean.Device; |
| | | import com.genersoft.iot.vmp.gb28181.task.ISubscribeTask; |
| | |
| | | import gov.nist.javax.sip.message.SIPRequest; |
| | | import org.slf4j.Logger; |
| | | import org.slf4j.LoggerFactory; |
| | | import org.springframework.scheduling.annotation.Async; |
| | | import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; |
| | | |
| | | import javax.sip.*; |
| | | import javax.sip.DialogState; |
| | | import javax.sip.InvalidArgumentException; |
| | | import javax.sip.ResponseEvent; |
| | | import javax.sip.SipException; |
| | | import javax.sip.header.ToHeader; |
| | | import java.text.ParseException; |
| | | import java.util.Timer; |
| | | import java.util.TimerTask; |
| | | |
| | | /** |
| | | * ç®å½è®¢é
ä»»å¡ |
| | |
| | | } |
| | | |
| | | @Override |
| | | public void stop() { |
| | | public void stop(CommonCallback<Boolean> callback) { |
| | | /** |
| | | * dialog çåä¸ªç¶æ |
| | | * EARLY-> Early stateç¶æ-åå§è¯·æ±åé以åï¼æ¶å°äºä¸ä¸ªä¸´æ¶ååºæ¶æ¯ |
| | |
| | | // æå |
| | | logger.info("[åæ¶ç®å½è®¢é
]æåï¼ {}", device.getDeviceId()); |
| | | } |
| | | if (callback != null) { |
| | | callback.run(event.getResponse().getRawContent() != null); |
| | | } |
| | | },eventResult -> { |
| | | // 失败 |
| | | logger.warn("[åæ¶ç®å½è®¢é
]失败ï¼ä¿¡ä»¤åéå¤±è´¥ï¼ {}-{} ", device.getDeviceId(), eventResult.msg); |
| | |
| | | package com.genersoft.iot.vmp.gb28181.task.impl; |
| | | |
| | | import com.genersoft.iot.vmp.conf.DynamicTask; |
| | | import com.genersoft.iot.vmp.gb28181.bean.*; |
| | | import com.genersoft.iot.vmp.common.CommonCallback; |
| | | import com.genersoft.iot.vmp.gb28181.task.ISubscribeTask; |
| | | import com.genersoft.iot.vmp.gb28181.transmit.cmd.ISIPCommanderForPlatform; |
| | | import com.genersoft.iot.vmp.service.IPlatformService; |
| | | import com.genersoft.iot.vmp.service.bean.GPSMsgInfo; |
| | | import com.genersoft.iot.vmp.storager.IRedisCatchStorage; |
| | | import com.genersoft.iot.vmp.storager.IVideoManagerStorage; |
| | | import com.genersoft.iot.vmp.utils.SpringBeanFactory; |
| | | import org.slf4j.Logger; |
| | | import org.slf4j.LoggerFactory; |
| | | import org.springframework.scheduling.annotation.Async; |
| | | |
| | | import javax.sip.DialogState; |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * åå·²ç»è®¢é
(ç§»å¨ä½ç½®)çä¸çº§åéMobilePositionæ¶æ¯ |
| | |
| | | } |
| | | |
| | | @Override |
| | | public void stop() { |
| | | public void stop(CommonCallback<Boolean> callback) { |
| | | |
| | | } |
| | | } |
| | |
| | | package com.genersoft.iot.vmp.gb28181.task.impl; |
| | | |
| | | import com.genersoft.iot.vmp.common.CommonCallback; |
| | | import com.genersoft.iot.vmp.conf.DynamicTask; |
| | | import com.genersoft.iot.vmp.gb28181.bean.Device; |
| | | import com.genersoft.iot.vmp.gb28181.task.ISubscribeTask; |
| | | import com.genersoft.iot.vmp.gb28181.transmit.cmd.ISIPCommander; |
| | | import gov.nist.javax.sip.message.SIPRequest; |
| | | import gov.nist.javax.sip.message.SIPResponse; |
| | | import org.dom4j.Element; |
| | | import org.slf4j.Logger; |
| | | import org.slf4j.LoggerFactory; |
| | | import org.springframework.scheduling.annotation.Async; |
| | | |
| | | import javax.sip.*; |
| | | import javax.sip.InvalidArgumentException; |
| | | import javax.sip.ResponseEvent; |
| | | import javax.sip.SipException; |
| | | import javax.sip.header.ToHeader; |
| | | import java.text.ParseException; |
| | | import java.util.Timer; |
| | | import java.util.TimerTask; |
| | | |
| | | /** |
| | | * ç§»å¨ä½ç½®è®¢é
ç宿¶æ´æ° |
| | |
| | | } |
| | | |
| | | @Override |
| | | public void stop() { |
| | | public void stop(CommonCallback<Boolean> callback) { |
| | | /** |
| | | * dialog çåä¸ªç¶æ |
| | | * EARLY-> Early stateç¶æ-åå§è¯·æ±åé以åï¼æ¶å°äºä¸ä¸ªä¸´æ¶ååºæ¶æ¯ |
| | |
| | | // æå |
| | | logger.info("[åæ¶ç§»å¨ä½ç½®è®¢é
]æåï¼ {}", device.getDeviceId()); |
| | | } |
| | | if (callback != null) { |
| | | callback.run(event.getResponse().getRawContent() != null); |
| | | } |
| | | },eventResult -> { |
| | | // 失败 |
| | | logger.warn("[åæ¶ç§»å¨ä½ç½®è®¢é
]失败ï¼ä¿¡ä»¤åéå¤±è´¥ï¼ {}-{} ", device.getDeviceId(), eventResult.msg); |
| | |
| | | import com.genersoft.iot.vmp.gb28181.bean.*; |
| | | import com.genersoft.iot.vmp.gb28181.bean.Device; |
| | | import com.genersoft.iot.vmp.gb28181.bean.DeviceAlarm; |
| | | import com.genersoft.iot.vmp.gb28181.bean.DeviceChannel; |
| | | import com.genersoft.iot.vmp.gb28181.event.SipSubscribe; |
| | | import com.genersoft.iot.vmp.media.zlm.ZlmHttpHookSubscribe; |
| | | import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem; |
| | |
| | | /** |
| | | * 请æ±é¢è§è§é¢æµ |
| | | * @param device è§é¢è®¾å¤ |
| | | * @param channelId é¢è§éé |
| | | * @param channel é¢è§éé |
| | | */ |
| | | void playStreamCmd(MediaServerItem mediaServerItem, SSRCInfo ssrcInfo, Device device, String channelId, ZlmHttpHookSubscribe.Event event, SipSubscribe.Event okEvent, SipSubscribe.Event errorEvent) throws InvalidArgumentException, SipException, ParseException; |
| | | void playStreamCmd(MediaServerItem mediaServerItem, SSRCInfo ssrcInfo, Device device, DeviceChannel channel, ZlmHttpHookSubscribe.Event event, SipSubscribe.Event okEvent, SipSubscribe.Event errorEvent) throws InvalidArgumentException, SipException, ParseException; |
| | | |
| | | /** |
| | | * 请æ±åæ¾è§é¢æµ |
| | |
| | | import com.genersoft.iot.vmp.conf.exception.SsrcTransactionNotFoundException;
|
| | | import com.genersoft.iot.vmp.gb28181.SipLayer;
|
| | | import com.genersoft.iot.vmp.gb28181.bean.*;
|
| | | import com.genersoft.iot.vmp.gb28181.bean.Device;
|
| | | import com.genersoft.iot.vmp.gb28181.bean.DeviceAlarm;
|
| | | import com.genersoft.iot.vmp.gb28181.bean.DeviceChannel;
|
| | | import com.genersoft.iot.vmp.gb28181.bean.SsrcTransaction;
|
| | | import com.genersoft.iot.vmp.gb28181.event.SipSubscribe;
|
| | | import com.genersoft.iot.vmp.gb28181.session.VideoStreamSessionManager;
|
| | | import com.genersoft.iot.vmp.gb28181.transmit.SIPSender;
|
| | |
| | | * 请æ±é¢è§è§é¢æµ
|
| | | *
|
| | | * @param device è§é¢è®¾å¤
|
| | | * @param channelId é¢è§éé
|
| | | * @param channel é¢è§éé
|
| | | * @param event hook订é
|
| | | * @param errorEvent sipé误订é
|
| | | */
|
| | | @Override
|
| | | public void playStreamCmd(MediaServerItem mediaServerItem, SSRCInfo ssrcInfo, Device device, String channelId,
|
| | | public void playStreamCmd(MediaServerItem mediaServerItem, SSRCInfo ssrcInfo, Device device, DeviceChannel channel,
|
| | | ZlmHttpHookSubscribe.Event event, SipSubscribe.Event okEvent, SipSubscribe.Event errorEvent) throws InvalidArgumentException, SipException, ParseException {
|
| | | String stream = ssrcInfo.getStream();
|
| | |
|
| | |
| | | }
|
| | | StringBuffer content = new StringBuffer(200);
|
| | | content.append("v=0\r\n");
|
| | | content.append("o=" + channelId + " 0 0 IN IP4 " + sdpIp + "\r\n");
|
| | | content.append("o=" + channel.getChannelId() + " 0 0 IN IP4 " + sdpIp + "\r\n");
|
| | | content.append("s=Play\r\n");
|
| | | content.append("c=IN IP4 " + sdpIp + "\r\n");
|
| | | content.append("t=0 0\r\n");
|
| | |
| | | }
|
| | | }
|
| | |
|
| | | if( device.isSwitchPrimarySubStream() ){
|
| | | if("TP-LINK".equals(device.getManufacturer())){
|
| | | if (device.isSwitchPrimarySubStream()){
|
| | | content.append("a=streamMode:sub\r\n");
|
| | | }else {
|
| | | content.append("a=streamMode:main\r\n");
|
| | | }
|
| | | }else {
|
| | | if (device.isSwitchPrimarySubStream()){
|
| | | content.append("a=streamprofile:1\r\n");
|
| | | }else {
|
| | | content.append("a=streamprofile:0\r\n");
|
| | | }
|
| | | }
|
| | | if (!ObjectUtils.isEmpty(channel.getStreamIdentification())) {
|
| | | content.append("a=" + channel.getStreamIdentification() + "\r\n");
|
| | | }
|
| | |
|
| | | content.append("y=" + ssrcInfo.getSsrc() + "\r\n");//ssrc
|
| | |
| | |
|
| | |
|
| | |
|
| | | Request request = headerProvider.createInviteRequest(device, channelId, content.toString(), SipUtils.getNewViaTag(), SipUtils.getNewFromTag(), null, ssrcInfo.getSsrc(),sipSender.getNewCallIdHeader(sipLayer.getLocalIp(device.getLocalIp()),device.getTransport()));
|
| | | Request request = headerProvider.createInviteRequest(device, channel.getChannelId(), content.toString(), SipUtils.getNewViaTag(), SipUtils.getNewFromTag(), null, ssrcInfo.getSsrc(),sipSender.getNewCallIdHeader(sipLayer.getLocalIp(device.getLocalIp()),device.getTransport()));
|
| | | sipSender.transmitRequest(sipLayer.getLocalIp(device.getLocalIp()), request, (e -> {
|
| | | streamSession.remove(device.getDeviceId(), channelId, ssrcInfo.getStream());
|
| | | streamSession.remove(device.getDeviceId(), channel.getChannelId(), ssrcInfo.getStream());
|
| | | mediaServerService.releaseSsrc(mediaServerItem.getId(), ssrcInfo.getSsrc());
|
| | | errorEvent.response(e);
|
| | | }), e -> {
|
| | | ResponseEvent responseEvent = (ResponseEvent) e.event;
|
| | | SIPResponse response = (SIPResponse) responseEvent.getResponse();
|
| | | String callId = response.getCallIdHeader().getCallId();
|
| | | streamSession.put(device.getDeviceId(), channelId, callId, stream, ssrcInfo.getSsrc(), mediaServerItem.getId(), response,
|
| | | streamSession.put(device.getDeviceId(), channel.getChannelId(), callId, stream, ssrcInfo.getSsrc(), mediaServerItem.getId(), response,
|
| | | InviteSessionType.PLAY);
|
| | | okEvent.response(e);
|
| | | });
|
| | |
| | | import com.genersoft.iot.vmp.conf.UserSetting; |
| | | import com.genersoft.iot.vmp.gb28181.bean.*; |
| | | import com.genersoft.iot.vmp.gb28181.event.EventPublisher; |
| | | import com.genersoft.iot.vmp.gb28181.event.subscribe.catalog.CatalogEvent; |
| | | import com.genersoft.iot.vmp.gb28181.transmit.SIPProcessorObserver; |
| | | import com.genersoft.iot.vmp.gb28181.transmit.callback.DeferredResultHolder; |
| | | import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommander; |
| | |
| | | import javax.sip.header.FromHeader; |
| | | import javax.sip.message.Response; |
| | | import java.text.ParseException; |
| | | import java.util.Iterator; |
| | | import java.util.List; |
| | | import java.util.concurrent.ConcurrentLinkedQueue; |
| | | |
| | |
| | | mobilePosition.getLongitude(), mobilePosition.getLatitude()); |
| | | mobilePosition.setReportSource("Mobile Position"); |
| | | |
| | | |
| | | // æ´æ°device channel çç»çº¬åº¦ |
| | | DeviceChannel deviceChannel = new DeviceChannel(); |
| | | deviceChannel.setDeviceId(device.getDeviceId()); |
| | |
| | | } |
| | | |
| | | storager.updateChannelPosition(deviceChannel); |
| | | // åå
³èäºè¯¥ééå¹¶ä¸å¼å¯ç§»å¨ä½ç½®è®¢é
çä¸çº§å¹³å°åéç§»å¨ä½ç½®è®¢é
æ¶æ¯ |
| | | |
| | | |
| | | // åéredisæ¶æ¯ã éç¥ä½ç½®ä¿¡æ¯çåå |
| | | JSONObject jsonObject = new JSONObject(); |
| | |
| | | device.setIp(remoteAddressInfo.getIp()); |
| | | // 设å¤å°åååä¼å¼èµ·ç®å½è®¢é
ä»»å¡å¤±æï¼éè¦éæ°æ·»å |
| | | if (device.getSubscribeCycleForCatalog() > 0) { |
| | | deviceService.removeCatalogSubscribe(device); |
| | | deviceService.addCatalogSubscribe(device); |
| | | deviceService.removeCatalogSubscribe(device, result->{ |
| | | deviceService.addCatalogSubscribe(device); |
| | | }); |
| | | } |
| | | } |
| | | if (device.getKeepaliveTime() == null) { |
| | |
| | | * ç´æ¥æ¹éæ·»å |
| | | */ |
| | | void batchAddChannel(List<DeviceChannel> deviceChannels); |
| | | |
| | | /** |
| | | * ä¿®æ¹ééçç æµç±»å |
| | | */ |
| | | void updateChannelStreamIdentification(DeviceChannel channel); |
| | | } |
| | |
| | | package com.genersoft.iot.vmp.service; |
| | | |
| | | import com.genersoft.iot.vmp.common.CommonCallback; |
| | | import com.genersoft.iot.vmp.gb28181.bean.Device; |
| | | import com.genersoft.iot.vmp.gb28181.bean.DeviceChannel; |
| | | import com.genersoft.iot.vmp.gb28181.bean.SipTransactionInfo; |
| | |
| | | * @param device 设å¤ä¿¡æ¯ |
| | | * @return å¸å° |
| | | */ |
| | | boolean removeCatalogSubscribe(Device device); |
| | | boolean removeCatalogSubscribe(Device device, CommonCallback<Boolean> callback); |
| | | |
| | | /** |
| | | * æ·»å ç§»å¨ä½ç½®è®¢é
|
| | |
| | | * @param device 设å¤ä¿¡æ¯ |
| | | * @return å¸å° |
| | | */ |
| | | boolean removeMobilePositionSubscribe(Device device); |
| | | boolean removeMobilePositionSubscribe(Device device, CommonCallback<Boolean> callback); |
| | | |
| | | /** |
| | | * ç§»é¤ç§»å¨ä½ç½®è®¢é
|
| | |
| | | import com.genersoft.iot.vmp.gb28181.bean.Device; |
| | | import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform; |
| | | import com.genersoft.iot.vmp.gb28181.bean.SendRtpItem; |
| | | import com.genersoft.iot.vmp.gb28181.bean.DeviceChannel; |
| | | import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem; |
| | | import com.genersoft.iot.vmp.media.zlm.dto.hook.HookParam; |
| | | import com.genersoft.iot.vmp.service.bean.ErrorCallback; |
| | |
| | | */ |
| | | public interface IPlayService { |
| | | |
| | | void play(MediaServerItem mediaServerItem, SSRCInfo ssrcInfo, Device device, String channelId, |
| | | void play(MediaServerItem mediaServerItem, SSRCInfo ssrcInfo, Device device, DeviceChannel channelId, |
| | | ErrorCallback<Object> callback); |
| | | SSRCInfo play(MediaServerItem mediaServerItem, String deviceId, String channelId, String ssrc, ErrorCallback<Object> callback); |
| | | |
| | |
| | | import org.slf4j.LoggerFactory; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.util.ObjectUtils; |
| | | |
| | | import java.util.ArrayList; |
| | | import java.util.HashMap; |
| | |
| | | } |
| | | } |
| | | |
| | | |
| | | @Override |
| | | public void updateChannelStreamIdentification(DeviceChannel channel) { |
| | | assert !ObjectUtils.isEmpty(channel.getDeviceId()); |
| | | assert !ObjectUtils.isEmpty(channel.getStreamIdentification()); |
| | | if (ObjectUtils.isEmpty(channel.getStreamIdentification())) { |
| | | logger.info("[éç½®ééç æµç±»å] 设å¤: {}, ç æµï¼ {}", channel.getDeviceId(), channel.getStreamIdentification()); |
| | | }else { |
| | | logger.info("[æ´æ°ééç æµç±»å] 设å¤: {}, ééï¼{}ï¼ ç æµï¼ {}", channel.getDeviceId(), channel.getChannelId(), |
| | | channel.getStreamIdentification()); |
| | | } |
| | | channelMapper.updateChannelStreamIdentification(channel); |
| | | } |
| | | } |
| | |
| | | package com.genersoft.iot.vmp.service.impl; |
| | | |
| | | import com.baomidou.dynamic.datasource.annotation.DS; |
| | | import com.genersoft.iot.vmp.common.CommonCallback; |
| | | import com.genersoft.iot.vmp.common.VideoManagerConstants; |
| | | import com.genersoft.iot.vmp.conf.DynamicTask; |
| | | import com.genersoft.iot.vmp.conf.UserSetting; |
| | | import com.genersoft.iot.vmp.conf.exception.SsrcTransactionNotFoundException; |
| | | import com.genersoft.iot.vmp.gb28181.bean.*; |
| | | import com.genersoft.iot.vmp.gb28181.session.AudioBroadcastManager; |
| | | import com.genersoft.iot.vmp.gb28181.session.VideoStreamSessionManager; |
| | |
| | | } |
| | | sync(device); |
| | | }else { |
| | | |
| | | if (deviceInDb != null) { |
| | | device.setSwitchPrimarySubStream(deviceInDb.isSwitchPrimarySubStream()); |
| | | } |
| | | if(!device.isOnLine()){ |
| | | device.setOnLine(true); |
| | | device.setCreateTime(now); |
| | |
| | | } |
| | | } |
| | | // ç§»é¤è®¢é
|
| | | removeCatalogSubscribe(device); |
| | | removeMobilePositionSubscribe(device); |
| | | if (userSetting.getDeviceStatusNotify()) { |
| | | // åéredisæ¶æ¯ |
| | | redisCatchStorage.sendDeviceOrChannelStatus(device.getDeviceId(), null, false); |
| | | } |
| | | removeCatalogSubscribe(device, null); |
| | | removeMobilePositionSubscribe(device, null); |
| | | |
| | | List<AudioBroadcastCatch> audioBroadcastCatches = audioBroadcastManager.get(deviceId); |
| | | if (audioBroadcastCatches.size() > 0) { |
| | |
| | | } |
| | | |
| | | @Override |
| | | public boolean removeCatalogSubscribe(Device device) { |
| | | public boolean removeCatalogSubscribe(Device device, CommonCallback<Boolean> callback) { |
| | | if (device == null || device.getSubscribeCycleForCatalog() < 0) { |
| | | return false; |
| | | } |
| | |
| | | Runnable runnable = dynamicTask.get(taskKey); |
| | | if (runnable instanceof ISubscribeTask) { |
| | | ISubscribeTask subscribeTask = (ISubscribeTask) runnable; |
| | | subscribeTask.stop(); |
| | | subscribeTask.stop(callback); |
| | | } |
| | | } |
| | | dynamicTask.stop(taskKey); |
| | |
| | | } |
| | | |
| | | @Override |
| | | public boolean removeMobilePositionSubscribe(Device device) { |
| | | public boolean removeMobilePositionSubscribe(Device device, CommonCallback<Boolean> callback) { |
| | | if (device == null || device.getSubscribeCycleForCatalog() < 0) { |
| | | return false; |
| | | } |
| | |
| | | Runnable runnable = dynamicTask.get(taskKey); |
| | | if (runnable instanceof ISubscribeTask) { |
| | | ISubscribeTask subscribeTask = (ISubscribeTask) runnable; |
| | | subscribeTask.stop(); |
| | | subscribeTask.stop(callback); |
| | | } |
| | | } |
| | | dynamicTask.stop(taskKey); |
| | |
| | | logger.warn("æ´æ°è®¾å¤æ¶æªæ¾å°è®¾å¤ä¿¡æ¯"); |
| | | return; |
| | | } |
| | | if(deviceInStore.isSwitchPrimarySubStream() != device.isSwitchPrimarySubStream()){ |
| | | //å½ä¿®æ¹è®¾å¤ç主åç æµå¼å
³æ¶ï¼éè¦æ ¡éªæ¯å¦å卿µï¼å¦æå卿µåç´æ¥å
³é |
| | | List<SsrcTransaction> ssrcTransactionForAll = streamSession.getSsrcTransactionForAll(device.getDeviceId(), null, null, null); |
| | | if(ssrcTransactionForAll != null){ |
| | | for (SsrcTransaction ssrcTransaction: ssrcTransactionForAll) { |
| | | try { |
| | | cmder.streamByeCmd(device, ssrcTransaction.getChannelId(), ssrcTransaction.getStream(), null, null); |
| | | } catch (InvalidArgumentException | SsrcTransactionNotFoundException | ParseException | SipException e) { |
| | | throw new RuntimeException(e); |
| | | } |
| | | } |
| | | } |
| | | deviceChannelMapper.clearPlay(device.getDeviceId()); |
| | | inviteStreamService.clearInviteInfo(device.getDeviceId()); |
| | | } |
| | | |
| | | if (!ObjectUtils.isEmpty(device.getName())) { |
| | | deviceInStore.setName(device.getName()); |
| | |
| | | if (!ObjectUtils.isEmpty(device.getStreamMode())) { |
| | | deviceInStore.setStreamMode(device.getStreamMode()); |
| | | } |
| | | |
| | | |
| | | // ç®å½è®¢é
ç¸å
³çä¿¡æ¯ |
| | | if (deviceInStore.getSubscribeCycleForCatalog() != device.getSubscribeCycleForCatalog()) { |
| | | if (device.getSubscribeCycleForCatalog() > 0) { |
| | | // è¥å·²å¼å¯è®¢é
ï¼ä½è®¢é
卿ä¸åï¼åå
åæ¶ |
| | | if (deviceInStore.getSubscribeCycleForCatalog() != 0) { |
| | | removeCatalogSubscribe(deviceInStore); |
| | | removeCatalogSubscribe(deviceInStore, result->{ |
| | | // å¼å¯è®¢é
|
| | | deviceInStore.setSubscribeCycleForCatalog(device.getSubscribeCycleForCatalog()); |
| | | addCatalogSubscribe(deviceInStore); |
| | | // å 为æ¯å¼æ¥æ§è¡ï¼éè¦å¨è¿éæ´æ°ä¸æ°æ® |
| | | deviceMapper.updateCustom(deviceInStore); |
| | | redisCatchStorage.updateDevice(deviceInStore); |
| | | }); |
| | | }else { |
| | | // å¼å¯è®¢é
|
| | | deviceInStore.setSubscribeCycleForCatalog(device.getSubscribeCycleForCatalog()); |
| | | addCatalogSubscribe(deviceInStore); |
| | | } |
| | | // å¼å¯è®¢é
|
| | | deviceInStore.setSubscribeCycleForCatalog(device.getSubscribeCycleForCatalog()); |
| | | addCatalogSubscribe(deviceInStore); |
| | | |
| | | }else if (device.getSubscribeCycleForCatalog() == 0) { |
| | | // åæ¶è®¢é
|
| | | deviceInStore.setSubscribeCycleForCatalog(device.getSubscribeCycleForCatalog()); |
| | | removeCatalogSubscribe(deviceInStore); |
| | | deviceInStore.setSubscribeCycleForCatalog(0); |
| | | removeCatalogSubscribe(deviceInStore, null); |
| | | } |
| | | } |
| | | |
| | | // ç§»å¨ä½ç½®è®¢é
ç¸å
³çä¿¡æ¯ |
| | | if (device.getSubscribeCycleForMobilePosition() > 0) { |
| | | if (deviceInStore.getSubscribeCycleForMobilePosition() == 0 || deviceInStore.getSubscribeCycleForMobilePosition() != device.getSubscribeCycleForMobilePosition()) { |
| | | deviceInStore.setMobilePositionSubmissionInterval(device.getMobilePositionSubmissionInterval()); |
| | | deviceInStore.setSubscribeCycleForMobilePosition(device.getSubscribeCycleForMobilePosition()); |
| | | // å¼å¯è®¢é
|
| | | addMobilePositionSubscribe(deviceInStore); |
| | | } |
| | | }else if (device.getSubscribeCycleForMobilePosition() == 0) { |
| | | if (deviceInStore.getSubscribeCycleForMobilePosition() != 0) { |
| | | deviceInStore.setMobilePositionSubmissionInterval(device.getMobilePositionSubmissionInterval()); |
| | | deviceInStore.setSubscribeCycleForMobilePosition(device.getSubscribeCycleForMobilePosition()); |
| | | if (deviceInStore.getSubscribeCycleForMobilePosition() != device.getSubscribeCycleForMobilePosition()) { |
| | | if (device.getSubscribeCycleForMobilePosition() > 0) { |
| | | // è¥å·²å¼å¯è®¢é
ï¼ä½è®¢é
卿ä¸åï¼åå
åæ¶ |
| | | if (deviceInStore.getSubscribeCycleForMobilePosition() != 0) { |
| | | removeMobilePositionSubscribe(deviceInStore, result->{ |
| | | // å¼å¯è®¢é
|
| | | deviceInStore.setSubscribeCycleForMobilePosition(device.getSubscribeCycleForMobilePosition()); |
| | | addMobilePositionSubscribe(deviceInStore); |
| | | // å 为æ¯å¼æ¥æ§è¡ï¼éè¦å¨è¿éæ´æ°ä¸æ°æ® |
| | | deviceMapper.updateCustom(deviceInStore); |
| | | redisCatchStorage.updateDevice(deviceInStore); |
| | | }); |
| | | }else { |
| | | // å¼å¯è®¢é
|
| | | deviceInStore.setSubscribeCycleForMobilePosition(device.getSubscribeCycleForMobilePosition()); |
| | | addMobilePositionSubscribe(deviceInStore); |
| | | } |
| | | |
| | | }else if (device.getSubscribeCycleForMobilePosition() == 0) { |
| | | // åæ¶è®¢é
|
| | | removeMobilePositionSubscribe(deviceInStore); |
| | | deviceInStore.setSubscribeCycleForCatalog(0); |
| | | removeCatalogSubscribe(deviceInStore, null); |
| | | } |
| | | } |
| | | if (deviceInStore.getGeoCoordSys() != null) { |
| | |
| | | deviceInStore.setSsrcCheck(device.isSsrcCheck()); |
| | | //ä½ä¸ºæ¶æ¯éé |
| | | deviceInStore.setAsMessageChannel(device.isAsMessageChannel()); |
| | | |
| | | // æ´æ°redis |
| | | |
| | | deviceMapper.updateCustom(deviceInStore); |
| | | redisCatchStorage.removeDevice(deviceInStore.getDeviceId()); |
| | | redisCatchStorage.updateDevice(deviceInStore); |
| | | } |
| | | |
| | | @Override |
| | |
| | | import com.genersoft.iot.vmp.gb28181.session.VideoStreamSessionManager; |
| | | import com.genersoft.iot.vmp.gb28181.transmit.cmd.ISIPCommanderForPlatform; |
| | | import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommander; |
| | | import com.genersoft.iot.vmp.gb28181.transmit.cmd.ISIPCommander; |
| | | import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommanderFroPlatform; |
| | | import com.genersoft.iot.vmp.gb28181.utils.SipUtils; |
| | | import com.genersoft.iot.vmp.media.zlm.ZLMRESTfulUtils; |
| | | import com.genersoft.iot.vmp.media.zlm.ZLMServerFactory; |
| | |
| | | import com.genersoft.iot.vmp.media.zlm.dto.*; |
| | | import com.genersoft.iot.vmp.media.zlm.*; |
| | | import com.genersoft.iot.vmp.media.zlm.dto.HookSubscribeFactory; |
| | | import com.genersoft.iot.vmp.media.zlm.dto.HookSubscribeForStreamChange; |
| | | import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem; |
| | | import com.genersoft.iot.vmp.media.zlm.dto.HookSubscribeFactory; |
| | | import com.genersoft.iot.vmp.media.zlm.dto.HookSubscribeForRecordMp4; |
| | | import com.genersoft.iot.vmp.media.zlm.dto.HookSubscribeForStreamChange; |
| | | import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem; |
| | | import com.genersoft.iot.vmp.media.zlm.dto.hook.HookParam; |
| | |
| | | import com.genersoft.iot.vmp.service.bean.RequestPushStreamMsg; |
| | | import com.genersoft.iot.vmp.service.bean.SSRCInfo; |
| | | import com.genersoft.iot.vmp.service.redisMsg.RedisGbPlayMsgListener; |
| | | import com.genersoft.iot.vmp.service.bean.DownloadFileInfo; |
| | | import com.genersoft.iot.vmp.service.bean.ErrorCallback; |
| | | import com.genersoft.iot.vmp.service.bean.InviteErrorCode; |
| | | import com.genersoft.iot.vmp.service.bean.SSRCInfo; |
| | | import com.genersoft.iot.vmp.storager.IRedisCatchStorage; |
| | | import com.genersoft.iot.vmp.storager.IVideoManagerStorage; |
| | | import com.genersoft.iot.vmp.storager.dao.CloudRecordServiceMapper; |
| | | import com.genersoft.iot.vmp.utils.CloudRecordUtils; |
| | | import com.genersoft.iot.vmp.utils.DateUtil; |
| | | import com.genersoft.iot.vmp.vmanager.bean.AudioBroadcastResult; |
| | |
| | | private IVideoManagerStorage storager; |
| | | |
| | | @Autowired |
| | | private SIPCommander cmder; |
| | | private ISIPCommander cmder; |
| | | |
| | | @Autowired |
| | | private AudioBroadcastManager audioBroadcastManager; |
| | |
| | | |
| | | @Autowired |
| | | private UserSetting userSetting; |
| | | |
| | | @Autowired |
| | | private IDeviceChannelService channelService; |
| | | |
| | | @Autowired |
| | | private SipConfig sipConfig; |
| | |
| | | if (device.getStreamMode().equalsIgnoreCase("TCP-ACTIVE") && !mediaServerItem.isRtpEnable()) { |
| | | logger.warn("[ç¹æ] åç«¯å£æ¶æµæ¶ä¸æ¯æTCP䏻卿¹å¼æ¶æµ deviceId: {},channelId:{}", deviceId, channelId); |
| | | throw new ControllerException(ErrorCode.ERROR100.getCode(), "åç«¯å£æ¶æµæ¶ä¸æ¯æTCP䏻卿¹å¼æ¶æµ"); |
| | | } |
| | | DeviceChannel channel = channelService.getOne(deviceId, channelId); |
| | | if (channel == null) { |
| | | logger.warn("[ç¹æ] æªæ¾å°éé deviceId: {},channelId:{}", deviceId, channelId); |
| | | throw new ControllerException(ErrorCode.ERROR100.getCode(), "æªæ¾å°éé"); |
| | | } |
| | | InviteInfo inviteInfo = inviteStreamService.getInviteInfoByDeviceAndChannel(InviteSessionType.PLAY, deviceId, channelId); |
| | | if (inviteInfo != null ) { |
| | |
| | | null); |
| | | return null; |
| | | } |
| | | play(mediaServerItem, ssrcInfo, device, channelId, callback); |
| | | play(mediaServerItem, ssrcInfo, device, channel, callback); |
| | | return ssrcInfo; |
| | | } |
| | | |
| | |
| | | |
| | | |
| | | @Override |
| | | public void play(MediaServerItem mediaServerItem, SSRCInfo ssrcInfo, Device device, String channelId, |
| | | public void play(MediaServerItem mediaServerItem, SSRCInfo ssrcInfo, Device device, DeviceChannel channel, |
| | | ErrorCallback<Object> callback) { |
| | | |
| | | if (mediaServerItem == null || ssrcInfo == null) { |
| | |
| | | null); |
| | | return; |
| | | } |
| | | logger.info("[ç¹æå¼å§] deviceId: {}, channelId: {},ç æµç±»åï¼{}, æ¶æµç«¯å£ï¼ {}, STREAMï¼{}, æ¶æµæ¨¡å¼ï¼{}, SSRC: {}, SSRCæ ¡éªï¼{}", |
| | | device.getDeviceId(), channelId, device.isSwitchPrimarySubStream() ? "è¾
ç æµ" : "ä¸»ç æµ", ssrcInfo.getPort(), ssrcInfo.getStream(), |
| | | logger.info("[ç¹æå¼å§] deviceId: {}, channelId: {},ç æµç±»åï¼{}, æ¶æµç«¯å£ï¼ {}, ç æµï¼{}, æ¶æµæ¨¡å¼ï¼{}, SSRC: {}, SSRCæ ¡éªï¼{}", |
| | | device.getDeviceId(), channel.getChannelId(), channel.getStreamIdentification(), ssrcInfo.getPort(), ssrcInfo.getStream(), |
| | | device.getStreamMode(), ssrcInfo.getSsrc(), device.isSsrcCheck()); |
| | | //端å£è·å失败çssrcInfo 没æå¿
è¦åéç¹ææä»¤ |
| | | if (ssrcInfo.getPort() <= 0) { |
| | | logger.info("[ç¹æç«¯å£åé
å¼å¸¸]ï¼deviceId={},channelId={},ssrcInfo={}", device.getDeviceId(), channelId, ssrcInfo); |
| | | logger.info("[ç¹æç«¯å£åé
å¼å¸¸]ï¼deviceId={},channelId={},ssrcInfo={}", device.getDeviceId(), channel.getChannelId(), ssrcInfo); |
| | | // éæ¾ssrc |
| | | mediaServerService.releaseSsrc(mediaServerItem.getId(), ssrcInfo.getSsrc()); |
| | | streamSession.remove(device.getDeviceId(), channelId, ssrcInfo.getStream()); |
| | | streamSession.remove(device.getDeviceId(), channel.getChannelId(), ssrcInfo.getStream()); |
| | | |
| | | callback.run(InviteErrorCode.ERROR_FOR_RESOURCE_EXHAUSTION.getCode(), "ç¹æç«¯å£åé
å¼å¸¸", null); |
| | | inviteStreamService.call(InviteSessionType.PLAY, device.getDeviceId(), channelId, null, |
| | | inviteStreamService.call(InviteSessionType.PLAY, device.getDeviceId(), channel.getChannelId(), null, |
| | | InviteErrorCode.ERROR_FOR_RESOURCE_EXHAUSTION.getCode(), "ç¹æç«¯å£åé
å¼å¸¸", null); |
| | | return; |
| | | } |
| | | |
| | | // åå§åredisä¸çinviteæ¶æ¯ç¶æ |
| | | InviteInfo inviteInfo = InviteInfo.getInviteInfo(device.getDeviceId(), channelId, ssrcInfo.getStream(), ssrcInfo, |
| | | InviteInfo inviteInfo = InviteInfo.getInviteInfo(device.getDeviceId(), channel.getChannelId(), ssrcInfo.getStream(), ssrcInfo, |
| | | mediaServerItem.getSdpIp(), ssrcInfo.getPort(), device.getStreamMode(), InviteSessionType.PLAY, |
| | | InviteSessionStatus.ready); |
| | | inviteInfo.setSubStream(device.isSwitchPrimarySubStream()); |
| | | inviteStreamService.updateInviteInfo(inviteInfo); |
| | | // è¶
æ¶å¤ç |
| | | String timeOutTaskKey = UUID.randomUUID().toString(); |
| | | dynamicTask.startDelay(timeOutTaskKey, () -> { |
| | | // æ§è¡è¶
æ¶ä»»å¡æ¶æ¥è¯¢æ¯å¦å·²ç»æåï¼æåäºå䏿§è¡è¶
æ¶ä»»å¡ï¼é²æ¢è¶
æ¶ä»»å¡åæ¶å¤±è´¥çæ
åµ |
| | | InviteInfo inviteInfoForTimeOut = inviteStreamService.getInviteInfoByDeviceAndChannel(InviteSessionType.PLAY, device.getDeviceId(), channelId); |
| | | InviteInfo inviteInfoForTimeOut = inviteStreamService.getInviteInfoByDeviceAndChannel(InviteSessionType.PLAY, device.getDeviceId(), channel.getChannelId()); |
| | | if (inviteInfoForTimeOut == null || inviteInfoForTimeOut.getStreamInfo() == null) { |
| | | logger.info("[ç¹æè¶
æ¶] æ¶æµè¶
æ¶ deviceId: {}, channelId: {},ç æµç±»åï¼{}ï¼ç«¯å£ï¼{}, SSRC: {}", |
| | | device.getDeviceId(), channelId, device.isSwitchPrimarySubStream() ? "è¾
ç æµ" : "ä¸»ç æµ", |
| | | logger.info("[ç¹æè¶
æ¶] æ¶æµè¶
æ¶ deviceId: {}, channelId: {},ç æµï¼{}ï¼ç«¯å£ï¼{}, SSRC: {}", |
| | | device.getDeviceId(), channel.getChannelId(), channel.getStreamIdentification(), |
| | | ssrcInfo.getPort(), ssrcInfo.getSsrc()); |
| | | |
| | | callback.run(InviteErrorCode.ERROR_FOR_STREAM_TIMEOUT.getCode(), InviteErrorCode.ERROR_FOR_STREAM_TIMEOUT.getMsg(), null); |
| | | inviteStreamService.call(InviteSessionType.PLAY, device.getDeviceId(), channelId, null, |
| | | inviteStreamService.call(InviteSessionType.PLAY, device.getDeviceId(), channel.getChannelId(), null, |
| | | InviteErrorCode.ERROR_FOR_STREAM_TIMEOUT.getCode(), InviteErrorCode.ERROR_FOR_STREAM_TIMEOUT.getMsg(), null); |
| | | inviteStreamService.removeInviteInfoByDeviceAndChannel(InviteSessionType.PLAY, device.getDeviceId(), channelId); |
| | | inviteStreamService.removeInviteInfoByDeviceAndChannel(InviteSessionType.PLAY, device.getDeviceId(), channel.getChannelId()); |
| | | |
| | | try { |
| | | cmder.streamByeCmd(device, channelId, ssrcInfo.getStream(), null); |
| | | } catch (InvalidArgumentException | ParseException | SipException | |
| | | SsrcTransactionNotFoundException e) { |
| | | cmder.streamByeCmd(device, channel.getChannelId(), ssrcInfo.getStream(), null); |
| | | } catch (InvalidArgumentException | ParseException | SipException | SsrcTransactionNotFoundException e) { |
| | | logger.error("[ç¹æè¶
æ¶]ï¼ åéBYE失败 {}", e.getMessage()); |
| | | } finally { |
| | | mediaServerService.releaseSsrc(mediaServerItem.getId(), ssrcInfo.getSsrc()); |
| | | mediaServerService.closeRTPServer(mediaServerItem, ssrcInfo.getStream()); |
| | | streamSession.remove(device.getDeviceId(), channelId, ssrcInfo.getStream()); |
| | | streamSession.remove(device.getDeviceId(), channel.getChannelId(), ssrcInfo.getStream()); |
| | | mediaServerService.closeRTPServer(mediaServerItem, ssrcInfo.getStream()); |
| | | // åæ¶è®¢é
æ¶æ¯çå¬ |
| | | HookSubscribeForStreamChange hookSubscribe = HookSubscribeFactory.on_stream_changed("rtp", ssrcInfo.getStream(), true, "rtsp", mediaServerItem.getId()); |
| | | subscribe.removeSubscribe(hookSubscribe); |
| | | } |
| | | }else { |
| | | logger.info("[ç¹æè¶
æ¶] æ¶æµè¶
æ¶ deviceId: {}, channelId: {},ç æµç±»åï¼{}ï¼ç«¯å£ï¼{}, SSRC: {}", |
| | | device.getDeviceId(), channelId, device.isSwitchPrimarySubStream() ? "è¾
ç æµ" : "ä¸»ç æµ", |
| | | logger.info("[ç¹æè¶
æ¶] æ¶æµè¶
æ¶ deviceId: {}, channelId: {},ç æµï¼{}ï¼ç«¯å£ï¼{}, SSRC: {}", |
| | | device.getDeviceId(), channel.getChannelId(), channel.getStreamIdentification(), |
| | | ssrcInfo.getPort(), ssrcInfo.getSsrc()); |
| | | |
| | | mediaServerService.releaseSsrc(mediaServerItem.getId(), ssrcInfo.getSsrc()); |
| | | |
| | | mediaServerService.closeRTPServer(mediaServerItem.getId(), ssrcInfo.getStream()); |
| | | streamSession.remove(device.getDeviceId(), channelId, ssrcInfo.getStream()); |
| | | streamSession.remove(device.getDeviceId(), channel.getChannelId(), ssrcInfo.getStream()); |
| | | } |
| | | }, userSetting.getPlayTimeout()); |
| | | |
| | | try { |
| | | cmder.playStreamCmd(mediaServerItem, ssrcInfo, device, channelId, (mediaServerItemInuse, hookParam ) -> { |
| | | cmder.playStreamCmd(mediaServerItem, ssrcInfo, device, channel, (mediaServerItemInuse, hookParam ) -> { |
| | | logger.info("æ¶å°è®¢é
æ¶æ¯ï¼ " + hookParam); |
| | | dynamicTask.stop(timeOutTaskKey); |
| | | // hookååº |
| | | StreamInfo streamInfo = onPublishHandlerForPlay(mediaServerItemInuse, hookParam, device.getDeviceId(), channelId); |
| | | StreamInfo streamInfo = onPublishHandlerForPlay(mediaServerItemInuse, hookParam, device.getDeviceId(), channel.getChannelId()); |
| | | if (streamInfo == null){ |
| | | callback.run(InviteErrorCode.ERROR_FOR_STREAM_PARSING_EXCEPTIONS.getCode(), |
| | | InviteErrorCode.ERROR_FOR_STREAM_PARSING_EXCEPTIONS.getMsg(), null); |
| | | inviteStreamService.call(InviteSessionType.PLAY, device.getDeviceId(), channelId, null, |
| | | inviteStreamService.call(InviteSessionType.PLAY, device.getDeviceId(), channel.getChannelId(), null, |
| | | InviteErrorCode.ERROR_FOR_STREAM_PARSING_EXCEPTIONS.getCode(), |
| | | InviteErrorCode.ERROR_FOR_STREAM_PARSING_EXCEPTIONS.getMsg(), null); |
| | | return; |
| | | } |
| | | callback.run(InviteErrorCode.SUCCESS.getCode(), InviteErrorCode.SUCCESS.getMsg(), streamInfo); |
| | | inviteStreamService.call(InviteSessionType.PLAY, device.getDeviceId(), channelId, null, |
| | | inviteStreamService.call(InviteSessionType.PLAY, device.getDeviceId(), channel.getChannelId(), null, |
| | | InviteErrorCode.SUCCESS.getCode(), |
| | | InviteErrorCode.SUCCESS.getMsg(), |
| | | streamInfo); |
| | | logger.info("[ç¹ææå] deviceId: {}, channelId:{}, ç æµç±»åï¼{}", device.getDeviceId(), channelId, |
| | | device.isSwitchPrimarySubStream() ? "è¾
ç æµ" : "ä¸»ç æµ"); |
| | | snapOnPlay(mediaServerItemInuse, device.getDeviceId(), channelId, ssrcInfo.getStream()); |
| | | logger.info("[ç¹ææå] deviceId: {}, channelId:{}, ç æµç±»åï¼{}", device.getDeviceId(), channel.getChannelId(), |
| | | channel.getStreamIdentification()); |
| | | snapOnPlay(mediaServerItemInuse, device.getDeviceId(), channel.getChannelId(), ssrcInfo.getStream()); |
| | | }, (eventResult) -> { |
| | | // å¤çæ¶å°200okåçTCP主å¨è¿æ¥ä»¥åSSRCä¸ä¸è´çé®é¢ |
| | | InviteOKHandler(eventResult, ssrcInfo, mediaServerItem, device, channelId, |
| | | InviteOKHandler(eventResult, ssrcInfo, mediaServerItem, device, channel.getChannelId(), |
| | | timeOutTaskKey, callback, inviteInfo, InviteSessionType.PLAY); |
| | | }, (event) -> { |
| | | logger.info("[ç¹æå¤±è´¥] deviceId: {}, channelId:{}, {}: {}", device.getDeviceId(), channelId, event.statusCode, event.msg); |
| | | logger.info("[ç¹æå¤±è´¥] deviceId: {}, channelId:{}, {}: {}", device.getDeviceId(), channel.getChannelId(), event.statusCode, event.msg); |
| | | dynamicTask.stop(timeOutTaskKey); |
| | | mediaServerService.closeRTPServer(mediaServerItem, ssrcInfo.getStream()); |
| | | // éæ¾ssrc |
| | | mediaServerService.releaseSsrc(mediaServerItem.getId(), ssrcInfo.getSsrc()); |
| | | |
| | | streamSession.remove(device.getDeviceId(), channelId, ssrcInfo.getStream()); |
| | | streamSession.remove(device.getDeviceId(), channel.getChannelId(), ssrcInfo.getStream()); |
| | | |
| | | callback.run(InviteErrorCode.ERROR_FOR_SIGNALLING_ERROR.getCode(), |
| | | String.format("ç¹æå¤±è´¥ï¼ é误ç ï¼ %s, %s", event.statusCode, event.msg), null); |
| | | inviteStreamService.call(InviteSessionType.PLAY, device.getDeviceId(), channelId, null, |
| | | inviteStreamService.call(InviteSessionType.PLAY, device.getDeviceId(), channel.getChannelId(), null, |
| | | InviteErrorCode.ERROR_FOR_RESET_SSRC.getCode(), |
| | | String.format("ç¹æå¤±è´¥ï¼ é误ç ï¼ %s, %s", event.statusCode, event.msg), null); |
| | | |
| | | inviteStreamService.removeInviteInfoByDeviceAndChannel(InviteSessionType.PLAY, device.getDeviceId(), channelId); |
| | | inviteStreamService.removeInviteInfoByDeviceAndChannel(InviteSessionType.PLAY, device.getDeviceId(), channel.getChannelId()); |
| | | }); |
| | | } catch (InvalidArgumentException | SipException | ParseException e) { |
| | | |
| | |
| | | // éæ¾ssrc |
| | | mediaServerService.releaseSsrc(mediaServerItem.getId(), ssrcInfo.getSsrc()); |
| | | |
| | | streamSession.remove(device.getDeviceId(), channelId, ssrcInfo.getStream()); |
| | | streamSession.remove(device.getDeviceId(), channel.getChannelId(), ssrcInfo.getStream()); |
| | | |
| | | callback.run(InviteErrorCode.ERROR_FOR_SIP_SENDING_FAILED.getCode(), |
| | | InviteErrorCode.ERROR_FOR_SIP_SENDING_FAILED.getMsg(), null); |
| | | inviteStreamService.call(InviteSessionType.PLAY, device.getDeviceId(), channelId, null, |
| | | inviteStreamService.call(InviteSessionType.PLAY, device.getDeviceId(), channel.getChannelId(), null, |
| | | InviteErrorCode.ERROR_FOR_SIP_SENDING_FAILED.getCode(), |
| | | InviteErrorCode.ERROR_FOR_SIP_SENDING_FAILED.getMsg(), null); |
| | | |
| | | inviteStreamService.removeInviteInfoByDeviceAndChannel(InviteSessionType.PLAY, device.getDeviceId(), channelId); |
| | | inviteStreamService.removeInviteInfoByDeviceAndChannel(InviteSessionType.PLAY, device.getDeviceId(), channel.getChannelId()); |
| | | } |
| | | } |
| | | |
| | |
| | | |
| | | @Override |
| | | public void playBack(String deviceId, String channelId, String startTime, |
| | | String endTime, ErrorCallback<Object> callback) { |
| | | String endTime, ErrorCallback<Object> callback) { |
| | | Device device = storager.queryVideoDevice(deviceId); |
| | | if (device == null) { |
| | | logger.warn("[å½ååæ¾] æªæ¾å°è®¾å¤ deviceId: {},channelId:{}", deviceId, channelId); |
| | |
| | | |
| | | @Override |
| | | public void playBack(MediaServerItem mediaServerItem, SSRCInfo ssrcInfo, |
| | | String deviceId, String channelId, String startTime, |
| | | String endTime, ErrorCallback<Object> callback) { |
| | | String deviceId, String channelId, String startTime, |
| | | String endTime, ErrorCallback<Object> callback) { |
| | | if (mediaServerItem == null || ssrcInfo == null) { |
| | | callback.run(InviteErrorCode.ERROR_FOR_PARAMETER_ERROR.getCode(), |
| | | InviteErrorCode.ERROR_FOR_PARAMETER_ERROR.getMsg(), |
| | |
| | | |
| | | MediaServerItem newMediaServerItem = getNewMediaServerItem(device); |
| | | play(newMediaServerItem, deviceId, channelId, null, (code, msg, data)->{ |
| | | if (code == InviteErrorCode.SUCCESS.getCode()) { |
| | | InviteInfo inviteInfoForPlay = inviteStreamService.getInviteInfoByDeviceAndChannel(InviteSessionType.PLAY, deviceId, channelId); |
| | | if (inviteInfoForPlay != null && inviteInfoForPlay.getStreamInfo() != null) { |
| | | getSnap(deviceId, channelId, fileName, errorCallback); |
| | | }else { |
| | | errorCallback.run(InviteErrorCode.FAIL.getCode(), InviteErrorCode.FAIL.getMsg(), null); |
| | | } |
| | | }else { |
| | | errorCallback.run(InviteErrorCode.FAIL.getCode(), InviteErrorCode.FAIL.getMsg(), null); |
| | | } |
| | | if (code == InviteErrorCode.SUCCESS.getCode()) { |
| | | InviteInfo inviteInfoForPlay = inviteStreamService.getInviteInfoByDeviceAndChannel(InviteSessionType.PLAY, deviceId, channelId); |
| | | if (inviteInfoForPlay != null && inviteInfoForPlay.getStreamInfo() != null) { |
| | | getSnap(deviceId, channelId, fileName, errorCallback); |
| | | }else { |
| | | errorCallback.run(InviteErrorCode.FAIL.getCode(), InviteErrorCode.FAIL.getMsg(), null); |
| | | } |
| | | }else { |
| | | errorCallback.run(InviteErrorCode.FAIL.getCode(), InviteErrorCode.FAIL.getMsg(), null); |
| | | } |
| | | }); |
| | | } |
| | | |
| | |
| | | @Insert("INSERT INTO wvp_device_channel (channel_id, device_id, name, manufacture, model, owner, civil_code, block, " + |
| | | "address, parental, parent_id, safety_way, register_way, cert_num, certifiable, err_code, secrecy, " + |
| | | "ip_address, port, password, ptz_type, status, stream_id, longitude, latitude, longitude_gcj02, latitude_gcj02, " + |
| | | "longitude_wgs84, latitude_wgs84, has_audio, create_time, update_time, business_group_id, gps_time) " + |
| | | "longitude_wgs84, latitude_wgs84, has_audio, create_time, update_time, business_group_id, gps_time, stream_identification) " + |
| | | "VALUES (#{channelId}, #{deviceId}, #{name}, #{manufacture}, #{model}, #{owner}, #{civilCode}, #{block}," + |
| | | "#{address}, #{parental}, #{parentId}, #{safetyWay}, #{registerWay}, #{certNum}, #{certifiable}, #{errCode}, #{secrecy}, " + |
| | | "#{ipAddress}, #{port}, #{password}, #{PTZType}, #{status}, #{streamId}, #{longitude}, #{latitude}, #{longitudeGcj02}, " + |
| | | "#{latitudeGcj02}, #{longitudeWgs84}, #{latitudeWgs84}, #{hasAudio}, #{createTime}, #{updateTime}, #{businessGroupId}, #{gpsTime})") |
| | | "#{latitudeGcj02}, #{longitudeWgs84}, #{latitudeWgs84}, #{hasAudio}, #{createTime}, #{updateTime}, #{businessGroupId}, #{gpsTime}, #{streamIdentification})") |
| | | int add(DeviceChannel channel); |
| | | |
| | | @Update(value = {" <script>" + |
| | |
| | | "<if test='latitudeWgs84 != null'>, latitude_wgs84=#{latitudeWgs84}</if>" + |
| | | "<if test='businessGroupId != null'>, business_group_id=#{businessGroupId}</if>" + |
| | | "<if test='gpsTime != null'>, gps_time=#{gpsTime}</if>" + |
| | | "<if test='streamIdentification != null'>, stream_identification=#{streamIdentification}</if>" + |
| | | "WHERE device_id=#{deviceId} AND channel_id=#{channelId}"+ |
| | | " </script>"}) |
| | | int update(DeviceChannel channel); |
| | |
| | | "dc.longitude_wgs84, " + |
| | | "dc.latitude_wgs84, " + |
| | | "dc.business_group_id, " + |
| | | "dc.stream_identification, " + |
| | | "dc.gps_time " + |
| | | "from " + |
| | | "wvp_device_channel dc " + |
| | |
| | | "(channel_id, device_id, name, manufacture, model, owner, civil_code, block, sub_count, " + |
| | | " address, parental, parent_id, safety_way, register_way, cert_num, certifiable, err_code, secrecy, " + |
| | | " ip_address,port,password,ptz_type,status,stream_id,longitude,latitude,longitude_gcj02,latitude_gcj02,"+ |
| | | " longitude_wgs84,latitude_wgs84,has_audio,create_time,update_time,business_group_id,gps_time)"+ |
| | | " longitude_wgs84,latitude_wgs84,has_audio,create_time,update_time,business_group_id,gps_time,stream_identification)"+ |
| | | "values " + |
| | | "<foreach collection='addChannels' index='index' item='item' separator=','> " + |
| | | "(#{item.channelId}, #{item.deviceId}, #{item.name}, #{item.manufacture}, #{item.model}, " + |
| | |
| | | "#{item.ipAddress}, #{item.port}, #{item.password}, #{item.PTZType}, #{item.status}, " + |
| | | "#{item.streamId}, #{item.longitude}, #{item.latitude},#{item.longitudeGcj02}, " + |
| | | "#{item.latitudeGcj02},#{item.longitudeWgs84}, #{item.latitudeWgs84}, #{item.hasAudio}, now(), now(), " + |
| | | "#{item.businessGroupId}, #{item.gpsTime}) " + |
| | | "#{item.businessGroupId}, #{item.gpsTime}, #{item.streamIdentification}) " + |
| | | "</foreach> " + |
| | | "</script>") |
| | | int batchAdd(@Param("addChannels") List<DeviceChannel> addChannels); |
| | |
| | | "<if test='item.latitudeWgs84 != null'>, latitude_wgs84=#{item.latitudeWgs84}</if>" + |
| | | "<if test='item.businessGroupId != null'>, business_group_id=#{item.businessGroupId}</if>" + |
| | | "<if test='item.gpsTime != null'>, gps_time=#{item.gpsTime}</if>" + |
| | | "<if test='item.streamIdentification != null'>, stream_identification=#{item.streamIdentification}</if>" + |
| | | "<if test='item.id > 0'>WHERE id=#{item.id}</if>" + |
| | | "<if test='item.id == 0'>WHERE device_id=#{item.deviceId} AND channel_id=#{item.channelId}</if>" + |
| | | "</foreach>" + |
| | |
| | | " </script>"}) |
| | | List<DeviceChannel> getSubChannelsByDeviceId(@Param("deviceId") String deviceId, @Param("parentId") String parentId, @Param("onlyCatalog") boolean onlyCatalog); |
| | | |
| | | @Update("<script>" + |
| | | "UPDATE wvp_device_channel SET stream_identification=#{streamIdentification} WHERE device_id=#{deviceId}" + |
| | | " <if test='channelId != null'> and channel_id = #{channelId} </if>" + |
| | | "</script>") |
| | | void updateChannelStreamIdentification(DeviceChannel channel); |
| | | } |
| | |
| | | "geo_coord_sys," + |
| | | "on_line," + |
| | | "media_server_id," + |
| | | "switch_primary_sub_stream," + |
| | | "broadcast_push_after_ack," + |
| | | "(SELECT count(0) FROM wvp_device_channel WHERE device_id=wvp_device.device_id) as channel_count "+ |
| | | " FROM wvp_device WHERE device_id = #{deviceId}") |
| | |
| | | "geo_coord_sys,"+ |
| | | "on_line,"+ |
| | | "media_server_id,"+ |
| | | "switch_primary_sub_stream switchPrimarySubStream,"+ |
| | | "(SELECT count(0) FROM wvp_device_channel WHERE device_id=de.device_id) as channel_count " + |
| | | "FROM wvp_device de" + |
| | | "<if test=\"onLine != null\"> where on_line=${onLine}</if>"+ |
| | |
| | | "<if test=\"asMessageChannel != null\">, as_message_channel=#{asMessageChannel}</if>" + |
| | | "<if test=\"broadcastPushAfterAck != null\">, broadcast_push_after_ack=#{broadcastPushAfterAck}</if>" + |
| | | "<if test=\"geoCoordSys != null\">, geo_coord_sys=#{geoCoordSys}</if>" + |
| | | "<if test=\"switchPrimarySubStream != null\">, switch_primary_sub_stream=#{switchPrimarySubStream}</if>" + |
| | | "<if test=\"mediaServerId != null\">, media_server_id=#{mediaServerId}</if>" + |
| | | "WHERE device_id=#{deviceId}"+ |
| | | " </script>"}) |
| | |
| | | "broadcastPushAfterAck,"+ |
| | | "geo_coord_sys,"+ |
| | | "on_line,"+ |
| | | "media_server_id,"+ |
| | | "switch_primary_sub_stream"+ |
| | | "media_server_id"+ |
| | | ") VALUES (" + |
| | | "#{deviceId}," + |
| | | "#{name}," + |
| | |
| | | "#{broadcastPushAfterAck}," + |
| | | "#{geoCoordSys}," + |
| | | "#{onLine}," + |
| | | "#{mediaServerId}," + |
| | | "#{switchPrimarySubStream}" + |
| | | "#{mediaServerId}" + |
| | | ")") |
| | | void addCustomDevice(Device device); |
| | | |
| | |
| | | Device device = storager.queryVideoDevice(deviceId); |
| | | device.setSubscribeCycleForMobilePosition(Integer.parseInt(expires)); |
| | | device.setMobilePositionSubmissionInterval(Integer.parseInt(interval)); |
| | | deviceService.updateDevice(device); |
| | | if (!deviceService.removeMobilePositionSubscribe(device)) { |
| | | throw new ControllerException(ErrorCode.ERROR100); |
| | | } |
| | | deviceService.updateCustomDevice(device); |
| | | } |
| | | |
| | | /** |
| | |
| | | Runnable runnable = dynamicTask.get(key); |
| | | if (runnable instanceof ISubscribeTask) { |
| | | ISubscribeTask subscribeTask = (ISubscribeTask) runnable; |
| | | subscribeTask.stop(); |
| | | subscribeTask.stop(null); |
| | | } |
| | | dynamicTask.stop(key); |
| | | } |
| | |
| | | deviceChannelService.updateChannel(deviceId, channel); |
| | | } |
| | | |
| | | @Operation(summary = "ä¿®æ¹ééçç æµç±»å", security = @SecurityRequirement(name = JwtUtils.HEADER)) |
| | | @Parameter(name = "deviceId", description = "设å¤å½æ ç¼å·", required = true) |
| | | @Parameter(name = "channel", description = "ééä¿¡æ¯", required = true) |
| | | @PostMapping("/channel/stream/identification/update/") |
| | | public void updateChannelStreamIdentification(DeviceChannel channel){ |
| | | deviceChannelService.updateChannelStreamIdentification(channel); |
| | | } |
| | | |
| | | /** |
| | | * ä¿®æ¹æ°æ®æµä¼ è¾æ¨¡å¼ |
| | | * @param deviceId 设å¤id |
| | |
| | | prefix-icon="el-icon-search" v-model="searchSrt" clearable></el-input> |
| | | |
| | | ééç±»å: |
| | | <el-select size="mini" @change="search" style="margin-right: 1rem;" v-model="channelType" placeholder="è¯·éæ©" |
| | | <el-select size="mini" @change="search" style="width: 8rem; margin-right: 1rem;" v-model="channelType" placeholder="è¯·éæ©" |
| | | default-first-option> |
| | | <el-option label="å
¨é¨" value=""></el-option> |
| | | <el-option label="设å¤" value="false"></el-option> |
| | | <el-option label="åç®å½" value="true"></el-option> |
| | | </el-select> |
| | | å¨çº¿ç¶æ: |
| | | <el-select size="mini" style="margin-right: 1rem;" @change="search" v-model="online" placeholder="è¯·éæ©" |
| | | <el-select size="mini" style="width: 8rem; margin-right: 1rem;" @change="search" v-model="online" placeholder="è¯·éæ©" |
| | | default-first-option> |
| | | <el-option label="å
¨é¨" value=""></el-option> |
| | | <el-option label="å¨çº¿" value="true"></el-option> |
| | | <el-option label="离线" value="false"></el-option> |
| | | </el-select> |
| | | æ¸
æ°åº¦: |
| | | <el-select size="mini" style="margin-right: 1rem;" @change="search" v-model="isSubStream" placeholder="è¯·éæ©" |
| | | default-first-option> |
| | | <el-option label="åç»" :value="false"></el-option> |
| | | <el-option label="æµç
" :value="true"></el-option> |
| | | ç æµç±»åéç½®: |
| | | <el-select size="mini" style="width: 16rem; margin-right: 1rem;" @change="subStreamChange" v-model="subStream" |
| | | placeholder="è¯·éæ©ç æµç±»å" default-first-option > |
| | | <el-option label="stream:0(ä¸»ç æµ)" value="stream:0"></el-option> |
| | | <el-option label="stream:1(åç æµ)" value="stream:1"></el-option> |
| | | <el-option label="streamnumber:0(ä¸»ç æµ-2022)" value="streamnumber:0"></el-option> |
| | | <el-option label="streamnumber:1(åç æµ-2022)" value="streamnumber:1"></el-option> |
| | | <el-option label="streamprofile:0(ä¸»ç æµ-大å)" value="streamprofile:0"></el-option> |
| | | <el-option label="streamprofile:1(åç æµ-大å)" value="streamprofile:1"></el-option> |
| | | <el-option label="streamMode:main(ä¸»ç æµ-æ°´æ+TP-LINK)" value="streamMode:main"></el-option> |
| | | <el-option label="streamMode:sub(åç æµ-æ°´æ+TP-LINK)" value="streamMode:sub"></el-option> |
| | | </el-select> |
| | | </div> |
| | | <el-button icon="el-icon-refresh-right" circle size="mini" @click="refresh()"></el-button> |
| | |
| | | <el-main style="padding: 5px;"> |
| | | <el-table ref="channelListTable" :data="deviceChannelList" :height="winHeight" style="width: 100%" |
| | | header-row-class-name="table-header"> |
| | | <el-table-column prop="channelId" label="ééç¼å·" min-width="200"> |
| | | <el-table-column prop="channelId" label="ééç¼å·" min-width="180"> |
| | | </el-table-column> |
| | | <el-table-column prop="deviceId" label="设å¤ç¼å·" min-width="200"> |
| | | <el-table-column prop="deviceId" label="设å¤ç¼å·" min-width="180"> |
| | | </el-table-column> |
| | | <el-table-column prop="name" label="ééåç§°" min-width="200"> |
| | | <el-table-column prop="name" label="ééåç§°" min-width="180"> |
| | | <template v-slot:default="scope"> |
| | | <el-input |
| | | v-show="scope.row.edit" |
| | |
| | | <span v-show="!scope.row.edit">{{ scope.row.name }}</span> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="å¿«ç
§" min-width="120"> |
| | | <el-table-column label="å¿«ç
§" min-width="100"> |
| | | <template v-slot:default="scope"> |
| | | <el-image |
| | | :src="getSnap(scope.row)" |
| | |
| | | </el-image> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column prop="subCount" label="åèç¹æ°" min-width="120"> |
| | | <el-table-column prop="subCount" label="åèç¹æ°" min-width="100"> |
| | | </el-table-column> |
| | | <el-table-column prop="manufacture" label="åå®¶" min-width="120"> |
| | | <el-table-column prop="manufacture" label="åå®¶" min-width="100"> |
| | | </el-table-column> |
| | | <el-table-column label="ä½ç½®ä¿¡æ¯" min-width="200"> |
| | | <el-table-column label="ä½ç½®ä¿¡æ¯" min-width="120"> |
| | | <template v-slot:default="scope"> |
| | | <el-input |
| | | v-show="scope.row.edit" |
| | |
| | | <span v-show="!scope.row.edit">{{ scope.row.location }}</span> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column prop="PTZType" label="äºå°ç±»å" min-width="120"> |
| | | <el-table-column prop="PTZType" label="äºå°ç±»å" min-width="100"> |
| | | <template v-slot:default="scope"> |
| | | <el-select v-show="scope.row.edit" v-model="scope.row.PTZType" |
| | | placeholder="äºå°ç±»å" filterable> |
| | |
| | | <div v-show="!scope.row.edit">{{ scope.row.PTZTypeText }}</div> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="å¼å¯é³é¢" min-width="120"> |
| | | <el-table-column label="å¼å¯é³é¢" min-width="100"> |
| | | <template slot-scope="scope"> |
| | | <el-switch @change="updateChannel(scope.row)" v-model="scope.row.hasAudio" active-color="#409EFF"> |
| | | </el-switch> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="ç¶æ" min-width="120"> |
| | | <el-table-column label="ç æµç±»å" min-width="180"> |
| | | <template slot-scope="scope"> |
| | | <el-select size="mini" style="margin-right: 1rem;" @change="channelSubStreamChange(scope.row)" v-model="scope.row.streamIdentification" |
| | | placeholder="è¯·éæ©ç æµç±»å" default-first-option > |
| | | <el-option label="stream:0(ä¸»ç æµ)" value="stream:0"></el-option> |
| | | <el-option label="stream:1(åç æµ)" value="stream:1"></el-option> |
| | | <el-option label="streamnumber:0(ä¸»ç æµ-2022)" value="streamnumber:0"></el-option> |
| | | <el-option label="streamnumber:1(åç æµ-2022)" value="streamnumber:1"></el-option> |
| | | <el-option label="streamprofile:0(ä¸»ç æµ-大å)" value="streamprofile:0"></el-option> |
| | | <el-option label="streamprofile:1(åç æµ-大å)" value="streamprofile:1"></el-option> |
| | | <el-option label="streamMode:main(ä¸»ç æµ-æ°´æ+TP-LINK)" value="streamMode:main"></el-option> |
| | | <el-option label="streamMode:sub(åç æµ-æ°´æ+TP-LINK)" value="streamMode:sub"></el-option> |
| | | </el-select> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="ç¶æ" min-width="100"> |
| | | <template slot-scope="scope"> |
| | | <div slot="reference" class="name-wrapper"> |
| | | <el-tag size="medium" v-if="scope.row.status === true">å¨çº¿</el-tag> |
| | |
| | | </div> |
| | | </template> |
| | | </el-table-column> |
| | | |
| | | |
| | | <el-table-column label="æä½" min-width="340" fixed="right"> |
| | | <template slot-scope="scope"> |
| | | <el-button size="medium" v-bind:disabled="device == null || device.online === 0" icon="el-icon-video-play" |
| | |
| | | searchSrt: "", |
| | | channelType: "", |
| | | online: "", |
| | | isSubStream: false, |
| | | subStream: "", |
| | | winHeight: window.innerHeight - 200, |
| | | currentPage: 1, |
| | | count: 15, |
| | |
| | | console.log(JSON.stringify(res)); |
| | | }); |
| | | }, |
| | | subStreamChange: function () { |
| | | this.$confirm('ç¡®å®éç½®ææééçç æµç±»å?', 'æç¤º', { |
| | | confirmButtonText: 'ç¡®å®', |
| | | cancelButtonText: 'åæ¶', |
| | | type: 'warning' |
| | | }).then(() => { |
| | | this.$axios({ |
| | | method: 'post', |
| | | url: `/api/device/query/channel/stream/identification/update/`, |
| | | params: { |
| | | deviceId: this.deviceId, |
| | | streamIdentification: this.subStream |
| | | } |
| | | }).then((res)=> { |
| | | console.log(JSON.stringify(res)); |
| | | this.initData() |
| | | }).finally(()=>{ |
| | | this.subStream = "" |
| | | }) |
| | | }).catch(() => { |
| | | this.subStream = "" |
| | | }); |
| | | |
| | | }, |
| | | channelSubStreamChange: function (row) { |
| | | this.$axios({ |
| | | method: 'post', |
| | | url: `/api/device/query/channel/stream/identification/update/`, |
| | | params: { |
| | | deviceId: this.deviceId, |
| | | channelId: row.channelId, |
| | | streamIdentification: row.streamIdentification |
| | | } |
| | | }).then(function (res) { |
| | | console.log(JSON.stringify(res)); |
| | | }); |
| | | }, |
| | | refresh: function () { |
| | | this.initData(); |
| | | }, |
| | |
| | | <el-form-item v-if="form.subscribeCycleForMobilePosition > 0" label="ç§»å¨ä½ç½®æ¥éé´é" prop="subscribeCycleForCatalog" > |
| | | <el-input v-model="form.mobilePositionSubmissionInterval" clearable ></el-input> |
| | | </el-form-item> |
| | | <el-form-item label="主åç æµå¼å
³" prop="switchPrimarySubStream" > |
| | | <el-select v-model="form.switchPrimarySubStream" style="float: left; width: 100%" > |
| | | <el-option key="true" label="å¼å¯" :value="true"></el-option> |
| | | <el-option key="false" label="å
³é" :value="false"></el-option> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item label="å
¶ä»é项"> |
| | | <el-checkbox label="SSRCæ ¡éª" v-model="form.ssrcCheck" style="float: left"></el-checkbox> |
| | | <el-checkbox label="ä½ä¸ºæ¶æ¯éé" v-model="form.asMessageChannel" style="float: left"></el-checkbox> |
New file |
| | |
| | | /*建表*/ |
| | | create table wvp_device ( |
| | | id serial primary key , |
| | | device_id character varying(50) not null , |
| | | name character varying(255), |
| | | manufacturer character varying(255), |
| | | model character varying(255), |
| | | firmware character varying(255), |
| | | transport character varying(50), |
| | | stream_mode character varying(50), |
| | | on_line bool default false, |
| | | register_time character varying(50), |
| | | keepalive_time character varying(50), |
| | | ip character varying(50), |
| | | create_time character varying(50), |
| | | update_time character varying(50), |
| | | port integer, |
| | | expires integer, |
| | | subscribe_cycle_for_catalog integer DEFAULT 0, |
| | | subscribe_cycle_for_mobile_position integer DEFAULT 0, |
| | | mobile_position_submission_interval integer DEFAULT 5, |
| | | subscribe_cycle_for_alarm integer DEFAULT 0, |
| | | host_address character varying(50), |
| | | charset character varying(50), |
| | | ssrc_check bool default false, |
| | | geo_coord_sys character varying(50), |
| | | media_server_id character varying(50), |
| | | custom_name character varying(255), |
| | | sdp_ip character varying(50), |
| | | local_ip character varying(50), |
| | | password character varying(255), |
| | | as_message_channel bool default false, |
| | | keepalive_interval_time integer, |
| | | switch_primary_sub_stream bool default false, |
| | | broadcast_push_after_ack bool default false, |
| | | constraint uk_device_device unique (device_id) |
| | | ); |
| | | |
| | | create table wvp_device_alarm ( |
| | | id serial primary key , |
| | | device_id character varying(50) not null, |
| | | channel_id character varying(50) not null, |
| | | alarm_priority character varying(50), |
| | | alarm_method character varying(50), |
| | | alarm_time character varying(50), |
| | | alarm_description character varying(255), |
| | | longitude double precision, |
| | | latitude double precision, |
| | | alarm_type character varying(50), |
| | | create_time character varying(50) not null |
| | | ); |
| | | |
| | | create table wvp_device_channel ( |
| | | id serial primary key , |
| | | channel_id character varying(50) not null, |
| | | name character varying(255), |
| | | custom_name character varying(255), |
| | | manufacture character varying(50), |
| | | model character varying(50), |
| | | owner character varying(50), |
| | | civil_code character varying(50), |
| | | block character varying(50), |
| | | address character varying(50), |
| | | parent_id character varying(50), |
| | | safety_way integer, |
| | | register_way integer, |
| | | cert_num character varying(50), |
| | | certifiable integer, |
| | | err_code integer, |
| | | end_time character varying(50), |
| | | secrecy character varying(50), |
| | | ip_address character varying(50), |
| | | port integer, |
| | | password character varying(255), |
| | | ptz_type integer, |
| | | custom_ptz_type integer, |
| | | status bool default false, |
| | | longitude double precision, |
| | | custom_longitude double precision, |
| | | latitude double precision, |
| | | custom_latitude double precision, |
| | | stream_id character varying(255), |
| | | device_id character varying(50) not null, |
| | | parental character varying(50), |
| | | has_audio bool default false, |
| | | create_time character varying(50) not null, |
| | | update_time character varying(50) not null, |
| | | sub_count integer, |
| | | longitude_gcj02 double precision, |
| | | latitude_gcj02 double precision, |
| | | longitude_wgs84 double precision, |
| | | latitude_wgs84 double precision, |
| | | business_group_id character varying(50), |
| | | gps_time character varying(50), |
| | | stream_identification character varying(50), |
| | | constraint uk_wvp_device_channel_unique_device_channel unique (device_id, channel_id) |
| | | ); |
| | | |
| | | create table wvp_device_mobile_position ( |
| | | id serial primary key, |
| | | device_id character varying(50) not null, |
| | | channel_id character varying(50) not null, |
| | | device_name character varying(255), |
| | | time character varying(50), |
| | | longitude double precision, |
| | | latitude double precision, |
| | | altitude double precision, |
| | | speed double precision, |
| | | direction double precision, |
| | | report_source character varying(50), |
| | | longitude_gcj02 double precision, |
| | | latitude_gcj02 double precision, |
| | | longitude_wgs84 double precision, |
| | | latitude_wgs84 double precision, |
| | | create_time character varying(50) |
| | | ); |
| | | |
| | | create table wvp_gb_stream ( |
| | | gb_stream_id serial primary key, |
| | | app character varying(255) not null, |
| | | stream character varying(255) not null, |
| | | gb_id character varying(50) not null, |
| | | name character varying(255), |
| | | longitude double precision, |
| | | latitude double precision, |
| | | stream_type character varying(50), |
| | | media_server_id character varying(50), |
| | | create_time character varying(50), |
| | | constraint uk_gb_stream_unique_gb_id unique (gb_id), |
| | | constraint uk_gb_stream_unique_app_stream unique (app, stream) |
| | | ); |
| | | |
| | | create table wvp_log ( |
| | | id serial primary key , |
| | | name character varying(50), |
| | | type character varying(50), |
| | | uri character varying(200), |
| | | address character varying(50), |
| | | result character varying(50), |
| | | timing bigint, |
| | | username character varying(50), |
| | | create_time character varying(50) |
| | | ); |
| | | |
| | | create table wvp_media_server ( |
| | | id character varying(255) primary key , |
| | | ip character varying(50), |
| | | hook_ip character varying(50), |
| | | sdp_ip character varying(50), |
| | | stream_ip character varying(50), |
| | | http_port integer, |
| | | http_ssl_port integer, |
| | | rtmp_port integer, |
| | | rtmp_ssl_port integer, |
| | | rtp_proxy_port integer, |
| | | rtsp_port integer, |
| | | rtsp_ssl_port integer, |
| | | auto_config bool default false, |
| | | secret character varying(50), |
| | | rtp_enable bool default false, |
| | | rtp_port_range character varying(50), |
| | | send_rtp_port_range character varying(50), |
| | | record_assist_port integer, |
| | | default_server bool default false, |
| | | create_time character varying(50), |
| | | update_time character varying(50), |
| | | hook_alive_interval integer, |
| | | record_path character varying(255), |
| | | record_day integer default 7, |
| | | constraint uk_media_server_unique_ip_http_port unique (ip, http_port) |
| | | ); |
| | | |
| | | create table wvp_platform ( |
| | | id serial primary key , |
| | | enable bool default false, |
| | | name character varying(255), |
| | | server_gb_id character varying(50), |
| | | server_gb_domain character varying(50), |
| | | server_ip character varying(50), |
| | | server_port integer, |
| | | device_gb_id character varying(50), |
| | | device_ip character varying(50), |
| | | device_port character varying(50), |
| | | username character varying(255), |
| | | password character varying(50), |
| | | expires character varying(50), |
| | | keep_timeout character varying(50), |
| | | transport character varying(50), |
| | | character_set character varying(50), |
| | | catalog_id character varying(50), |
| | | ptz bool default false, |
| | | rtcp bool default false, |
| | | status bool default false, |
| | | start_offline_push bool default false, |
| | | administrative_division character varying(50), |
| | | catalog_group integer, |
| | | create_time character varying(50), |
| | | update_time character varying(50), |
| | | as_message_channel bool default false, |
| | | auto_push_channel bool default false, |
| | | constraint uk_platform_unique_server_gb_id unique (server_gb_id) |
| | | ); |
| | | |
| | | create table wvp_platform_catalog ( |
| | | id character varying(50), |
| | | platform_id character varying(50), |
| | | name character varying(255), |
| | | parent_id character varying(50), |
| | | civil_code character varying(50), |
| | | business_group_id character varying(50), |
| | | constraint uk_platform_catalog_id_platform_id unique (id, platform_id) |
| | | ); |
| | | |
| | | create table wvp_platform_gb_channel ( |
| | | id serial primary key , |
| | | platform_id character varying(50), |
| | | catalog_id character varying(50), |
| | | device_channel_id integer, |
| | | constraint uk_platform_gb_channel_platform_id_catalog_id_device_channel_id unique (platform_id, catalog_id, device_channel_id) |
| | | ); |
| | | |
| | | create table wvp_platform_gb_stream ( |
| | | id serial primary key, |
| | | platform_id character varying(50), |
| | | catalog_id character varying(50), |
| | | gb_stream_id integer, |
| | | constraint uk_platform_gb_stream_platform_id_catalog_id_gb_stream_id unique (platform_id, catalog_id, gb_stream_id) |
| | | ); |
| | | |
| | | create table wvp_stream_proxy ( |
| | | id serial primary key, |
| | | type character varying(50), |
| | | app character varying(255), |
| | | stream character varying(255), |
| | | url character varying(255), |
| | | src_url character varying(255), |
| | | dst_url character varying(255), |
| | | timeout_ms integer, |
| | | ffmpeg_cmd_key character varying(255), |
| | | rtp_type character varying(50), |
| | | media_server_id character varying(50), |
| | | enable_audio bool default false, |
| | | enable_mp4 bool default false, |
| | | enable bool default false, |
| | | status boolean, |
| | | enable_remove_none_reader bool default false, |
| | | create_time character varying(50), |
| | | name character varying(255), |
| | | update_time character varying(50), |
| | | stream_key character varying(255), |
| | | enable_disable_none_reader bool default false, |
| | | constraint uk_stream_proxy_app_stream unique (app, stream) |
| | | ); |
| | | |
| | | create table wvp_stream_push ( |
| | | id serial primary key, |
| | | app character varying(255), |
| | | stream character varying(255), |
| | | total_reader_count character varying(50), |
| | | origin_type integer, |
| | | origin_type_str character varying(50), |
| | | create_time character varying(50), |
| | | alive_second integer, |
| | | media_server_id character varying(50), |
| | | server_id character varying(50), |
| | | push_time character varying(50), |
| | | status bool default false, |
| | | update_time character varying(50), |
| | | push_ing bool default false, |
| | | self bool default false, |
| | | constraint uk_stream_push_app_stream unique (app, stream) |
| | | ); |
| | | create table wvp_cloud_record ( |
| | | id serial primary key, |
| | | app character varying(255), |
| | | stream character varying(255), |
| | | call_id character varying(255), |
| | | start_time bigint, |
| | | end_time bigint, |
| | | media_server_id character varying(50), |
| | | file_name character varying(255), |
| | | folder character varying(255), |
| | | file_path character varying(255), |
| | | collect bool default false, |
| | | file_size bigint, |
| | | time_len bigint, |
| | | constraint uk_stream_push_app_stream_path unique (app, stream, file_path) |
| | | ); |
| | | |
| | | create table wvp_user ( |
| | | id serial primary key, |
| | | username character varying(255), |
| | | password character varying(255), |
| | | role_id integer, |
| | | create_time character varying(50), |
| | | update_time character varying(50), |
| | | push_key character varying(50), |
| | | constraint uk_user_username unique (username) |
| | | ); |
| | | |
| | | create table wvp_user_role ( |
| | | id serial primary key, |
| | | name character varying(50), |
| | | authority character varying(50), |
| | | create_time character varying(50), |
| | | update_time character varying(50) |
| | | ); |
| | | create table wvp_resources_tree ( |
| | | id serial primary key , |
| | | is_catalog bool default true, |
| | | device_channel_id integer , |
| | | gb_stream_id integer, |
| | | name character varying(255), |
| | | parentId integer, |
| | | path character varying(255) |
| | | ); |
| | | |
| | | |
| | | /*åå§æ°æ®*/ |
| | | INSERT INTO wvp_user VALUES (1, 'admin','21232f297a57a5a743894a0e4a801fc3',1,'2021-04-13 14:14:57','2021-04-13 14:14:57','3e80d1762a324d5b0ff636e0bd16f1e3'); |
| | | INSERT INTO wvp_user_role VALUES (1, 'admin','0','2021-04-13 14:14:57','2021-04-13 14:14:57'); |
| | | |
| | | |
| | | |
New file |
| | |
| | | /*建表*/ |
| | | create table wvp_device ( |
| | | id serial primary key , |
| | | device_id character varying(50) not null , |
| | | name character varying(255), |
| | | manufacturer character varying(255), |
| | | model character varying(255), |
| | | firmware character varying(255), |
| | | transport character varying(50), |
| | | stream_mode character varying(50), |
| | | on_line bool default false, |
| | | register_time character varying(50), |
| | | keepalive_time character varying(50), |
| | | ip character varying(50), |
| | | create_time character varying(50), |
| | | update_time character varying(50), |
| | | port integer, |
| | | expires integer, |
| | | subscribe_cycle_for_catalog integer DEFAULT 0, |
| | | subscribe_cycle_for_mobile_position integer DEFAULT 0, |
| | | mobile_position_submission_interval integer DEFAULT 5, |
| | | subscribe_cycle_for_alarm integer DEFAULT 0, |
| | | host_address character varying(50), |
| | | charset character varying(50), |
| | | ssrc_check bool default false, |
| | | geo_coord_sys character varying(50), |
| | | media_server_id character varying(50), |
| | | custom_name character varying(255), |
| | | sdp_ip character varying(50), |
| | | local_ip character varying(50), |
| | | password character varying(255), |
| | | as_message_channel bool default false, |
| | | keepalive_interval_time integer, |
| | | switch_primary_sub_stream bool default false, |
| | | broadcast_push_after_ack bool default false, |
| | | constraint uk_device_device unique (device_id) |
| | | ); |
| | | |
| | | create table wvp_device_alarm ( |
| | | id serial primary key , |
| | | device_id character varying(50) not null, |
| | | channel_id character varying(50) not null, |
| | | alarm_priority character varying(50), |
| | | alarm_method character varying(50), |
| | | alarm_time character varying(50), |
| | | alarm_description character varying(255), |
| | | longitude double precision, |
| | | latitude double precision, |
| | | alarm_type character varying(50), |
| | | create_time character varying(50) not null |
| | | ); |
| | | |
| | | create table wvp_device_channel ( |
| | | id serial primary key , |
| | | channel_id character varying(50) not null, |
| | | name character varying(255), |
| | | custom_name character varying(255), |
| | | manufacture character varying(50), |
| | | model character varying(50), |
| | | owner character varying(50), |
| | | civil_code character varying(50), |
| | | block character varying(50), |
| | | address character varying(50), |
| | | parent_id character varying(50), |
| | | safety_way integer, |
| | | register_way integer, |
| | | cert_num character varying(50), |
| | | certifiable integer, |
| | | err_code integer, |
| | | end_time character varying(50), |
| | | secrecy character varying(50), |
| | | ip_address character varying(50), |
| | | port integer, |
| | | password character varying(255), |
| | | ptz_type integer, |
| | | custom_ptz_type integer, |
| | | status bool default false, |
| | | longitude double precision, |
| | | custom_longitude double precision, |
| | | latitude double precision, |
| | | custom_latitude double precision, |
| | | stream_id character varying(255), |
| | | device_id character varying(50) not null, |
| | | parental character varying(50), |
| | | has_audio bool default false, |
| | | create_time character varying(50) not null, |
| | | update_time character varying(50) not null, |
| | | sub_count integer, |
| | | longitude_gcj02 double precision, |
| | | latitude_gcj02 double precision, |
| | | longitude_wgs84 double precision, |
| | | latitude_wgs84 double precision, |
| | | business_group_id character varying(50), |
| | | gps_time character varying(50), |
| | | stream_identification character varying(50), |
| | | constraint uk_wvp_device_channel_unique_device_channel unique (device_id, channel_id) |
| | | ); |
| | | |
| | | create table wvp_device_mobile_position ( |
| | | id serial primary key, |
| | | device_id character varying(50) not null, |
| | | channel_id character varying(50) not null, |
| | | device_name character varying(255), |
| | | time character varying(50), |
| | | longitude double precision, |
| | | latitude double precision, |
| | | altitude double precision, |
| | | speed double precision, |
| | | direction double precision, |
| | | report_source character varying(50), |
| | | longitude_gcj02 double precision, |
| | | latitude_gcj02 double precision, |
| | | longitude_wgs84 double precision, |
| | | latitude_wgs84 double precision, |
| | | create_time character varying(50) |
| | | ); |
| | | |
| | | create table wvp_gb_stream ( |
| | | gb_stream_id serial primary key, |
| | | app character varying(255) not null, |
| | | stream character varying(255) not null, |
| | | gb_id character varying(50) not null, |
| | | name character varying(255), |
| | | longitude double precision, |
| | | latitude double precision, |
| | | stream_type character varying(50), |
| | | media_server_id character varying(50), |
| | | create_time character varying(50), |
| | | constraint uk_gb_stream_unique_gb_id unique (gb_id), |
| | | constraint uk_gb_stream_unique_app_stream unique (app, stream) |
| | | ); |
| | | |
| | | create table wvp_log ( |
| | | id serial primary key , |
| | | name character varying(50), |
| | | type character varying(50), |
| | | uri character varying(200), |
| | | address character varying(50), |
| | | result character varying(50), |
| | | timing bigint, |
| | | username character varying(50), |
| | | create_time character varying(50) |
| | | ); |
| | | |
| | | create table wvp_media_server ( |
| | | id character varying(255) primary key , |
| | | ip character varying(50), |
| | | hook_ip character varying(50), |
| | | sdp_ip character varying(50), |
| | | stream_ip character varying(50), |
| | | http_port integer, |
| | | http_ssl_port integer, |
| | | rtmp_port integer, |
| | | rtmp_ssl_port integer, |
| | | rtp_proxy_port integer, |
| | | rtsp_port integer, |
| | | rtsp_ssl_port integer, |
| | | auto_config bool default false, |
| | | secret character varying(50), |
| | | rtp_enable bool default false, |
| | | rtp_port_range character varying(50), |
| | | send_rtp_port_range character varying(50), |
| | | record_assist_port integer, |
| | | default_server bool default false, |
| | | create_time character varying(50), |
| | | update_time character varying(50), |
| | | hook_alive_interval integer, |
| | | record_path character varying(255), |
| | | record_day integer default 7, |
| | | constraint uk_media_server_unique_ip_http_port unique (ip, http_port) |
| | | ); |
| | | |
| | | create table wvp_platform ( |
| | | id serial primary key , |
| | | enable bool default false, |
| | | name character varying(255), |
| | | server_gb_id character varying(50), |
| | | server_gb_domain character varying(50), |
| | | server_ip character varying(50), |
| | | server_port integer, |
| | | device_gb_id character varying(50), |
| | | device_ip character varying(50), |
| | | device_port character varying(50), |
| | | username character varying(255), |
| | | password character varying(50), |
| | | expires character varying(50), |
| | | keep_timeout character varying(50), |
| | | transport character varying(50), |
| | | character_set character varying(50), |
| | | catalog_id character varying(50), |
| | | ptz bool default false, |
| | | rtcp bool default false, |
| | | status bool default false, |
| | | start_offline_push bool default false, |
| | | administrative_division character varying(50), |
| | | catalog_group integer, |
| | | create_time character varying(50), |
| | | update_time character varying(50), |
| | | as_message_channel bool default false, |
| | | auto_push_channel bool default false, |
| | | constraint uk_platform_unique_server_gb_id unique (server_gb_id) |
| | | ); |
| | | |
| | | create table wvp_platform_catalog ( |
| | | id character varying(50), |
| | | platform_id character varying(50), |
| | | name character varying(255), |
| | | parent_id character varying(50), |
| | | civil_code character varying(50), |
| | | business_group_id character varying(50), |
| | | constraint uk_platform_catalog_id_platform_id unique (id, platform_id) |
| | | ); |
| | | |
| | | create table wvp_platform_gb_channel ( |
| | | id serial primary key , |
| | | platform_id character varying(50), |
| | | catalog_id character varying(50), |
| | | device_channel_id integer, |
| | | constraint uk_platform_gb_channel_platform_id_catalog_id_device_channel_id unique (platform_id, catalog_id, device_channel_id) |
| | | ); |
| | | |
| | | create table wvp_platform_gb_stream ( |
| | | id serial primary key, |
| | | platform_id character varying(50), |
| | | catalog_id character varying(50), |
| | | gb_stream_id integer, |
| | | constraint uk_platform_gb_stream_platform_id_catalog_id_gb_stream_id unique (platform_id, catalog_id, gb_stream_id) |
| | | ); |
| | | |
| | | create table wvp_stream_proxy ( |
| | | id serial primary key, |
| | | type character varying(50), |
| | | app character varying(255), |
| | | stream character varying(255), |
| | | url character varying(255), |
| | | src_url character varying(255), |
| | | dst_url character varying(255), |
| | | timeout_ms integer, |
| | | ffmpeg_cmd_key character varying(255), |
| | | rtp_type character varying(50), |
| | | media_server_id character varying(50), |
| | | enable_audio bool default false, |
| | | enable_mp4 bool default false, |
| | | enable bool default false, |
| | | status boolean, |
| | | enable_remove_none_reader bool default false, |
| | | create_time character varying(50), |
| | | name character varying(255), |
| | | update_time character varying(50), |
| | | stream_key character varying(255), |
| | | enable_disable_none_reader bool default false, |
| | | constraint uk_stream_proxy_app_stream unique (app, stream) |
| | | ); |
| | | |
| | | create table wvp_stream_push ( |
| | | id serial primary key, |
| | | app character varying(255), |
| | | stream character varying(255), |
| | | total_reader_count character varying(50), |
| | | origin_type integer, |
| | | origin_type_str character varying(50), |
| | | create_time character varying(50), |
| | | alive_second integer, |
| | | media_server_id character varying(50), |
| | | server_id character varying(50), |
| | | push_time character varying(50), |
| | | status bool default false, |
| | | update_time character varying(50), |
| | | push_ing bool default false, |
| | | self bool default false, |
| | | constraint uk_stream_push_app_stream unique (app, stream) |
| | | ); |
| | | create table wvp_cloud_record ( |
| | | id serial primary key, |
| | | app character varying(255), |
| | | stream character varying(255), |
| | | call_id character varying(255), |
| | | start_time int8, |
| | | end_time int8, |
| | | media_server_id character varying(50), |
| | | file_name character varying(255), |
| | | folder character varying(255), |
| | | file_path character varying(255), |
| | | collect bool default false, |
| | | file_size int8, |
| | | time_len int8, |
| | | constraint uk_stream_push_app_stream_path unique (app, stream, file_path) |
| | | ); |
| | | |
| | | create table wvp_user ( |
| | | id serial primary key, |
| | | username character varying(255), |
| | | password character varying(255), |
| | | role_id integer, |
| | | create_time character varying(50), |
| | | update_time character varying(50), |
| | | push_key character varying(50), |
| | | constraint uk_user_username unique (username) |
| | | ); |
| | | |
| | | create table wvp_user_role ( |
| | | id serial primary key, |
| | | name character varying(50), |
| | | authority character varying(50), |
| | | create_time character varying(50), |
| | | update_time character varying(50) |
| | | ); |
| | | create table wvp_resources_tree ( |
| | | id serial primary key , |
| | | is_catalog bool default true, |
| | | device_channel_id integer , |
| | | gb_stream_id integer, |
| | | name character varying(255), |
| | | parentId integer, |
| | | path character varying(255) |
| | | ); |
| | | |
| | | |
| | | /*åå§æ°æ®*/ |
| | | INSERT INTO wvp_user VALUES (1, 'admin','21232f297a57a5a743894a0e4a801fc3',1,'2021-04-13 14:14:57','2021-04-13 14:14:57','3e80d1762a324d5b0ff636e0bd16f1e3'); |
| | | INSERT INTO wvp_user_role VALUES (1, 'admin','0','2021-04-13 14:14:57','2021-04-13 14:14:57'); |
| | | |
| | | |
| | | |
New file |
| | |
| | | alter table wvp_device_channel |
| | | add stream_identification character varying(50); |
| | | |
| | | alter table wvp_device |
| | | drop switch_primary_sub_stream; |
New file |
| | |
| | | alter table wvp_device_channel |
| | | add stream_identification character varying(50); |
| | | |
| | | alter table wvp_device |
| | | drop switch_primary_sub_stream; |