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