From 975ace051bb6ed708090d7a15281a062a0d6dbc2 Mon Sep 17 00:00:00 2001
From: 648540858 <648540858@qq.com>
Date: 星期六, 01 七月 2023 18:28:28 +0800
Subject: [PATCH] Merge branch 'wvp-28181-2.0' into main-dev
---
src/main/java/com/genersoft/iot/vmp/media/zlm/SendRtpPortManager.java | 55 ++++++
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/NotifyRequestForCatalogProcessor.java | 12 +
src/main/java/com/genersoft/iot/vmp/gb28181/utils/XmlUtil.java | 12 +
src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRTPServerFactory.java | 137 +---------------
sql/初始化.sql | 1
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/AckRequestProcessor.java | 18 +-
src/main/java/com/genersoft/iot/vmp/media/zlm/dto/MediaServerItem.java | 11 +
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/response/cmd/CatalogResponseMessageHandler.java | 19 +
web_src/src/components/dialog/MediaServerEdit.vue | 22 ++
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/InviteRequestProcessor.java | 16 -
sql/2.6.8升级2.6.9.sql | 6
src/main/java/com/genersoft/iot/vmp/media/zlm/dto/MediaSendRtpPortInfo.java | 50 ++++++
src/main/java/com/genersoft/iot/vmp/storager/dao/MediaServerMapper.java | 4
src/main/java/com/genersoft/iot/vmp/conf/MediaConfig.java | 12 +
src/main/java/com/genersoft/iot/vmp/service/impl/MediaServerServiceImpl.java | 37 ++++
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/NotifyRequestProcessor.java | 7
web_src/src/components/dialog/StreamProxyEdit.vue | 24 +-
src/main/java/com/genersoft/iot/vmp/service/redisMsg/RedisGbPlayMsgListener.java | 4
18 files changed, 270 insertions(+), 177 deletions(-)
diff --git "a/sql/2.6.8\345\215\207\347\272\2472.6.9.sql" "b/sql/2.6.8\345\215\207\347\272\2472.6.9.sql"
index e633d63..a398cb8 100644
--- "a/sql/2.6.8\345\215\207\347\272\2472.6.9.sql"
+++ "b/sql/2.6.8\345\215\207\347\272\2472.6.9.sql"
@@ -205,6 +205,12 @@
change hookIp hook_ip varchar(50) not null;
alter table media_server
+ add send_rtp_port_range varchar(50) not null;
+
+alter table media_server
+ add column send_rtp_port_range varchar(50) default null;
+
+alter table media_server
change sdpIp sdp_ip varchar(50) not null;
alter table media_server
diff --git "a/sql/\345\210\235\345\247\213\345\214\226.sql" "b/sql/\345\210\235\345\247\213\345\214\226.sql"
index 3eed0dd..421760f 100644
--- "a/sql/\345\210\235\345\247\213\345\214\226.sql"
+++ "b/sql/\345\210\235\345\247\213\345\214\226.sql"
@@ -153,6 +153,7 @@
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),
diff --git a/src/main/java/com/genersoft/iot/vmp/conf/MediaConfig.java b/src/main/java/com/genersoft/iot/vmp/conf/MediaConfig.java
index 62baa71..fca6d63 100644
--- a/src/main/java/com/genersoft/iot/vmp/conf/MediaConfig.java
+++ b/src/main/java/com/genersoft/iot/vmp/conf/MediaConfig.java
@@ -75,6 +75,9 @@
@Value("${media.rtp.port-range}")
private String rtpPortRange;
+ @Value("${media.rtp.send-port-range}")
+ private String rtpSendPortRange;
+
@Value("${media.record-assist-port:0}")
private Integer recordAssistPort = 0;
@@ -206,6 +209,7 @@
mediaServerItem.setSecret(secret);
mediaServerItem.setRtpEnable(rtpEnable);
mediaServerItem.setRtpPortRange(rtpPortRange);
+ mediaServerItem.setSendRtpPortRange(rtpSendPortRange);
mediaServerItem.setRecordAssistPort(recordAssistPort);
mediaServerItem.setHookAliveInterval(30.00f);
@@ -215,6 +219,14 @@
return mediaServerItem;
}
+ public String getRtpSendPortRange() {
+ return rtpSendPortRange;
+ }
+
+ public void setRtpSendPortRange(String rtpSendPortRange) {
+ this.rtpSendPortRange = rtpSendPortRange;
+ }
+
private boolean isValidIPAddress(String ipAddress) {
if ((ipAddress != null) && (!ipAddress.isEmpty())) {
return Pattern.matches("^([1-9]|[1-9]\\d|1\\d{2}|2[0-4]\\d|25[0-5])(\\.(\\d|[1-9]\\d|1\\d{2}|2[0-4]\\d|25[0-5])){3}$", ipAddress);
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/AckRequestProcessor.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/AckRequestProcessor.java
index c50498b..cc1f0c0 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/AckRequestProcessor.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/AckRequestProcessor.java
@@ -109,6 +109,8 @@
param.put("app",sendRtpItem.getApp());
param.put("stream",sendRtpItem.getStream());
param.put("ssrc", sendRtpItem.getSsrc());
+ param.put("dst_url",sendRtpItem.getIp());
+ param.put("dst_port", sendRtpItem.getPort());
param.put("src_port", sendRtpItem.getLocalPort());
param.put("pt", sendRtpItem.getPt());
param.put("use_ps", sendRtpItem.isUsePs() ? "1" : "0");
@@ -131,16 +133,12 @@
// 濡傛灉鏄潪涓ユ牸妯″紡锛岄渶瑕佸叧闂鍙e崰鐢�
JSONObject startSendRtpStreamResult = null;
if (sendRtpItem.getLocalPort() != 0) {
- HookSubscribeForRtpServerTimeout hookSubscribeForRtpServerTimeout = HookSubscribeFactory.on_rtp_server_timeout(sendRtpItem.getSsrc(), null, mediaInfo.getId());
- hookSubscribe.removeSubscribe(hookSubscribeForRtpServerTimeout);
- if (zlmrtpServerFactory.releasePort(mediaInfo, sendRtpItem.getSsrc())) {
- if (sendRtpItem.isTcpActive()) {
- startSendRtpStreamResult = zlmrtpServerFactory.startSendRtpPassive(mediaInfo, param);
- }else {
- param.put("dst_url", sendRtpItem.getIp());
- param.put("dst_port", sendRtpItem.getPort());
- startSendRtpStreamResult = zlmrtpServerFactory.startSendRtpStream(mediaInfo, param);
- }
+ if (sendRtpItem.isTcpActive()) {
+ startSendRtpStreamResult = zlmrtpServerFactory.startSendRtpPassive(mediaInfo, param);
+ }else {
+ param.put("dst_url", sendRtpItem.getIp());
+ param.put("dst_port", sendRtpItem.getPort());
+ startSendRtpStreamResult = zlmrtpServerFactory.startSendRtpStream(mediaInfo, param);
}
}else {
if (sendRtpItem.isTcpActive()) {
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/InviteRequestProcessor.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/InviteRequestProcessor.java
index 8a94d68..93e5540 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/InviteRequestProcessor.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/InviteRequestProcessor.java
@@ -375,9 +375,7 @@
}
logger.info("[涓婄骇Invite] {}, 骞冲彴锛歿}锛� 閫氶亾锛歿}, 鏀舵祦鍦板潃锛歿}:{}锛屾敹娴佹柟寮忥細{}, ssrc锛歿}", sessionName, username, channelId, addressStr, port, streamTypeStr, ssrc);
SendRtpItem sendRtpItem = zlmrtpServerFactory.createSendRtpItem(mediaServerItem, addressStr, port, ssrc, requesterId,
- device.getDeviceId(), channelId, mediaTransmissionTCP, platform.isRtcp(), ssrcFromCallback -> {
- return redisCatchStorage.querySendRTPServer(platform.getServerGBId(), channelId, null, callIdHeader.getCallId()) != null;
- });
+ device.getDeviceId(), channelId, mediaTransmissionTCP, platform.isRtcp());
if (tcpActive != null) {
sendRtpItem.setTcpActive(tcpActive);
@@ -588,9 +586,7 @@
if (streamReady != null && streamReady) {
// 鑷钩鍙板唴瀹�
SendRtpItem sendRtpItem = zlmrtpServerFactory.createSendRtpItem(mediaServerItem, addressStr, port, ssrc, requesterId,
- gbStream.getApp(), gbStream.getStream(), channelId, mediaTransmissionTCP, platform.isRtcp(), ssrcFromCallback ->{
- return redisCatchStorage.querySendRTPServer(platform.getServerGBId(), channelId, null, callIdHeader.getCallId()) != null;
- });
+ gbStream.getApp(), gbStream.getStream(), channelId, mediaTransmissionTCP, platform.isRtcp());
if (sendRtpItem == null) {
logger.warn("鏈嶅姟鍣ㄧ鍙h祫婧愪笉瓒�");
@@ -630,9 +626,7 @@
if (streamReady != null && streamReady) {
// 鑷钩鍙板唴瀹�
SendRtpItem sendRtpItem = zlmrtpServerFactory.createSendRtpItem(mediaServerItem, addressStr, port, ssrc, requesterId,
- gbStream.getApp(), gbStream.getStream(), channelId, mediaTransmissionTCP, platform.isRtcp(), ssrcFromCallback ->{
- return redisCatchStorage.querySendRTPServer(platform.getServerGBId(), channelId, null, callIdHeader.getCallId()) != null;
- });
+ gbStream.getApp(), gbStream.getStream(), channelId, mediaTransmissionTCP, platform.isRtcp());
if (sendRtpItem == null) {
logger.warn("鏈嶅姟鍣ㄧ鍙h祫婧愪笉瓒�");
@@ -748,9 +742,7 @@
dynamicTask.stop(callIdHeader.getCallId());
if (serverId.equals(userSetting.getServerId())) {
SendRtpItem sendRtpItem = zlmrtpServerFactory.createSendRtpItem(mediaServerItem, addressStr, finalPort, ssrc, requesterId,
- app, stream, channelId, mediaTransmissionTCP, platform.isRtcp(), ssrcFromCallback -> {
- return redisCatchStorage.querySendRTPServer(platform.getServerGBId(), channelId, null, callIdHeader.getCallId()) != null;
- });
+ app, stream, channelId, mediaTransmissionTCP, platform.isRtcp());
if (sendRtpItem == null) {
logger.warn("涓婄骇鐐规椂鍒涘缓sendRTPItem澶辫触锛屽彲鑳芥槸鏈嶅姟鍣ㄧ鍙h祫婧愪笉瓒�");
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/NotifyRequestForCatalogProcessor.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/NotifyRequestForCatalogProcessor.java
index 907cd66..281d780 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/NotifyRequestForCatalogProcessor.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/NotifyRequestForCatalogProcessor.java
@@ -2,6 +2,7 @@
import com.genersoft.iot.vmp.conf.CivilCodeFileConf;
import com.genersoft.iot.vmp.conf.DynamicTask;
+import com.genersoft.iot.vmp.conf.SipConfig;
import com.genersoft.iot.vmp.conf.UserSetting;
import com.genersoft.iot.vmp.gb28181.bean.Device;
import com.genersoft.iot.vmp.gb28181.bean.DeviceChannel;
@@ -63,6 +64,9 @@
@Autowired
private CivilCodeFileConf civilCodeFileConf;
+ @Autowired
+ private SipConfig sipConfig;
+
private final static String talkKey = "notify-request-for-catalog-task";
public void process(RequestEvent evt) {
@@ -104,7 +108,13 @@
event = eventElement.getText().toUpperCase();
}
DeviceChannel channel = XmlUtil.channelContentHandler(itemDevice, device, event, civilCodeFileConf);
-
+ if (channel == null) {
+ logger.info("[鏀跺埌鐩綍璁㈤槄]锛氫絾鏄В鏋愬け璐� {}", new String(evt.getRequest().getRawContent()));
+ continue;
+ }
+ if (channel.getParentId() != null && channel.getParentId().equals(sipConfig.getId())) {
+ channel.setParentId(null);
+ }
channel.setDeviceId(device.getDeviceId());
logger.info("[鏀跺埌鐩綍璁㈤槄]锛歿}/{}", device.getDeviceId(), channel.getChannelId());
switch (event) {
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/NotifyRequestProcessor.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/NotifyRequestProcessor.java
index bc34bbd..d44ff5a 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/NotifyRequestProcessor.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/NotifyRequestProcessor.java
@@ -413,6 +413,13 @@
event = eventElement.getText().toUpperCase();
}
DeviceChannel channel = XmlUtil.channelContentHandler(itemDevice, device, event, civilCodeFileConf);
+ if (channel == null) {
+ logger.info("[鏀跺埌鐩綍璁㈤槄]锛氫絾鏄В鏋愬け璐� {}", new String(evt.getRequest().getRawContent()));
+ continue;
+ }
+ if (channel.getParentId() != null && channel.getParentId().equals(sipConfig.getId())) {
+ channel.setParentId(null);
+ }
channel.setDeviceId(device.getDeviceId());
logger.info("[鏀跺埌鐩綍璁㈤槄]锛歿}/{}", device.getDeviceId(), channel.getChannelId());
switch (event) {
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/response/cmd/CatalogResponseMessageHandler.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/response/cmd/CatalogResponseMessageHandler.java
index 20cb59c..2283fa2 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/response/cmd/CatalogResponseMessageHandler.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/response/cmd/CatalogResponseMessageHandler.java
@@ -1,6 +1,7 @@
package com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.response.cmd;
import com.genersoft.iot.vmp.conf.CivilCodeFileConf;
+import com.genersoft.iot.vmp.conf.SipConfig;
import com.genersoft.iot.vmp.gb28181.bean.*;
import com.genersoft.iot.vmp.gb28181.session.CatalogDataCatch;
import com.genersoft.iot.vmp.gb28181.transmit.event.request.SIPRequestProcessorParent;
@@ -58,6 +59,9 @@
@Autowired
private CivilCodeFileConf civilCodeFileConf;
+ @Autowired
+ private SipConfig sipConfig;
+
@Override
public void afterPropertiesSet() throws Exception {
responseMessageHandler.addHandler(cmdType, this);
@@ -113,11 +117,18 @@
if (channelDeviceElement == null) {
continue;
}
- DeviceChannel deviceChannel = XmlUtil.channelContentHandler(itemDevice, device, null, civilCodeFileConf);
- deviceChannel = SipUtils.updateGps(deviceChannel, device.getGeoCoordSys());
- deviceChannel.setDeviceId(take.getDevice().getDeviceId());
+ DeviceChannel channel = XmlUtil.channelContentHandler(itemDevice, device, null, civilCodeFileConf);
+ if (channel == null) {
+ logger.info("[鏀跺埌鐩綍璁㈤槄]锛氫絾鏄В鏋愬け璐� {}", new String(evt.getRequest().getRawContent()));
+ continue;
+ }
+ if (channel.getParentId() != null && channel.getParentId().equals(sipConfig.getId())) {
+ channel.setParentId(null);
+ }
+ SipUtils.updateGps(channel, device.getGeoCoordSys());
+ channel.setDeviceId(take.getDevice().getDeviceId());
- channelList.add(deviceChannel);
+ channelList.add(channel);
}
int sn = Integer.parseInt(snElement.getText());
catalogDataCatch.put(take.getDevice().getDeviceId(), sn, sumNum, take.getDevice(), channelList);
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/utils/XmlUtil.java b/src/main/java/com/genersoft/iot/vmp/gb28181/utils/XmlUtil.java
index 7914ffa..a83e7c9 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/utils/XmlUtil.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/utils/XmlUtil.java
@@ -8,6 +8,7 @@
import com.genersoft.iot.vmp.gb28181.bean.DeviceChannel;
import com.genersoft.iot.vmp.gb28181.event.subscribe.catalog.CatalogEvent;
import com.genersoft.iot.vmp.utils.DateUtil;
+import org.apache.commons.lang3.math.NumberUtils;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
@@ -317,7 +318,6 @@
deviceChannel.setBusinessGroupId(businessGroupID);
}
-
if (!ObjectUtils.isEmpty(parentID)) {
if (parentID.contains("/")) {
String[] parentIdArray = parentID.split("/");
@@ -341,7 +341,11 @@
if (!ObjectUtils.isEmpty(owner)) {
deviceChannel.setOwner(owner);
}
- if (!ObjectUtils.isEmpty(civilCode)) {
+ if (!ObjectUtils.isEmpty(civilCode)
+ && civilCode.length() <= 8
+ && NumberUtils.isParsable(civilCode)
+ && Integer.parseInt(civilCode)%2 == 0
+ ) {
deviceChannel.setCivilCode(civilCode);
}
if (!ObjectUtils.isEmpty(businessGroupID)) {
@@ -387,8 +391,8 @@
if (!ObjectUtils.isEmpty(businessGroupID)) {
deviceChannel.setParentId(businessGroupID);
}else {
- if (!ObjectUtils.isEmpty(civilCode)) {
- deviceChannel.setParentId(civilCode);
+ if (!ObjectUtils.isEmpty(deviceChannel.getCivilCode())) {
+ deviceChannel.setParentId(deviceChannel.getCivilCode());
}
}
}
diff --git a/src/main/java/com/genersoft/iot/vmp/media/zlm/SendRtpPortManager.java b/src/main/java/com/genersoft/iot/vmp/media/zlm/SendRtpPortManager.java
new file mode 100644
index 0000000..8366a4a
--- /dev/null
+++ b/src/main/java/com/genersoft/iot/vmp/media/zlm/SendRtpPortManager.java
@@ -0,0 +1,55 @@
+package com.genersoft.iot.vmp.media.zlm;
+
+import com.genersoft.iot.vmp.conf.UserSetting;
+import com.genersoft.iot.vmp.media.zlm.dto.MediaSendRtpPortInfo;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.stereotype.Component;
+
+@Component
+public class SendRtpPortManager {
+
+ private final static Logger logger = LoggerFactory.getLogger(SendRtpPortManager.class);
+
+ @Autowired
+ private UserSetting userSetting;
+
+ @Autowired
+ private RedisTemplate<Object, Object> redisTemplate;
+
+ private final String KEY = "VM_MEDIA_SEND_RTP_PORT_RANGE_";
+
+
+ public void initServerPort(String mediaServerId, int startPort, int endPort){
+ String key = KEY + userSetting.getServerId() + "_" + mediaServerId;
+ MediaSendRtpPortInfo mediaSendRtpPortInfo = new MediaSendRtpPortInfo(startPort, endPort, mediaServerId);
+ redisTemplate.opsForValue().set(key, mediaSendRtpPortInfo);
+ }
+
+ public int getNextPort(String mediaServerId) {
+ String key = KEY + userSetting.getServerId() + "_" + mediaServerId;
+ MediaSendRtpPortInfo mediaSendRtpPortInfo = (MediaSendRtpPortInfo)redisTemplate.opsForValue().get(key);
+ if (mediaSendRtpPortInfo == null) {
+ logger.warn("[鍙戦�佺鍙g鐞哴 鑾峰彇{}鐨勫彂閫佺鍙f椂鏈壘鍒扮鍙d俊鎭�", mediaSendRtpPortInfo);
+ return 0;
+ }
+ int port;
+ if (mediaSendRtpPortInfo.getCurrent() %2 != 0) {
+ port = mediaSendRtpPortInfo.getCurrent() + 1;
+ }else {
+ port = mediaSendRtpPortInfo.getCurrent() + 2;
+ }
+ if (port > mediaSendRtpPortInfo.getEnd()) {
+ if (mediaSendRtpPortInfo.getStart() %2 != 0) {
+ port = mediaSendRtpPortInfo.getStart() + 1;
+ }else {
+ port = mediaSendRtpPortInfo.getStart();
+ }
+ }
+ mediaSendRtpPortInfo.setCurrent(port);
+ redisTemplate.opsForValue().set(key, mediaSendRtpPortInfo);
+ return port;
+ }
+}
diff --git a/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRTPServerFactory.java b/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRTPServerFactory.java
index e39474f..52e7953 100644
--- a/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRTPServerFactory.java
+++ b/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRTPServerFactory.java
@@ -1,22 +1,18 @@
package com.genersoft.iot.vmp.media.zlm;
import com.alibaba.fastjson2.JSON;
-import com.alibaba.fastjson2.JSONArray;
import com.alibaba.fastjson2.JSONObject;
import com.genersoft.iot.vmp.common.CommonCallback;
import com.genersoft.iot.vmp.conf.UserSetting;
import com.genersoft.iot.vmp.gb28181.bean.SendRtpItem;
-import com.genersoft.iot.vmp.media.zlm.dto.HookSubscribeFactory;
-import com.genersoft.iot.vmp.media.zlm.dto.HookSubscribeForRtpServerTimeout;
import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem;
-import com.genersoft.iot.vmp.media.zlm.dto.hook.HookParam;
-import com.genersoft.iot.vmp.media.zlm.dto.hook.OnRtpServerTimeoutHookParam;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
-import java.util.*;
+import java.util.HashMap;
+import java.util.Map;
@Component
public class ZLMRTPServerFactory {
@@ -32,68 +28,9 @@
@Autowired
private ZlmHttpHookSubscribe hookSubscribe;
- private int[] portRangeArray = new int[2];
+ @Autowired
+ private SendRtpPortManager sendRtpPortManager;
- public int getFreePort(MediaServerItem mediaServerItem, int startPort, int endPort, List<Integer> usedFreelist) {
- if (endPort <= startPort) {
- return -1;
- }
- if (usedFreelist == null) {
- usedFreelist = new ArrayList<>();
- }
- JSONObject listRtpServerJsonResult = zlmresTfulUtils.listRtpServer(mediaServerItem);
- if (listRtpServerJsonResult != null) {
- JSONArray data = listRtpServerJsonResult.getJSONArray("data");
- if (data != null) {
- for (int i = 0; i < data.size(); i++) {
- JSONObject dataItem = data.getJSONObject(i);
- usedFreelist.add(dataItem.getInteger("port"));
- }
- }
- }
-
- Map<String, Object> param = new HashMap<>();
- int result = -1;
- // 璁剧疆鎺ㄦ祦绔彛
- if (startPort%2 == 1) {
- startPort ++;
- }
- boolean checkPort = false;
- for (int i = startPort; i < endPort + 1; i+=2) {
- if (!usedFreelist.contains(i)){
- checkPort = true;
- startPort = i;
- break;
- }
- }
- if (!checkPort) {
- logger.warn("鏈壘鍒拌妭鐐箋}涓婅寖鍥碵{}-{}]鐨勭┖闂茬鍙�", mediaServerItem.getId(), startPort, endPort);
- return -1;
- }
- param.put("port", startPort);
- String stream = UUID.randomUUID().toString();
- param.put("enable_tcp", 1);
- param.put("stream_id", stream);
-// param.put("port", 0);
- JSONObject openRtpServerResultJson = zlmresTfulUtils.openRtpServer(mediaServerItem, param);
-
- if (openRtpServerResultJson != null) {
- if (openRtpServerResultJson.getInteger("code") == 0) {
- result= openRtpServerResultJson.getInteger("port");
- Map<String, Object> closeRtpServerParam = new HashMap<>();
- closeRtpServerParam.put("stream_id", stream);
- zlmresTfulUtils.closeRtpServer(mediaServerItem, closeRtpServerParam);
- }else {
- usedFreelist.add(startPort);
- startPort +=2;
- result = getFreePort(mediaServerItem, startPort, endPort,usedFreelist);
- }
- }else {
- // 妫�鏌LM鐘舵��
- logger.error("鍒涘缓RTP Server 澶辫触 {}: 璇锋鏌LM鏈嶅姟", param.get("port"));
- }
- return result;
- }
/**
* 寮�鍚痳tpServer
@@ -226,16 +163,14 @@
* @return SendRtpItem
*/
public SendRtpItem createSendRtpItem(MediaServerItem serverItem, String ip, int port, String ssrc, String platformId,
- String deviceId, String channelId, boolean tcp, boolean rtcp, KeepPortCallback callback){
+ String deviceId, String channelId, boolean tcp, boolean rtcp){
// 榛樿涓洪殢鏈虹鍙�
int localPort = 0;
if (userSetting.getGbSendStreamStrict()) {
- if (userSetting.getGbSendStreamStrict()) {
- localPort = keepPort(serverItem, ssrc, localPort, callback);
- if (localPort == 0) {
- return null;
- }
+ localPort = sendRtpPortManager.getNextPort(serverItem.getId());
+ if (localPort == 0) {
+ return null;
}
}
SendRtpItem sendRtpItem = new SendRtpItem();
@@ -265,11 +200,11 @@
* @return SendRtpItem
*/
public SendRtpItem createSendRtpItem(MediaServerItem serverItem, String ip, int port, String ssrc, String platformId,
- String app, String stream, String channelId, boolean tcp, boolean rtcp, KeepPortCallback callback){
+ String app, String stream, String channelId, boolean tcp, boolean rtcp){
// 榛樿涓洪殢鏈虹鍙�
int localPort = 0;
if (userSetting.getGbSendStreamStrict()) {
- localPort = keepPort(serverItem, ssrc, localPort, callback);
+ localPort = sendRtpPortManager.getNextPort(serverItem.getId());
if (localPort == 0) {
return null;
}
@@ -288,58 +223,6 @@
sendRtpItem.setMediaServerId(serverItem.getId());
sendRtpItem.setRtcp(rtcp);
return sendRtpItem;
- }
-
- public interface KeepPortCallback{
- Boolean keep(String ssrc);
- }
-
- /**
- * 淇濇寔绔彛锛岀洿鍒伴渶瑕侀渶瑕佸彂娴佹椂鍐嶉噴鏀�
- */
- public int keepPort(MediaServerItem serverItem, String ssrc, int localPort, KeepPortCallback keepPortCallback) {
- Map<String, Object> param = new HashMap<>(3);
- param.put("port", localPort);
- param.put("enable_tcp", 1);
- param.put("stream_id", ssrc);
- JSONObject jsonObject = zlmresTfulUtils.openRtpServer(serverItem, param);
- if (jsonObject.getInteger("code") == 0) {
- localPort = jsonObject.getInteger("port");
- HookSubscribeForRtpServerTimeout hookSubscribeForRtpServerTimeout = HookSubscribeFactory.on_rtp_server_timeout(ssrc, null, serverItem.getId());
- // 璁㈤槄 zlm鍚姩浜嬩欢, 鏂扮殑zlm涔熶細浠庤繖閲岃繘鍏ョ郴缁�
- int finalLocalPort = localPort;
- hookSubscribe.addSubscribe(hookSubscribeForRtpServerTimeout,
- (MediaServerItem mediaServerItem, HookParam hookParam)->{
- logger.info("[涓婄骇鐐规挱] {}->鐩戝惉绔彛鍒版湡缁х画淇濇寔鐩戝惉: {}", ssrc, finalLocalPort);
- OnRtpServerTimeoutHookParam rtpServerTimeoutHookParam = (OnRtpServerTimeoutHookParam) hookParam;
- if (ssrc.equals(rtpServerTimeoutHookParam.getStream_id())) {
- if (keepPortCallback.keep(ssrc)) {
- logger.info("[涓婄骇鐐规挱] {}->鐩戝惉绔彛鍒版湡缁х画淇濇寔鐩戝惉", ssrc);
- keepPort(serverItem, ssrc, finalLocalPort, keepPortCallback);
- }else {
- logger.info("[涓婄骇鐐规挱] {}->鍙戦�佸彇娑堬紝鏃犻渶缁х画鐩戝惉", ssrc);
- releasePort(serverItem, ssrc);
- }
- }
- });
- logger.info("[涓婄骇鐐规挱] {}->: {}", ssrc, localPort);
- return localPort;
- }else {
- logger.info("[涓婄骇鐐规挱] 鐩戝惉绔彛澶辫触: {}->{}", ssrc, localPort);
- return 0;
- }
- }
-
- /**
- * 閲婃斁淇濇寔鐨勭鍙�
- */
- public boolean releasePort(MediaServerItem serverItem, String ssrc) {
- logger.info("[淇濇寔绔彛] {}->閲婃斁鐩戝惉绔彛", ssrc);
- boolean closeRTPServerResult = closeRtpServer(serverItem, ssrc);
- HookSubscribeForRtpServerTimeout hookSubscribeForRtpServerTimeout = HookSubscribeFactory.on_rtp_server_timeout(ssrc, null, serverItem.getId());
- // 璁㈤槄 zlm鍚姩浜嬩欢, 鏂扮殑zlm涔熶細浠庤繖閲岃繘鍏ョ郴缁�
- hookSubscribe.removeSubscribe(hookSubscribeForRtpServerTimeout);
- return closeRTPServerResult;
}
/**
diff --git a/src/main/java/com/genersoft/iot/vmp/media/zlm/dto/MediaSendRtpPortInfo.java b/src/main/java/com/genersoft/iot/vmp/media/zlm/dto/MediaSendRtpPortInfo.java
new file mode 100644
index 0000000..2e9f631
--- /dev/null
+++ b/src/main/java/com/genersoft/iot/vmp/media/zlm/dto/MediaSendRtpPortInfo.java
@@ -0,0 +1,50 @@
+package com.genersoft.iot.vmp.media.zlm.dto;
+
+public class MediaSendRtpPortInfo {
+
+ private int start;
+ private int end;
+ private String mediaServerId;
+
+ private int current;
+
+
+ public MediaSendRtpPortInfo(int start, int end, String mediaServerId) {
+ this.start = start;
+ this.current = start;
+ this.end = end;
+ this.mediaServerId = mediaServerId;
+ }
+
+ public int getStart() {
+ return start;
+ }
+
+ public void setStart(int start) {
+ this.start = start;
+ }
+
+ public int getEnd() {
+ return end;
+ }
+
+ public void setEnd(int end) {
+ this.end = end;
+ }
+
+ public String getMediaServerId() {
+ return mediaServerId;
+ }
+
+ public void setMediaServerId(String mediaServerId) {
+ this.mediaServerId = mediaServerId;
+ }
+
+ public int getCurrent() {
+ return current;
+ }
+
+ public void setCurrent(int current) {
+ this.current = current;
+ }
+}
diff --git a/src/main/java/com/genersoft/iot/vmp/media/zlm/dto/MediaServerItem.java b/src/main/java/com/genersoft/iot/vmp/media/zlm/dto/MediaServerItem.java
index e6bbb5f..066a677 100644
--- a/src/main/java/com/genersoft/iot/vmp/media/zlm/dto/MediaServerItem.java
+++ b/src/main/java/com/genersoft/iot/vmp/media/zlm/dto/MediaServerItem.java
@@ -62,6 +62,9 @@
@Schema(description = "澶氱鍙TP鏀舵祦绔彛鑼冨洿")
private String rtpPortRange;
+ @Schema(description = "RTP鍙戞祦绔彛鑼冨洿")
+ private String sendRtpPortRange;
+
@Schema(description = "assist鏈嶅姟绔彛")
private int recordAssistPort;
@@ -297,4 +300,12 @@
public void setHookAliveInterval(Float hookAliveInterval) {
this.hookAliveInterval = hookAliveInterval;
}
+
+ public String getSendRtpPortRange() {
+ return sendRtpPortRange;
+ }
+
+ public void setSendRtpPortRange(String sendRtpPortRange) {
+ this.sendRtpPortRange = sendRtpPortRange;
+ }
}
diff --git a/src/main/java/com/genersoft/iot/vmp/service/impl/MediaServerServiceImpl.java b/src/main/java/com/genersoft/iot/vmp/service/impl/MediaServerServiceImpl.java
index 83c1904..2fd13ec 100644
--- a/src/main/java/com/genersoft/iot/vmp/service/impl/MediaServerServiceImpl.java
+++ b/src/main/java/com/genersoft/iot/vmp/service/impl/MediaServerServiceImpl.java
@@ -11,10 +11,7 @@
import com.genersoft.iot.vmp.conf.exception.ControllerException;
import com.genersoft.iot.vmp.gb28181.event.EventPublisher;
import com.genersoft.iot.vmp.gb28181.session.SSRCFactory;
-import com.genersoft.iot.vmp.media.zlm.AssistRESTfulUtils;
-import com.genersoft.iot.vmp.media.zlm.ZLMRESTfulUtils;
-import com.genersoft.iot.vmp.media.zlm.ZLMRTPServerFactory;
-import com.genersoft.iot.vmp.media.zlm.ZLMServerConfig;
+import com.genersoft.iot.vmp.media.zlm.*;
import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem;
import com.genersoft.iot.vmp.media.zlm.dto.ServerKeepaliveData;
import com.genersoft.iot.vmp.service.IInviteStreamService;
@@ -71,6 +68,9 @@
private UserSetting userSetting;
@Autowired
+ private SendRtpPortManager sendRtpPortManager;
+
+ @Autowired
private AssistRESTfulUtils assistRESTfulUtils;
@Autowired
@@ -121,13 +121,40 @@
if (ssrcFactory.hasMediaServerSSRC(mediaServerItem.getId())) {
ssrcFactory.initMediaServerSSRC(mediaServerItem.getId(), null);
}
+ if (userSetting.getGbSendStreamStrict()) {
+ int startPort = 50000;
+ int endPort = 60000;
+ String sendRtpPortRange = mediaServerItem.getSendRtpPortRange();
+ if (sendRtpPortRange == null) {
+ logger.warn("[zlm] ] 鏈厤缃彂娴佺鍙h寖鍥达紝榛樿浣跨敤50000鍒�60000");
+ }else {
+ String[] sendRtpPortRangeArray = sendRtpPortRange.trim().split(",");
+ if (sendRtpPortRangeArray.length != 2) {
+ logger.warn("[zlm] ] 鍙戞祦绔彛鑼冨洿閿欒锛岄粯璁や娇鐢�50000鍒�60000");
+ }else {
+ try {
+ startPort = Integer.parseInt(sendRtpPortRangeArray[0]);
+ endPort = Integer.parseInt(sendRtpPortRangeArray[1]);
+ if (endPort <= startPort) {
+ logger.warn("[zlm] ] 鍙戞祦绔彛鑼冨洿閿欒锛岀粨鏉熺鍙e簲澶т簬寮�濮嬬鍙�,浣跨敤榛樿绔彛");
+ startPort = 50000;
+ endPort = 60000;
+ }
+
+ }catch (NumberFormatException e) {
+ logger.warn("[zlm] ] 鍙戞祦绔彛鑼冨洿閿欒锛岄粯璁や娇鐢�50000鍒�60000");
+ }
+ }
+ }
+ logger.info("[[zlm] ] 閰嶇疆鍙戞祦绔彛鑼冨洿锛寋}-{}", startPort, endPort);
+ sendRtpPortManager.initServerPort(mediaServerItem.getId(), startPort, endPort);
+ }
// 鏌ヨredis鏄惁瀛樺湪姝ediaServer
String key = VideoManagerConstants.MEDIA_SERVER_PREFIX + userSetting.getServerId() + "_" + mediaServerItem.getId();
Boolean hasKey = redisTemplate.hasKey(key);
if (hasKey != null && ! hasKey) {
redisTemplate.opsForValue().set(key, mediaServerItem);
}
-
}
}
diff --git a/src/main/java/com/genersoft/iot/vmp/service/redisMsg/RedisGbPlayMsgListener.java b/src/main/java/com/genersoft/iot/vmp/service/redisMsg/RedisGbPlayMsgListener.java
index a40bb3b..d46f909 100644
--- a/src/main/java/com/genersoft/iot/vmp/service/redisMsg/RedisGbPlayMsgListener.java
+++ b/src/main/java/com/genersoft/iot/vmp/service/redisMsg/RedisGbPlayMsgListener.java
@@ -314,9 +314,7 @@
SendRtpItem sendRtpItem = zlmrtpServerFactory.createSendRtpItem(mediaServerItem, content.getIp(),
content.getPort(), content.getSsrc(), content.getPlatformId(),
content.getApp(), content.getStream(), content.getChannelId(),
- content.getTcp(), content.getRtcp(), ssrcFromCallback -> {
- return querySendRTPServer(content.getPlatformId(), content.getChannelId(), content.getStream(), null) != null;
- });
+ content.getTcp(), content.getRtcp());
WVPResult<ResponseSendItemMsg> result = new WVPResult<>();
result.setCode(0);
diff --git a/src/main/java/com/genersoft/iot/vmp/storager/dao/MediaServerMapper.java b/src/main/java/com/genersoft/iot/vmp/storager/dao/MediaServerMapper.java
index ca0d98d..cdc303d 100644
--- a/src/main/java/com/genersoft/iot/vmp/storager/dao/MediaServerMapper.java
+++ b/src/main/java/com/genersoft/iot/vmp/storager/dao/MediaServerMapper.java
@@ -28,6 +28,7 @@
"secret,"+
"rtp_enable,"+
"rtp_port_range,"+
+ "send_rtp_port_range,"+
"record_assist_port,"+
"default_server,"+
"create_time,"+
@@ -51,6 +52,7 @@
"#{secret}, " +
"#{rtpEnable}, " +
"#{rtpPortRange}, " +
+ "#{sendRtpPortRange}, " +
"#{recordAssistPort}, " +
"#{defaultServer}, " +
"#{createTime}, " +
@@ -75,6 +77,7 @@
"<if test=\"autoConfig != null\">, auto_config=#{autoConfig}</if>" +
"<if test=\"rtpEnable != null\">, rtp_enable=#{rtpEnable}</if>" +
"<if test=\"rtpPortRange != null\">, rtp_port_range=#{rtpPortRange}</if>" +
+ "<if test=\"sendRtpPortRange != null\">, send_rtp_port_range=#{sendRtpPortRange}</if>" +
"<if test=\"secret != null\">, secret=#{secret}</if>" +
"<if test=\"recordAssistPort != null\">, record_assist_port=#{recordAssistPort}</if>" +
"<if test=\"hookAliveInterval != null\">, hook_alive_interval=#{hookAliveInterval}</if>" +
@@ -98,6 +101,7 @@
"<if test=\"autoConfig != null\">, auto_config=#{autoConfig}</if>" +
"<if test=\"rtpEnable != null\">, rtp_enable=#{rtpEnable}</if>" +
"<if test=\"rtpPortRange != null\">, rtp_port_range=#{rtpPortRange}</if>" +
+ "<if test=\"sendRtpPortRange != null\">, send_rtp_port_range=#{sendRtpPortRange}</if>" +
"<if test=\"secret != null\">, secret=#{secret}</if>" +
"<if test=\"recordAssistPort != null\">, record_assist_port=#{recordAssistPort}</if>" +
"<if test=\"hookAliveInterval != null\">, hook_alive_interval=#{hookAliveInterval}</if>" +
diff --git a/web_src/src/components/dialog/MediaServerEdit.vue b/web_src/src/components/dialog/MediaServerEdit.vue
index 15923c1..9808a1c 100644
--- a/web_src/src/components/dialog/MediaServerEdit.vue
+++ b/web_src/src/components/dialog/MediaServerEdit.vue
@@ -81,6 +81,7 @@
<el-switch active-text="澶氱鍙�" inactive-text="鍗曠鍙�" @change="portRangeChange" v-model="mediaServerForm.rtpEnable" :disabled="mediaServerForm.defaultServer"></el-switch>
</el-form-item>
+
<el-form-item v-if="!mediaServerForm.rtpEnable" label="鏀舵祦绔彛" prop="rtpProxyPort">
<el-input v-model.number="mediaServerForm.rtpProxyPort" clearable :disabled="mediaServerForm.defaultServer"></el-input>
</el-form-item>
@@ -88,6 +89,11 @@
<el-input v-model="rtpPortRange1" placeholder="璧峰" @change="portRangeChange" clearable style="width: 100px" prop="rtpPortRange1" :disabled="mediaServerForm.defaultServer"></el-input>
-
<el-input v-model="rtpPortRange2" placeholder="缁堟" @change="portRangeChange" clearable style="width: 100px" prop="rtpPortRange2" :disabled="mediaServerForm.defaultServer"></el-input>
+ </el-form-item>
+ <el-form-item v-if="mediaServerForm.sendRtpEnable" label="鍙戞祦绔彛" >
+ <el-input v-model="sendRtpPortRange1" placeholder="璧峰" @change="portRangeChange" clearable style="width: 100px" prop="rtpPortRange1" :disabled="mediaServerForm.defaultServer"></el-input>
+ -
+ <el-input v-model="sendRtpPortRange2" placeholder="缁堟" @change="portRangeChange" clearable style="width: 100px" prop="rtpPortRange2" :disabled="mediaServerForm.defaultServer"></el-input>
</el-form-item>
<el-form-item label="褰曞儚绠$悊鏈嶅姟绔彛" prop="recordAssistPort">
<el-input v-model.number="mediaServerForm.recordAssistPort" :disabled="mediaServerForm.defaultServer">
@@ -172,12 +178,16 @@
rtmpSSlPort: "",
rtpEnable: false,
rtpPortRange: "",
+ sendRtpPortRange: "",
rtpProxyPort: "",
rtspPort: "",
rtspSSLPort: "",
},
rtpPortRange1:30000,
rtpPortRange2:30500,
+
+ sendRtpPortRange1:50000,
+ sendRtpPortRange2:60000,
rules: {
ip: [{ required: true, validator: isValidIp, message: '璇疯緭鍏ユ湁鏁堢殑IP鍦板潃', trigger: 'blur' }],
@@ -214,9 +224,14 @@
this.currentStep = 3;
if (param.rtpPortRange) {
let rtpPortRange = this.mediaServerForm.rtpPortRange.split(",");
+ let sendRtpPortRange = this.mediaServerForm.sendRtpPortRange.split(",");
if (rtpPortRange.length > 0) {
this.rtpPortRange1 = rtpPortRange[0]
this.rtpPortRange2 = rtpPortRange[1]
+ }
+ if (sendRtpPortRange.length > 0) {
+ this.sendRtpPortRange1 = sendRtpPortRange[0]
+ this.sendRtpPortRange2 = sendRtpPortRange[1]
}
}
}
@@ -240,6 +255,8 @@
that.mediaServerForm.autoConfig = true;
that.rtpPortRange1 = 30000
that.rtpPortRange2 = 30500
+ that.sendRtpPortRange1 = 50000
+ that.sendRtpPortRange2 = 60000
that.serverCheck = 1;
}else {
that.serverCheck = -1;
@@ -321,12 +338,15 @@
rtmpSSlPort: "",
rtpEnable: false,
rtpPortRange: "",
+ sendRtpPortRange: "",
rtpProxyPort: "",
rtspPort: "",
rtspSSLPort: "",
};
this.rtpPortRange1 = 30500;
this.rtpPortRange2 = 30500;
+ this.sendRtpPortRange1 = 50000;
+ this.sendRtpPortRange2 = 60000;
this.listChangeCallback = null
this.currentStep = 1;
},
@@ -351,7 +371,7 @@
portRangeChange: function() {
if (this.mediaServerForm.rtpEnable) {
this.mediaServerForm.rtpPortRange = this.rtpPortRange1 + "," + this.rtpPortRange2
- console.log(this.mediaServerForm.rtpPortRange)
+ this.mediaServerForm.sendRtpPortRange = this.sendRtpPortRange1 + "," + this.sendRtpPortRange2
}
}
},
diff --git a/web_src/src/components/dialog/StreamProxyEdit.vue b/web_src/src/components/dialog/StreamProxyEdit.vue
index 588f114..f56134e 100644
--- a/web_src/src/components/dialog/StreamProxyEdit.vue
+++ b/web_src/src/components/dialog/StreamProxyEdit.vue
@@ -82,17 +82,21 @@
<el-option label="缁勬挱" value="2"></el-option>
</el-select>
</el-form-item>
+
<el-form-item label="鏃犱汉瑙傜湅" prop="rtpType" >
- <el-select
- @change="noneReaderHandler"
- v-model="proxyParam.noneReader"
- style="width: 100%"
- placeholder="璇烽�夋嫨鏃犱汉瑙傜湅鐨勫鐞嗘柟寮�"
- >
- <el-option label="涓嶅仛澶勭悊" value="0"></el-option>
- <el-option label="鍋滅敤" value="1"></el-option>
- <el-option label="绉婚櫎" value="2"></el-option>
- </el-select>
+ <el-radio v-model="proxyParam.noneReader" label="1">涓嶅仛澶勭悊</el-radio>
+ <el-radio v-model="proxyParam.enableDisableNoneReader" label="2">鍋滅敤</el-radio>
+ <el-radio v-model="proxyParam.enableRemoveNoneReader" label="3">绉婚櫎</el-radio>
+<!-- <el-select-->
+<!-- @change="noneReaderHandler"-->
+<!-- v-model="proxyParam.noneReader"-->
+<!-- style="width: 100%"-->
+<!-- placeholder="璇烽�夋嫨鏃犱汉瑙傜湅鐨勫鐞嗘柟寮�"-->
+<!-- >-->
+<!-- <el-option label="涓嶅仛澶勭悊" value="0"></el-option>-->
+<!-- <el-option label="鍋滅敤" value="1"></el-option>-->
+<!-- <el-option label="绉婚櫎" value="2"></el-option>-->
+<!-- </el-select>-->
</el-form-item>
<el-form-item label="鍏朵粬閫夐」">
<div style="float: left;">
--
Gitblit v1.8.0