From c041aaccb43baf73d1a9f5b50fb5a1f410b88523 Mon Sep 17 00:00:00 2001
From: 648540858 <648540858@qq.com>
Date: 星期一, 15 八月 2022 15:08:51 +0800
Subject: [PATCH] 修复录像回放中的信令错误

---
 src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/response/impl/InviteResponseProcessor.java |   58 +++++++++--
 src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/SIPRequestHeaderProvider.java                |   98 ++++++++++--------
 src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java                       |   44 ++++++--
 src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookListener.java                                |    4 
 src/main/java/com/genersoft/iot/vmp/storager/impl/RedisCatchStorageImpl.java                          |    4 
 src/main/java/com/genersoft/iot/vmp/storager/IRedisCatchStorage.java                                  |    3 
 src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommanderFroPlatform.java            |    2 
 src/main/java/com/genersoft/iot/vmp/service/impl/MediaServerServiceImpl.java                          |   21 ++--
 src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/SIPRequestHeaderPlarformProvider.java        |    6 
 src/main/java/com/genersoft/iot/vmp/common/VideoManagerConstants.java                                 |   40 +++++--
 10 files changed, 179 insertions(+), 101 deletions(-)

diff --git a/src/main/java/com/genersoft/iot/vmp/common/VideoManagerConstants.java b/src/main/java/com/genersoft/iot/vmp/common/VideoManagerConstants.java
index 40a7352..510b5b2 100644
--- a/src/main/java/com/genersoft/iot/vmp/common/VideoManagerConstants.java
+++ b/src/main/java/com/genersoft/iot/vmp/common/VideoManagerConstants.java
@@ -77,38 +77,54 @@
 
 	//************************** redis 娑堟伅*********************************
 
-	// 娴佸彉鍖栫殑閫氱煡
+	/**
+	 * 娴佸彉鍖栫殑閫氱煡
+	 */
 	public static final String WVP_MSG_STREAM_CHANGE_PREFIX = "WVP_MSG_STREAM_CHANGE_";
 
-	// 鎺ユ敹鎺ㄦ祦璁惧鐨凣PS鍙樺寲閫氱煡
+	/**
+	 * 鎺ユ敹鎺ㄦ祦璁惧鐨凣PS鍙樺寲閫氱煡
+	 */
 	public static final String VM_MSG_GPS = "VM_MSG_GPS";
 
-	// 鎺ユ敹鎺ㄦ祦璁惧鐨凣PS鍙樺寲閫氱煡
+	/**
+	 * 鎺ユ敹鎺ㄦ祦璁惧鐨凣PS鍙樺寲閫氱煡
+	 */
 	public static final String VM_MSG_PUSH_STREAM_STATUS_CHANGE = "VM_MSG_PUSH_STREAM_STATUS_CHANGE";
 
-	// redis 娑堟伅閫氱煡璁惧鎺ㄦ祦鍒板钩鍙�
+	/**
+	 * redis 娑堟伅閫氱煡璁惧鎺ㄦ祦鍒板钩鍙�
+	 */
 	public static final String VM_MSG_STREAM_PUSH_REQUESTED = "VM_MSG_STREAM_PUSH_REQUESTED";
 
-	// redis 娑堟伅璇锋眰鎵�鏈夌殑鍦ㄧ嚎閫氶亾
+	/**
+	 * redis 娑堟伅璇锋眰鎵�鏈夌殑鍦ㄧ嚎閫氶亾
+	 */
 	public static final String VM_MSG_GET_ALL_ONLINE_REQUESTED = "VM_MSG_GET_ALL_ONLINE_REQUESTED";
 
-	// 绉诲姩浣嶇疆璁㈤槄閫氱煡
+	/**
+	 * 绉诲姩浣嶇疆璁㈤槄閫氱煡
+	 */
 	public static final String VM_MSG_SUBSCRIBE_MOBILE_POSITION = "mobileposition";
 
