diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/bean/Device.java b/src/main/java/com/genersoft/iot/vmp/gb28181/bean/Device.java
index d50ffb77..81b96662 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/bean/Device.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/bean/Device.java
@@ -129,6 +129,11 @@ public class Device {
*/
private int subscribeCycleForAlarm;
+ /**
+ * 是否开启ssrc校验,默认关闭,开启可以防止串流
+ */
+ private boolean ssrcCheck;
+
public String getDeviceId() {
return deviceId;
@@ -321,4 +326,12 @@ public class Device {
public void setSubscribeCycleForAlarm(int subscribeCycleForAlarm) {
this.subscribeCycleForAlarm = subscribeCycleForAlarm;
}
+
+ public boolean isSsrcCheck() {
+ return ssrcCheck;
+ }
+
+ public void setSsrcCheck(boolean ssrcCheck) {
+ this.ssrcCheck = ssrcCheck;
+ }
}
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/bean/DeviceChannel.java b/src/main/java/com/genersoft/iot/vmp/gb28181/bean/DeviceChannel.java
index 36337895..1e6ef773 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/bean/DeviceChannel.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/bean/DeviceChannel.java
@@ -169,6 +169,11 @@ public class DeviceChannel {
*/
private boolean hasAudio;
+ /**
+ * 标记通道的类型,0->国标通道 1->直播流通道 2->业务分组/虚拟组织/行政区划
+ */
+ private int channelType;
+
public int getId() {
return id;
}
@@ -441,4 +446,12 @@ public class DeviceChannel {
public void setUpdateTime(String updateTime) {
this.updateTime = updateTime;
}
+
+ public int getChannelType() {
+ return channelType;
+ }
+
+ public void setChannelType(int channelType) {
+ this.channelType = channelType;
+ }
}
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommanderFroPlatform.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommanderFroPlatform.java
index 37053119..0fd8cc50 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommanderFroPlatform.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommanderFroPlatform.java
@@ -260,24 +260,27 @@ public class SIPCommanderFroPlatform implements ISIPCommanderForPlatform {
catalogXml.append("" + channel.getChannelId() + "\r\n");
catalogXml.append("" + channel.getName() + "\r\n");
catalogXml.append("" + channel.getManufacture() + "\r\n");
- catalogXml.append("" + channel.getModel() + "\r\n");
- catalogXml.append("" + channel.getOwner() + "\r\n");
- catalogXml.append("" + channel.getCivilCode() + "\r\n");
- catalogXml.append("
" + channel.getAddress() + "\r\n");
catalogXml.append("" + channel.getParental() + "\r\n");
if (channel.getParentId() != null) {
catalogXml.append("" + channel.getParentId() + "\r\n");
}
- catalogXml.append("" + channel.getSecrecy() + "\r\n");
catalogXml.append("" + channel.getRegisterWay() + "\r\n");
catalogXml.append("" + (channel.getStatus() == 0?"OFF":"ON") + "\r\n");
- catalogXml.append("" + channel.getLongitude() + "\r\n");
- catalogXml.append("" + channel.getLatitude() + "\r\n");
- catalogXml.append("" + channel.getIpAddress() + "\r\n");
- catalogXml.append("" + channel.getPort() + "\r\n");
- catalogXml.append("\r\n");
- catalogXml.append("" + channel.getPTZType() + "\r\n");
- catalogXml.append("\r\n");
+ catalogXml.append("" + channel.getSecrecy() + "\r\n");
+ if (channel.getChannelType() != 2) { // 业务分组/虚拟组织/行政区划 不设置以下字段
+ catalogXml.append("" + channel.getModel() + "\r\n");
+ catalogXml.append("" + channel.getOwner() + "\r\n");
+ catalogXml.append("" + channel.getCivilCode() + "\r\n");
+ catalogXml.append("" + channel.getAddress() + "\r\n");
+ catalogXml.append("" + channel.getLongitude() + "\r\n");
+ catalogXml.append("" + channel.getLatitude() + "\r\n");
+ catalogXml.append("" + channel.getIpAddress() + "\r\n");
+ catalogXml.append("" + channel.getPort() + "\r\n");
+ catalogXml.append("\r\n");
+ catalogXml.append("" + channel.getPTZType() + "\r\n");
+ catalogXml.append("\r\n");
+ }
+
catalogXml.append("\r\n");
}
}
@@ -539,10 +542,6 @@ public class SIPCommanderFroPlatform implements ISIPCommanderForPlatform {
catalogXml.append("" + channel.getChannelId() + "\r\n");
catalogXml.append("" + channel.getName() + "\r\n");
catalogXml.append("" + channel.getManufacture() + "\r\n");
- catalogXml.append("" + channel.getModel() + "\r\n");
- catalogXml.append("0\r\n");
- catalogXml.append("CivilCode\r\n");
- catalogXml.append("" + channel.getAddress() + "\r\n");
catalogXml.append("" + channel.getParental() + "\r\n");
if (channel.getParentId() != null) {
catalogXml.append("" + channel.getParentId() + "\r\n");
@@ -550,6 +549,12 @@ public class SIPCommanderFroPlatform implements ISIPCommanderForPlatform {
catalogXml.append("" + channel.getSecrecy() + "\r\n");
catalogXml.append("" + channel.getRegisterWay() + "\r\n");
catalogXml.append("" + (channel.getStatus() == 0 ? "OFF" : "ON") + "\r\n");
+ if (channel.getChannelType() == 2) { // 业务分组/虚拟组织/行政区划 不设置以下属性
+ catalogXml.append("" + channel.getModel() + "\r\n");
+ catalogXml.append("0\r\n");
+ catalogXml.append("CivilCode\r\n");
+ catalogXml.append("" + channel.getAddress() + "\r\n");
+ }
if (!"presence".equals(subscribeInfo.getEventType())) {
catalogXml.append("" + type + "\r\n");
}
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/query/cmd/CatalogQueryMessageHandler.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/query/cmd/CatalogQueryMessageHandler.java
index 9844315a..cefee3fc 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/query/cmd/CatalogQueryMessageHandler.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/query/cmd/CatalogQueryMessageHandler.java
@@ -83,10 +83,10 @@ public class CatalogQueryMessageHandler extends SIPRequestProcessorParent implem
catalog.setParentId(parentPlatform.getDeviceGBId());
}
DeviceChannel deviceChannel = new DeviceChannel();
+ // 通道的类型,0->国标通道 1->直播流通道 2->业务分组/虚拟组织/行政区划
+ deviceChannel.setChannelType(2);
deviceChannel.setChannelId(catalog.getId());
deviceChannel.setName(catalog.getName());
- deviceChannel.setLongitude(0.0);
- deviceChannel.setLatitude(0.0);
deviceChannel.setDeviceId(parentPlatform.getDeviceGBId());
deviceChannel.setManufacture("wvp-pro");
deviceChannel.setStatus(1);
@@ -94,9 +94,6 @@ public class CatalogQueryMessageHandler extends SIPRequestProcessorParent implem
deviceChannel.setParentId(catalog.getParentId());
deviceChannel.setRegisterWay(1);
deviceChannel.setCivilCode(parentPlatform.getAdministrativeDivision());
- deviceChannel.setModel("live");
- deviceChannel.setOwner("wvp-pro");
- deviceChannel.setSecrecy("0");
allChannels.add(deviceChannel);
}
}
@@ -107,6 +104,8 @@ public class CatalogQueryMessageHandler extends SIPRequestProcessorParent implem
channel.setCatalogId(parentPlatform.getDeviceGBId());
}
DeviceChannel deviceChannel = storage.queryChannel(channel.getDeviceId(), channel.getChannelId());
+ // 通道的类型,0->国标通道 1->直播流通道 2->业务分组/虚拟组织/行政区划
+ deviceChannel.setChannelType(0);
deviceChannel.setParental(0);
deviceChannel.setParentId(channel.getCatalogId());
deviceChannel.setCivilCode(parentPlatform.getDeviceGBId().substring(0, 6));
@@ -120,6 +119,8 @@ public class CatalogQueryMessageHandler extends SIPRequestProcessorParent implem
gbStream.setCatalogId(null);
}
DeviceChannel deviceChannel = new DeviceChannel();
+ // 通道的类型,0->国标通道 1->直播流通道 2->业务分组/虚拟组织/行政区划
+ deviceChannel.setChannelType(1);
deviceChannel.setChannelId(gbStream.getGbId());
deviceChannel.setName(gbStream.getName());
deviceChannel.setLongitude(gbStream.getLongitude());
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 a36593e3..cf8e0069 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
@@ -81,7 +81,7 @@ public class ZLMRTPServerFactory {
return result;
}
- public int createRTPServer(MediaServerItem mediaServerItem, String streamId) {
+ public int createRTPServer(MediaServerItem mediaServerItem, String streamId, int ssrc) {
int result = -1;
// 查询此rtp server 是否已经存在
JSONObject rtpInfo = zlmresTfulUtils.getRtpInfo(mediaServerItem, streamId);
@@ -94,6 +94,7 @@ public class ZLMRTPServerFactory {
param.put("enable_tcp", 1);
param.put("stream_id", streamId);
param.put("port", 0);
+ param.put("ssrc", ssrc);
JSONObject openRtpServerResultJson = zlmresTfulUtils.openRtpServer(mediaServerItem, param);
if (openRtpServerResultJson != null) {
diff --git a/src/main/java/com/genersoft/iot/vmp/service/IMediaServerService.java b/src/main/java/com/genersoft/iot/vmp/service/IMediaServerService.java
index 00ec0dd5..2a99754f 100644
--- a/src/main/java/com/genersoft/iot/vmp/service/IMediaServerService.java
+++ b/src/main/java/com/genersoft/iot/vmp/service/IMediaServerService.java
@@ -44,9 +44,9 @@ public interface IMediaServerService {
void updateVmServer(List mediaServerItemList);
- SSRCInfo openRTPServer(MediaServerItem mediaServerItem, String streamId);
+ SSRCInfo openRTPServer(MediaServerItem mediaServerItem, String streamId, boolean ssrcCheck);
- SSRCInfo openRTPServer(MediaServerItem mediaServerItem, String streamId, boolean isPlayback);
+ SSRCInfo openRTPServer(MediaServerItem mediaServerItem, String streamId, boolean ssrcCheck, boolean isPlayback);
void closeRTPServer(String deviceId, String channelId, String ssrc);
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 a667bab5..e7b9e513 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
@@ -117,12 +117,12 @@ public class MediaServerServiceImpl implements IMediaServerService {
}
@Override
- public SSRCInfo openRTPServer(MediaServerItem mediaServerItem, String streamId) {
- return openRTPServer(mediaServerItem, streamId, false);
+ public SSRCInfo openRTPServer(MediaServerItem mediaServerItem, String streamId, boolean ssrcCheck) {
+ return openRTPServer(mediaServerItem, streamId, ssrcCheck,false);
}
@Override
- public SSRCInfo openRTPServer(MediaServerItem mediaServerItem, String streamId, boolean isPlayback) {
+ public SSRCInfo openRTPServer(MediaServerItem mediaServerItem, String streamId, boolean ssrcCheck, boolean isPlayback) {
if (mediaServerItem == null || mediaServerItem.getId() == null) {
return null;
}
@@ -146,7 +146,7 @@ public class MediaServerServiceImpl implements IMediaServerService {
}
int rtpServerPort = mediaServerItem.getRtpProxyPort();
if (mediaServerItem.isRtpEnable()) {
- rtpServerPort = zlmrtpServerFactory.createRTPServer(mediaServerItem, streamId);
+ rtpServerPort = zlmrtpServerFactory.createRTPServer(mediaServerItem, streamId, ssrcCheck?Integer.parseInt(ssrc):0);
}
redisUtil.set(key, mediaServerItem);
return new SSRCInfo(rtpServerPort, ssrc, streamId);
diff --git a/src/main/java/com/genersoft/iot/vmp/service/impl/PlayServiceImpl.java b/src/main/java/com/genersoft/iot/vmp/service/impl/PlayServiceImpl.java
index 61c37a81..518b9d41 100644
--- a/src/main/java/com/genersoft/iot/vmp/service/impl/PlayServiceImpl.java
+++ b/src/main/java/com/genersoft/iot/vmp/service/impl/PlayServiceImpl.java
@@ -188,7 +188,7 @@ public class PlayServiceImpl implements IPlayService {
if (mediaServerItem.isRtpEnable()) {
streamId = String.format("%s_%s", device.getDeviceId(), channelId);
}
- SSRCInfo ssrcInfo = mediaServerService.openRTPServer(mediaServerItem, streamId);
+ SSRCInfo ssrcInfo = mediaServerService.openRTPServer(mediaServerItem, streamId, device.isSsrcCheck());
play(mediaServerItem, ssrcInfo, device, channelId, (mediaServerItemInUse, response)->{
if (hookEvent != null) {
hookEvent.response(mediaServerItem, response);
@@ -232,7 +232,7 @@ public class PlayServiceImpl implements IPlayService {
streamId = String.format("%s_%s", device.getDeviceId(), channelId);
}
if (ssrcInfo == null) {
- ssrcInfo = mediaServerService.openRTPServer(mediaServerItem, streamId);
+ ssrcInfo = mediaServerService.openRTPServer(mediaServerItem, streamId, device.isSsrcCheck());
}
// 超时处理
diff --git a/src/main/java/com/genersoft/iot/vmp/storager/dao/DeviceMapper.java b/src/main/java/com/genersoft/iot/vmp/storager/dao/DeviceMapper.java
index aab8d773..97cf2ccf 100644
--- a/src/main/java/com/genersoft/iot/vmp/storager/dao/DeviceMapper.java
+++ b/src/main/java/com/genersoft/iot/vmp/storager/dao/DeviceMapper.java
@@ -37,6 +37,7 @@ public interface DeviceMapper {
"subscribeCycleForMobilePosition," +
"mobilePositionSubmissionInterval," +
"subscribeCycleForAlarm," +
+ "ssrcCheck," +
"online" +
") VALUES (" +
"#{deviceId}," +
@@ -59,6 +60,7 @@ public interface DeviceMapper {
"#{subscribeCycleForMobilePosition}," +
"#{mobilePositionSubmissionInterval}," +
"#{subscribeCycleForAlarm}," +
+ "#{ssrcCheck}," +
"#{online}" +
")")
int add(Device device);
@@ -84,6 +86,7 @@ public interface DeviceMapper {
", subscribeCycleForMobilePosition=${subscribeCycleForMobilePosition}" +
", mobilePositionSubmissionInterval=${mobilePositionSubmissionInterval}" +
", subscribeCycleForAlarm=${subscribeCycleForAlarm}" +
+ ", ssrcCheck=${ssrcCheck}" +
"WHERE deviceId='${deviceId}'"+
" "})
int update(Device device);
diff --git a/web_src/src/components/dialog/catalogEdit.vue b/web_src/src/components/dialog/catalogEdit.vue
index 20b21684..93d8f8dd 100644
--- a/web_src/src/components/dialog/catalogEdit.vue
+++ b/web_src/src/components/dialog/catalogEdit.vue
@@ -13,11 +13,24 @@
-
+
+
+ 建议的类型:
+
+ 行政区划(可选2位/4位/6位/8位/10位数字,例如:130432,表示河北省邯郸市广平县)
+
+ 业务分组(第11、12、13位215,例如:34020000002150000001)
+
+ 虚拟组织(第11、12、13位216,例如:34020000002160000001)
+
+
+
+
+
确认
diff --git a/web_src/src/components/dialog/deviceEdit.vue b/web_src/src/components/dialog/deviceEdit.vue
index 1b1aba02..b4dd2855 100644
--- a/web_src/src/components/dialog/deviceEdit.vue
+++ b/web_src/src/components/dialog/deviceEdit.vue
@@ -45,6 +45,9 @@
+
+
+
确认