From 394c40d8bb29b8e40fc7978ea638f1592b03d617 Mon Sep 17 00:00:00 2001
From: 648540858 <648540858@qq.com>
Date: 星期四, 08 九月 2022 16:42:46 +0800
Subject: [PATCH] 修复目录订阅的状态异常
---
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java | 344 +++++++++++++++++++++++++++++++++------------------------
1 files changed, 200 insertions(+), 144 deletions(-)
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java
index 567bcac..e6228bb 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java
@@ -10,9 +10,12 @@
import com.genersoft.iot.vmp.gb28181.session.VideoStreamSessionManager;
import com.genersoft.iot.vmp.gb28181.transmit.cmd.ISIPCommander;
import com.genersoft.iot.vmp.gb28181.transmit.cmd.SIPRequestHeaderProvider;
+import com.genersoft.iot.vmp.gb28181.utils.HeaderUtils;
+import com.genersoft.iot.vmp.media.zlm.dto.HookSubscribeFactory;
+import com.genersoft.iot.vmp.media.zlm.dto.HookSubscribeForStreamChange;
import com.genersoft.iot.vmp.utils.DateUtil;
import com.genersoft.iot.vmp.gb28181.utils.NumericUtil;
-import com.genersoft.iot.vmp.media.zlm.ZLMHttpHookSubscribe;
+import com.genersoft.iot.vmp.media.zlm.ZlmHttpHookSubscribe;
import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem;
import com.genersoft.iot.vmp.service.IMediaServerService;
import com.genersoft.iot.vmp.service.bean.SSRCInfo;
@@ -29,17 +32,16 @@
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.DependsOn;
import org.springframework.stereotype.Component;
-import org.springframework.util.StringUtils;
+import org.springframework.util.ObjectUtils;
import javax.sip.*;
+import javax.sip.address.Address;
import javax.sip.address.SipURI;
import javax.sip.header.*;
import javax.sip.message.Request;
import java.lang.reflect.Field;
import java.text.ParseException;
-import java.util.ArrayList;
import java.util.HashSet;
-import java.util.List;
/**
* @description:璁惧鑳藉姏鎺ュ彛锛岀敤浜庡畾涔夎澶囩殑鎺у埗銆佹煡璇㈣兘鍔�
@@ -82,7 +84,7 @@
private UserSetting userSetting;
@Autowired
- private ZLMHttpHookSubscribe subscribe;
+ private ZlmHttpHookSubscribe subscribe;
@Autowired
private SipSubscribe sipSubscribe;
@@ -245,7 +247,7 @@
String tm = Long.toString(System.currentTimeMillis());
- CallIdHeader callIdHeader = device.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId()
+ CallIdHeader callIdHeader = device.getTransport().equalsIgnoreCase("TCP") ? tcpSipProvider.getNewCallId()
: udpSipProvider.getNewCallId();
Request request = headerProvider.createMessageRequest(device, ptzXml.toString(), "z9hG4bK-ViaPtz-" + tm, "FromPtz" + tm, null, callIdHeader);
@@ -288,7 +290,7 @@
String tm = Long.toString(System.currentTimeMillis());
- CallIdHeader callIdHeader = device.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId()
+ CallIdHeader callIdHeader = device.getTransport().equalsIgnoreCase("TCP") ? tcpSipProvider.getNewCallId()
: udpSipProvider.getNewCallId();
Request request = headerProvider.createMessageRequest(device, ptzXml.toString(), "z9hG4bK-ViaPtz-" + tm, "FromPtz" + tm, null, callIdHeader);
@@ -324,7 +326,7 @@
String tm = Long.toString(System.currentTimeMillis());
- CallIdHeader callIdHeader = device.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId()
+ CallIdHeader callIdHeader = device.getTransport().equalsIgnoreCase("TCP") ? tcpSipProvider.getNewCallId()
: udpSipProvider.getNewCallId();
Request request = headerProvider.createMessageRequest(device, ptzXml.toString(), "z9hG4bK-ViaPtz-" + tm, "FromPtz" + tm, null, callIdHeader);
@@ -345,42 +347,36 @@
*/
@Override
public void playStreamCmd(MediaServerItem mediaServerItem, SSRCInfo ssrcInfo, Device device, String channelId,
- ZLMHttpHookSubscribe.Event event, SipSubscribe.Event okEvent, SipSubscribe.Event errorEvent) {
- String streamId = ssrcInfo.getStream();
+ ZlmHttpHookSubscribe.Event event, SipSubscribe.Event okEvent, SipSubscribe.Event errorEvent) {
+ String stream = ssrcInfo.getStream();
try {
if (device == null) {
return;
}
- String streamMode = device.getStreamMode().toUpperCase();
+// String streamMode = device.getStreamMode().toUpperCase();
- logger.info("{} 鍒嗛厤鐨刏LM涓�: {} [{}:{}]", streamId, mediaServerItem.getId(), mediaServerItem.getIp(), ssrcInfo.getPort());
- // 娣诲姞璁㈤槄
- JSONObject subscribeKey = new JSONObject();
- subscribeKey.put("app", "rtp");
- subscribeKey.put("stream", streamId);
- subscribeKey.put("regist", true);
- subscribeKey.put("schema", "rtmp");
- subscribeKey.put("mediaServerId", mediaServerItem.getId());
- subscribe.addSubscribe(ZLMHttpHookSubscribe.HookType.on_stream_changed, subscribeKey,
- (MediaServerItem mediaServerItemInUse, JSONObject json)->{
+ logger.info("{} 鍒嗛厤鐨刏LM涓�: {} [{}:{}]", stream, mediaServerItem.getId(), mediaServerItem.getIp(), ssrcInfo.getPort());
+ HookSubscribeForStreamChange hookSubscribe = HookSubscribeFactory.on_stream_changed("rtp", stream, true, "rtsp", mediaServerItem.getId());
+ subscribe.addSubscribe(hookSubscribe, (MediaServerItem mediaServerItemInUse, JSONObject json)->{
if (event != null) {
event.response(mediaServerItemInUse, json);
+ subscribe.removeSubscribe(hookSubscribe);
}
});
//
StringBuffer content = new StringBuffer(200);
content.append("v=0\r\n");
- content.append("o="+ sipConfig.getId()+" 0 0 IN IP4 "+ mediaServerItem.getSdpIp() +"\r\n");
+ content.append("o="+ channelId+" 0 0 IN IP4 "+ mediaServerItem.getSdpIp() +"\r\n");
content.append("s=Play\r\n");
content.append("c=IN IP4 "+ mediaServerItem.getSdpIp() +"\r\n");
content.append("t=0 0\r\n");
if (userSetting.isSeniorSdp()) {
- if("TCP-PASSIVE".equals(streamMode)) {
+ if("TCP-PASSIVE".equalsIgnoreCase(device.getStreamMode())) {
content.append("m=video "+ ssrcInfo.getPort() +" TCP/RTP/AVP 96 126 125 99 34 98 97\r\n");
- }else if ("TCP-ACTIVE".equals(streamMode)) {
+ }else if ("TCP-ACTIVE".equalsIgnoreCase(device.getStreamMode())) {
content.append("m=video "+ ssrcInfo.getPort() +" TCP/RTP/AVP 96 126 125 99 34 98 97\r\n");
- }else if("UDP".equals(streamMode)) {
+ }else if("UDP".equalsIgnoreCase(device.getStreamMode())) {
content.append("m=video "+ ssrcInfo.getPort() +" RTP/AVP 96 126 125 99 34 98 97\r\n");
}
content.append("a=recvonly\r\n");
@@ -389,33 +385,33 @@
content.append("a=rtpmap:126 H264/90000\r\n");
content.append("a=rtpmap:125 H264S/90000\r\n");
content.append("a=fmtp:125 profile-level-id=42e01e\r\n");
- content.append("a=rtpmap:99 MP4V-ES/90000\r\n");
- content.append("a=fmtp:99 profile-level-id=3\r\n");
+ content.append("a=rtpmap:99 H265/90000\r\n");
content.append("a=rtpmap:98 H264/90000\r\n");
content.append("a=rtpmap:97 MPEG4/90000\r\n");
- if("TCP-PASSIVE".equals(streamMode)){ // tcp琚姩妯″紡
+ if("TCP-PASSIVE".equalsIgnoreCase(device.getStreamMode())){ // tcp琚姩妯″紡
content.append("a=setup:passive\r\n");
content.append("a=connection:new\r\n");
- }else if ("TCP-ACTIVE".equals(streamMode)) { // tcp涓诲姩妯″紡
+ }else if ("TCP-ACTIVE".equalsIgnoreCase(device.getStreamMode())) { // tcp涓诲姩妯″紡
content.append("a=setup:active\r\n");
content.append("a=connection:new\r\n");
}
}else {
- if("TCP-PASSIVE".equals(streamMode)) {
- content.append("m=video "+ ssrcInfo.getPort() +" TCP/RTP/AVP 96 98 97\r\n");
- }else if ("TCP-ACTIVE".equals(streamMode)) {
- content.append("m=video "+ ssrcInfo.getPort() +" TCP/RTP/AVP 96 98 97\r\n");
- }else if("UDP".equals(streamMode)) {
- content.append("m=video "+ ssrcInfo.getPort() +" RTP/AVP 96 98 97\r\n");
+ if("TCP-PASSIVE".equalsIgnoreCase(device.getStreamMode())) {
+ content.append("m=video "+ ssrcInfo.getPort() +" TCP/RTP/AVP 96 97 98 99\r\n");
+ }else if ("TCP-ACTIVE".equalsIgnoreCase(device.getStreamMode())) {
+ content.append("m=video "+ ssrcInfo.getPort() +" TCP/RTP/AVP 96 97 98 99\r\n");
+ }else if("UDP".equalsIgnoreCase(device.getStreamMode())) {
+ content.append("m=video "+ ssrcInfo.getPort() +" RTP/AVP 96 97 98 99\r\n");
}
content.append("a=recvonly\r\n");
content.append("a=rtpmap:96 PS/90000\r\n");
content.append("a=rtpmap:98 H264/90000\r\n");
content.append("a=rtpmap:97 MPEG4/90000\r\n");
- if ("TCP-PASSIVE".equals(streamMode)) { // tcp琚姩妯″紡
+ content.append("a=rtpmap:99 H265/90000\r\n");
+ if ("TCP-PASSIVE".equalsIgnoreCase(device.getStreamMode())) { // tcp琚姩妯″紡
content.append("a=setup:passive\r\n");
content.append("a=connection:new\r\n");
- } else if ("TCP-ACTIVE".equals(streamMode)) { // tcp涓诲姩妯″紡
+ } else if ("TCP-ACTIVE".equalsIgnoreCase(device.getStreamMode())) { // tcp涓诲姩妯″紡
content.append("a=setup:active\r\n");
content.append("a=connection:new\r\n");
}
@@ -427,7 +423,7 @@
String tm = Long.toString(System.currentTimeMillis());
- CallIdHeader callIdHeader = device.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId()
+ CallIdHeader callIdHeader = device.getTransport().equalsIgnoreCase("TCP") ? tcpSipProvider.getNewCallId()
: udpSipProvider.getNewCallId();
Request request = headerProvider.createInviteRequest(device, channelId, content.toString(), null, "FromInvt" + tm, null, ssrcInfo.getSsrc(), callIdHeader);
@@ -438,7 +434,7 @@
errorEvent.response(e);
}), e ->{
// 杩欓噷涓轰緥閬垮厤涓�涓�氶亾鐨勭偣鎾彧鏈変竴涓猚allID杩欎釜鍙傛暟浣跨敤涓�涓浐瀹氬��
- streamSession.put(device.getDeviceId(), channelId ,"play", streamId, ssrcInfo.getSsrc(), mediaServerItem.getId(), ((ResponseEvent)e.event).getClientTransaction(), VideoStreamSessionManager.SessionType.play);
+ streamSession.put(device.getDeviceId(), channelId ,"play", stream, ssrcInfo.getSsrc(), mediaServerItem.getId(), ((ResponseEvent)e.event).getClientTransaction(), VideoStreamSessionManager.SessionType.play);
streamSession.put(device.getDeviceId(), channelId ,"play", e.dialog);
okEvent.response(e);
});
@@ -460,28 +456,28 @@
@Override
public void playbackStreamCmd(MediaServerItem mediaServerItem, SSRCInfo ssrcInfo, Device device, String channelId,
String startTime, String endTime, InviteStreamCallback inviteStreamCallback, InviteStreamCallback hookEvent,
- SipSubscribe.Event errorEvent) {
+ SipSubscribe.Event okEvent,SipSubscribe.Event errorEvent) {
try {
logger.info("{} 鍒嗛厤鐨刏LM涓�: {} [{}:{}]", ssrcInfo.getStream(), mediaServerItem.getId(), mediaServerItem.getIp(), ssrcInfo.getPort());
StringBuffer content = new StringBuffer(200);
content.append("v=0\r\n");
- content.append("o="+sipConfig.getId()+" 0 0 IN IP4 " + mediaServerItem.getSdpIp() + "\r\n");
+ content.append("o="+channelId+" 0 0 IN IP4 " + mediaServerItem.getSdpIp() + "\r\n");
content.append("s=Playback\r\n");
content.append("u="+channelId+":0\r\n");
content.append("c=IN IP4 "+mediaServerItem.getSdpIp()+"\r\n");
content.append("t="+DateUtil.yyyy_MM_dd_HH_mm_ssToTimestamp(startTime)+" "
+DateUtil.yyyy_MM_dd_HH_mm_ssToTimestamp(endTime) +"\r\n");
- String streamMode = device.getStreamMode().toUpperCase();
+ String streamMode = device.getStreamMode();
if (userSetting.isSeniorSdp()) {
- if("TCP-PASSIVE".equals(streamMode)) {
+ if("TCP-PASSIVE".equalsIgnoreCase(streamMode)) {
content.append("m=video "+ ssrcInfo.getPort() +" TCP/RTP/AVP 96 126 125 99 34 98 97\r\n");
- }else if ("TCP-ACTIVE".equals(streamMode)) {
+ }else if ("TCP-ACTIVE".equalsIgnoreCase(streamMode)) {
content.append("m=video "+ ssrcInfo.getPort() +" TCP/RTP/AVP 96 126 125 99 34 98 97\r\n");
- }else if("UDP".equals(streamMode)) {
+ }else if("UDP".equalsIgnoreCase(streamMode)) {
content.append("m=video "+ ssrcInfo.getPort() +" RTP/AVP 96 126 125 99 34 98 97\r\n");
}
content.append("a=recvonly\r\n");
@@ -490,33 +486,33 @@
content.append("a=rtpmap:126 H264/90000\r\n");
content.append("a=rtpmap:125 H264S/90000\r\n");
content.append("a=fmtp:125 profile-level-id=42e01e\r\n");
- content.append("a=rtpmap:99 MP4V-ES/90000\r\n");
- content.append("a=fmtp:99 profile-level-id=3\r\n");
+ content.append("a=rtpmap:99 H265/90000\r\n");
content.append("a=rtpmap:98 H264/90000\r\n");
content.append("a=rtpmap:97 MPEG4/90000\r\n");
- if("TCP-PASSIVE".equals(streamMode)){ // tcp琚姩妯″紡
+ if("TCP-PASSIVE".equalsIgnoreCase(streamMode)){ // tcp琚姩妯″紡
content.append("a=setup:passive\r\n");
content.append("a=connection:new\r\n");
- }else if ("TCP-ACTIVE".equals(streamMode)) { // tcp涓诲姩妯″紡
+ }else if ("TCP-ACTIVE".equalsIgnoreCase(streamMode)) { // tcp涓诲姩妯″紡
content.append("a=setup:active\r\n");
content.append("a=connection:new\r\n");
}
}else {
- if("TCP-PASSIVE".equals(streamMode)) {
- content.append("m=video "+ ssrcInfo.getPort() +" TCP/RTP/AVP 96 98 97\r\n");
- }else if ("TCP-ACTIVE".equals(streamMode)) {
- content.append("m=video "+ ssrcInfo.getPort() +" TCP/RTP/AVP 96 98 97\r\n");
- }else if("UDP".equals(streamMode)) {
- content.append("m=video "+ ssrcInfo.getPort() +" RTP/AVP 96 98 97\r\n");
+ if("TCP-PASSIVE".equalsIgnoreCase(streamMode)) {
+ content.append("m=video "+ ssrcInfo.getPort() +" TCP/RTP/AVP 96 97 98 99\r\n");
+ }else if ("TCP-ACTIVE".equalsIgnoreCase(streamMode)) {
+ content.append("m=video "+ ssrcInfo.getPort() +" TCP/RTP/AVP 96 97 98 99\r\n");
+ }else if("UDP".equalsIgnoreCase(streamMode)) {
+ content.append("m=video "+ ssrcInfo.getPort() +" RTP/AVP 96 97 98 99\r\n");
}
content.append("a=recvonly\r\n");
content.append("a=rtpmap:96 PS/90000\r\n");
- content.append("a=rtpmap:98 H264/90000\r\n");
content.append("a=rtpmap:97 MPEG4/90000\r\n");
- if("TCP-PASSIVE".equals(streamMode)){ // tcp琚姩妯″紡
+ content.append("a=rtpmap:98 H264/90000\r\n");
+ content.append("a=rtpmap:99 H265/90000\r\n");
+ if("TCP-PASSIVE".equalsIgnoreCase(streamMode)){ // tcp琚姩妯″紡
content.append("a=setup:passive\r\n");
content.append("a=connection:new\r\n");
- }else if ("TCP-ACTIVE".equals(streamMode)) { // tcp涓诲姩妯″紡
+ }else if ("TCP-ACTIVE".equalsIgnoreCase(streamMode)) { // tcp涓诲姩妯″紡
content.append("a=setup:active\r\n");
content.append("a=connection:new\r\n");
}
@@ -528,28 +524,22 @@
CallIdHeader callIdHeader = device.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId()
: udpSipProvider.getNewCallId();
-
+ HookSubscribeForStreamChange hookSubscribe = HookSubscribeFactory.on_stream_changed("rtp", ssrcInfo.getStream(), true, "rtsp", mediaServerItem.getId());
// 娣诲姞璁㈤槄
- JSONObject subscribeKey = new JSONObject();
- subscribeKey.put("app", "rtp");
- subscribeKey.put("stream", ssrcInfo.getStream());
- subscribeKey.put("regist", true);
- subscribeKey.put("schema", "rtmp");
- subscribeKey.put("mediaServerId", mediaServerItem.getId());
- logger.debug("褰曞儚鍥炴斁娣诲姞璁㈤槄锛岃闃呭唴瀹癸細" + subscribeKey);
- subscribe.addSubscribe(ZLMHttpHookSubscribe.HookType.on_stream_changed, subscribeKey,
- (MediaServerItem mediaServerItemInUse, JSONObject json)->{
+ subscribe.addSubscribe(hookSubscribe, (MediaServerItem mediaServerItemInUse, JSONObject json)->{
if (hookEvent != null) {
InviteStreamInfo inviteStreamInfo = new InviteStreamInfo(mediaServerItemInUse, json, callIdHeader.getCallId(), "rtp", ssrcInfo.getStream());
hookEvent.call(inviteStreamInfo);
}
+ subscribe.removeSubscribe(hookSubscribe);
});
Request request = headerProvider.createPlaybackInviteRequest(device, channelId, content.toString(), null, "fromplybck" + tm, null, callIdHeader, ssrcInfo.getSsrc());
- transmitRequest(device, request, errorEvent, okEvent -> {
- ResponseEvent responseEvent = (ResponseEvent) okEvent.event;
+ transmitRequest(device, request, errorEvent, event -> {
+ ResponseEvent responseEvent = (ResponseEvent) event.event;
streamSession.put(device.getDeviceId(), channelId, callIdHeader.getCallId(), ssrcInfo.getStream(), ssrcInfo.getSsrc(), mediaServerItem.getId(), responseEvent.getClientTransaction(), VideoStreamSessionManager.SessionType.playback);
- streamSession.put(device.getDeviceId(), channelId, callIdHeader.getCallId(), okEvent.dialog);
+ streamSession.put(device.getDeviceId(), channelId, callIdHeader.getCallId(), event.dialog);
+ okEvent.response(event);
});
if (inviteStreamCallback != null) {
inviteStreamCallback.call(new InviteStreamInfo(mediaServerItem, null, callIdHeader.getCallId(), "rtp", ssrcInfo.getStream()));
@@ -577,7 +567,7 @@
StringBuffer content = new StringBuffer(200);
content.append("v=0\r\n");
- content.append("o="+sipConfig.getId()+" 0 0 IN IP4 " + mediaServerItem.getSdpIp() + "\r\n");
+ content.append("o="+channelId+" 0 0 IN IP4 " + mediaServerItem.getSdpIp() + "\r\n");
content.append("s=Download\r\n");
content.append("u="+channelId+":0\r\n");
content.append("c=IN IP4 "+mediaServerItem.getSdpIp()+"\r\n");
@@ -613,16 +603,17 @@
}
}else {
if("TCP-PASSIVE".equals(streamMode)) {
- content.append("m=video "+ ssrcInfo.getPort() +" TCP/RTP/AVP 96 98 97\r\n");
+ content.append("m=video "+ ssrcInfo.getPort() +" TCP/RTP/AVP 96 97 98 99\r\n");
}else if ("TCP-ACTIVE".equals(streamMode)) {
- content.append("m=video "+ ssrcInfo.getPort() +" TCP/RTP/AVP 96 98 97\r\n");
+ content.append("m=video "+ ssrcInfo.getPort() +" TCP/RTP/AVP 96 97 98 99\r\n");
}else if("UDP".equals(streamMode)) {
- content.append("m=video "+ ssrcInfo.getPort() +" RTP/AVP 96 98 97\r\n");
+ content.append("m=video "+ ssrcInfo.getPort() +" RTP/AVP 96 97 98 99\r\n");
}
content.append("a=recvonly\r\n");
content.append("a=rtpmap:96 PS/90000\r\n");
- content.append("a=rtpmap:98 H264/90000\r\n");
content.append("a=rtpmap:97 MPEG4/90000\r\n");
+ content.append("a=rtpmap:98 H264/90000\r\n");
+ content.append("a=rtpmap:99 H265/90000\r\n");
if("TCP-PASSIVE".equals(streamMode)){ // tcp琚姩妯″紡
content.append("a=setup:passive\r\n");
content.append("a=connection:new\r\n");
@@ -640,17 +631,22 @@
CallIdHeader callIdHeader = device.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId()
: udpSipProvider.getNewCallId();
+ HookSubscribeForStreamChange hookSubscribe = HookSubscribeFactory.on_stream_changed("rtp", ssrcInfo.getStream(), true, null, mediaServerItem.getId());
// 娣诲姞璁㈤槄
- JSONObject subscribeKey = new JSONObject();
- subscribeKey.put("app", "rtp");
- subscribeKey.put("stream", ssrcInfo.getStream());
- subscribeKey.put("regist", true);
- subscribeKey.put("mediaServerId", mediaServerItem.getId());
- logger.debug("褰曞儚鍥炴斁娣诲姞璁㈤槄锛岃闃呭唴瀹癸細" + subscribeKey.toString());
- subscribe.addSubscribe(ZLMHttpHookSubscribe.HookType.on_stream_changed, subscribeKey,
- (MediaServerItem mediaServerItemInUse, JSONObject json)->{
+ subscribe.addSubscribe(hookSubscribe, (MediaServerItem mediaServerItemInUse, JSONObject json)->{
hookEvent.call(new InviteStreamInfo(mediaServerItem, json, callIdHeader.getCallId(), "rtp", ssrcInfo.getStream()));
- subscribe.removeSubscribe(ZLMHttpHookSubscribe.HookType.on_stream_changed, subscribeKey);
+ subscribe.removeSubscribe(hookSubscribe);
+ hookSubscribe.getContent().put("regist", false);
+ hookSubscribe.getContent().put("schema", "rtsp");
+ // 娣诲姞娴佹敞閿�鐨勮闃咃紝娉ㄩ攢浜嗗悗鍚戣澶囧彂閫乥ye
+ subscribe.addSubscribe(hookSubscribe,
+ (MediaServerItem mediaServerItemForEnd, JSONObject jsonForEnd)->{
+ ClientTransaction transaction = streamSession.getTransaction(device.getDeviceId(), channelId, ssrcInfo.getStream(), callIdHeader.getCallId());
+ if (transaction != null) {
+ logger.info("[褰曞儚]涓嬭浇缁撴潫锛� 鍙戦�丅YE");
+ streamByeCmd(device.getDeviceId(), channelId, ssrcInfo.getStream(), callIdHeader.getCallId());
+ }
+ });
});
Request request = headerProvider.createPlaybackInviteRequest(device, channelId, content.toString(), null, "fromplybck" + tm, null, callIdHeader, ssrcInfo.getSsrc());
@@ -683,10 +679,10 @@
@Override
public void streamByeCmd(String deviceId, String channelId, String stream, String callId, SipSubscribe.Event okEvent) {
try {
- SsrcTransaction ssrcTransaction = streamSession.getSsrcTransaction(deviceId, channelId, null, stream);
- ClientTransaction transaction = streamSession.getTransactionByStream(deviceId, channelId, stream);
+ SsrcTransaction ssrcTransaction = streamSession.getSsrcTransaction(deviceId, channelId, callId, stream);
+ ClientTransaction transaction = streamSession.getTransaction(deviceId, channelId, stream, callId);
- if (transaction == null) {
+ if (transaction == null ) {
logger.warn("[ {} -> {}]鍋滄瑙嗛娴佺殑鏃跺�欏彂鐜颁簨鍔″凡涓㈠け", deviceId, channelId);
SipSubscribe.EventResult<Object> eventResult = new SipSubscribe.EventResult<>();
if (okEvent != null) {
@@ -696,22 +692,19 @@
}
SIPDialog dialog;
if (callId != null) {
- dialog = streamSession.getDialogByCallId(deviceId, channelId, callId);
+ dialog = streamSession.getDialogByCallId(ssrcTransaction.getDeviceId(), ssrcTransaction.getChannelId(), callId);
}else {
- if (stream == null) {
+ if (stream == null && ssrcTransaction == null && ssrcTransaction.getStream() == null) {
return;
}
- dialog = streamSession.getDialogByStream(deviceId, channelId, stream);
+ dialog = streamSession.getDialogByStream(ssrcTransaction.getDeviceId(), ssrcTransaction.getChannelId(), ssrcTransaction.getStream());
}
- if (ssrcTransaction != null) {
- MediaServerItem mediaServerItem = mediaServerService.getOne(ssrcTransaction.getMediaServerId());
- mediaServerService.releaseSsrc(mediaServerItem.getId(), ssrcTransaction.getSsrc());
- mediaServerService.closeRTPServer(deviceId, channelId, ssrcTransaction.getStream());
- streamSession.remove(deviceId, channelId, ssrcTransaction.getStream());
- }
+ mediaServerService.releaseSsrc(ssrcTransaction.getMediaServerId(), ssrcTransaction.getSsrc());
+ mediaServerService.closeRTPServer(ssrcTransaction.getDeviceId(), ssrcTransaction.getChannelId(), ssrcTransaction.getStream());
+ streamSession.remove(ssrcTransaction.getDeviceId(), ssrcTransaction.getChannelId(), ssrcTransaction.getStream());
if (dialog == null) {
- logger.warn("[ {} -> {}]鍋滄瑙嗛娴佺殑鏃跺�欏彂鐜板璇濆凡涓㈠け", deviceId, channelId);
+ logger.warn("[ {} -> {}]鍋滄瑙嗛娴佺殑鏃跺�欏彂鐜板璇濆凡涓㈠け", ssrcTransaction.getDeviceId(), ssrcTransaction.getChannelId());
return;
}
SipStack sipStack = udpSipProvider.getSipStack();
@@ -737,8 +730,15 @@
SIPRequest request = (SIPRequest)transaction.getRequest();
byeURI.setHost(request.getRemoteAddress().getHostAddress());
byeURI.setPort(request.getRemotePort());
+ byeURI.setUser(channelId);
ViaHeader viaHeader = (ViaHeader) byeRequest.getHeader(ViaHeader.NAME);
String protocol = viaHeader.getTransport().toUpperCase();
+ viaHeader.setRPort();
+ // 澧炲姞Contact header
+ Address concatAddress = sipFactory.createAddressFactory().createAddress(sipFactory.createAddressFactory().createSipURI(sipConfig.getId(), sipConfig.getIp()+":"+sipConfig.getPort()));
+ byeRequest.addHeader(sipFactory.createHeaderFactory().createContactHeader(concatAddress));
+ UserAgentHeader userAgentHeader = HeaderUtils.createUserAgentHeader(sipFactory);
+ byeRequest.addHeader(userAgentHeader);
ClientTransaction clientTransaction = null;
if("TCP".equals(protocol)) {
clientTransaction = tcpSipProvider.getNewClientTransaction(byeRequest);
@@ -750,11 +750,14 @@
if (okEvent != null) {
sipSubscribe.addOkSubscribe(callIdHeader.getCallId(), okEvent);
}
-
+ CSeqHeader cSeqHeader = (CSeqHeader)byeRequest.getHeader(CSeqHeader.NAME);
+ cSeqHeader.setSeqNumber(redisCatchStorage.getCSEQ());
dialog.sendRequest(clientTransaction);
} catch (SipException | ParseException e) {
e.printStackTrace();
+ } catch (InvalidArgumentException e) {
+ throw new RuntimeException(e);
}
}
@@ -843,7 +846,7 @@
cmdXml.append("<Control>\r\n");
cmdXml.append("<CmdType>DeviceControl</CmdType>\r\n");
cmdXml.append("<SN>" + (int)((Math.random()*9+1)*100000) + "</SN>\r\n");
- if (StringUtils.isEmpty(channelId)) {
+ if (ObjectUtils.isEmpty(channelId)) {
cmdXml.append("<DeviceID>" + device.getDeviceId() + "</DeviceID>\r\n");
} else {
cmdXml.append("<DeviceID>" + channelId + "</DeviceID>\r\n");
@@ -946,16 +949,16 @@
cmdXml.append("<SN>" + (int)((Math.random()*9+1)*100000) + "</SN>\r\n");
cmdXml.append("<DeviceID>" + device.getDeviceId() + "</DeviceID>\r\n");
cmdXml.append("<AlarmCmd>ResetAlarm</AlarmCmd>\r\n");
- if (!StringUtils.isEmpty(alarmMethod) || !StringUtils.isEmpty(alarmType)) {
+ if (!ObjectUtils.isEmpty(alarmMethod) || !ObjectUtils.isEmpty(alarmType)) {
cmdXml.append("<Info>\r\n");
}
- if (!StringUtils.isEmpty(alarmMethod)) {
+ if (!ObjectUtils.isEmpty(alarmMethod)) {
cmdXml.append("<AlarmMethod>" + alarmMethod + "</AlarmMethod>\r\n");
}
- if (!StringUtils.isEmpty(alarmType)) {
+ if (!ObjectUtils.isEmpty(alarmType)) {
cmdXml.append("<AlarmType>" + alarmType + "</AlarmType>\r\n");
}
- if (!StringUtils.isEmpty(alarmMethod) || !StringUtils.isEmpty(alarmType)) {
+ if (!ObjectUtils.isEmpty(alarmMethod) || !ObjectUtils.isEmpty(alarmType)) {
cmdXml.append("</Info>\r\n");
}
cmdXml.append("</Control>\r\n");
@@ -989,7 +992,7 @@
cmdXml.append("<Control>\r\n");
cmdXml.append("<CmdType>DeviceControl</CmdType>\r\n");
cmdXml.append("<SN>" + (int)((Math.random()*9+1)*100000) + "</SN>\r\n");
- if (StringUtils.isEmpty(channelId)) {
+ if (ObjectUtils.isEmpty(channelId)) {
cmdXml.append("<DeviceID>" + device.getDeviceId() + "</DeviceID>\r\n");
} else {
cmdXml.append("<DeviceID>" + channelId + "</DeviceID>\r\n");
@@ -1028,7 +1031,7 @@
cmdXml.append("<Control>\r\n");
cmdXml.append("<CmdType>DeviceControl</CmdType>\r\n");
cmdXml.append("<SN>" + (int)((Math.random()*9+1)*100000) + "</SN>\r\n");
- if (StringUtils.isEmpty(channelId)) {
+ if (ObjectUtils.isEmpty(channelId)) {
cmdXml.append("<DeviceID>" + device.getDeviceId() + "</DeviceID>\r\n");
} else {
cmdXml.append("<DeviceID>" + channelId + "</DeviceID>\r\n");
@@ -1097,13 +1100,13 @@
cmdXml.append("<Control>\r\n");
cmdXml.append("<CmdType>DeviceConfig</CmdType>\r\n");
cmdXml.append("<SN>" + (int)((Math.random()*9+1)*100000) + "</SN>\r\n");
- if (StringUtils.isEmpty(channelId)) {
+ if (ObjectUtils.isEmpty(channelId)) {
cmdXml.append("<DeviceID>" + device.getDeviceId() + "</DeviceID>\r\n");
} else {
cmdXml.append("<DeviceID>" + channelId + "</DeviceID>\r\n");
}
cmdXml.append("<BasicParam>\r\n");
- if (!StringUtils.isEmpty(name)) {
+ if (!ObjectUtils.isEmpty(name)) {
cmdXml.append("<Name>" + name + "</Name>\r\n");
}
if (NumericUtil.isInteger(expiration)) {
@@ -1313,22 +1316,22 @@
cmdXml.append("<CmdType>Alarm</CmdType>\r\n");
cmdXml.append("<SN>" + (int)((Math.random()*9+1)*100000) + "</SN>\r\n");
cmdXml.append("<DeviceID>" + device.getDeviceId() + "</DeviceID>\r\n");
- if (!StringUtils.isEmpty(startPriority)) {
+ if (!ObjectUtils.isEmpty(startPriority)) {
cmdXml.append("<StartAlarmPriority>" + startPriority + "</StartAlarmPriority>\r\n");
}
- if (!StringUtils.isEmpty(endPriority)) {
+ if (!ObjectUtils.isEmpty(endPriority)) {
cmdXml.append("<EndAlarmPriority>" + endPriority + "</EndAlarmPriority>\r\n");
}
- if (!StringUtils.isEmpty(alarmMethod)) {
+ if (!ObjectUtils.isEmpty(alarmMethod)) {
cmdXml.append("<AlarmMethod>" + alarmMethod + "</AlarmMethod>\r\n");
}
- if (!StringUtils.isEmpty(alarmType)) {
+ if (!ObjectUtils.isEmpty(alarmType)) {
cmdXml.append("<AlarmType>" + alarmType + "</AlarmType>\r\n");
}
- if (!StringUtils.isEmpty(startTime)) {
+ if (!ObjectUtils.isEmpty(startTime)) {
cmdXml.append("<StartAlarmTime>" + startTime + "</StartAlarmTime>\r\n");
}
- if (!StringUtils.isEmpty(endTime)) {
+ if (!ObjectUtils.isEmpty(endTime)) {
cmdXml.append("<EndAlarmTime>" + endTime + "</EndAlarmTime>\r\n");
}
cmdXml.append("</Query>\r\n");
@@ -1363,7 +1366,7 @@
cmdXml.append("<Query>\r\n");
cmdXml.append("<CmdType>ConfigDownload</CmdType>\r\n");
cmdXml.append("<SN>" + (int)((Math.random()*9+1)*100000) + "</SN>\r\n");
- if (StringUtils.isEmpty(channelId)) {
+ if (ObjectUtils.isEmpty(channelId)) {
cmdXml.append("<DeviceID>" + device.getDeviceId() + "</DeviceID>\r\n");
} else {
cmdXml.append("<DeviceID>" + channelId + "</DeviceID>\r\n");
@@ -1399,7 +1402,7 @@
cmdXml.append("<Query>\r\n");
cmdXml.append("<CmdType>PresetQuery</CmdType>\r\n");
cmdXml.append("<SN>" + (int)((Math.random()*9+1)*100000) + "</SN>\r\n");
- if (StringUtils.isEmpty(channelId)) {
+ if (ObjectUtils.isEmpty(channelId)) {
cmdXml.append("<DeviceID>" + device.getDeviceId() + "</DeviceID>\r\n");
} else {
cmdXml.append("<DeviceID>" + channelId + "</DeviceID>\r\n");
@@ -1477,12 +1480,20 @@
Request request;
if (dialog != null) {
- logger.info("鍙戦�佺Щ鍔ㄤ綅缃闃呮秷鎭椂 dialog鐨勭姸鎬佷负锛� {}", dialog.getState());
+ SipURI requestURI = sipFactory.createAddressFactory().createSipURI(device.getDeviceId(), device.getHostAddress());
request = dialog.createRequest(Request.SUBSCRIBE);
+ ExpiresHeader expiresHeader = sipFactory.createHeaderFactory().createExpiresHeader(device.getSubscribeCycleForCatalog());
+ request.setExpires(expiresHeader);
+
+ request.setRequestURI(requestURI);
+
ContentTypeHeader contentTypeHeader = sipFactory.createHeaderFactory().createContentTypeHeader("Application", "MANSCDP+xml");
request.setContent(subscribePostitionXml.toString(), contentTypeHeader);
- ExpiresHeader expireHeader = sipFactory.createHeaderFactory().createExpiresHeader(device.getSubscribeCycleForMobilePosition());
- request.addHeader(expireHeader);
+
+ CSeqHeader cSeqHeader = (CSeqHeader)request.getHeader(CSeqHeader.NAME);
+ cSeqHeader.setSeqNumber(redisCatchStorage.getCSEQ());
+ request.removeHeader(CSeqHeader.NAME);
+ request.addHeader(cSeqHeader);
}else {
String tm = Long.toString(System.currentTimeMillis());
CallIdHeader callIdHeader = device.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId()
@@ -1522,22 +1533,22 @@
cmdXml.append("<CmdType>Alarm</CmdType>\r\n");
cmdXml.append("<SN>" + (int)((Math.random()*9+1)*100000) + "</SN>\r\n");
cmdXml.append("<DeviceID>" + device.getDeviceId() + "</DeviceID>\r\n");
- if (!StringUtils.isEmpty(startPriority)) {
+ if (!ObjectUtils.isEmpty(startPriority)) {
cmdXml.append("<StartAlarmPriority>" + startPriority + "</StartAlarmPriority>\r\n");
}
- if (!StringUtils.isEmpty(endPriority)) {
+ if (!ObjectUtils.isEmpty(endPriority)) {
cmdXml.append("<EndAlarmPriority>" + endPriority + "</EndAlarmPriority>\r\n");
}
- if (!StringUtils.isEmpty(alarmMethod)) {
+ if (!ObjectUtils.isEmpty(alarmMethod)) {
cmdXml.append("<AlarmMethod>" + alarmMethod + "</AlarmMethod>\r\n");
}
- if (!StringUtils.isEmpty(alarmType)) {
+ if (!ObjectUtils.isEmpty(alarmType)) {
cmdXml.append("<AlarmType>" + alarmType + "</AlarmType>\r\n");
}
- if (!StringUtils.isEmpty(startTime)) {
+ if (!ObjectUtils.isEmpty(startTime)) {
cmdXml.append("<StartAlarmTime>" + startTime + "</StartAlarmTime>\r\n");
}
- if (!StringUtils.isEmpty(endTime)) {
+ if (!ObjectUtils.isEmpty(endTime)) {
cmdXml.append("<EndAlarmTime>" + endTime + "</EndAlarmTime>\r\n");
}
cmdXml.append("</Query>\r\n");
@@ -1573,12 +1584,21 @@
Request request;
if (dialog != null) {
- logger.info("鍙戦�佺洰褰曡闃呮秷鎭椂 dialog鐨勭姸鎬佷负锛� {}", dialog.getState());
+ SipURI requestURI = sipFactory.createAddressFactory().createSipURI(device.getDeviceId(), device.getHostAddress());
request = dialog.createRequest(Request.SUBSCRIBE);
+ ExpiresHeader expiresHeader = sipFactory.createHeaderFactory().createExpiresHeader(device.getSubscribeCycleForCatalog());
+ request.setExpires(expiresHeader);
+
+ request.setRequestURI(requestURI);
+
ContentTypeHeader contentTypeHeader = sipFactory.createHeaderFactory().createContentTypeHeader("Application", "MANSCDP+xml");
request.setContent(cmdXml.toString(), contentTypeHeader);
- ExpiresHeader expireHeader = sipFactory.createHeaderFactory().createExpiresHeader(device.getSubscribeCycleForMobilePosition());
- request.addHeader(expireHeader);
+
+ CSeqHeader cSeqHeader = (CSeqHeader)request.getHeader(CSeqHeader.NAME);
+ cSeqHeader.setSeqNumber(redisCatchStorage.getCSEQ());
+ request.removeHeader(CSeqHeader.NAME);
+ request.addHeader(cSeqHeader);
+
}else {
String tm = Long.toString(System.currentTimeMillis());
@@ -1609,7 +1629,7 @@
dragXml.append("<Control>\r\n");
dragXml.append("<CmdType>DeviceControl</CmdType>\r\n");
dragXml.append("<SN>" + (int) ((Math.random() * 9 + 1) * 100000) + "</SN>\r\n");
- if (StringUtils.isEmpty(channelId)) {
+ if (ObjectUtils.isEmpty(channelId)) {
dragXml.append("<DeviceID>" + device.getDeviceId() + "</DeviceID>\r\n");
} else {
dragXml.append("<DeviceID>" + channelId + "</DeviceID>\r\n");
@@ -1646,14 +1666,11 @@
clientTransaction = udpSipProvider.getNewClientTransaction(request);
}
if (request.getHeader(UserAgentHeader.NAME) == null) {
- List<String> agentParam = new ArrayList<>();
- agentParam.add("wvp-pro");
- // TODO 娣诲姞鐗堟湰淇℃伅浠ュ強鏃ユ湡
UserAgentHeader userAgentHeader = null;
try {
- userAgentHeader = sipFactory.createHeaderFactory().createUserAgentHeader(agentParam);
+ userAgentHeader = HeaderUtils.createUserAgentHeader(sipFactory);
} catch (ParseException e) {
- throw new RuntimeException(e);
+ logger.error("娣诲姞UserAgentHeader澶辫触", e);
}
request.addHeader(userAgentHeader);
}
@@ -1663,6 +1680,7 @@
sipSubscribe.addErrorSubscribe(callIdHeader.getCallId(), (eventResult -> {
errorEvent.response(eventResult);
sipSubscribe.removeErrorSubscribe(eventResult.callId);
+ sipSubscribe.removeOkSubscribe(eventResult.callId);
}));
}
// 娣诲姞璁㈤槄
@@ -1670,6 +1688,7 @@
sipSubscribe.addOkSubscribe(callIdHeader.getCallId(), eventResult ->{
okEvent.response(eventResult);
sipSubscribe.removeOkSubscribe(eventResult.callId);
+ sipSubscribe.removeErrorSubscribe(eventResult.callId);
});
}
@@ -1683,10 +1702,9 @@
@Override
public void playPauseCmd(Device device, StreamInfo streamInfo) {
try {
- Long cseq = redisCatchStorage.getCSEQ(Request.INFO);
StringBuffer content = new StringBuffer(200);
content.append("PAUSE RTSP/1.0\r\n");
- content.append("CSeq: " + cseq + "\r\n");
+ content.append("CSeq: " + getInfoCseq() + "\r\n");
content.append("PauseTime: now\r\n");
Request request = headerProvider.createInfoRequest(device, streamInfo, content.toString());
if (request == null) {
@@ -1714,10 +1732,9 @@
@Override
public void playResumeCmd(Device device, StreamInfo streamInfo) {
try {
- Long cseq = redisCatchStorage.getCSEQ(Request.INFO);
StringBuffer content = new StringBuffer(200);
content.append("PLAY RTSP/1.0\r\n");
- content.append("CSeq: " + cseq + "\r\n");
+ content.append("CSeq: " + getInfoCseq() + "\r\n");
content.append("Range: npt=now-\r\n");
Request request = headerProvider.createInfoRequest(device, streamInfo, content.toString());
if (request == null) {
@@ -1744,10 +1761,9 @@
@Override
public void playSeekCmd(Device device, StreamInfo streamInfo, long seekTime) {
try {
- Long cseq = redisCatchStorage.getCSEQ(Request.INFO);
StringBuffer content = new StringBuffer(200);
content.append("PLAY RTSP/1.0\r\n");
- content.append("CSeq: " + cseq + "\r\n");
+ content.append("CSeq: " + getInfoCseq() + "\r\n");
content.append("Range: npt=" + Math.abs(seekTime) + "-\r\n");
Request request = headerProvider.createInfoRequest(device, streamInfo, content.toString());
@@ -1775,11 +1791,11 @@
@Override
public void playSpeedCmd(Device device, StreamInfo streamInfo, Double speed) {
try {
- Long cseq = redisCatchStorage.getCSEQ(Request.INFO);
+
StringBuffer content = new StringBuffer(200);
content.append("PLAY RTSP/1.0\r\n");
- content.append("CSeq: " + cseq + "\r\n");
- content.append("Scale: " + String.format("%.1f",speed) + "\r\n");
+ content.append("CSeq: " + getInfoCseq() + "\r\n");
+ content.append("Scale: " + String.format("%.6f",speed) + "\r\n");
Request request = headerProvider.createInfoRequest(device, streamInfo, content.toString());
if (request == null) {
return;
@@ -1794,6 +1810,46 @@
clientTransaction.sendRequest();
+ } catch (SipException | ParseException | InvalidArgumentException e) {
+ e.printStackTrace();
+ }
+ }
+
+ private int getInfoCseq() {
+ return (int) ((Math.random() * 9 + 1) * Math.pow(10, 8));
+ }
+
+ @Override
+ public void playbackControlCmd(Device device, StreamInfo streamInfo, String content,SipSubscribe.Event errorEvent, SipSubscribe.Event okEvent) {
+ try {
+ Request request = headerProvider.createInfoRequest(device, streamInfo, content);
+ if (request == null) {
+ return;
+ }
+ ClientTransaction clientTransaction = null;
+ if ("TCP".equals(device.getTransport())) {
+ clientTransaction = tcpSipProvider.getNewClientTransaction(request);
+ } else if ("UDP".equals(device.getTransport())) {
+ clientTransaction = udpSipProvider.getNewClientTransaction(request);
+ }
+ CallIdHeader callIdHeader = (CallIdHeader)request.getHeader(CallIdHeader.NAME);
+ if(errorEvent != null) {
+ sipSubscribe.addErrorSubscribe(callIdHeader.getCallId(), (eventResult -> {
+ errorEvent.response(eventResult);
+ sipSubscribe.removeErrorSubscribe(eventResult.callId);
+ sipSubscribe.removeOkSubscribe(eventResult.callId);
+ }));
+ }
+
+ if(okEvent != null) {
+ sipSubscribe.addOkSubscribe(callIdHeader.getCallId(), eventResult -> {
+ okEvent.response(eventResult);
+ sipSubscribe.removeOkSubscribe(eventResult.callId);
+ sipSubscribe.removeErrorSubscribe(eventResult.callId);
+ });
+ }
+ clientTransaction.sendRequest();
+
} catch (SipException | ParseException | InvalidArgumentException e) {
e.printStackTrace();
}
@@ -1843,7 +1899,7 @@
private void sendNotify(Device device, String catalogXmlContent,
SubscribeInfo subscribeInfo, SipSubscribe.Event errorEvent, SipSubscribe.Event okEvent )
- throws NoSuchFieldException, IllegalAccessException, SipException, ParseException {
+ throws SipException, ParseException {
MessageFactoryImpl messageFactory = (MessageFactoryImpl) sipFactory.createMessageFactory();
String characterSet = device.getCharset();
// 璁剧疆缂栫爜锛� 闃叉涓枃涔辩爜
--
Gitblit v1.8.0