-	// 鎶ヨ璁㈤槄鐨勯�氱煡锛堟敹鍒版姤璀﹀悜redis鍙戝嚭閫氱煡锛�
+	/**
+	 * 鎶ヨ璁㈤槄鐨勯�氱煡锛堟敹鍒版姤璀﹀悜redis鍙戝嚭閫氱煡锛�
+	 */
 	public static final String VM_MSG_SUBSCRIBE_ALARM = "alarm";
 
-	// 鎶ヨ閫氱煡鐨勫彂閫� 锛堟敹鍒皉edis鍙戝嚭鐨勯�氱煡锛岃浆鍙戠粰鍏朵粬骞冲彴锛�
+	/**
+	 * 鎶ヨ閫氱煡鐨勫彂閫� 锛堟敹鍒皉edis鍙戝嚭鐨勯�氱煡锛岃浆鍙戠粰鍏朵粬骞冲彴锛�
+	 */
 	public static final String VM_MSG_SUBSCRIBE_ALARM_RECEIVE= "alarm_receive";
 
-	// 璁惧鐘舵�佽闃呯殑閫氱煡
+	/**
+	 * 璁惧鐘舵�佽闃呯殑閫氱煡
+	 */
 	public static final String VM_MSG_SUBSCRIBE_DEVICE_STATUS = "device";
 
 
-
-
-
 	//**************************    绗笁鏂�  ****************************************
+
 	public static final String WVP_STREAM_GB_ID_PREFIX = "memberNo_";
 	public static final String WVP_STREAM_GPS_MSG_PREFIX = "WVP_STREAM_GPS_MSG_";
 
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/SIPRequestHeaderPlarformProvider.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/SIPRequestHeaderPlarformProvider.java
index 1c2e611..ad8043f 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/SIPRequestHeaderPlarformProvider.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/SIPRequestHeaderPlarformProvider.java
@@ -62,7 +62,7 @@
 		// Forwards
 		MaxForwardsHeader maxForwards = sipFactory.createHeaderFactory().createMaxForwardsHeader(70);
 		// ceq
-		CSeqHeader cSeqHeader = sipFactory.createHeaderFactory().createCSeqHeader(redisCatchStorage.getCSEQ(Request.MESSAGE), Request.MESSAGE);
+		CSeqHeader cSeqHeader = sipFactory.createHeaderFactory().createCSeqHeader(redisCatchStorage.getCSEQ(), Request.MESSAGE);
 
 		request = sipFactory.createMessageFactory().createRequest(requestURI, Request.MESSAGE, callIdHeader, cSeqHeader, fromHeader,
 				toHeader, viaHeaders, maxForwards);
