From 80d2edeef25f752e0a80a6cff99e38f61c2d2cb2 Mon Sep 17 00:00:00 2001 From: 648540858 <648540858@qq.com> Date: 星期二, 18 十月 2022 13:07:38 +0800 Subject: [PATCH] 优化sip消息构建,去除ServerTransaction的使用 --- src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/SIPRequestProcessorParent.java | 143 ++++++++++++++++++++++++----------------------- 1 files changed, 74 insertions(+), 69 deletions(-) diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/SIPRequestProcessorParent.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/SIPRequestProcessorParent.java index 8c6ab99..a274814 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/SIPRequestProcessorParent.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/SIPRequestProcessorParent.java @@ -1,13 +1,11 @@ package com.genersoft.iot.vmp.gb28181.transmit.event.request; import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform; +import com.genersoft.iot.vmp.gb28181.transmit.SIPSender; import com.genersoft.iot.vmp.gb28181.utils.SipUtils; import gov.nist.javax.sip.SipProviderImpl; -import gov.nist.javax.sip.SipStackImpl; import gov.nist.javax.sip.message.SIPRequest; import gov.nist.javax.sip.message.SIPResponse; -import gov.nist.javax.sip.stack.SIPServerTransaction; -import gov.nist.javax.sip.stack.SIPServerTransactionImpl; import org.apache.commons.lang3.ArrayUtils; import org.dom4j.Document; import org.dom4j.DocumentException; @@ -51,48 +49,9 @@ @Qualifier(value="udpSipProvider") private SipProviderImpl udpSipProvider; - /** - * 鏍规嵁 RequestEvent 鑾峰彇 ServerTransaction - * @param evt - * @return - */ - public ServerTransaction getServerTransaction(RequestEvent evt) { - Request request = evt.getRequest(); - SIPServerTransactionImpl serverTransaction = (SIPServerTransactionImpl)evt.getServerTransaction(); - // 鍒ゆ柇TCP杩樻槸UDP - boolean isTcp = false; - ViaHeader reqViaHeader = (ViaHeader) request.getHeader(ViaHeader.NAME); - String transport = reqViaHeader.getTransport(); - if (transport.equalsIgnoreCase("TCP")) { - isTcp = true; - } - if (serverTransaction != null && serverTransaction.getOriginalRequest() == null) { - serverTransaction.setOriginalRequest((SIPRequest) evt.getRequest()); - } - if (serverTransaction == null) { - try { - if (isTcp) { - SipStackImpl stack = (SipStackImpl)tcpSipProvider.getSipStack(); - serverTransaction = (SIPServerTransactionImpl) stack.findTransaction((SIPRequest)request, true); - if (serverTransaction == null) { - serverTransaction = (SIPServerTransactionImpl)tcpSipProvider.getNewServerTransaction(request); - } - } else { - SipStackImpl stack = (SipStackImpl)udpSipProvider.getSipStack(); - serverTransaction = (SIPServerTransactionImpl) stack.findTransaction((SIPRequest)request, true); - if (serverTransaction == null) { - serverTransaction = (SIPServerTransactionImpl)udpSipProvider.getNewServerTransaction(request); - } - } - } catch (TransactionAlreadyExistsException e) { - logger.error(e.getMessage()); - } catch (TransactionUnavailableException e) { - logger.error(e.getMessage()); - } - } - return serverTransaction; - } - + @Autowired + private SIPSender sipSender; + public AddressFactory getAddressFactory() { try { return SipFactory.getInstance().createAddressFactory(); @@ -134,25 +93,73 @@ * 400 * 404 */ - public SIPResponse responseAck(ServerTransaction serverTransaction, int statusCode) throws SipException, InvalidArgumentException, ParseException { - return responseAck(serverTransaction, statusCode, null); + public SIPResponse responseAck(SIPRequest sipRequest, int statusCode) throws SipException, InvalidArgumentException, ParseException { + return responseAck(sipRequest, statusCode, null); } - public SIPResponse responseAck(ServerTransaction serverTransaction, int statusCode, String msg) throws SipException, InvalidArgumentException, ParseException { - return responseAck(serverTransaction, statusCode, msg, null); + public SIPResponse responseAck(SIPRequest sipRequest, int statusCode, String msg) throws SipException, InvalidArgumentException, ParseException { + return responseAck(sipRequest, statusCode, msg, null); } - public SIPResponse responseAck(ServerTransaction serverTransaction, int statusCode, String msg, ResponseAckExtraParam responseAckExtraParam) throws SipException, InvalidArgumentException, ParseException { - ToHeader toHeader = (ToHeader) serverTransaction.getRequest().getHeader(ToHeader.NAME); - if (toHeader.getTag() == null) { - toHeader.setTag(SipUtils.getNewTag()); +// public SIPResponse responseAck(ServerTransaction serverTransaction, int statusCode, String msg, ResponseAckExtraParam responseAckExtraParam) throws SipException, InvalidArgumentException, ParseException { +// if (serverTransaction == null) { +// logger.warn("[鍥炲娑堟伅] ServerTransaction 涓簄ull"); +// return null; +// } +// ToHeader toHeader = (ToHeader) serverTransaction.getRequest().getHeader(ToHeader.NAME); +// if (toHeader.getTag() == null) { +// toHeader.setTag(SipUtils.getNewTag()); +// } +// SIPResponse response = (SIPResponse)getMessageFactory().createResponse(statusCode, serverTransaction.getRequest()); +// if (msg != null) { +// response.setReasonPhrase(msg); +// } +// if (responseAckExtraParam != null) { +// if (responseAckExtraParam.sipURI != null && serverTransaction.getRequest().getMethod().equals(Request.INVITE)) { +// logger.debug("responseSdpAck SipURI: {}:{}", responseAckExtraParam.sipURI.getHost(), responseAckExtraParam.sipURI.getPort()); +// Address concatAddress = SipFactory.getInstance().createAddressFactory().createAddress( +// SipFactory.getInstance().createAddressFactory().createSipURI(responseAckExtraParam.sipURI.getUser(), responseAckExtraParam.sipURI.getHost()+":"+responseAckExtraParam.sipURI.getPort() +// )); +// response.addHeader(SipFactory.getInstance().createHeaderFactory().createContactHeader(concatAddress)); +// } +// if (responseAckExtraParam.contentTypeHeader != null) { +// response.setContent(responseAckExtraParam.content, responseAckExtraParam.contentTypeHeader); +// } +// +// if (serverTransaction.getRequest().getMethod().equals(Request.SUBSCRIBE)) { +// if (responseAckExtraParam.expires == -1) { +// logger.error("[鍙傛暟涓嶅叏] 2xx鐨凷UBSCRIBE鍥炲锛屽繀椤昏缃瓻xpires header"); +// }else { +// ExpiresHeader expiresHeader = SipFactory.getInstance().createHeaderFactory().createExpiresHeader(responseAckExtraParam.expires); +// response.addHeader(expiresHeader); +// } +// } +// }else { +// if (serverTransaction.getRequest().getMethod().equals(Request.SUBSCRIBE)) { +// logger.error("[鍙傛暟涓嶅叏] 2xx鐨凷UBSCRIBE鍥炲锛屽繀椤昏缃瓻xpires header"); +// } +// } +// serverTransaction.sendResponse(response); +// if (statusCode >= 200 && !"NOTIFY".equalsIgnoreCase(serverTransaction.getRequest().getMethod())) { +// if (serverTransaction.getDialog() != null) { +// serverTransaction.getDialog().delete(); +// } +// } +// return response; +// } + + public SIPResponse responseAck(SIPRequest sipRequest, int statusCode, String msg, ResponseAckExtraParam responseAckExtraParam) throws SipException, InvalidArgumentException, ParseException { + if (sipRequest.getToHeader().getTag() == null) { + sipRequest.getToHeader().setTag(SipUtils.getNewTag()); } - SIPResponse response = (SIPResponse)getMessageFactory().createResponse(statusCode, serverTransaction.getRequest()); + SIPResponse response = (SIPResponse)getMessageFactory().createResponse(statusCode, sipRequest); + response.setStatusCode(statusCode); if (msg != null) { response.setReasonPhrase(msg); } + if (responseAckExtraParam != null) { - if (responseAckExtraParam.sipURI != null && serverTransaction.getRequest().getMethod().equals(Request.INVITE)) { + if (responseAckExtraParam.sipURI != null && sipRequest.getMethod().equals(Request.INVITE)) { logger.debug("responseSdpAck SipURI: {}:{}", responseAckExtraParam.sipURI.getHost(), responseAckExtraParam.sipURI.getPort()); Address concatAddress = SipFactory.getInstance().createAddressFactory().createAddress( SipFactory.getInstance().createAddressFactory().createSipURI(responseAckExtraParam.sipURI.getUser(), responseAckExtraParam.sipURI.getHost()+":"+responseAckExtraParam.sipURI.getPort() @@ -163,7 +170,7 @@ response.setContent(responseAckExtraParam.content, responseAckExtraParam.contentTypeHeader); } - if (serverTransaction.getRequest().getMethod().equals(Request.SUBSCRIBE)) { + if (sipRequest.getMethod().equals(Request.SUBSCRIBE)) { if (responseAckExtraParam.expires == -1) { logger.error("[鍙傛暟涓嶅叏] 2xx鐨凷UBSCRIBE鍥炲锛屽繀椤昏缃瓻xpires header"); }else { @@ -172,28 +179,26 @@ } } }else { - if (serverTransaction.getRequest().getMethod().equals(Request.SUBSCRIBE)) { + if (sipRequest.getMethod().equals(Request.SUBSCRIBE)) { logger.error("[鍙傛暟涓嶅叏] 2xx鐨凷UBSCRIBE鍥炲锛屽繀椤昏缃瓻xpires header"); } } - serverTransaction.sendResponse(response); - if (statusCode >= 200 && !"NOTIFY".equalsIgnoreCase(serverTransaction.getRequest().getMethod())) { - if (serverTransaction.getDialog() != null) { - serverTransaction.getDialog().delete(); - } - } + + // 鍙戦�乺esponse + sipSender.transmitRequest(response); + return response; } /** * 鍥炲甯dp鐨�200 */ - public SIPResponse responseSdpAck(ServerTransaction serverTransaction, String sdp, ParentPlatform platform) throws SipException, InvalidArgumentException, ParseException { + public SIPResponse responseSdpAck(SIPRequest request, String sdp, ParentPlatform platform) throws SipException, InvalidArgumentException, ParseException { ContentTypeHeader contentTypeHeader = SipFactory.getInstance().createHeaderFactory().createContentTypeHeader("APPLICATION", "SDP"); // 鍏煎鍥芥爣涓殑浣跨敤缂栫爜@鍩熷悕浣滀负RequestURI鐨勬儏鍐� - SipURI sipURI = (SipURI)serverTransaction.getRequest().getRequestURI(); + SipURI sipURI = (SipURI)request.getRequestURI(); if (sipURI.getPort() == -1) { sipURI = SipFactory.getInstance().createAddressFactory().createSipURI(platform.getServerGBId(), platform.getServerIP()+":"+platform.getServerPort()); } @@ -202,16 +207,16 @@ responseAckExtraParam.content = sdp; responseAckExtraParam.sipURI = sipURI; - return responseAck(serverTransaction, Response.OK, null, responseAckExtraParam); + return responseAck(request, Response.OK, null, responseAckExtraParam); } /** * 鍥炲甯ml鐨�200 */ - public SIPResponse responseXmlAck(ServerTransaction serverTransaction, String xml, ParentPlatform platform, Integer expires) throws SipException, InvalidArgumentException, ParseException { + public SIPResponse responseXmlAck(SIPRequest request, String xml, ParentPlatform platform, Integer expires) throws SipException, InvalidArgumentException, ParseException { ContentTypeHeader contentTypeHeader = SipFactory.getInstance().createHeaderFactory().createContentTypeHeader("Application", "MANSCDP+xml"); - SipURI sipURI = (SipURI)serverTransaction.getRequest().getRequestURI(); + SipURI sipURI = (SipURI)request.getRequestURI(); if (sipURI.getPort() == -1) { sipURI = SipFactory.getInstance().createAddressFactory().createSipURI(platform.getServerGBId(), platform.getServerIP()+":"+platform.getServerPort()); } @@ -220,7 +225,7 @@ responseAckExtraParam.content = xml; responseAckExtraParam.sipURI = sipURI; responseAckExtraParam.expires = expires; - return responseAck(serverTransaction, Response.OK, null, responseAckExtraParam); + return responseAck(request, Response.OK, null, responseAckExtraParam); } public Element getRootElement(RequestEvent evt) throws DocumentException { -- Gitblit v1.8.0