From 6ecd801c2365feb4e65f6684065aa97f11615797 Mon Sep 17 00:00:00 2001
From: songww <songww@inspur.com>
Date: 星期三, 13 五月 2020 20:38:32 +0800
Subject: [PATCH] 增加设备删除接口,只允许删除离线设备;增加视频停止播放接口

---
 src/main/java/com/genersoft/iot/vmp/gb28181/transmit/response/impl/InviteResponseProcessor.java  |   46 ++++---
 src/main/java/com/genersoft/iot/vmp/vmanager/play/PlayController.java                            |   20 +++
 src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java                  |   67 +++++++++--
 src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/ByeRequestProcessor.java       |    2 
 src/main/java/com/genersoft/iot/vmp/conf/SipConfig.java                                          |   12 +
 src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/AckRequestProcessor.java       |    2 
 src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/OtherRequestProcessor.java     |    2 
 src/main/java/com/genersoft/iot/vmp/utils/redis/RedisUtil.java                                   |   20 ++-
 src/main/java/com/genersoft/iot/vmp/storager/redis/VideoManagerRedisStoragerImpl.java            |    3 
 src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/ISIPCommander.java                      |    7 +
 src/main/java/com/genersoft/iot/vmp/gb28181/SipLayer.java                                        |    4 
 src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/ISIPRequestProcessor.java           |    3 
 src/main/java/com/genersoft/iot/vmp/gb28181/session/SsrcUtil.java                                |    2 
 src/main/java/com/genersoft/iot/vmp/gb28181/session/VideoStreamSessionManager.java               |   41 ++++++
 src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/SIPRequestHeaderProvider.java           |   57 ++++++++
 src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/InviteRequestProcessor.java    |    2 
 src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/RegisterRequestProcessor.java  |    4 
 src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/SubscribeRequestProcessor.java |    4 
 src/main/java/com/genersoft/iot/vmp/vmanager/device/DeviceController.java                        |   26 ++++
 src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/MessageRequestProcessor.java   |    4 
 src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/CancelRequestProcessor.java    |    2 
 src/main/resources/application.yml                                                               |    2 
 22 files changed, 266 insertions(+), 66 deletions(-)

diff --git a/src/main/java/com/genersoft/iot/vmp/conf/SipConfig.java b/src/main/java/com/genersoft/iot/vmp/conf/SipConfig.java
index 339389f..2694de3 100644
--- a/src/main/java/com/genersoft/iot/vmp/conf/SipConfig.java
+++ b/src/main/java/com/genersoft/iot/vmp/conf/SipConfig.java
@@ -12,6 +12,8 @@
 	Integer sipPort;
 	@Value("${sip.domain}")
 	String sipDomain;
+	@Value("${sip.id}")
+	String sipId;
 	@Value("${sip.password}")
 	String sipPassword;
 	@Value("${media.ip}")
@@ -77,6 +79,12 @@
 	public void setSpeed(Integer speed) {
 		this.speed = speed;
 	}
-	
-	
+
+	public String getSipId() {
+		return sipId;
+	}
+
+	public void setSipId(String sipId) {
+		this.sipId = sipId;
+	}
 }
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/SipLayer.java b/src/main/java/com/genersoft/iot/vmp/gb28181/SipLayer.java
index 2f585d2..cfea026 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/SipLayer.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/SipLayer.java
@@ -117,7 +117,7 @@
 	@Override
 	public void processRequest(RequestEvent evt) {
 		ISIPRequestProcessor processor = processorFactory.createRequestProcessor(evt);
-		processor.process(evt, this, getServerTransaction(evt));
+		processor.process(evt, this);
 	}
 
 	@Override
@@ -200,7 +200,7 @@
 
 	}
 