@@ -120,7 +120,7 @@
 										 String callId, WWWAuthenticateHeader www , CallIdHeader callIdHeader) throws ParseException, PeerUnavailableException, InvalidArgumentException {
 
 
-		Request registerRequest = createRegisterRequest(parentPlatform, redisCatchStorage.getCSEQ(Request.REGISTER), fromTag, viaTag, callIdHeader);
+		Request registerRequest = createRegisterRequest(parentPlatform, redisCatchStorage.getCSEQ(), fromTag, viaTag, callIdHeader);
 		SipURI requestURI = sipFactory.createAddressFactory().createSipURI(parentPlatform.getServerGBId(), parentPlatform.getServerIP() + ":" + parentPlatform.getServerPort());
 		if (www == null) {
 			AuthorizationHeader authorizationHeader = sipFactory.createHeaderFactory().createAuthorizationHeader("Digest");
@@ -213,7 +213,7 @@
 		// Forwards
 		MaxForwardsHeader maxForwards = sipFactory.createHeaderFactory().createMaxForwardsHeader(70);
 		// ceq
-		CSeqHeader cSeqHeader = sipFactory.createHeaderFactory().createCSeqHeader(redisCatchStorage.getCSEQ(Request.MESSAGE), Request.MESSAGE);
+		CSeqHeader cSeqHeader = sipFactory.createHeaderFactory().createCSeqHeader(redisCatchStorage.getCSEQ(), Request.MESSAGE);
 		MessageFactoryImpl messageFactory = (MessageFactoryImpl) sipFactory.createMessageFactory();
 		// 璁剧疆缂栫爜锛� 闃叉涓枃涔辩爜
 		messageFactory.setDefaultContentEncodingCharset(parentPlatform.getCharacterSet());
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/SIPRequestHeaderProvider.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/SIPRequestHeaderProvider.java
index 349732b..b89fd8e 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/SIPRequestHeaderProvider.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/SIPRequestHeaderProvider.java
@@ -2,11 +2,9 @@
 
 import java.text.ParseException;
 import java.util.ArrayList;
+import java.util.List;
 
-import javax.sip.Dialog;
-import javax.sip.InvalidArgumentException;
-import javax.sip.PeerUnavailableException;
-import javax.sip.SipFactory;
+import javax.sip.*;
 import javax.sip.address.Address;
 import javax.sip.address.SipURI;
 import javax.sip.header.*;
@@ -15,7 +13,11 @@
 import com.genersoft.iot.vmp.common.StreamInfo;
 import com.genersoft.iot.vmp.gb28181.session.VideoStreamSessionManager;
 import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
+import gov.nist.javax.sip.SipProviderImpl;
+import gov.nist.javax.sip.SipStackImpl;
+import gov.nist.javax.sip.stack.SIPDialog;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.stereotype.Component;
 
 import com.genersoft.iot.vmp.conf.SipConfig;
@@ -40,6 +42,14 @@
 
 	@Autowired
 	private VideoStreamSessionManager streamSession;
+
+	@Autowired
+	@Qualifier(value="tcpSipProvider")
+	private SipProviderImpl tcpSipProvider;
+
+	@Autowired
+	@Qualifier(value="udpSipProvider")
+	private SipProviderImpl udpSipProvider;
 	
 	public Request createMessageRequest(Device device, String content, String viaTag, String fromTag, String toTag, CallIdHeader callIdHeader) throws ParseException, InvalidArgumentException, PeerUnavailableException {
 		Request request = null;
@@ -95,7 +105,7 @@
 		MaxForwardsHeader maxForwards = sipFactory.createHeaderFactory().createMaxForwardsHeader(70);
 		
 		//ceq
-		CSeqHeader cSeqHeader = sipFactory.createHeaderFactory().createCSeqHeader(redisCatchStorage.getCSEQ(Request.INVITE), Request.INVITE);
+		CSeqHeader cSeqHeader = sipFactory.createHeaderFactory().createCSeqHeader(redisCatchStorage.getCSEQ(), Request.INVITE);
 		request = sipFactory.createMessageFactory().createRequest(requestLine, Request.INVITE, callIdHeader, cSeqHeader,fromHeader, toHeader, viaHeaders, maxForwards);
 		
 		Address concatAddress = sipFactory.createAddressFactory().createAddress(sipFactory.createAddressFactory().createSipURI(sipConfig.getId(), sipConfig.getIp()+":"+sipConfig.getPort()));
@@ -131,7 +141,7 @@
 		MaxForwardsHeader maxForwards = sipFactory.createHeaderFactory().createMaxForwardsHeader(70);
 		
 		//ceq
-		CSeqHeader cSeqHeader = sipFactory.createHeaderFactory().createCSeqHeader(redisCatchStorage.getCSEQ(Request.INVITE), Request.INVITE);
+		CSeqHeader cSeqHeader = sipFactory.createHeaderFactory().createCSeqHeader(redisCatchStorage.getCSEQ(), Request.INVITE);
 		request = sipFactory.createMessageFactory().createRequest(requestLine, Request.INVITE, callIdHeader, cSeqHeader,fromHeader, toHeader, viaHeaders, maxForwards);
 		
 		Address concatAddress = sipFactory.createAddressFactory().createAddress(sipFactory.createAddressFactory().createSipURI(sipConfig.getId(), sipConfig.getIp()+":"+sipConfig.getPort()));
@@ -200,7 +210,7 @@
 		MaxForwardsHeader maxForwards = sipFactory.createHeaderFactory().createMaxForwardsHeader(70);
 
 		// ceq
-		CSeqHeader cSeqHeader = sipFactory.createHeaderFactory().createCSeqHeader(redisCatchStorage.getCSEQ(Request.SUBSCRIBE), Request.SUBSCRIBE);
+		CSeqHeader cSeqHeader = sipFactory.createHeaderFactory().createCSeqHeader(redisCatchStorage.getCSEQ(), Request.SUBSCRIBE);
 
 		request = sipFactory.createMessageFactory().createRequest(requestURI, Request.SUBSCRIBE, callIdHeader, cSeqHeader, fromHeader,
 				toHeader, viaHeaders, maxForwards);
@@ -226,55 +236,55 @@
 	}
 
 	public Request createInfoRequest(Device device, StreamInfo streamInfo, String content)
-			throws PeerUnavailableException, ParseException, InvalidArgumentException {
-		Request request = null;
+			throws SipException, ParseException, InvalidArgumentException {
 		if (streamInfo == null) {
 			return null;
 		}
-		Dialog dialog = streamSession.getDialogByStream(streamInfo.getDeviceID(), streamInfo.getChannelId(), streamInfo.getStream());
+		Request request = null;
+		SIPDialog dialog = streamSession.getDialogByStream(streamInfo.getDeviceID(), streamInfo.getChannelId(), streamInfo.getStream());
 		if (dialog == null) {
 			return null;
 		}
 
-		SipURI requestLine = sipFactory.createAddressFactory().createSipURI(device.getDeviceId(),
-				device.getHostAddress());
-		// via
-		ArrayList<ViaHeader> viaHeaders = new ArrayList<ViaHeader>();
-		ViaHeader viaHeader = sipFactory.createHeaderFactory().createViaHeader(device.getIp(), device.getPort(),
-				device.getTransport(), null);
+		SipStack sipStack = udpSipProvider.getSipStack();
+		SIPDialog sipDialog = ((SipStackImpl) sipStack).putDialog(dialog);
+		if (dialog != sipDialog) {
+			dialog = sipDialog;
+		}else {
+			dialog.setSipProvider(udpSipProvider);
+		}
+		streamSession.put(streamInfo.getDeviceID(), streamInfo.getChannelId(), dialog.getCallId().getCallId(), dialog);
+		Request infoRequest = dialog.createRequest(Request.INFO);
+		SipURI sipURI = (SipURI) infoRequest.getRequestURI();
+		sipURI.setHost(device.getIp());
+		sipURI.setPort(device.getPort());
+		sipURI.setUser(streamInfo.getChannelId());
+
+		ViaHeader viaHeader = (ViaHeader) infoRequest.getHeader(ViaHeader.NAME);
 		viaHeader.setRPort();
-		viaHeaders.add(viaHeader);
-		// from
-		SipURI fromSipURI = sipFactory.createAddressFactory().createSipURI(sipConfig.getId(),
-				sipConfig.getDomain());
-		Address fromAddress = sipFactory.createAddressFactory().createAddress(fromSipURI);
-		FromHeader fromHeader = sipFactory.createHeaderFactory().createFromHeader(fromAddress, dialog.getLocalTag());
-		// to
-		SipURI toSipURI = sipFactory.createAddressFactory().createSipURI(streamInfo.getChannelId(),
-				sipConfig.getDomain());
-		Address toAddress = sipFactory.createAddressFactory().createAddress(toSipURI);
-		ToHeader toHeader = sipFactory.createHeaderFactory().createToHeader(toAddress, dialog.getRemoteTag());
-
-		// callid
-		CallIdHeader callIdHeader = dialog.getCallId();
-
-		// Forwards
-		MaxForwardsHeader maxForwards = sipFactory.createHeaderFactory().createMaxForwardsHeader(70);
-
-		Long cseq = redisCatchStorage.getCSEQ(Request.INVITE);
-		// ceq
-		CSeqHeader cSeqHeader = sipFactory.createHeaderFactory()
-				.createCSeqHeader(cseq, Request.INFO);
-
-		request = sipFactory.createMessageFactory().createRequest(requestLine, Request.INFO, callIdHeader, cSeqHeader,
-				fromHeader, toHeader, viaHeaders, maxForwards);
+		// 澧炲姞Contact header
 		Address concatAddress = sipFactory.createAddressFactory().createAddress(sipFactory.createAddressFactory()
 				.createSipURI(sipConfig.getId(), sipConfig.getIp() + ":" + sipConfig.getPort()));
-		request.addHeader(sipFactory.createHeaderFactory().createContactHeader(concatAddress));
+		infoRequest.addHeader(sipFactory.createHeaderFactory().createContactHeader(concatAddress));
+		List<String> agentParam = new ArrayList<>();
+		agentParam.add("wvp-pro");
+		// TODO 娣诲姞鐗堟湰淇℃伅浠ュ強鏃ユ湡
+		UserAgentHeader userAgentHeader = null;
+		try {
+			userAgentHeader = sipFactory.createHeaderFactory().createUserAgentHeader(agentParam);
+		} catch (ParseException e) {
+			throw new RuntimeException(e);
+		}
+		infoRequest.addHeader(userAgentHeader);
 
 		ContentTypeHeader contentTypeHeader = sipFactory.createHeaderFactory().createContentTypeHeader("Application",
 				"MANSRTSP");
-		request.setContent(content, contentTypeHeader);
-		return request;
+		infoRequest.setContent(content, contentTypeHeader);
+
+		CSeqHeader cSeqHeader = (CSeqHeader)infoRequest.getHeader(CSeqHeader.NAME);
+		cSeqHeader.setSeqNumber(redisCatchStorage.getCSEQ());
+		// ceq
+		infoRequest.addHeader(cSeqHeader);
+		return infoRequest;
 	}
 }
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 feb66b4..cb6038b 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
@@ -732,8 +732,23 @@
 			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));
