From f2279859b367fda6108a5ea22c572d38d89d338d Mon Sep 17 00:00:00 2001 From: panlinlin <648540858@qq.com> Date: 星期六, 26 十二月 2020 16:44:27 +0800 Subject: [PATCH] 增加对水星IPC的兼容 增加对SIP错误的订阅,刷新通道或点播或回放出现sip错误时及时返回给页面 优化UI,增加按钮loading --- src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java | 65 +++++++++++++++++++++----------- 1 files changed, 42 insertions(+), 23 deletions(-) diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java index 7d91d7b..61ed270 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 @@ -4,22 +4,22 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; -import javax.sip.ClientTransaction; -import javax.sip.Dialog; -import javax.sip.InvalidArgumentException; -import javax.sip.SipException; -import javax.sip.SipProvider; -import javax.sip.TransactionDoesNotExistException; +import javax.sip.*; import javax.sip.address.SipURI; +import javax.sip.header.CallIdHeader; +import javax.sip.header.Header; import javax.sip.header.ViaHeader; import javax.sip.message.Request; import com.alibaba.fastjson.JSONObject; import com.genersoft.iot.vmp.conf.MediaServerConfig; import com.genersoft.iot.vmp.gb28181.bean.DeviceChannel; +import com.genersoft.iot.vmp.gb28181.event.SipSubscribe; import com.genersoft.iot.vmp.media.zlm.ZLMHttpHookSubscribe; import com.genersoft.iot.vmp.media.zlm.ZLMRTPServerFactory; import com.genersoft.iot.vmp.storager.IVideoManagerStorager; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Value; @@ -39,6 +39,8 @@ */ @Component public class SIPCommander implements ISIPCommander { + + private final Logger logger = LoggerFactory.getLogger(SIPCommander.class); @Autowired private SipConfig sipConfig; @@ -68,6 +70,9 @@ @Autowired private ZLMHttpHookSubscribe subscribe; + + @Autowired + private SipSubscribe sipSubscribe; @@ -221,7 +226,7 @@ Request request = headerProvider.createMessageRequest(device, ptzXml.toString(), "ViaPtzBranch", "FromPtzTag", "ToPtzTag"); - transmitRequest(device, request); + transmitRequest(device, request, null); return true; } catch (SipException | ParseException | InvalidArgumentException e) { e.printStackTrace(); @@ -256,22 +261,23 @@ ptzXml.append("</Control>\r\n"); Request request = headerProvider.createMessageRequest(device, ptzXml.toString(), "ViaPtzBranch", "FromPtzTag", "ToPtzTag"); - - transmitRequest(device, request); + transmitRequest(device, request, null); return true; } catch (SipException | ParseException | InvalidArgumentException e) { e.printStackTrace(); } return false; } + /** - * 璇锋眰棰勮瑙嗛娴� - * + * 璇锋眰棰勮瑙嗛娴� * @param device 瑙嗛璁惧 * @param channelId 棰勮閫氶亾 + * @param event hook璁㈤槄 + * @param errorEvent sip閿欒璁㈤槄 */ @Override - public void playStreamCmd(Device device, String channelId, ZLMHttpHookSubscribe.Event event) { + public void playStreamCmd(Device device, String channelId, ZLMHttpHookSubscribe.Event event, SipSubscribe.Event errorEvent) { try { String ssrc = streamSession.createPlaySsrc(); @@ -300,7 +306,8 @@ // StringBuffer content = new StringBuffer(200); content.append("v=0\r\n"); - content.append("o="+channelId+" 0 0 IN IP4 "+mediaInfo.getWanIp()+"\r\n"); +// content.append("o="+channelId+" 0 0 IN IP4 "+mediaInfo.getWanIp()+"\r\n"); + content.append("o="+"00000"+" 0 0 IN IP4 "+mediaInfo.getWanIp()+"\r\n"); content.append("s=Play\r\n"); content.append("c=IN IP4 "+mediaInfo.getWanIp()+"\r\n"); content.append("t=0 0\r\n"); @@ -332,7 +339,7 @@ Request request = headerProvider.createInviteRequest(device, channelId, content.toString(), null, "live", null, ssrc); - ClientTransaction transaction = transmitRequest(device, request); + ClientTransaction transaction = transmitRequest(device, request, errorEvent); streamSession.put(streamId, transaction); DeviceChannel deviceChannel = storager.queryChannel(device.getDeviceId(), channelId); if (deviceChannel != null) { @@ -357,7 +364,8 @@ * @param endTime 缁撴潫鏃堕棿,鏍煎紡瑕佹眰锛歽yyy-MM-dd HH:mm:ss */ @Override - public void playbackStreamCmd(Device device, String channelId, String startTime, String endTime, ZLMHttpHookSubscribe.Event event) { + public void playbackStreamCmd(Device device, String channelId, String startTime, String endTime, ZLMHttpHookSubscribe.Event event + , SipSubscribe.Event errorEvent) { try { MediaServerConfig mediaInfo = storager.getMediaInfo(); String ssrc = streamSession.createPlayBackSsrc(); @@ -413,8 +421,8 @@ content.append("y="+ssrc+"\r\n");//ssrc Request request = headerProvider.createPlaybackInviteRequest(device, channelId, content.toString(), null, "playback", null); - - ClientTransaction transaction = transmitRequest(device, request); + + ClientTransaction transaction = transmitRequest(device, request, errorEvent); streamSession.put(streamId, transaction); } catch ( SipException | ParseException | InvalidArgumentException e) { @@ -575,7 +583,8 @@ catalogXml.append("</Query>\r\n"); Request request = headerProvider.createMessageRequest(device, catalogXml.toString(), "ViaDeviceInfoBranch", "FromDeviceInfoTag", "ToDeviceInfoTag"); - transmitRequest(device, request); + + transmitRequest(device, request, null); } catch (SipException | ParseException | InvalidArgumentException e) { e.printStackTrace(); @@ -590,7 +599,7 @@ * @param device 瑙嗛璁惧 */ @Override - public boolean catalogQuery(Device device) { + public boolean catalogQuery(Device device, SipSubscribe.Event errorEvent) { // 娓呯┖閫氶亾 storager.cleanChannelsForDevice(device.getDeviceId()); try { @@ -602,8 +611,9 @@ catalogXml.append("<DeviceID>" + device.getDeviceId() + "</DeviceID>\r\n"); catalogXml.append("</Query>\r\n"); - Request request = headerProvider.createMessageRequest(device, catalogXml.toString(), "ViaCatalogBranch", "FromCatalogTag", "ToCatalogTag"); - transmitRequest(device, request); + Request request = headerProvider.createMessageRequest(device, catalogXml.toString(), "ViaCatalogBranch", "FromCatalogTag", null); + + transmitRequest(device, request, errorEvent); } catch (SipException | ParseException | InvalidArgumentException e) { e.printStackTrace(); return false; @@ -636,7 +646,9 @@ recordInfoXml.append("</Query>\r\n"); Request request = headerProvider.createMessageRequest(device, recordInfoXml.toString(), "ViaRecordInfoBranch", "FromRecordInfoTag", "ToRecordInfoTag"); - transmitRequest(device, request); + + + transmitRequest(device, request, null); } catch (SipException | ParseException | InvalidArgumentException e) { e.printStackTrace(); return false; @@ -688,13 +700,20 @@ return false; } - private ClientTransaction transmitRequest(Device device, Request request) throws SipException { + private ClientTransaction transmitRequest(Device device, Request request, SipSubscribe.Event errorEvent) throws SipException { ClientTransaction clientTransaction = null; if("TCP".equals(device.getTransport())) { clientTransaction = tcpSipProvider.getNewClientTransaction(request); } else if("UDP".equals(device.getTransport())) { clientTransaction = udpSipProvider.getNewClientTransaction(request); } + + // 娣诲姞璁㈤槄 + if (errorEvent != null) { + CallIdHeader callIdHeader = (CallIdHeader)request.getHeader(CallIdHeader.NAME); + sipSubscribe.addSubscribe(callIdHeader.getCallId(), errorEvent); + } + clientTransaction.sendRequest(); return clientTransaction; } -- Gitblit v1.8.0