From 3d2aeb890b0d6bc13ea44ff6e0d5764bcf7aa529 Mon Sep 17 00:00:00 2001 From: 648540858 <648540858@qq.com> Date: Mon, 14 Dec 2020 16:51:29 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BD=BF=E7=94=A8=E7=BA=BF=E7=A8=8B=E5=AE=89?= =?UTF-8?q?=E5=85=A8=E7=9A=84map=E5=AD=98=E5=82=A8=E8=AE=A2=E9=98=85?= =?UTF-8?q?=E4=BF=A1=E6=81=AF=20=E4=BF=AE=E6=94=B9=E7=82=B9=E6=92=AD?= =?UTF-8?q?=E6=B6=88=E6=81=AF=E5=86=85=E5=AE=B9,=E6=8F=90=E5=8D=87?= =?UTF-8?q?=E5=85=BC=E5=AE=B9=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../genersoft/iot/vmp/gb28181/SipLayer.java | 2 + .../cmd/SIPRequestHeaderProvider.java | 3 +- .../request/impl/AckRequestProcessor.java | 6 +-- .../impl/InviteResponseProcessor.java | 45 ++----------------- .../vmp/media/zlm/ZLMHttpHookSubscribe.java | 4 +- 5 files changed, 12 insertions(+), 48 deletions(-) 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 bfdc8f6c..f1ed477e 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/SipLayer.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/SipLayer.java @@ -113,6 +113,7 @@ public class SipLayer implements SipListener { */ @Override public void processRequest(RequestEvent evt) { + logger.debug(evt.getRequest().toString()); // 由于jainsip是单线程程序,为提高性能并发处理 processThreadPool.execute(() -> { processorFactory.createRequestProcessor(evt).process(); @@ -122,6 +123,7 @@ public class SipLayer implements SipListener { @Override public void processResponse(ResponseEvent evt) { Response response = evt.getResponse(); + logger.debug(evt.getResponse().toString()); int status = response.getStatusCode(); if ((status >= 200) && (status < 300)) { // Success! ISIPResponseProcessor processor = processorFactory.createResponseProcessor(evt); 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 a645680b..65f08337 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 @@ -84,8 +84,7 @@ public class SIPRequestHeaderProvider { SipURI requestLine = sipFactory.createAddressFactory().createSipURI(channelId, host.getAddress()); //via ArrayList viaHeaders = new ArrayList(); - // ViaHeader viaHeader = sipFactory.createHeaderFactory().createViaHeader(sipConfig.getSipIp(), sipConfig.getSipPort(), device.getTransport(), viaTag); - ViaHeader viaHeader = sipFactory.createHeaderFactory().createViaHeader(device.getHost().getIp(), device.getHost().getPort(), device.getTransport(), viaTag); + ViaHeader viaHeader = sipFactory.createHeaderFactory().createViaHeader(sipConfig.getSipIp(), sipConfig.getSipPort(), device.getTransport(), viaTag); viaHeader.setRPort(); viaHeaders.add(viaHeader); //from 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 aebc601c..13d630c4 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 @@ -21,14 +21,12 @@ public class AckRequestProcessor extends SIPRequestAbstractProcessor { * 处理 ACK请求 * * @param evt - * @param layer - * @param transaction - * @param config - */ + */ @Override public void process(RequestEvent evt) { Request request = evt.getRequest(); Dialog dialog = evt.getDialog(); + if (dialog == null) return; try { Request ackRequest = null; CSeq csReq = (CSeq) request.getHeader(CSeq.NAME); 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 ae7182d9..fe5be818 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 @@ -12,6 +12,7 @@ import javax.sip.header.ViaHeader; import javax.sip.message.Request; import javax.sip.message.Response; +import gov.nist.javax.sip.header.CSeq; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; @@ -23,9 +24,9 @@ import com.genersoft.iot.vmp.gb28181.transmit.response.ISIPResponseProcessor; /** - * @Description:处理INVITE响应 + * @Description:处理INVITE响应 * @author: swwheihei - * @date: 2020年5月3日 下午4:43:52 + * @date: 2020年5月3日 下午4:43:52 */ @Component public class InviteResponseProcessor implements ISIPResponseProcessor { @@ -49,49 +50,11 @@ public class InviteResponseProcessor implements ISIPResponseProcessor { // 成功响应 // 下发ack if (statusCode == Response.OK) { - // ClientTransaction clientTransaction = evt.getClientTransaction(); - // if(clientTransaction == null){ - // logger.error("回复ACK时,clientTransaction为null >>> {}",response); - // return; - // } - // Dialog clientDialog = clientTransaction.getDialog(); - - // CSeqHeader clientCSeqHeader = (CSeqHeader) - // response.getHeader(CSeqHeader.NAME); - // long cseqId = clientCSeqHeader.getSeqNumber(); - // /* - // createAck函数,创建的ackRequest,会采用Invite响应的200OK,中的contact字段中的地址,作为目标地址。 - // 有的终端传上来的可能还是内网地址,会造成ack发送不出去。接受不到音视频流 - // 所以在此处统一替换地址。和响应消息的Via头中的地址保持一致。 - // */ - // Request ackRequest = clientDialog.createAck(cseqId); - // SipURI requestURI = (SipURI) ackRequest.getRequestURI(); - // ViaHeader viaHeader = (ViaHeader) response.getHeader(ViaHeader.NAME); - // try { - // requestURI.setHost(viaHeader.getHost()); - // } catch (Exception e) { - // e.printStackTrace(); - // } - // requestURI.setPort(viaHeader.getPort()); - // clientDialog.sendAck(ackRequest); - Dialog dialog = evt.getDialog(); CSeqHeader cseq = (CSeqHeader) response.getHeader(CSeqHeader.NAME); Request reqAck = dialog.createAck(cseq.getSeqNumber()); - - SipURI requestURI = (SipURI) reqAck.getRequestURI(); - ViaHeader viaHeader = (ViaHeader) response.getHeader(ViaHeader.NAME); - // String viaHost =viaHeader.getHost(); - //getHost()函数取回的IP地址是“[xxx.xxx.xxx.xxx:yyyy]”的格式,需用正则表达式截取为“xxx.xxx.xxx.xxx"格式 - // Pattern p = Pattern.compile("(?<=//|)((\\w)+\\.)+\\w+"); - // Matcher matcher = p.matcher(viaHeader.getHost()); - // if (matcher.find()) { - // requestURI.setHost(matcher.group()); - // } - requestURI.setHost(viaHeader.getHost()); - requestURI.setPort(viaHeader.getPort()); - reqAck.setRequestURI(requestURI); dialog.sendAck(reqAck); + } } catch (InvalidArgumentException | SipException e) { e.printStackTrace(); diff --git a/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookSubscribe.java b/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookSubscribe.java index a4389cf8..0c00b821 100644 --- a/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookSubscribe.java +++ b/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookSubscribe.java @@ -13,6 +13,7 @@ import org.springframework.beans.factory.annotation.Value; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Component; +import org.springframework.util.ConcurrentReferenceHashMap; import org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpServletRequest; @@ -20,6 +21,7 @@ import java.math.BigInteger; import java.text.DecimalFormat; import java.util.HashMap; import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; /** * @Description:针对 ZLMediaServer的hook事件订阅 @@ -50,7 +52,7 @@ public class ZLMHttpHookSubscribe { void response(JSONObject response); } - private Map> allSubscribes = new HashMap<>(); + private Map> allSubscribes = new ConcurrentHashMap<>(); public void addSubscribe(HookType type, JSONObject hookResponse, ZLMHttpHookSubscribe.Event event) { Map eventMap = allSubscribes.get(type);