+			List<String> agentParam = new ArrayList<>();
+			agentParam.add("wvp-pro");
+			// TODO 娣诲姞鐗堟湰淇℃伅浠ュ強鏃ユ湡
+			UserAgentHeader userAgentHeader = null;
+			try {
+				userAgentHeader = sipFactory.createHeaderFactory().createUserAgentHeader(agentParam);
+			} catch (ParseException e) {
+				throw new RuntimeException(e);
+			}
+			byeRequest.addHeader(userAgentHeader);
 			ClientTransaction clientTransaction = null;
 			if("TCP".equals(protocol)) {
 				clientTransaction = tcpSipProvider.getNewClientTransaction(byeRequest);
@@ -745,11 +760,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);
 		}
 	}
 
@@ -1483,7 +1501,7 @@
 				request.setContent(subscribePostitionXml.toString(), contentTypeHeader);
 
 				CSeqHeader cSeqHeader = (CSeqHeader)request.getHeader(CSeqHeader.NAME);
-				cSeqHeader.setSeqNumber(redisCatchStorage.getCSEQ(Request.SUBSCRIBE));
+				cSeqHeader.setSeqNumber(redisCatchStorage.getCSEQ());
 				request.removeHeader(CSeqHeader.NAME);
 				request.addHeader(cSeqHeader);
 			}else {
@@ -1587,7 +1605,7 @@
 				request.setContent(cmdXml.toString(), contentTypeHeader);
 
 				CSeqHeader cSeqHeader = (CSeqHeader)request.getHeader(CSeqHeader.NAME);
-				cSeqHeader.setSeqNumber(redisCatchStorage.getCSEQ(Request.SUBSCRIBE));
+				cSeqHeader.setSeqNumber(redisCatchStorage.getCSEQ());
 				request.removeHeader(CSeqHeader.NAME);
 				request.addHeader(cSeqHeader);
 
@@ -1697,10 +1715,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) {
@@ -1728,10 +1745,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) {
@@ -1758,10 +1774,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());
@@ -1789,11 +1804,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;
@@ -1812,6 +1827,10 @@
 			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) {
@@ -1820,7 +1839,6 @@
 			if (request == null) {
 				return;
 			}
-			logger.info(request.toString());
 			ClientTransaction clientTransaction = null;
 			if ("TCP".equals(device.getTransport())) {
 				clientTransaction = tcpSipProvider.getNewClientTransaction(request);
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 10f428b..36d9298 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
@@ -105,7 +105,7 @@
                 }
 
                 request = headerProviderPlarformProvider.createRegisterRequest(parentPlatform,
-                        redisCatchStorage.getCSEQ(Request.REGISTER), "FromRegister" + tm,
+                        redisCatchStorage.getCSEQ(), "FromRegister" + tm,
                         "z9hG4bK-" + UUID.randomUUID().toString().replace("-", ""), callIdHeader);
                 // 灏� callid 鍐欏叆缂撳瓨锛� 绛夋敞鍐屾垚鍔熷彲浠ユ洿鏂扮姸鎬�
                 String callIdFromHeader = callIdHeader.getCallId();
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/response/impl/InviteResponseProcessor.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/response/impl/InviteResponseProcessor.java
index 89958e9..04a11b9 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/response/impl/InviteResponseProcessor.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/response/impl/InviteResponseProcessor.java
@@ -2,24 +2,32 @@
 
 import com.genersoft.iot.vmp.conf.SipConfig;
 import com.genersoft.iot.vmp.gb28181.SipLayer;
+import com.genersoft.iot.vmp.gb28181.bean.SsrcTransaction;
 import com.genersoft.iot.vmp.gb28181.session.VideoStreamSessionManager;
 import com.genersoft.iot.vmp.gb28181.transmit.SIPProcessorObserver;
 import com.genersoft.iot.vmp.gb28181.transmit.event.response.SIPResponseProcessorAbstract;
 import gov.nist.javax.sip.ResponseEventExt;
+import gov.nist.javax.sip.message.SIPResponse;
 import gov.nist.javax.sip.stack.SIPDialog;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
-import javax.sip.InvalidArgumentException;
-import javax.sip.ResponseEvent;
-import javax.sip.SipException;
+import javax.sdp.SdpFactory;
+import javax.sdp.SdpParseException;
+import javax.sdp.SessionDescription;
+import javax.sip.*;
+import javax.sip.address.Address;
 import javax.sip.address.SipURI;
 import javax.sip.header.CSeqHeader;
+import javax.sip.header.CallIdHeader;
+import javax.sip.header.UserAgentHeader;
 import javax.sip.message.Request;
 import javax.sip.message.Response;
 import java.text.ParseException;
+import java.util.ArrayList;
+import java.util.List;
 
 
 /**
@@ -34,14 +42,16 @@
 	private final String method = "INVITE";
 
 	@Autowired
-	private SipLayer sipLayer;
-
-	@Autowired
-	private SipConfig config;
-
+	private VideoStreamSessionManager streamSession;
 
 	@Autowired
 	private SIPProcessorObserver sipProcessorObserver;
+
+	@Autowired
+	private SipConfig sipConfig;
+
+	@Autowired
+	private SipFactory sipFactory;
 
 	@Override
 	public void afterPropertiesSet() throws Exception {
@@ -49,8 +59,7 @@
 		sipProcessorObserver.addResponseProcessor(method, this);
 	}
 
-	@Autowired
-	private VideoStreamSessionManager streamSession;
+
 
 	/**
 	 * 澶勭悊invite鍝嶅簲
@@ -74,6 +83,19 @@
 				CSeqHeader cseq = (CSeqHeader) response.getHeader(CSeqHeader.NAME);
 				Request reqAck = dialog.createAck(cseq.getSeqNumber());
 				SipURI requestURI = (SipURI) reqAck.getRequestURI();
+				String contentString = new String(response.getRawContent());
+				// jainSip涓嶆敮鎸亂=瀛楁锛� 绉婚櫎浠ヨВ鏋愩��
+				int ssrcIndex = contentString.indexOf("y=");
+				// 妫�鏌ユ槸鍚︽湁y瀛楁
+				SessionDescription sdp;
+				if (ssrcIndex >= 0) {
+					//ssrc瑙勫畾闀垮害涓�10瀛楄妭锛屼笉鍙栦綑涓嬮暱搴︿互閬垮厤鍚庣画杩樻湁鈥渇=鈥濆瓧娈�
+					String substring = contentString.substring(0, contentString.indexOf("y="));
+					sdp = SdpFactory.getInstance().createSessionDescription(substring);
+				} else {
+					sdp = SdpFactory.getInstance().createSessionDescription(contentString);
+				}
+				requestURI.setUser(sdp.getOrigin().getUsername());
 				try {
 					requestURI.setHost(event.getRemoteIpAddress());
 				} catch (ParseException e) {
@@ -81,6 +103,18 @@
 				}
 				requestURI.setPort(event.getRemotePort());
 				reqAck.setRequestURI(requestURI);
+				List<String> agentParam = new ArrayList<>();
+				agentParam.add("wvp-pro");
+				// TODO 娣诲姞鐗堟湰淇℃伅浠ュ強鏃ユ湡
+				UserAgentHeader userAgentHeader = null;
+				try {
+					userAgentHeader = sipFactory.createHeaderFactory().createUserAgentHeader(agentParam);
+				} catch (ParseException e) {
+					throw new RuntimeException(e);
+				}
+				reqAck.addHeader(userAgentHeader);
+				Address concatAddress = sipFactory.createAddressFactory().createAddress(sipFactory.createAddressFactory().createSipURI(sipConfig.getId(), sipConfig.getIp()+":"+sipConfig.getPort()));
+				reqAck.addHeader(sipFactory.createHeaderFactory().createContactHeader(concatAddress));
 				logger.info("[鍥炲ack] {}-> {}:{} ",requestURI, event.getRemoteIpAddress(), event.getRemotePort());
 
 				dialog.sendAck(reqAck);
@@ -88,6 +122,10 @@
 			}
 		} catch (InvalidArgumentException | SipException e) {
 			e.printStackTrace();
+		} catch (ParseException e) {
+			throw new RuntimeException(e);
+		} catch (SdpParseException e) {
+			throw new RuntimeException(e);
 		}
 	}
 
diff --git a/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookListener.java b/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookListener.java
index 57ad192..e934a26 100644
--- a/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookListener.java
+++ b/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookListener.java
@@ -98,9 +98,7 @@
 	@PostMapping(value = "/on_server_keepalive", produces = "application/json;charset=UTF-8")
 	public ResponseEntity<String> onServerKeepalive(@RequestBody JSONObject json){
 
-		if (logger.isDebugEnabled()) {
-			logger.debug("[ ZLM HOOK ] on_server_keepalive API璋冪敤锛屽弬鏁帮細" + json.toString());
-		}
+		logger.info("[ ZLM HOOK ] on_server_keepalive API璋冪敤锛屽弬鏁帮細" + json.toString());
 		String mediaServerId = json.getString("mediaServerId");
 		List<ZLMHttpHookSubscribe.Event> subscribes = this.subscribe.getSubscribes(HookType.on_server_keepalive);
 		if (subscribes != null  && subscribes.size() > 0) {
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 aded98d..df66bba 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
@@ -277,13 +277,7 @@
             return null;
         }
         String key = VideoManagerConstants.MEDIA_SERVER_PREFIX + userSetting.getServerId() + "_" + mediaServerId;
-        MediaServerItem serverItem=(MediaServerItem)redisUtil.get(key);
-        if(null==serverItem){
-            //zlm鏈嶅姟涓嶅湪绾匡紝鍚姩閲嶈繛
-            reloadZlm();
-            serverItem=(MediaServerItem)redisUtil.get(key);
-        }
-        return serverItem;
+        return (MediaServerItem)redisUtil.get(key);
     }
 
     @Override
@@ -412,7 +406,6 @@
         }
         redisUtil.set(key, serverItem);
         resetOnlineServerItem(serverItem);
-        updateMediaServerKeepalive(serverItem.getId(), null);
         if (serverItem.isAutoConfig()) {
             setZLMConfig(serverItem, "0".equals(zlmServerConfig.getHookEnable()));
         }
@@ -476,9 +469,6 @@
         String key = VideoManagerConstants.MEDIA_SERVERS_ONLINE_PREFIX + userSetting.getServerId();
 
         if (redisUtil.zSize(key)  == null || redisUtil.zSize(key) == 0) {
-            logger.info("鑾峰彇璐熻浇鏈�浣庣殑鑺傜偣鏃舵棤鍦ㄧ嚎鑺傜偣锛屽惎鍔ㄩ噸杩炴満鍒�");
-            //鍚姩閲嶈繛
-            reloadZlm();
             if (redisUtil.zSize(key)  == null || redisUtil.zSize(key) == 0) {
                 logger.info("鑾峰彇璐熻浇鏈�浣庣殑鑺傜偣鏃舵棤鍦ㄧ嚎鑺傜偣");
                 return null;
@@ -643,6 +633,11 @@
     public void updateMediaServerKeepalive(String mediaServerId, JSONObject data) {
         MediaServerItem mediaServerItem = getOne(mediaServerId);
         if (mediaServerItem == null) {
+            // 缂撳瓨涓嶅瓨鍦紝浠庢暟鎹簱鏌ヨ锛屽鏋滄暟鎹簱涓嶅瓨鍦ㄥ垯鏄敊璇殑
+            MediaServerItem mediaServerItemFromDatabase = getOneFromDatabase(mediaServerId);
+            if (mediaServerItemFromDatabase == null) {
+                return;
+            }
             // zlm杩炴帴閲嶈瘯
             logger.warn("[鏇存柊ZLM 淇濇椿淇℃伅]澶辫触锛屾湭鎵惧埌娴佸獟浣撲俊鎭�,灏濊瘯閲嶈繛zlm");
             reloadZlm();
@@ -658,6 +653,10 @@
         redisUtil.set(key, data, hookAliveInterval);
     }
 
+    private MediaServerItem getOneFromDatabase(String mediaServerId) {
+        return mediaServerMapper.queryOne(mediaServerId);
+    }
+
     @Override
     public void syncCatchFromDatabase() {
         List<MediaServerItem> allInCatch = getAll();
diff --git a/src/main/java/com/genersoft/iot/vmp/storager/IRedisCatchStorage.java b/src/main/java/com/genersoft/iot/vmp/storager/IRedisCatchStorage.java
index b9811da..d10de48 100644
--- a/src/main/java/com/genersoft/iot/vmp/storager/IRedisCatchStorage.java
+++ b/src/main/java/com/genersoft/iot/vmp/storager/IRedisCatchStorage.java
@@ -17,10 +17,9 @@
     /**
      * 璁℃暟鍣ㄣ�備负cseq杩涜璁℃暟
      *
-     * @param method sip 鏂规硶
      * @return
      */
-    Long getCSEQ(String method);
+    Long getCSEQ();
 
     /**
      * 寮�濮嬫挱鏀炬椂灏嗘祦瀛樺叆
diff --git a/src/main/java/com/genersoft/iot/vmp/storager/impl/RedisCatchStorageImpl.java b/src/main/java/com/genersoft/iot/vmp/storager/impl/RedisCatchStorageImpl.java
index 31294a0..81920b8 100644
--- a/src/main/java/com/genersoft/iot/vmp/storager/impl/RedisCatchStorageImpl.java
+++ b/src/main/java/com/genersoft/iot/vmp/storager/impl/RedisCatchStorageImpl.java
@@ -42,8 +42,8 @@
     private UserSetting userSetting;
 
     @Override
-    public Long getCSEQ(String method) {
-        String key = VideoManagerConstants.SIP_CSEQ_PREFIX  + userSetting.getServerId() + "_" +  method;
+    public Long getCSEQ() {
+        String key = VideoManagerConstants.SIP_CSEQ_PREFIX  + userSetting.getServerId();
 
         long result =  redis.incr(key, 1L);
         if (result > Integer.MAX_VALUE) {

--
Gitblit v1.8.0