-	private ServerTransaction getServerTransaction(RequestEvent evt) {
+	public ServerTransaction getServerTransaction(RequestEvent evt) {
 		Request request = evt.getRequest();
 		ServerTransaction serverTransaction = evt.getServerTransaction();
 		// 鍒ゆ柇TCP杩樻槸UDP
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/utils/SsrcUtil.java b/src/main/java/com/genersoft/iot/vmp/gb28181/session/SsrcUtil.java
similarity index 97%
rename from src/main/java/com/genersoft/iot/vmp/gb28181/utils/SsrcUtil.java
rename to src/main/java/com/genersoft/iot/vmp/gb28181/session/SsrcUtil.java
index 023b4f9..9e887da 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/utils/SsrcUtil.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/session/SsrcUtil.java
@@ -1,4 +1,4 @@
-package com.genersoft.iot.vmp.gb28181.utils;
+package com.genersoft.iot.vmp.gb28181.session;
 
 import java.util.ArrayList;
 import java.util.List;
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/session/VideoStreamSessionManager.java b/src/main/java/com/genersoft/iot/vmp/gb28181/session/VideoStreamSessionManager.java
new file mode 100644
index 0000000..f8b9350
--- /dev/null
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/session/VideoStreamSessionManager.java
@@ -0,0 +1,41 @@
+package com.genersoft.iot.vmp.gb28181.session;
+
+import java.util.concurrent.ConcurrentHashMap;
+
+import javax.sip.ClientTransaction;
+
+import org.springframework.stereotype.Component;
+
+/**    
+ * @Description:瑙嗛娴乻ession绠$悊鍣紝绠$悊瑙嗛棰勮銆侀瑙堝洖鏀剧殑閫氫俊鍙ユ焺 
+ * @author: songww
+ * @date:   2020骞�5鏈�13鏃� 涓嬪崍4:03:02     
+ */
+@Component
+public class VideoStreamSessionManager {
+
+	private ConcurrentHashMap<String, ClientTransaction> sessionMap = new ConcurrentHashMap<>();
+
+	public String createPlaySsrc(){
+		String ssrc = SsrcUtil.getPlaySsrc();
+		return ssrc;
+	}
+	
+	public String createPlayBackSsrc(){
+		String ssrc = SsrcUtil.getPlayBackSsrc();
+		return ssrc;
+	}
+	
+	public void put(String ssrc,ClientTransaction transaction){
+		sessionMap.put(ssrc, transaction);
+	}
+	
+	public ClientTransaction get(String ssrc){
+		return sessionMap.get(ssrc);
+	}
+	
+	public void remove(String ssrc) {
+		sessionMap.remove(ssrc);
+		SsrcUtil.releaseSsrc(ssrc);
+	}
+}
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/ISIPCommander.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/ISIPCommander.java
index 1039a35..8b190d5 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/ISIPCommander.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/ISIPCommander.java
@@ -82,6 +82,13 @@
 	public String playbackStreamCmd(Device device,String channelId, String startTime, String endTime);
 	
 	/**
+	 * 瑙嗛娴佸仠姝�
+	 * 
+	 * @param ssrc  ssrc
+	 */
+	public void streamByeCmd(String ssrc);
+	
+	/**
 	 * 璇煶骞挎挱
 	 * 
 	 * @param device  瑙嗛璁惧
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 5adbf66..b4eb4d2 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
@@ -46,14 +46,15 @@
 		ArrayList<ViaHeader> viaHeaders = new ArrayList<ViaHeader>();
 		ViaHeader viaHeader = layer.getHeaderFactory().createViaHeader(sipConfig.getSipIp(), sipConfig.getSipPort(),
 				device.getTransport(), viaTag);
+		viaHeader.setRPort();
 		viaHeaders.add(viaHeader);
 		// from
-		SipURI fromSipURI = layer.getAddressFactory().createSipURI(device.getDeviceId(),
+		SipURI fromSipURI = layer.getAddressFactory().createSipURI(sipConfig.getSipId(),
 				sipConfig.getSipIp() + ":" + sipConfig.getSipPort());
 		Address fromAddress = layer.getAddressFactory().createAddress(fromSipURI);
 		FromHeader fromHeader = layer.getHeaderFactory().createFromHeader(fromAddress, fromTag);
 		// to
-		SipURI toSipURI = layer.getAddressFactory().createSipURI(device.getDeviceId(), host.getAddress());
+		SipURI toSipURI = layer.getAddressFactory().createSipURI(device.getDeviceId(), sipConfig.getSipDomain());
 		Address toAddress = layer.getAddressFactory().createAddress(toSipURI);
 		ToHeader toHeader = layer.getHeaderFactory().createToHeader(toAddress, toTag);
 		// callid
@@ -71,6 +72,49 @@
 		return request;
 	}
 	
+//	public Request createInviteRequest(Device device, String content, String viaTag, String fromTag, String toTag) throws ParseException, InvalidArgumentException {
+//		Request request = null;
+//		Host host = device.getHost();
+//		//璇锋眰琛�
+//		SipURI requestLine = layer.getAddressFactory().createSipURI(device.getDeviceId(), host.getAddress());
+//		//via
+//		ArrayList<ViaHeader> viaHeaders = new ArrayList<ViaHeader>();
+//		ViaHeader viaHeader = layer.getHeaderFactory().createViaHeader(sipConfig.getSipIp(), sipConfig.getSipPort(), device.getTransport(), viaTag);
+//		viaHeader.setRPort();
+//		viaHeaders.add(viaHeader);
+//		//from
+//		SipURI fromSipURI = layer.getAddressFactory().createSipURI(device.getDeviceId(),sipConfig.getSipIp()+":"+sipConfig.getSipPort());
+//		Address fromAddress = layer.getAddressFactory().createAddress(fromSipURI);
+//		FromHeader fromHeader = layer.getHeaderFactory().createFromHeader(fromAddress, fromTag); //蹇呴』瑕佹湁鏍囪锛屽惁鍒欐棤娉曞垱寤轰細璇濓紝鏃犳硶鍥炲簲ack
+//		//to
+//		SipURI toSipURI = layer.getAddressFactory().createSipURI(device.getDeviceId(),host.getAddress()); 
+//		Address toAddress = layer.getAddressFactory().createAddress(toSipURI);
+//		ToHeader toHeader = layer.getHeaderFactory().createToHeader(toAddress,null);
+//
+//		//callid
+//		CallIdHeader callIdHeader = null;
+//		if(device.getTransport().equals("TCP")) {
+//			callIdHeader = layer.getTcpSipProvider().getNewCallId();
+//		}
+//		if(device.getTransport().equals("UDP")) {
+//			callIdHeader = layer.getUdpSipProvider().getNewCallId();
+//		}
+//		
+//		//Forwards
+//		MaxForwardsHeader maxForwards = layer.getHeaderFactory().createMaxForwardsHeader(70);
+//		
+//		//ceq
+//		CSeqHeader cSeqHeader = layer.getHeaderFactory().createCSeqHeader(1L, Request.INVITE);
+//		request = layer.getMessageFactory().createRequest(requestLine, Request.INVITE, callIdHeader, cSeqHeader,fromHeader, toHeader, viaHeaders, maxForwards);
+//		
+//		Address concatAddress = layer.getAddressFactory().createAddress(layer.getAddressFactory().createSipURI(sipConfig.getSipId(), sipConfig.getSipIp()+":"+sipConfig.getSipPort()));
+//		request.addHeader(layer.getHeaderFactory().createContactHeader(concatAddress));
+//		
+//		ContentTypeHeader contentTypeHeader = layer.getHeaderFactory().createContentTypeHeader("Application", "SDP");
+//		request.setContent(content, contentTypeHeader);
+//		return request;
+//	}
+	
 	public Request createInviteRequest(Device device, String content, String viaTag, String fromTag, String toTag) throws ParseException, InvalidArgumentException {
 		Request request = null;
 		Host host = device.getHost();
@@ -82,11 +126,11 @@
 		viaHeader.setRPort();
 		viaHeaders.add(viaHeader);
 		//from
-		SipURI fromSipURI = layer.getAddressFactory().createSipURI(device.getDeviceId(),sipConfig.getSipIp()+":"+sipConfig.getSipPort());
+		SipURI fromSipURI = layer.getAddressFactory().createSipURI(sipConfig.getSipId(),sipConfig.getSipDomain());
 		Address fromAddress = layer.getAddressFactory().createAddress(fromSipURI);
 		FromHeader fromHeader = layer.getHeaderFactory().createFromHeader(fromAddress, fromTag); //蹇呴』瑕佹湁鏍囪锛屽惁鍒欐棤娉曞垱寤轰細璇濓紝鏃犳硶鍥炲簲ack
 		//to
-		SipURI toSipURI = layer.getAddressFactory().createSipURI(device.getDeviceId(),host.getAddress()); 
+		SipURI toSipURI = layer.getAddressFactory().createSipURI(device.getDeviceId(),sipConfig.getSipDomain()); 
 		Address toAddress = layer.getAddressFactory().createAddress(toSipURI);
 		ToHeader toHeader = layer.getHeaderFactory().createToHeader(toAddress,null);
 
@@ -101,9 +145,14 @@
 		
 		//Forwards
 		MaxForwardsHeader maxForwards = layer.getHeaderFactory().createMaxForwardsHeader(70);
+		
 		//ceq
 		CSeqHeader cSeqHeader = layer.getHeaderFactory().createCSeqHeader(1L, Request.INVITE);
 		request = layer.getMessageFactory().createRequest(requestLine, Request.INVITE, callIdHeader, cSeqHeader,fromHeader, toHeader, viaHeaders, maxForwards);
+		
+		Address concatAddress = layer.getAddressFactory().createAddress(layer.getAddressFactory().createSipURI(sipConfig.getSipId(), sipConfig.getSipIp()+":"+sipConfig.getSipPort()));
+		request.addHeader(layer.getHeaderFactory().createContactHeader(concatAddress));
+		
 		ContentTypeHeader contentTypeHeader = layer.getHeaderFactory().createContentTypeHeader("Application", "SDP");
 		request.setContent(content, contentTypeHeader);
 		return request;
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 a6b512f..6213d7d 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
@@ -3,8 +3,11 @@
 import java.text.ParseException;
 
 import javax.sip.ClientTransaction;
+import javax.sip.Dialog;
 import javax.sip.InvalidArgumentException;
 import javax.sip.SipException;
+import javax.sip.TransactionDoesNotExistException;
+import javax.sip.header.ViaHeader;
 import javax.sip.message.Request;
 
 import org.springframework.beans.factory.annotation.Autowired;
@@ -13,10 +16,10 @@
 import com.genersoft.iot.vmp.conf.SipConfig;
 import com.genersoft.iot.vmp.gb28181.SipLayer;
 import com.genersoft.iot.vmp.gb28181.bean.Device;
+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.DateUtil;
-import com.genersoft.iot.vmp.gb28181.utils.SsrcUtil;
 
 /**    
  * @Description:璁惧鑳藉姏鎺ュ彛锛岀敤浜庡畾涔夎澶囩殑鎺у埗銆佹煡璇㈣兘鍔�   
@@ -34,6 +37,9 @@
 	
 	@Autowired
 	private SipLayer sipLayer;
+	
+	@Autowired
+	private VideoStreamSessionManager streamSession;
 	
 	/**
 	 * 浜戝彴鏂瑰悜鏀炬帶鍒讹紝浣跨敤閰嶇疆鏂囦欢涓殑榛樿闀滃ご绉诲姩閫熷害
@@ -135,11 +141,11 @@
 	public String playStreamCmd(Device device, String channelId) {
 		try {
 			
-			String ssrc = SsrcUtil.getPlaySsrc();
+			String ssrc = streamSession.createPlaySsrc();
 			//
 			StringBuffer content = new StringBuffer(200);
 	        content.append("v=0\r\n");
-	        content.append("o="+channelId+" 0 0 IN IP4 "+sipConfig.getSipIp()+"\r\n");
+	        content.append("o="+channelId+" 0 0 IN IP4 "+sipConfig.getMediaIp()+"\r\n");
 	        content.append("s=Play\r\n");
 	        content.append("c=IN IP4 "+sipConfig.getMediaIp()+"\r\n");
 	        content.append("t=0 0\r\n");
@@ -161,7 +167,8 @@
 	        
 	        Request request = headerProvider.createInviteRequest(device, content.toString(), null, "live", null);
 	
-	        transmitRequest(device, request);
+	        ClientTransaction transaction = transmitRequest(device, request);
+	        streamSession.put(ssrc, transaction);
 			return ssrc;
 		} catch ( SipException | ParseException | InvalidArgumentException e) {
 			e.printStackTrace();
@@ -181,11 +188,11 @@
 	public String playbackStreamCmd(Device device, String channelId, String startTime, String endTime) {
 		try {
 			
-			String ssrc = SsrcUtil.getPlayBackSsrc();
+			String ssrc = streamSession.createPlayBackSsrc();
 			//
 			StringBuffer content = new StringBuffer(200);
 	        content.append("v=0\r\n");
-	        content.append("o="+device.getDeviceId()+" 0 0 IN IP4 "+sipConfig.getSipIp()+"\r\n");
+	        content.append("o="+device.getDeviceId()+" 0 0 IN IP4 "+sipConfig.getMediaIp()+"\r\n");
 	        content.append("s=Playback\r\n");
 	        content.append("u="+channelId+":3\r\n");
 	        content.append("c=IN IP4 "+sipConfig.getMediaIp()+"\r\n");
@@ -208,11 +215,48 @@
 	        
 	        Request request = headerProvider.createInviteRequest(device, content.toString(), null, "live", null);
 	
-	        transmitRequest(device, request);
+	        ClientTransaction transaction = transmitRequest(device, request);
+	        streamSession.put(ssrc, transaction);
 			return ssrc;
 		} catch ( SipException | ParseException | InvalidArgumentException e) {
 			e.printStackTrace();
 			return null;
+		}
+	}
+	
+	/**
+	 * 瑙嗛娴佸仠姝�
+	 * 
+	 * @param device  瑙嗛璁惧
+	 * @param channelId  棰勮閫氶亾
+	 */
+	@Override
+	public void streamByeCmd(String ssrc) {
+		
+		try {
+			ClientTransaction transaction = streamSession.get(ssrc);
+			if (transaction == null) {
+				return;
+			}
+			
+			Dialog dialog = transaction.getDialog();
+			if (dialog == null) {
+				return;
+			}
+			Request byeRequest = dialog.createRequest(Request.BYE);
+			ViaHeader viaHeader = (ViaHeader) byeRequest.getHeader(ViaHeader.NAME);
+			String protocol = viaHeader.getTransport();
+			ClientTransaction clientTransaction = null;
+			if("TCP".equals(protocol)) {
+				clientTransaction = sipLayer.getTcpSipProvider().getNewClientTransaction(byeRequest);
+			} else if("UDP".equals(protocol)) {
+				clientTransaction = sipLayer.getUdpSipProvider().getNewClientTransaction(byeRequest);
+			}
+			dialog.sendRequest(clientTransaction);
+		} catch (TransactionDoesNotExistException e) {
+			e.printStackTrace();
+		} catch (SipException e) {
+			e.printStackTrace();
 		}
 	}
 
@@ -435,16 +479,15 @@
 		return false;
 	}
 	
-	private void transmitRequest(Device device, Request request) throws SipException {
+	private ClientTransaction transmitRequest(Device device, Request request) throws SipException {
 		ClientTransaction clientTransaction = null;
-		if(device.getTransport().equals("TCP")) {
+		if("TCP".equals(device.getTransport())) {
 			clientTransaction = sipLayer.getTcpSipProvider().getNewClientTransaction(request);
-			//sipLayer.getTcpSipProvider().sendRequest(request);
-		} else if(device.getTransport().equals("UDP")) {
+		} else if("UDP".equals(device.getTransport())) {
 			clientTransaction = sipLayer.getUdpSipProvider().getNewClientTransaction(request);
-			//sipLayer.getUdpSipProvider().sendRequest(request);
 		}
 		clientTransaction.sendRequest();
+		return clientTransaction;
 	}
 
 }
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/ISIPRequestProcessor.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/ISIPRequestProcessor.java
index a1757f2..53e0ed0 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/ISIPRequestProcessor.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/ISIPRequestProcessor.java
@@ -1,7 +1,6 @@
 package com.genersoft.iot.vmp.gb28181.transmit.request;
 
 import javax.sip.RequestEvent;
-import javax.sip.ServerTransaction;
 
 import com.genersoft.iot.vmp.gb28181.SipLayer;
 
@@ -12,6 +11,6 @@
  */
 public interface ISIPRequestProcessor {
 
-	public void process(RequestEvent evt, SipLayer layer, ServerTransaction transaction);
+	public void process(RequestEvent evt, SipLayer layer);
 
 }
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/AckRequestProcessor.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/AckRequestProcessor.java
index f26d566..7a5b25d 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/AckRequestProcessor.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/AckRequestProcessor.java
@@ -31,7 +31,7 @@
 	 * @param config    
 	 */  
 	@Override
-	public void process(RequestEvent evt, SipLayer layer, ServerTransaction transaction) {
+	public void process(RequestEvent evt, SipLayer layer) {
 		Request request = evt.getRequest();
 		Dialog dialog = evt.getDialog();
 		try {
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/ByeRequestProcessor.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/ByeRequestProcessor.java
index 20dd82f..716f482 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/ByeRequestProcessor.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/ByeRequestProcessor.java
@@ -25,7 +25,7 @@
 	 * @param config    
 	 */  
 	@Override
-	public void process(RequestEvent evt, SipLayer layer, ServerTransaction transaction) {
+	public void process(RequestEvent evt, SipLayer layer) {
 		// TODO Auto-generated method stub
 		
 	}
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/CancelRequestProcessor.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/CancelRequestProcessor.java
index c500829..d463af4 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/CancelRequestProcessor.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/CancelRequestProcessor.java
@@ -25,7 +25,7 @@
 	 * @param config    
 	 */  
 	@Override
-	public void process(RequestEvent evt, SipLayer layer, ServerTransaction transaction) {
+	public void process(RequestEvent evt, SipLayer layer) {
 		// TODO Auto-generated method stub
 		
 	}
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/InviteRequestProcessor.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/InviteRequestProcessor.java
index 17b592a..0de32c9 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/InviteRequestProcessor.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/InviteRequestProcessor.java
@@ -23,7 +23,7 @@
 	 *            璇锋眰娑堟伅
 	 */ 
 	@Override
-	public void process(RequestEvent evt, SipLayer layer, ServerTransaction transaction) {
+	public void process(RequestEvent evt, SipLayer layer) {
 		// TODO Auto-generated method stub
 //		Request request = requestEvent.getRequest();
 //
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/MessageRequestProcessor.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/MessageRequestProcessor.java
index 8a7c6cf..fd5ca37 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/MessageRequestProcessor.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/MessageRequestProcessor.java
@@ -93,10 +93,10 @@
 	 * @param transaction  
 	 */  
 	@Override
-	public void process(RequestEvent evt, SipLayer layer, ServerTransaction transaction) {
+	public void process(RequestEvent evt, SipLayer layer) {
 		
 		this.layer = layer;
-		this.transaction = transaction;
+		this.transaction = layer.getServerTransaction(evt);
 		
 		Request request = evt.getRequest();
 		SAXReader reader = new SAXReader();
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/OtherRequestProcessor.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/OtherRequestProcessor.java
index 227240d..e516767 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/OtherRequestProcessor.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/OtherRequestProcessor.java
@@ -25,7 +25,7 @@
 	 * @param config    
 	 */  
 	@Override
-	public void process(RequestEvent evt, SipLayer layer, ServerTransaction transaction) {
+	public void process(RequestEvent evt, SipLayer layer) {
 		System.out.println("no support the method! Method:" + evt.getRequest().getMethod());
 	}
 
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/RegisterRequestProcessor.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/RegisterRequestProcessor.java
index 7ca2e43..ca1ba5d 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/RegisterRequestProcessor.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/RegisterRequestProcessor.java
@@ -63,7 +63,7 @@
 	 *            璇锋眰娑堟伅
 	 */ 
 	@Override
-	public void process(RequestEvent evt, SipLayer layer, ServerTransaction transaction) {
+	public void process(RequestEvent evt, SipLayer layer) {
 		try {
 			System.out.println("鏀跺埌娉ㄥ唽璇锋眰锛屽紑濮嬪鐞�");
 			Request request = evt.getRequest();
@@ -141,7 +141,7 @@
 					device.setTransport(isTcp ? "TCP" : "UDP");
 				}
 			}
-			transaction.sendResponse(response);
+			layer.getServerTransaction(evt).sendResponse(response);
 			// 娉ㄥ唽鎴愬姛
 			// 淇濆瓨鍒皉edis
 			// 涓嬪彂catelog鏌ヨ鐩綍
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/SubscribeRequestProcessor.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/SubscribeRequestProcessor.java
index 47761d0..b0c05a8 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/SubscribeRequestProcessor.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/SubscribeRequestProcessor.java
@@ -32,7 +32,7 @@
 	 * @param config    
 	 */
 	@Override
-	public void process(RequestEvent evt, SipLayer layer, ServerTransaction transaction) {
+	public void process(RequestEvent evt, SipLayer layer) {
 		Request request = evt.getRequest();
 
 		try {
@@ -43,7 +43,7 @@
 				response.setExpires(expireHeader);
 			}
 			System.out.println("response : " + response.toString());
-
+			ServerTransaction transaction = layer.getServerTransaction(evt);
 			if (transaction != null) {
 				transaction.sendResponse(response);
 				transaction.terminate();
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/response/impl/InviteResponseProcessor.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/response/impl/InviteResponseProcessor.java
index f825584..9b1783f 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/response/impl/InviteResponseProcessor.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/response/impl/InviteResponseProcessor.java
@@ -50,30 +50,32 @@
 			//鎴愬姛鍝嶅簲
 			//涓嬪彂ack
 			if(statusCode == Response.OK){
-				ClientTransaction clientTransaction = evt.getClientTransaction();
-				if(clientTransaction == null){
-					logger.error("鍥炲ACK鏃讹紝clientTransaction涓簄ull >>> {}",response);
-					return;
-				}
-				Dialog clientDialog = clientTransaction.getDialog();
-
-				CSeqHeader clientCSeqHeader = (CSeqHeader) response.getHeader(CSeqHeader.NAME);
-				long cseqId = clientCSeqHeader.getSeqNumber();
-				/*
-				createAck鍑芥暟锛屽垱寤虹殑ackRequest锛屼細閲囩敤Invite鍝嶅簲鐨�200OK锛屼腑鐨刢ontact瀛楁涓殑鍦板潃锛屼綔涓虹洰鏍囧湴鍧�銆�
-				鏈夌殑缁堢浼犱笂鏉ョ殑鍙兘杩樻槸鍐呯綉鍦板潃锛屼細閫犳垚ack鍙戦�佷笉鍑哄幓銆傛帴鍙椾笉鍒伴煶瑙嗛娴�
-				鎵�浠ュ湪姝ゅ缁熶竴鏇挎崲鍦板潃銆傚拰鍝嶅簲娑堟伅鐨刅ia澶翠腑鐨勫湴鍧�淇濇寔涓�鑷淬��
-				 */
-				Request ackRequest = clientDialog.createAck(cseqId);
-				SipURI requestURI = (SipURI) ackRequest.getRequestURI();
-				ViaHeader viaHeader = (ViaHeader) response.getHeader(ViaHeader.NAME);
-				requestURI.setHost(viaHeader.getHost());
-				requestURI.setPort(viaHeader.getPort());
-				clientDialog.sendAck(ackRequest);
+//				ClientTransaction clientTransaction = evt.getClientTransaction();
+//				if(clientTransaction == null){
+//					logger.error("鍥炲ACK鏃讹紝clientTransaction涓簄ull >>> {}",response);
+//					return;
+//				}
+//				Dialog clientDialog = clientTransaction.getDialog();
+//
+//				CSeqHeader clientCSeqHeader = (CSeqHeader) response.getHeader(CSeqHeader.NAME);
+//				long cseqId = clientCSeqHeader.getSeqNumber();
+//				/*
+//				createAck鍑芥暟锛屽垱寤虹殑ackRequest锛屼細閲囩敤Invite鍝嶅簲鐨�200OK锛屼腑鐨刢ontact瀛楁涓殑鍦板潃锛屼綔涓虹洰鏍囧湴鍧�銆�
+//				鏈夌殑缁堢浼犱笂鏉ョ殑鍙兘杩樻槸鍐呯綉鍦板潃锛屼細閫犳垚ack鍙戦�佷笉鍑哄幓銆傛帴鍙椾笉鍒伴煶瑙嗛娴�
+//				鎵�浠ュ湪姝ゅ缁熶竴鏇挎崲鍦板潃銆傚拰鍝嶅簲娑堟伅鐨刅ia澶翠腑鐨勫湴鍧�淇濇寔涓�鑷淬��
+//				 */
+//				Request ackRequest = clientDialog.createAck(cseqId);
+//				SipURI requestURI = (SipURI) ackRequest.getRequestURI();
+//				ViaHeader viaHeader = (ViaHeader) response.getHeader(ViaHeader.NAME);
+//				requestURI.setHost(viaHeader.getHost());
+//				requestURI.setPort(viaHeader.getPort());
+//				clientDialog.sendAck(ackRequest);
+				
+				Dialog dialog = evt.getDialog();
+				Request reqAck =dialog.createAck(1L);
+				dialog.sendAck(reqAck);
 			}
 		} catch (InvalidArgumentException | SipException e) {
-			e.printStackTrace();
-		} catch (ParseException e) {
 			e.printStackTrace();
 		}
 	}
diff --git a/src/main/java/com/genersoft/iot/vmp/storager/redis/VideoManagerRedisStoragerImpl.java b/src/main/java/com/genersoft/iot/vmp/storager/redis/VideoManagerRedisStoragerImpl.java
index cad5e1f..54fa692 100644
--- a/src/main/java/com/genersoft/iot/vmp/storager/redis/VideoManagerRedisStoragerImpl.java
+++ b/src/main/java/com/genersoft/iot/vmp/storager/redis/VideoManagerRedisStoragerImpl.java
@@ -96,8 +96,7 @@
 	 */  
 	@Override
 	public boolean delete(String deviceId) {
-		redis.del(VideoManagerConstants.CACHEKEY_PREFIX+deviceId);
-		return true;  
+		return redis.del(VideoManagerConstants.CACHEKEY_PREFIX+deviceId);
 	}
 
 	/**   
diff --git a/src/main/java/com/genersoft/iot/vmp/utils/redis/RedisUtil.java b/src/main/java/com/genersoft/iot/vmp/utils/redis/RedisUtil.java
index 0427f8b..a03f9aa 100644
--- a/src/main/java/com/genersoft/iot/vmp/utils/redis/RedisUtil.java
+++ b/src/main/java/com/genersoft/iot/vmp/utils/redis/RedisUtil.java
@@ -68,14 +68,20 @@
      * @SuppressWarnings("unchecked") 蹇界暐绫诲瀷杞崲璀﹀憡
      * @param key 閿紙涓�涓垨鑰呭涓級
      */
-    public void del(String... key) {
-        if (key != null && key.length > 0) {
-            if (key.length == 1) {
-                redisTemplate.delete(key[0]);
-            } else {
-//                浼犲叆涓�涓� Collection<String> 闆嗗悎
-                redisTemplate.delete(CollectionUtils.arrayToList(key));
+    public boolean del(String... key) {
+    	try {
+    		if (key != null && key.length > 0) {
+                if (key.length == 1) {
+                    redisTemplate.delete(key[0]);
+                } else {
+//                    浼犲叆涓�涓� Collection<String> 闆嗗悎
+                    redisTemplate.delete(CollectionUtils.arrayToList(key));
+                }
             }
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
         }
     }
 
diff --git a/src/main/java/com/genersoft/iot/vmp/vmanager/device/DeviceController.java b/src/main/java/com/genersoft/iot/vmp/vmanager/device/DeviceController.java
index 3115933..60b48b1 100644
--- a/src/main/java/com/genersoft/iot/vmp/vmanager/device/DeviceController.java
+++ b/src/main/java/com/genersoft/iot/vmp/vmanager/device/DeviceController.java
@@ -14,7 +14,9 @@
 import org.springframework.web.bind.annotation.RestController;
 import org.springframework.web.context.request.async.DeferredResult;
 
+import com.alibaba.fastjson.JSONObject;
 import com.genersoft.iot.vmp.gb28181.bean.Device;
+import com.genersoft.iot.vmp.gb28181.event.DeviceOffLineDetector;
 import com.genersoft.iot.vmp.gb28181.transmit.callback.DeferredResultHolder;
 import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommander;
 import com.genersoft.iot.vmp.storager.IVideoManagerStorager;
@@ -33,6 +35,9 @@
 	
 	@Autowired
 	private DeferredResultHolder resultHolder;
+	
+	@Autowired
+	private DeviceOffLineDetector offLineDetector;
 	
 	@GetMapping("/devices/{deviceId}")
 	public ResponseEntity<Device> devices(@PathVariable String deviceId){
@@ -69,4 +74,25 @@
         resultHolder.put(DeferredResultHolder.CALLBACK_CMD_CATALOG+deviceId, result);
         return result;
 	}
+	
+	@PostMapping("/devices/{deviceId}/delete")
+	public ResponseEntity<String> delete(@PathVariable String deviceId){
+		
+		if (logger.isDebugEnabled()) {
+			logger.debug("璁惧淇℃伅鍒犻櫎API璋冪敤锛宒eviceId锛�" + deviceId);
+		}
+		
+		if (offLineDetector.isOnline(deviceId)) {
+			return new ResponseEntity<String>("涓嶅厑璁稿垹闄ゅ湪绾胯澶囷紒", HttpStatus.NOT_ACCEPTABLE);
+		}
+		boolean isSuccess = storager.delete(deviceId);
+		if (isSuccess) {
+			JSONObject json = new JSONObject();
+			json.put("deviceId", deviceId);
+			return new ResponseEntity<>(json.toString(),HttpStatus.OK);
+		} else {
+			logger.warn("璁惧棰勮API璋冪敤澶辫触锛�");
+			return new ResponseEntity<String>("璁惧棰勮API璋冪敤澶辫触锛�", HttpStatus.INTERNAL_SERVER_ERROR);
+		}
+	}
 }
diff --git a/src/main/java/com/genersoft/iot/vmp/vmanager/play/PlayController.java b/src/main/java/com/genersoft/iot/vmp/vmanager/play/PlayController.java
index 9370355..51e5074 100644
--- a/src/main/java/com/genersoft/iot/vmp/vmanager/play/PlayController.java
+++ b/src/main/java/com/genersoft/iot/vmp/vmanager/play/PlayController.java
@@ -7,6 +7,7 @@
 import org.springframework.http.ResponseEntity;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
@@ -47,4 +48,23 @@
 			return new ResponseEntity<String>(HttpStatus.INTERNAL_SERVER_ERROR);
 		}
 	}
+	
+	@PostMapping("/play/{ssrc}/stop")
+	public ResponseEntity<String> playStop(@PathVariable String ssrc){
+		
+		cmder.streamByeCmd(ssrc);
+		
+		if (logger.isDebugEnabled()) {
+			logger.debug(String.format("璁惧棰勮鍋滄API璋冪敤锛宻src锛�%s", ssrc));
+		}
+		
+		if(ssrc!=null) {
+			JSONObject json = new JSONObject();
+			json.put("ssrc", ssrc);
+			return new ResponseEntity<String>(json.toString(),HttpStatus.OK);
+		} else {
+			logger.warn("璁惧棰勮鍋滄API璋冪敤澶辫触锛�");
+			return new ResponseEntity<String>(HttpStatus.INTERNAL_SERVER_ERROR);
+		}
+	}
 }
diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml
index 02dc489..4ec320e 100644
--- a/src/main/resources/application.yml
+++ b/src/main/resources/application.yml
@@ -26,7 +26,7 @@
 server:
     port: 8080
 sip:
-    ip: 127.0.0.1
+    ip: 10.200.64.63
     port: 5060
     # 鏍规嵁鍥芥爣6.1.2涓瀹氾紝domain瀹滈噰鐢↖D缁熶竴缂栫爜鐨勫墠鍗佷綅缂栫爜銆傚浗鏍囬檮褰旸涓畾涔夊墠8浣嶄负涓績缂栫爜锛堢敱鐪佺骇銆佸競绾с�佸尯绾с�佸熀灞傜紪鍙风粍鎴愶紝鍙傜収GB/T 2260-2007锛�
     # 鍚庝袱浣嶄负琛屼笟缂栫爜锛屽畾涔夊弬鐓ч檮褰旸.3

--
Gitblit v1.8.0