Commit 74714711aa87dcd1259f5aebe55d362be732ffa2

Authored by 648540858
1 parent 1beb220b

优化sip消息构建,去除ServerTransaction的使用

Showing 34 changed files with 458 additions and 481 deletions
src/main/java/com/genersoft/iot/vmp/gb28181/bean/SubscribeInfo.java
... ... @@ -3,15 +3,13 @@ package com.genersoft.iot.vmp.gb28181.bean;
3 3 import gov.nist.javax.sip.message.SIPRequest;
4 4 import gov.nist.javax.sip.message.SIPResponse;
5 5  
6   -import javax.sip.ServerTransaction;
7 6 import javax.sip.header.*;
8 7  
9 8 public class SubscribeInfo {
10 9  
11 10  
12   - public SubscribeInfo(ServerTransaction serverTransaction, String id) {
  11 + public SubscribeInfo(SIPRequest request, String id) {
13 12 this.id = id;
14   - SIPRequest request = (SIPRequest)serverTransaction.getRequest();
15 13 this.request = request;
16 14 this.expires = request.getExpires().getExpires();
17 15 EventHeader eventHeader = (EventHeader)request.getHeader(EventHeader.NAME);
... ...
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/SIPSender.java 0 → 100644
  1 +package com.genersoft.iot.vmp.gb28181.transmit;
  2 +
  3 +import com.genersoft.iot.vmp.gb28181.event.SipSubscribe;
  4 +import com.genersoft.iot.vmp.gb28181.utils.SipUtils;
  5 +import com.genersoft.iot.vmp.utils.GitUtil;
  6 +import gov.nist.javax.sip.SipProviderImpl;
  7 +import org.slf4j.Logger;
  8 +import org.slf4j.LoggerFactory;
  9 +import org.springframework.beans.factory.annotation.Autowired;
  10 +import org.springframework.beans.factory.annotation.Qualifier;
  11 +import org.springframework.stereotype.Component;
  12 +
  13 +import javax.sip.SipException;
  14 +import javax.sip.SipFactory;
  15 +import javax.sip.header.CallIdHeader;
  16 +import javax.sip.header.UserAgentHeader;
  17 +import javax.sip.header.ViaHeader;
  18 +import javax.sip.message.Message;
  19 +import javax.sip.message.Request;
  20 +import javax.sip.message.Response;
  21 +import java.text.ParseException;
  22 +
  23 +@Component
  24 +public class SIPSender {
  25 +
  26 + private final Logger logger = LoggerFactory.getLogger(SIPSender.class);
  27 +
  28 + @Autowired
  29 + @Qualifier(value = "tcpSipProvider")
  30 + private SipProviderImpl tcpSipProvider;
  31 +
  32 + @Autowired
  33 + @Qualifier(value = "udpSipProvider")
  34 + private SipProviderImpl udpSipProvider;
  35 +
  36 + @Autowired
  37 + private SipFactory sipFactory;
  38 +
  39 + @Autowired
  40 + private GitUtil gitUtil;
  41 +
  42 + @Autowired
  43 + private SipSubscribe sipSubscribe;
  44 +
  45 + public void transmitRequest(Message message) throws SipException, ParseException {
  46 + transmitRequest(message, null, null);
  47 + }
  48 +
  49 + public void transmitRequest(Message message, SipSubscribe.Event errorEvent) throws SipException, ParseException {
  50 + transmitRequest(message, errorEvent, null);
  51 + }
  52 +
  53 + public void transmitRequest(Message message, SipSubscribe.Event errorEvent, SipSubscribe.Event okEvent) throws SipException, ParseException {
  54 + ViaHeader viaHeader = (ViaHeader)message.getHeader(ViaHeader.NAME);
  55 + String transport = "UDP";
  56 + if (viaHeader == null) {
  57 + logger.warn("[消息头缺失]: ViaHeader");
  58 + }else {
  59 + transport = viaHeader.getTransport();
  60 + }
  61 + if (message.getHeader(UserAgentHeader.NAME) == null) {
  62 + try {
  63 + message.addHeader(SipUtils.createUserAgentHeader(sipFactory, gitUtil));
  64 + } catch (ParseException e) {
  65 + logger.error("添加UserAgentHeader失败", e);
  66 + }
  67 + }
  68 +
  69 + CallIdHeader callIdHeader = (CallIdHeader) message.getHeader(CallIdHeader.NAME);
  70 + // 添加错误订阅
  71 + if (errorEvent != null) {
  72 + sipSubscribe.addErrorSubscribe(callIdHeader.getCallId(), (eventResult -> {
  73 + errorEvent.response(eventResult);
  74 + sipSubscribe.removeErrorSubscribe(eventResult.callId);
  75 + sipSubscribe.removeOkSubscribe(eventResult.callId);
  76 + }));
  77 + }
  78 + // 添加订阅
  79 + if (okEvent != null) {
  80 + sipSubscribe.addOkSubscribe(callIdHeader.getCallId(), eventResult -> {
  81 + okEvent.response(eventResult);
  82 + sipSubscribe.removeOkSubscribe(eventResult.callId);
  83 + sipSubscribe.removeErrorSubscribe(eventResult.callId);
  84 + });
  85 + }
  86 + if ("TCP".equals(transport)) {
  87 + if (message instanceof Request) {
  88 + tcpSipProvider.sendRequest((Request)message);
  89 + }else if (message instanceof Response) {
  90 + tcpSipProvider.sendResponse((Response)message);
  91 + }
  92 +
  93 + } else if ("UDP".equals(transport)) {
  94 + if (message instanceof Request) {
  95 + udpSipProvider.sendRequest((Request)message);
  96 + }else if (message instanceof Response) {
  97 + udpSipProvider.sendResponse((Response)message);
  98 + }
  99 + }
  100 + }
  101 +
  102 + public CallIdHeader getNewCallIdHeader(String transport){
  103 + return transport.equalsIgnoreCase("TCP") ? tcpSipProvider.getNewCallId()
  104 + : udpSipProvider.getNewCallId();
  105 + }
  106 +}
... ...
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/ISIPCommander.java
... ... @@ -13,6 +13,7 @@ import javax.sip.Dialog;
13 13 import javax.sip.InvalidArgumentException;
14 14 import javax.sip.PeerUnavailableException;
15 15 import javax.sip.SipException;
  16 +import javax.sip.message.Message;
16 17 import javax.sip.message.Request;
17 18 import java.text.ParseException;
18 19  
... ... @@ -362,9 +363,4 @@ public interface ISIPCommander {
362 363 */
363 364 void sendAlarmMessage(Device device, DeviceAlarm deviceAlarm) throws InvalidArgumentException, SipException, ParseException;
364 365  
365   - void transmitRequest(String transport, Request request) throws SipException, ParseException ;
366   -
367   - void transmitRequest(String transport, Request request, SipSubscribe.Event errorEvent) throws SipException, ParseException;
368   -
369   - void transmitRequest(String transport, Request request, SipSubscribe.Event errorEvent , SipSubscribe.Event okEvent) throws SipException, ParseException;
370 366 }
... ...
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java
... ... @@ -9,6 +9,7 @@ import com.genersoft.iot.vmp.conf.exception.SsrcTransactionNotFoundException;
9 9 import com.genersoft.iot.vmp.gb28181.bean.*;
10 10 import com.genersoft.iot.vmp.gb28181.event.SipSubscribe;
11 11 import com.genersoft.iot.vmp.gb28181.session.VideoStreamSessionManager;
  12 +import com.genersoft.iot.vmp.gb28181.transmit.SIPSender;
12 13 import com.genersoft.iot.vmp.gb28181.transmit.cmd.ISIPCommander;
13 14 import com.genersoft.iot.vmp.gb28181.transmit.cmd.SIPRequestHeaderProvider;
14 15 import com.genersoft.iot.vmp.gb28181.utils.SipUtils;
... ... @@ -44,6 +45,7 @@ import javax.sip.*;
44 45 import javax.sip.address.Address;
45 46 import javax.sip.address.SipURI;
46 47 import javax.sip.header.*;
  48 +import javax.sip.message.Message;
47 49 import javax.sip.message.Request;
48 50 import javax.sip.message.Response;
49 51 import java.lang.reflect.Field;
... ... @@ -68,16 +70,8 @@ public class SIPCommander implements ISIPCommander {
68 70 private SipFactory sipFactory;
69 71  
70 72 @Autowired
71   - private GitUtil gitUtil;
72   -
73   - @Autowired
74   - @Qualifier(value = "tcpSipProvider")
75   - private SipProviderImpl tcpSipProvider;
76   -
77   - @Autowired
78   - @Qualifier(value = "udpSipProvider")
79   - private SipProviderImpl udpSipProvider;
80   -
  73 + private SIPSender sipSender;
  74 +
81 75 @Autowired
82 76 private SIPRequestHeaderProvider headerProvider;
83 77  
... ... @@ -90,8 +84,7 @@ public class SIPCommander implements ISIPCommander {
90 84 @Autowired
91 85 private ZlmHttpHookSubscribe subscribe;
92 86  
93   - @Autowired
94   - private SipSubscribe sipSubscribe;
  87 +
95 88  
96 89 @Autowired
97 90 private IMediaServerService mediaServerService;
... ... @@ -202,13 +195,10 @@ public class SIPCommander implements ISIPCommander {
202 195 ptzXml.append("<ControlPriority>5</ControlPriority>\r\n");
203 196 ptzXml.append("</Info>\r\n");
204 197 ptzXml.append("</Control>\r\n");
  198 +
  199 + Request request = headerProvider.createMessageRequest(device, ptzXml.toString(), SipUtils.getNewViaTag(), SipUtils.getNewFromTag(), null, sipSender.getNewCallIdHeader(device.getTransport()));
205 200  
206   - CallIdHeader callIdHeader = device.getTransport().equalsIgnoreCase("TCP") ? tcpSipProvider.getNewCallId()
207   - : udpSipProvider.getNewCallId();
208   -
209   - Request request = headerProvider.createMessageRequest(device, ptzXml.toString(), SipUtils.getNewViaTag(), SipUtils.getNewFromTag(), null, callIdHeader);
210   -
211   - transmitRequest(device.getTransport(), request);
  201 + sipSender.transmitRequest( request);
212 202 }
213 203  
214 204 /**
... ... @@ -239,11 +229,10 @@ public class SIPCommander implements ISIPCommander {
239 229 ptzXml.append("</Control>\r\n");
240 230  
241 231  
242   - CallIdHeader callIdHeader = device.getTransport().equalsIgnoreCase("TCP") ? tcpSipProvider.getNewCallId()
243   - : udpSipProvider.getNewCallId();
244 232  
245   - SIPRequest request = (SIPRequest) headerProvider.createMessageRequest(device, ptzXml.toString(), SipUtils.getNewViaTag(), SipUtils.getNewFromTag(), null, callIdHeader);
246   - transmitRequest(device.getTransport(), request);
  233 +
  234 + SIPRequest request = (SIPRequest) headerProvider.createMessageRequest(device, ptzXml.toString(), SipUtils.getNewViaTag(), SipUtils.getNewFromTag(), null,sipSender.getNewCallIdHeader(device.getTransport()));
  235 + sipSender.transmitRequest(request);
247 236  
248 237 }
249 238  
... ... @@ -269,13 +258,10 @@ public class SIPCommander implements ISIPCommander {
269 258 ptzXml.append("<ControlPriority>5</ControlPriority>\r\n");
270 259 ptzXml.append("</Info>\r\n");
271 260 ptzXml.append("</Control>\r\n");
272   -
273   -
274   - CallIdHeader callIdHeader = device.getTransport().equalsIgnoreCase("TCP") ? tcpSipProvider.getNewCallId()
275   - : udpSipProvider.getNewCallId();
276   -
277   - Request request = headerProvider.createMessageRequest(device, ptzXml.toString(), SipUtils.getNewViaTag(), SipUtils.getNewFromTag(), null, callIdHeader);
278   - transmitRequest(device.getTransport(), request, errorEvent, okEvent);
  261 +
  262 +
  263 + Request request = headerProvider.createMessageRequest(device, ptzXml.toString(), SipUtils.getNewViaTag(), SipUtils.getNewFromTag(), null,sipSender.getNewCallIdHeader(device.getTransport()));
  264 + sipSender.transmitRequest(request, errorEvent, okEvent);
279 265  
280 266 }
281 267  
... ... @@ -362,11 +348,10 @@ public class SIPCommander implements ISIPCommander {
362 348 // f字段:f= v/编码格式/分辨率/帧率/码率类型/码率大小a/编码格式/码率大小/采样率
363 349 // content.append("f=v/2/5/25/1/4000a/1/8/1" + "\r\n"); // 未发现支持此特性的设备
364 350  
365   - CallIdHeader callIdHeader = device.getTransport().equalsIgnoreCase("TCP") ? tcpSipProvider.getNewCallId()
366   - : udpSipProvider.getNewCallId();
367 351  
368   - Request request = headerProvider.createInviteRequest(device, channelId, content.toString(), SipUtils.getNewViaTag(), SipUtils.getNewFromTag(), null, ssrcInfo.getSsrc(), callIdHeader);
369   - transmitRequest(device.getTransport(), request, (e -> {
  352 +
  353 + Request request = headerProvider.createInviteRequest(device, channelId, content.toString(), SipUtils.getNewViaTag(), SipUtils.getNewFromTag(), null, ssrcInfo.getSsrc(),sipSender.getNewCallIdHeader(device.getTransport()));
  354 + sipSender.transmitRequest( request, (e -> {
370 355 streamSession.remove(device.getDeviceId(), channelId, ssrcInfo.getStream());
371 356 mediaServerService.releaseSsrc(mediaServerItem.getId(), ssrcInfo.getSsrc());
372 357 errorEvent.response(e);
... ... @@ -454,27 +439,25 @@ public class SIPCommander implements ISIPCommander {
454 439  
455 440 content.append("y=" + ssrcInfo.getSsrc() + "\r\n");//ssrc
456 441  
457   - CallIdHeader callIdHeader = device.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId()
458   - : udpSipProvider.getNewCallId();
459 442 HookSubscribeForStreamChange hookSubscribe = HookSubscribeFactory.on_stream_changed("rtp", ssrcInfo.getStream(), true, "rtsp", mediaServerItem.getId());
460 443 // 添加订阅
461 444 subscribe.addSubscribe(hookSubscribe, (MediaServerItem mediaServerItemInUse, JSONObject json) -> {
462 445 if (hookEvent != null) {
463   - InviteStreamInfo inviteStreamInfo = new InviteStreamInfo(mediaServerItemInUse, json, callIdHeader.getCallId(), "rtp", ssrcInfo.getStream());
  446 + InviteStreamInfo inviteStreamInfo = new InviteStreamInfo(mediaServerItemInUse, json,sipSender.getNewCallIdHeader(device.getTransport()).getCallId(), "rtp", ssrcInfo.getStream());
464 447 hookEvent.call(inviteStreamInfo);
465 448 }
466 449 subscribe.removeSubscribe(hookSubscribe);
467 450 });
468   - Request request = headerProvider.createPlaybackInviteRequest(device, channelId, content.toString(), null, SipUtils.getNewFromTag(), null, callIdHeader, ssrcInfo.getSsrc());
  451 + Request request = headerProvider.createPlaybackInviteRequest(device, channelId, content.toString(), null, SipUtils.getNewFromTag(), null,sipSender.getNewCallIdHeader(device.getTransport()), ssrcInfo.getSsrc());
469 452  
470   - transmitRequest(device.getTransport(), request, errorEvent, event -> {
  453 + sipSender.transmitRequest( request, errorEvent, event -> {
471 454 ResponseEvent responseEvent = (ResponseEvent) event.event;
472 455 SIPResponse response = (SIPResponse) responseEvent.getResponse();
473   - streamSession.put(device.getDeviceId(), channelId, callIdHeader.getCallId(), ssrcInfo.getStream(), ssrcInfo.getSsrc(), mediaServerItem.getId(), response, VideoStreamSessionManager.SessionType.playback);
  456 + streamSession.put(device.getDeviceId(), channelId,sipSender.getNewCallIdHeader(device.getTransport()).getCallId(), ssrcInfo.getStream(), ssrcInfo.getSsrc(), mediaServerItem.getId(), response, VideoStreamSessionManager.SessionType.playback);
474 457 okEvent.response(event);
475 458 });
476 459 if (inviteStreamCallback != null) {
477   - inviteStreamCallback.call(new InviteStreamInfo(mediaServerItem, null, callIdHeader.getCallId(), "rtp", ssrcInfo.getStream()));
  460 + inviteStreamCallback.call(new InviteStreamInfo(mediaServerItem, null,sipSender.getNewCallIdHeader(device.getTransport()).getCallId(), "rtp", ssrcInfo.getStream()));
478 461 }
479 462 }
480 463  
... ... @@ -554,14 +537,11 @@ public class SIPCommander implements ISIPCommander {
554 537 content.append("a=downloadspeed:" + downloadSpeed + "\r\n");
555 538  
556 539 content.append("y=" + ssrcInfo.getSsrc() + "\r\n");//ssrc
557   -
558   - CallIdHeader callIdHeader = device.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId()
559   - : udpSipProvider.getNewCallId();
560   -
  540 +
561 541 HookSubscribeForStreamChange hookSubscribe = HookSubscribeFactory.on_stream_changed("rtp", ssrcInfo.getStream(), true, null, mediaServerItem.getId());
562 542 // 添加订阅
563 543 subscribe.addSubscribe(hookSubscribe, (MediaServerItem mediaServerItemInUse, JSONObject json) -> {
564   - hookEvent.call(new InviteStreamInfo(mediaServerItem, json, callIdHeader.getCallId(), "rtp", ssrcInfo.getStream()));
  544 + hookEvent.call(new InviteStreamInfo(mediaServerItem, json,sipSender.getNewCallIdHeader(device.getTransport()).getCallId(), "rtp", ssrcInfo.getStream()));
565 545 subscribe.removeSubscribe(hookSubscribe);
566 546 hookSubscribe.getContent().put("regist", false);
567 547 hookSubscribe.getContent().put("schema", "rtsp");
... ... @@ -570,7 +550,7 @@ public class SIPCommander implements ISIPCommander {
570 550 (MediaServerItem mediaServerItemForEnd, JSONObject jsonForEnd) -> {
571 551 logger.info("[录像]下载结束, 发送BYE");
572 552 try {
573   - streamByeCmd(device, channelId, ssrcInfo.getStream(), callIdHeader.getCallId());
  553 + streamByeCmd(device, channelId, ssrcInfo.getStream(),sipSender.getNewCallIdHeader(device.getTransport()).getCallId());
574 554 } catch (InvalidArgumentException | ParseException | SipException |
575 555 SsrcTransactionNotFoundException e) {
576 556 logger.error("[录像]下载结束, 发送BYE失败 {}", e.getMessage());
... ... @@ -578,14 +558,14 @@ public class SIPCommander implements ISIPCommander {
578 558 });
579 559 });
580 560  
581   - Request request = headerProvider.createPlaybackInviteRequest(device, channelId, content.toString(), null, SipUtils.getNewFromTag(), null, callIdHeader, ssrcInfo.getSsrc());
  561 + Request request = headerProvider.createPlaybackInviteRequest(device, channelId, content.toString(), null, SipUtils.getNewFromTag(), null,sipSender.getNewCallIdHeader(device.getTransport()), ssrcInfo.getSsrc());
582 562 if (inviteStreamCallback != null) {
583   - inviteStreamCallback.call(new InviteStreamInfo(mediaServerItem, null, callIdHeader.getCallId(), "rtp", ssrcInfo.getStream()));
  563 + inviteStreamCallback.call(new InviteStreamInfo(mediaServerItem, null,sipSender.getNewCallIdHeader(device.getTransport()).getCallId(), "rtp", ssrcInfo.getStream()));
584 564 }
585   - transmitRequest(device.getTransport(), request, errorEvent, okEvent -> {
  565 + sipSender.transmitRequest( request, errorEvent, okEvent -> {
586 566 ResponseEvent responseEvent = (ResponseEvent) okEvent.event;
587 567 SIPResponse response = (SIPResponse) responseEvent.getResponse();
588   - streamSession.put(device.getDeviceId(), channelId, callIdHeader.getCallId(), ssrcInfo.getStream(), ssrcInfo.getSsrc(), mediaServerItem.getId(), response, VideoStreamSessionManager.SessionType.download);
  568 + streamSession.put(device.getDeviceId(), channelId,sipSender.getNewCallIdHeader(device.getTransport()).getCallId(), ssrcInfo.getStream(), ssrcInfo.getSsrc(), mediaServerItem.getId(), response, VideoStreamSessionManager.SessionType.download);
589 569 });
590 570 }
591 571  
... ... @@ -612,7 +592,7 @@ public class SIPCommander implements ISIPCommander {
612 592 streamSession.remove(ssrcTransaction.getDeviceId(), ssrcTransaction.getChannelId(), ssrcTransaction.getStream());
613 593  
614 594 Request byteRequest = headerProvider.createByteRequest(device, channelId, ssrcTransaction.getSipTransactionInfo());
615   - transmitRequest(device.getTransport(), byteRequest, null, okEvent);
  595 + sipSender.transmitRequest( byteRequest, null, okEvent);
616 596 }
617 597  
618 598 /**
... ... @@ -643,11 +623,10 @@ public class SIPCommander implements ISIPCommander {
643 623 broadcastXml.append("<TargetID>" + device.getDeviceId() + "</TargetID>\r\n");
644 624 broadcastXml.append("</Notify>\r\n");
645 625  
646   - CallIdHeader callIdHeader = device.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId()
647   - : udpSipProvider.getNewCallId();
  626 +
648 627  
649   - Request request = headerProvider.createMessageRequest(device, broadcastXml.toString(), SipUtils.getNewViaTag(), SipUtils.getNewFromTag(), null, callIdHeader);
650   - transmitRequest(device.getTransport(), request);
  628 + Request request = headerProvider.createMessageRequest(device, broadcastXml.toString(), SipUtils.getNewViaTag(), SipUtils.getNewFromTag(), null,sipSender.getNewCallIdHeader(device.getTransport()));
  629 + sipSender.transmitRequest( request);
651 630  
652 631 }
653 632  
... ... @@ -664,11 +643,10 @@ public class SIPCommander implements ISIPCommander {
664 643 broadcastXml.append("<TargetID>" + device.getDeviceId() + "</TargetID>\r\n");
665 644 broadcastXml.append("</Notify>\r\n");
666 645  
667   - CallIdHeader callIdHeader = device.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId()
668   - : udpSipProvider.getNewCallId();
  646 +
669 647  
670   - Request request = headerProvider.createMessageRequest(device, broadcastXml.toString(), SipUtils.getNewViaTag(), SipUtils.getNewFromTag(), null, callIdHeader);
671   - transmitRequest(device.getTransport(), request, errorEvent);
  648 + Request request = headerProvider.createMessageRequest(device, broadcastXml.toString(), SipUtils.getNewViaTag(), SipUtils.getNewFromTag(), null,sipSender.getNewCallIdHeader(device.getTransport()));
  649 + sipSender.transmitRequest( request, errorEvent);
672 650  
673 651 }
674 652  
... ... @@ -696,11 +674,10 @@ public class SIPCommander implements ISIPCommander {
696 674 cmdXml.append("<RecordCmd>" + recordCmdStr + "</RecordCmd>\r\n");
697 675 cmdXml.append("</Control>\r\n");
698 676  
699   - CallIdHeader callIdHeader = device.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId()
700   - : udpSipProvider.getNewCallId();
  677 +
701 678  
702   - Request request = headerProvider.createMessageRequest(device, cmdXml.toString(), null, SipUtils.getNewFromTag(), null, callIdHeader);
703   - transmitRequest(device.getTransport(), request, errorEvent);
  679 + Request request = headerProvider.createMessageRequest(device, cmdXml.toString(), null, SipUtils.getNewFromTag(), null,sipSender.getNewCallIdHeader(device.getTransport()));
  680 + sipSender.transmitRequest( request, errorEvent);
704 681 }
705 682  
706 683 /**
... ... @@ -721,11 +698,10 @@ public class SIPCommander implements ISIPCommander {
721 698 cmdXml.append("<TeleBoot>Boot</TeleBoot>\r\n");
722 699 cmdXml.append("</Control>\r\n");
723 700  
724   - CallIdHeader callIdHeader = device.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId()
725   - : udpSipProvider.getNewCallId();
  701 +
726 702  
727   - Request request = headerProvider.createMessageRequest(device, cmdXml.toString(), null, SipUtils.getNewFromTag(), null, callIdHeader);
728   - transmitRequest(device.getTransport(), request);
  703 + Request request = headerProvider.createMessageRequest(device, cmdXml.toString(), null, SipUtils.getNewFromTag(), null,sipSender.getNewCallIdHeader(device.getTransport()));
  704 + sipSender.transmitRequest( request);
729 705 }
730 706  
731 707 /**
... ... @@ -747,11 +723,10 @@ public class SIPCommander implements ISIPCommander {
747 723 cmdXml.append("<GuardCmd>" + guardCmdStr + "</GuardCmd>\r\n");
748 724 cmdXml.append("</Control>\r\n");
749 725  
750   - CallIdHeader callIdHeader = device.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId()
751   - : udpSipProvider.getNewCallId();
  726 +
752 727  
753   - Request request = headerProvider.createMessageRequest(device, cmdXml.toString(), null, SipUtils.getNewFromTag(), null, callIdHeader);
754   - transmitRequest(device.getTransport(), request, errorEvent);
  728 + Request request = headerProvider.createMessageRequest(device, cmdXml.toString(), null, SipUtils.getNewFromTag(), null,sipSender.getNewCallIdHeader(device.getTransport()));
  729 + sipSender.transmitRequest( request, errorEvent);
755 730 }
756 731  
757 732 /**
... ... @@ -784,11 +759,10 @@ public class SIPCommander implements ISIPCommander {
784 759 }
785 760 cmdXml.append("</Control>\r\n");
786 761  
787   - CallIdHeader callIdHeader = device.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId()
788   - : udpSipProvider.getNewCallId();
  762 +
789 763  
790   - Request request = headerProvider.createMessageRequest(device, cmdXml.toString(), null, SipUtils.getNewFromTag(), null, callIdHeader);
791   - transmitRequest(device.getTransport(), request, errorEvent);
  764 + Request request = headerProvider.createMessageRequest(device, cmdXml.toString(), null, SipUtils.getNewFromTag(), null,sipSender.getNewCallIdHeader(device.getTransport()));
  765 + sipSender.transmitRequest( request, errorEvent);
792 766 }
793 767  
794 768 /**
... ... @@ -814,11 +788,10 @@ public class SIPCommander implements ISIPCommander {
814 788 cmdXml.append("<IFameCmd>Send</IFameCmd>\r\n");
815 789 cmdXml.append("</Control>\r\n");
816 790  
817   - CallIdHeader callIdHeader = device.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId()
818   - : udpSipProvider.getNewCallId();
  791 +
819 792  
820   - Request request = headerProvider.createMessageRequest(device, cmdXml.toString(), null, SipUtils.getNewFromTag(), null, callIdHeader);
821   - transmitRequest(device.getTransport(), request);
  793 + Request request = headerProvider.createMessageRequest(device, cmdXml.toString(), null, SipUtils.getNewFromTag(), null,sipSender.getNewCallIdHeader(device.getTransport()));
  794 + sipSender.transmitRequest( request);
822 795 }
823 796  
824 797 /**
... ... @@ -862,11 +835,10 @@ public class SIPCommander implements ISIPCommander {
862 835 cmdXml.append("</HomePosition>\r\n");
863 836 cmdXml.append("</Control>\r\n");
864 837  
865   - CallIdHeader callIdHeader = device.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId()
866   - : udpSipProvider.getNewCallId();
  838 +
867 839  
868   - Request request = headerProvider.createMessageRequest(device, cmdXml.toString(), null, SipUtils.getNewFromTag(), null, callIdHeader);
869   - transmitRequest(device.getTransport(), request, errorEvent);
  840 + Request request = headerProvider.createMessageRequest(device, cmdXml.toString(), null, SipUtils.getNewFromTag(), null,sipSender.getNewCallIdHeader(device.getTransport()));
  841 + sipSender.transmitRequest( request, errorEvent);
870 842 }
871 843  
872 844 /**
... ... @@ -926,11 +898,10 @@ public class SIPCommander implements ISIPCommander {
926 898 cmdXml.append("</BasicParam>\r\n");
927 899 cmdXml.append("</Control>\r\n");
928 900  
929   - CallIdHeader callIdHeader = device.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId()
930   - : udpSipProvider.getNewCallId();
  901 +
931 902  
932   - Request request = headerProvider.createMessageRequest(device, cmdXml.toString(), null, SipUtils.getNewFromTag(), null, callIdHeader);
933   - transmitRequest(device.getTransport(), request, errorEvent);
  903 + Request request = headerProvider.createMessageRequest(device, cmdXml.toString(), null, SipUtils.getNewFromTag(), null,sipSender.getNewCallIdHeader(device.getTransport()));
  904 + sipSender.transmitRequest( request, errorEvent);
934 905 }
935 906  
936 907 /**
... ... @@ -950,12 +921,11 @@ public class SIPCommander implements ISIPCommander {
950 921 catalogXml.append("<DeviceID>" + device.getDeviceId() + "</DeviceID>\r\n");
951 922 catalogXml.append("</Query>\r\n");
952 923  
953   - CallIdHeader callIdHeader = device.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId()
954   - : udpSipProvider.getNewCallId();
  924 +
955 925  
956   - Request request = headerProvider.createMessageRequest(device, catalogXml.toString(), null, SipUtils.getNewFromTag(), null, callIdHeader);
  926 + Request request = headerProvider.createMessageRequest(device, catalogXml.toString(), null, SipUtils.getNewFromTag(), null,sipSender.getNewCallIdHeader(device.getTransport()));
957 927  
958   - transmitRequest(device.getTransport(), request, errorEvent);
  928 + sipSender.transmitRequest( request, errorEvent);
959 929 }
960 930  
961 931 /**
... ... @@ -975,12 +945,11 @@ public class SIPCommander implements ISIPCommander {
975 945 catalogXml.append("<DeviceID>" + device.getDeviceId() + "</DeviceID>\r\n");
976 946 catalogXml.append("</Query>\r\n");
977 947  
978   - CallIdHeader callIdHeader = device.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId()
979   - : udpSipProvider.getNewCallId();
  948 +
980 949  
981   - Request request = headerProvider.createMessageRequest(device, catalogXml.toString(), SipUtils.getNewViaTag(), SipUtils.getNewFromTag(), null, callIdHeader);
  950 + Request request = headerProvider.createMessageRequest(device, catalogXml.toString(), SipUtils.getNewViaTag(), SipUtils.getNewFromTag(), null,sipSender.getNewCallIdHeader(device.getTransport()));
982 951  
983   - transmitRequest(device.getTransport(), request);
  952 + sipSender.transmitRequest( request);
984 953  
985 954 }
986 955  
... ... @@ -1001,12 +970,11 @@ public class SIPCommander implements ISIPCommander {
1001 970 catalogXml.append(" <DeviceID>" + device.getDeviceId() + "</DeviceID>\r\n");
1002 971 catalogXml.append("</Query>\r\n");
1003 972  
1004   - CallIdHeader callIdHeader = device.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId()
1005   - : udpSipProvider.getNewCallId();
  973 +
1006 974  
1007   - Request request = headerProvider.createMessageRequest(device, catalogXml.toString(), SipUtils.getNewViaTag(), SipUtils.getNewFromTag(), null, callIdHeader);
  975 + Request request = headerProvider.createMessageRequest(device, catalogXml.toString(), SipUtils.getNewViaTag(), SipUtils.getNewFromTag(), null,sipSender.getNewCallIdHeader(device.getTransport()));
1008 976  
1009   - transmitRequest(device.getTransport(), request, errorEvent);
  977 + sipSender.transmitRequest( request, errorEvent);
1010 978 }
1011 979  
1012 980 /**
... ... @@ -1047,13 +1015,12 @@ public class SIPCommander implements ISIPCommander {
1047 1015 }
1048 1016 recordInfoXml.append("</Query>\r\n");
1049 1017  
1050   - CallIdHeader callIdHeader = device.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId()
1051   - : udpSipProvider.getNewCallId();
  1018 +
1052 1019  
1053 1020 Request request = headerProvider.createMessageRequest(device, recordInfoXml.toString(),
1054   - SipUtils.getNewViaTag(), SipUtils.getNewFromTag(), null, callIdHeader);
  1021 + SipUtils.getNewViaTag(), SipUtils.getNewFromTag(), null,sipSender.getNewCallIdHeader(device.getTransport()));
1055 1022  
1056   - transmitRequest(device.getTransport(), request, errorEvent, okEvent);
  1023 + sipSender.transmitRequest( request, errorEvent, okEvent);
1057 1024 }
1058 1025  
1059 1026 /**
... ... @@ -1099,11 +1066,10 @@ public class SIPCommander implements ISIPCommander {
1099 1066 }
1100 1067 cmdXml.append("</Query>\r\n");
1101 1068  
1102   - CallIdHeader callIdHeader = device.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId()
1103   - : udpSipProvider.getNewCallId();
  1069 +
1104 1070  
1105   - Request request = headerProvider.createMessageRequest(device, cmdXml.toString(), null, SipUtils.getNewFromTag(), null, callIdHeader);
1106   - transmitRequest(device.getTransport(), request, errorEvent);
  1071 + Request request = headerProvider.createMessageRequest(device, cmdXml.toString(), null, SipUtils.getNewFromTag(), null,sipSender.getNewCallIdHeader(device.getTransport()));
  1072 + sipSender.transmitRequest( request, errorEvent);
1107 1073 }
1108 1074  
1109 1075 /**
... ... @@ -1130,11 +1096,10 @@ public class SIPCommander implements ISIPCommander {
1130 1096 cmdXml.append("<ConfigType>" + configType + "</ConfigType>\r\n");
1131 1097 cmdXml.append("</Query>\r\n");
1132 1098  
1133   - CallIdHeader callIdHeader = device.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId()
1134   - : udpSipProvider.getNewCallId();
  1099 +
1135 1100  
1136   - Request request = headerProvider.createMessageRequest(device, cmdXml.toString(), null, SipUtils.getNewFromTag(), null, callIdHeader);
1137   - transmitRequest(device.getTransport(), request, errorEvent);
  1101 + Request request = headerProvider.createMessageRequest(device, cmdXml.toString(), null, SipUtils.getNewFromTag(), null,sipSender.getNewCallIdHeader(device.getTransport()));
  1102 + sipSender.transmitRequest( request, errorEvent);
1138 1103 }
1139 1104  
1140 1105 /**
... ... @@ -1158,11 +1123,10 @@ public class SIPCommander implements ISIPCommander {
1158 1123 }
1159 1124 cmdXml.append("</Query>\r\n");
1160 1125  
1161   - CallIdHeader callIdHeader = device.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId()
1162   - : udpSipProvider.getNewCallId();
  1126 +
1163 1127  
1164   - Request request = headerProvider.createMessageRequest(device, cmdXml.toString(), null, SipUtils.getNewFromTag(), null, callIdHeader);
1165   - transmitRequest(device.getTransport(), request, errorEvent);
  1128 + Request request = headerProvider.createMessageRequest(device, cmdXml.toString(), null, SipUtils.getNewFromTag(), null,sipSender.getNewCallIdHeader(device.getTransport()));
  1129 + sipSender.transmitRequest( request, errorEvent);
1166 1130 }
1167 1131  
1168 1132 /**
... ... @@ -1183,12 +1147,11 @@ public class SIPCommander implements ISIPCommander {
1183 1147 mobilePostitionXml.append("<Interval>60</Interval>\r\n");
1184 1148 mobilePostitionXml.append("</Query>\r\n");
1185 1149  
1186   - CallIdHeader callIdHeader = device.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId()
1187   - : udpSipProvider.getNewCallId();
  1150 +
1188 1151  
1189   - Request request = headerProvider.createMessageRequest(device, mobilePostitionXml.toString(), SipUtils.getNewViaTag(), SipUtils.getNewFromTag(), null, callIdHeader);
  1152 + Request request = headerProvider.createMessageRequest(device, mobilePostitionXml.toString(), SipUtils.getNewViaTag(), SipUtils.getNewFromTag(), null,sipSender.getNewCallIdHeader(device.getTransport()));
1190 1153  
1191   - transmitRequest(device.getTransport(), request, errorEvent);
  1154 + sipSender.transmitRequest( request, errorEvent);
1192 1155  
1193 1156 }
1194 1157  
... ... @@ -1218,12 +1181,11 @@ public class SIPCommander implements ISIPCommander {
1218 1181 if (requestOld != null) {
1219 1182 callIdHeader = sipFactory.createHeaderFactory().createCallIdHeader(requestOld.getCallIdHeader().getCallId());
1220 1183 } else {
1221   - callIdHeader = device.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId()
1222   - : udpSipProvider.getNewCallId();
  1184 + callIdHeader = sipSender.getNewCallIdHeader(device.getTransport());
1223 1185 }
1224   - SIPRequest request = (SIPRequest) headerProvider.createSubscribeRequest(device, subscribePostitionXml.toString(), requestOld, device.getSubscribeCycleForMobilePosition(), "presence", callIdHeader); //Position;id=" + tm.substring(tm.length() - 4));
  1186 + SIPRequest request = (SIPRequest) headerProvider.createSubscribeRequest(device, subscribePostitionXml.toString(), requestOld, device.getSubscribeCycleForMobilePosition(), "presence",callIdHeader); //Position;id=" + tm.substring(tm.length() - 4));
1225 1187  
1226   - transmitRequest(device.getTransport(), request, errorEvent, okEvent);
  1188 + sipSender.transmitRequest( request, errorEvent, okEvent);
1227 1189 return request;
1228 1190 }
1229 1191  
... ... @@ -1270,11 +1232,10 @@ public class SIPCommander implements ISIPCommander {
1270 1232 }
1271 1233 cmdXml.append("</Query>\r\n");
1272 1234  
1273   - CallIdHeader callIdHeader = device.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId()
1274   - : udpSipProvider.getNewCallId();
  1235 +
1275 1236  
1276   - Request request = headerProvider.createSubscribeRequest(device, cmdXml.toString(), null, expires, "presence", callIdHeader);
1277   - transmitRequest(device.getTransport(), request);
  1237 + Request request = headerProvider.createSubscribeRequest(device, cmdXml.toString(), null, expires, "presence",sipSender.getNewCallIdHeader(device.getTransport()));
  1238 + sipSender.transmitRequest( request);
1278 1239  
1279 1240 }
1280 1241  
... ... @@ -1295,14 +1256,13 @@ public class SIPCommander implements ISIPCommander {
1295 1256 if (requestOld != null) {
1296 1257 callIdHeader = sipFactory.createHeaderFactory().createCallIdHeader(requestOld.getCallIdHeader().getCallId());
1297 1258 } else {
1298   - callIdHeader = device.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId()
1299   - : udpSipProvider.getNewCallId();
  1259 + callIdHeader = sipSender.getNewCallIdHeader(device.getTransport());
1300 1260 }
1301 1261  
1302 1262 // 有效时间默认为60秒以上
1303 1263 SIPRequest request = (SIPRequest) headerProvider.createSubscribeRequest(device, cmdXml.toString(), requestOld, device.getSubscribeCycleForCatalog(), "Catalog",
1304 1264 callIdHeader);
1305   - transmitRequest(device.getTransport(), request, errorEvent, okEvent);
  1265 + sipSender.transmitRequest( request, errorEvent, okEvent);
1306 1266 return request;
1307 1267 }
1308 1268  
... ... @@ -1322,59 +1282,14 @@ public class SIPCommander implements ISIPCommander {
1322 1282 }
1323 1283 dragXml.append(cmdString);
1324 1284 dragXml.append("</Control>\r\n");
1325   - CallIdHeader callIdHeader = device.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId()
1326   - : udpSipProvider.getNewCallId();
1327   - Request request = headerProvider.createMessageRequest(device, dragXml.toString(), SipUtils.getNewViaTag(), SipUtils.getNewFromTag(), null, callIdHeader);
  1285 +
  1286 + Request request = headerProvider.createMessageRequest(device, dragXml.toString(), SipUtils.getNewViaTag(), SipUtils.getNewFromTag(), null,sipSender.getNewCallIdHeader(device.getTransport()));
1328 1287 logger.debug("拉框信令: " + request.toString());
1329   - transmitRequest(device.getTransport(), request);
  1288 + sipSender.transmitRequest(request);
1330 1289 }
1331 1290  
1332 1291  
1333   - @Override
1334   - public void transmitRequest(String transport, Request request) throws SipException, ParseException {
1335   - transmitRequest(transport, request, null, null);
1336   - }
1337   -
1338   - @Override
1339   - public void transmitRequest(String transport, Request request, SipSubscribe.Event errorEvent) throws SipException, ParseException {
1340   - transmitRequest(transport, request, errorEvent, null);
1341   - }
1342   -
1343   - @Override
1344   - public void transmitRequest(String transport, Request request, SipSubscribe.Event errorEvent, SipSubscribe.Event okEvent) throws SipException, ParseException {
1345   -
1346   - if (request.getHeader(UserAgentHeader.NAME) == null) {
1347   - try {
1348   - request.addHeader(SipUtils.createUserAgentHeader(sipFactory, gitUtil));
1349   - } catch (ParseException e) {
1350   - logger.error("添加UserAgentHeader失败", e);
1351   - }
1352   - }
1353   -
1354   - CallIdHeader callIdHeader = (CallIdHeader) request.getHeader(CallIdHeader.NAME);
1355   - // 添加错误订阅
1356   - if (errorEvent != null) {
1357   - sipSubscribe.addErrorSubscribe(callIdHeader.getCallId(), (eventResult -> {
1358   - errorEvent.response(eventResult);
1359   - sipSubscribe.removeErrorSubscribe(eventResult.callId);
1360   - sipSubscribe.removeOkSubscribe(eventResult.callId);
1361   - }));
1362   - }
1363   - // 添加订阅
1364   - if (okEvent != null) {
1365   - sipSubscribe.addOkSubscribe(callIdHeader.getCallId(), eventResult -> {
1366   - okEvent.response(eventResult);
1367   - sipSubscribe.removeOkSubscribe(eventResult.callId);
1368   - sipSubscribe.removeErrorSubscribe(eventResult.callId);
1369   - });
1370   - }
1371   - if ("TCP".equals(transport)) {
1372   - tcpSipProvider.sendRequest(request);
1373   - } else if ("UDP".equals(transport)) {
1374   - udpSipProvider.sendRequest(request);
1375   - }
1376   -
1377   - }
  1292 +
1378 1293  
1379 1294  
1380 1295 /**
... ... @@ -1449,7 +1364,7 @@ public class SIPCommander implements ISIPCommander {
1449 1364 return;
1450 1365 }
1451 1366  
1452   - transmitRequest(device.getTransport(), request, errorEvent, okEvent);
  1367 + sipSender.transmitRequest( request, errorEvent, okEvent);
1453 1368 }
1454 1369  
1455 1370 @Override
... ... @@ -1478,10 +1393,9 @@ public class SIPCommander implements ISIPCommander {
1478 1393 deviceStatusXml.append("</info>\r\n");
1479 1394 deviceStatusXml.append("</Notify>\r\n");
1480 1395  
1481   - CallIdHeader callIdHeader = device.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId()
1482   - : udpSipProvider.getNewCallId();
1483   - Request request = headerProvider.createMessageRequest(device, deviceStatusXml.toString(), SipUtils.getNewViaTag(), SipUtils.getNewFromTag(), null, callIdHeader);
1484   - transmitRequest(device.getTransport(), request);
  1396 +
  1397 + Request request = headerProvider.createMessageRequest(device, deviceStatusXml.toString(), SipUtils.getNewViaTag(), SipUtils.getNewFromTag(), null,sipSender.getNewCallIdHeader(device.getTransport()));
  1398 + sipSender.transmitRequest(request);
1485 1399  
1486 1400  
1487 1401 }
... ...
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/SIPRequestProcessorParent.java
1 1 package com.genersoft.iot.vmp.gb28181.transmit.event.request;
2 2  
3 3 import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform;
  4 +import com.genersoft.iot.vmp.gb28181.transmit.SIPSender;
4 5 import com.genersoft.iot.vmp.gb28181.utils.SipUtils;
5 6 import gov.nist.javax.sip.SipProviderImpl;
6   -import gov.nist.javax.sip.SipStackImpl;
7 7 import gov.nist.javax.sip.message.SIPRequest;
8 8 import gov.nist.javax.sip.message.SIPResponse;
9   -import gov.nist.javax.sip.stack.SIPServerTransaction;
10   -import gov.nist.javax.sip.stack.SIPServerTransactionImpl;
11 9 import org.apache.commons.lang3.ArrayUtils;
12 10 import org.dom4j.Document;
13 11 import org.dom4j.DocumentException;
... ... @@ -51,48 +49,9 @@ public abstract class SIPRequestProcessorParent {
51 49 @Qualifier(value="udpSipProvider")
52 50 private SipProviderImpl udpSipProvider;
53 51  
54   - /**
55   - * 根据 RequestEvent 获取 ServerTransaction
56   - * @param evt
57   - * @return
58   - */
59   - public ServerTransaction getServerTransaction(RequestEvent evt) {
60   - Request request = evt.getRequest();
61   - SIPServerTransactionImpl serverTransaction = (SIPServerTransactionImpl)evt.getServerTransaction();
62   - // 判断TCP还是UDP
63   - boolean isTcp = false;
64   - ViaHeader reqViaHeader = (ViaHeader) request.getHeader(ViaHeader.NAME);
65   - String transport = reqViaHeader.getTransport();
66   - if (transport.equalsIgnoreCase("TCP")) {
67   - isTcp = true;
68   - }
69   - if (serverTransaction != null && serverTransaction.getOriginalRequest() == null) {
70   - serverTransaction.setOriginalRequest((SIPRequest) evt.getRequest());
71   - }
72   - if (serverTransaction == null) {
73   - try {
74   - if (isTcp) {
75   - SipStackImpl stack = (SipStackImpl)tcpSipProvider.getSipStack();
76   - serverTransaction = (SIPServerTransactionImpl) stack.findTransaction((SIPRequest)request, true);
77   - if (serverTransaction == null) {
78   - serverTransaction = (SIPServerTransactionImpl)tcpSipProvider.getNewServerTransaction(request);
79   - }
80   - } else {
81   - SipStackImpl stack = (SipStackImpl)udpSipProvider.getSipStack();
82   - serverTransaction = (SIPServerTransactionImpl) stack.findTransaction((SIPRequest)request, true);
83   - if (serverTransaction == null) {
84   - serverTransaction = (SIPServerTransactionImpl)udpSipProvider.getNewServerTransaction(request);
85   - }
86   - }
87   - } catch (TransactionAlreadyExistsException e) {
88   - logger.error(e.getMessage());
89   - } catch (TransactionUnavailableException e) {
90   - logger.error(e.getMessage());
91   - }
92   - }
93   - return serverTransaction;
94   - }
95   -
  52 + @Autowired
  53 + private SIPSender sipSender;
  54 +
96 55 public AddressFactory getAddressFactory() {
97 56 try {
98 57 return SipFactory.getInstance().createAddressFactory();
... ... @@ -134,25 +93,73 @@ public abstract class SIPRequestProcessorParent {
134 93 * 400
135 94 * 404
136 95 */
137   - public SIPResponse responseAck(ServerTransaction serverTransaction, int statusCode) throws SipException, InvalidArgumentException, ParseException {
138   - return responseAck(serverTransaction, statusCode, null);
  96 + public SIPResponse responseAck(SIPRequest sipRequest, int statusCode) throws SipException, InvalidArgumentException, ParseException {
  97 + return responseAck(sipRequest, statusCode, null);
139 98 }
140 99  
141   - public SIPResponse responseAck(ServerTransaction serverTransaction, int statusCode, String msg) throws SipException, InvalidArgumentException, ParseException {
142   - return responseAck(serverTransaction, statusCode, msg, null);
  100 + public SIPResponse responseAck(SIPRequest sipRequest, int statusCode, String msg) throws SipException, InvalidArgumentException, ParseException {
  101 + return responseAck(sipRequest, statusCode, msg, null);
143 102 }
144 103  
145   - public SIPResponse responseAck(ServerTransaction serverTransaction, int statusCode, String msg, ResponseAckExtraParam responseAckExtraParam) throws SipException, InvalidArgumentException, ParseException {
146   - ToHeader toHeader = (ToHeader) serverTransaction.getRequest().getHeader(ToHeader.NAME);
147   - if (toHeader.getTag() == null) {
148   - toHeader.setTag(SipUtils.getNewTag());
  104 +// public SIPResponse responseAck(ServerTransaction serverTransaction, int statusCode, String msg, ResponseAckExtraParam responseAckExtraParam) throws SipException, InvalidArgumentException, ParseException {
  105 +// if (serverTransaction == null) {
  106 +// logger.warn("[回复消息] ServerTransaction 为null");
  107 +// return null;
  108 +// }
  109 +// ToHeader toHeader = (ToHeader) serverTransaction.getRequest().getHeader(ToHeader.NAME);
  110 +// if (toHeader.getTag() == null) {
  111 +// toHeader.setTag(SipUtils.getNewTag());
  112 +// }
  113 +// SIPResponse response = (SIPResponse)getMessageFactory().createResponse(statusCode, serverTransaction.getRequest());
  114 +// if (msg != null) {
  115 +// response.setReasonPhrase(msg);
  116 +// }
  117 +// if (responseAckExtraParam != null) {
  118 +// if (responseAckExtraParam.sipURI != null && serverTransaction.getRequest().getMethod().equals(Request.INVITE)) {
  119 +// logger.debug("responseSdpAck SipURI: {}:{}", responseAckExtraParam.sipURI.getHost(), responseAckExtraParam.sipURI.getPort());
  120 +// Address concatAddress = SipFactory.getInstance().createAddressFactory().createAddress(
  121 +// SipFactory.getInstance().createAddressFactory().createSipURI(responseAckExtraParam.sipURI.getUser(), responseAckExtraParam.sipURI.getHost()+":"+responseAckExtraParam.sipURI.getPort()
  122 +// ));
  123 +// response.addHeader(SipFactory.getInstance().createHeaderFactory().createContactHeader(concatAddress));
  124 +// }
  125 +// if (responseAckExtraParam.contentTypeHeader != null) {
  126 +// response.setContent(responseAckExtraParam.content, responseAckExtraParam.contentTypeHeader);
  127 +// }
  128 +//
  129 +// if (serverTransaction.getRequest().getMethod().equals(Request.SUBSCRIBE)) {
  130 +// if (responseAckExtraParam.expires == -1) {
  131 +// logger.error("[参数不全] 2xx的SUBSCRIBE回复,必须设置Expires header");
  132 +// }else {
  133 +// ExpiresHeader expiresHeader = SipFactory.getInstance().createHeaderFactory().createExpiresHeader(responseAckExtraParam.expires);
  134 +// response.addHeader(expiresHeader);
  135 +// }
  136 +// }
  137 +// }else {
  138 +// if (serverTransaction.getRequest().getMethod().equals(Request.SUBSCRIBE)) {
  139 +// logger.error("[参数不全] 2xx的SUBSCRIBE回复,必须设置Expires header");
  140 +// }
  141 +// }
  142 +// serverTransaction.sendResponse(response);
  143 +// if (statusCode >= 200 && !"NOTIFY".equalsIgnoreCase(serverTransaction.getRequest().getMethod())) {
  144 +// if (serverTransaction.getDialog() != null) {
  145 +// serverTransaction.getDialog().delete();
  146 +// }
  147 +// }
  148 +// return response;
  149 +// }
  150 +
  151 + public SIPResponse responseAck(SIPRequest sipRequest, int statusCode, String msg, ResponseAckExtraParam responseAckExtraParam) throws SipException, InvalidArgumentException, ParseException {
  152 + if (sipRequest.getToHeader().getTag() == null) {
  153 + sipRequest.getToHeader().setTag(SipUtils.getNewTag());
149 154 }
150   - SIPResponse response = (SIPResponse)getMessageFactory().createResponse(statusCode, serverTransaction.getRequest());
  155 + SIPResponse response = (SIPResponse)getMessageFactory().createResponse(statusCode, sipRequest);
  156 + response.setStatusCode(statusCode);
151 157 if (msg != null) {
152 158 response.setReasonPhrase(msg);
153 159 }
  160 +
154 161 if (responseAckExtraParam != null) {
155   - if (responseAckExtraParam.sipURI != null && serverTransaction.getRequest().getMethod().equals(Request.INVITE)) {
  162 + if (responseAckExtraParam.sipURI != null && sipRequest.getMethod().equals(Request.INVITE)) {
156 163 logger.debug("responseSdpAck SipURI: {}:{}", responseAckExtraParam.sipURI.getHost(), responseAckExtraParam.sipURI.getPort());
157 164 Address concatAddress = SipFactory.getInstance().createAddressFactory().createAddress(
158 165 SipFactory.getInstance().createAddressFactory().createSipURI(responseAckExtraParam.sipURI.getUser(), responseAckExtraParam.sipURI.getHost()+":"+responseAckExtraParam.sipURI.getPort()
... ... @@ -163,7 +170,7 @@ public abstract class SIPRequestProcessorParent {
163 170 response.setContent(responseAckExtraParam.content, responseAckExtraParam.contentTypeHeader);
164 171 }
165 172  
166   - if (serverTransaction.getRequest().getMethod().equals(Request.SUBSCRIBE)) {
  173 + if (sipRequest.getMethod().equals(Request.SUBSCRIBE)) {
167 174 if (responseAckExtraParam.expires == -1) {
168 175 logger.error("[参数不全] 2xx的SUBSCRIBE回复,必须设置Expires header");
169 176 }else {
... ... @@ -172,28 +179,26 @@ public abstract class SIPRequestProcessorParent {
172 179 }
173 180 }
174 181 }else {
175   - if (serverTransaction.getRequest().getMethod().equals(Request.SUBSCRIBE)) {
  182 + if (sipRequest.getMethod().equals(Request.SUBSCRIBE)) {
176 183 logger.error("[参数不全] 2xx的SUBSCRIBE回复,必须设置Expires header");
177 184 }
178 185 }
179   - serverTransaction.sendResponse(response);
180   - if (statusCode >= 200 && !"NOTIFY".equalsIgnoreCase(serverTransaction.getRequest().getMethod())) {
181   - if (serverTransaction.getDialog() != null) {
182   - serverTransaction.getDialog().delete();
183   - }
184   - }
  186 +
  187 + // 发送response
  188 + sipSender.transmitRequest(response);
  189 +
185 190 return response;
186 191 }
187 192  
188 193 /**
189 194 * 回复带sdp的200
190 195 */
191   - public SIPResponse responseSdpAck(ServerTransaction serverTransaction, String sdp, ParentPlatform platform) throws SipException, InvalidArgumentException, ParseException {
  196 + public SIPResponse responseSdpAck(SIPRequest request, String sdp, ParentPlatform platform) throws SipException, InvalidArgumentException, ParseException {
192 197  
193 198 ContentTypeHeader contentTypeHeader = SipFactory.getInstance().createHeaderFactory().createContentTypeHeader("APPLICATION", "SDP");
194 199  
195 200 // 兼容国标中的使用编码@域名作为RequestURI的情况
196   - SipURI sipURI = (SipURI)serverTransaction.getRequest().getRequestURI();
  201 + SipURI sipURI = (SipURI)request.getRequestURI();
197 202 if (sipURI.getPort() == -1) {
198 203 sipURI = SipFactory.getInstance().createAddressFactory().createSipURI(platform.getServerGBId(), platform.getServerIP()+":"+platform.getServerPort());
199 204 }
... ... @@ -202,16 +207,16 @@ public abstract class SIPRequestProcessorParent {
202 207 responseAckExtraParam.content = sdp;
203 208 responseAckExtraParam.sipURI = sipURI;
204 209  
205   - return responseAck(serverTransaction, Response.OK, null, responseAckExtraParam);
  210 + return responseAck(request, Response.OK, null, responseAckExtraParam);
206 211 }
207 212  
208 213 /**
209 214 * 回复带xml的200
210 215 */
211   - public SIPResponse responseXmlAck(ServerTransaction serverTransaction, String xml, ParentPlatform platform, Integer expires) throws SipException, InvalidArgumentException, ParseException {
  216 + public SIPResponse responseXmlAck(SIPRequest request, String xml, ParentPlatform platform, Integer expires) throws SipException, InvalidArgumentException, ParseException {
212 217 ContentTypeHeader contentTypeHeader = SipFactory.getInstance().createHeaderFactory().createContentTypeHeader("Application", "MANSCDP+xml");
213 218  
214   - SipURI sipURI = (SipURI)serverTransaction.getRequest().getRequestURI();
  219 + SipURI sipURI = (SipURI)request.getRequestURI();
215 220 if (sipURI.getPort() == -1) {
216 221 sipURI = SipFactory.getInstance().createAddressFactory().createSipURI(platform.getServerGBId(), platform.getServerIP()+":"+platform.getServerPort());
217 222 }
... ... @@ -220,7 +225,7 @@ public abstract class SIPRequestProcessorParent {
220 225 responseAckExtraParam.content = xml;
221 226 responseAckExtraParam.sipURI = sipURI;
222 227 responseAckExtraParam.expires = expires;
223   - return responseAck(serverTransaction, Response.OK, null, responseAckExtraParam);
  228 + return responseAck(request, Response.OK, null, responseAckExtraParam);
224 229 }
225 230  
226 231 public Element getRootElement(RequestEvent evt) throws DocumentException {
... ...
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/ByeRequestProcessor.java
... ... @@ -18,6 +18,7 @@ import com.genersoft.iot.vmp.service.IMediaServerService;
18 18 import com.genersoft.iot.vmp.service.bean.MessageForPushChannel;
19 19 import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
20 20 import com.genersoft.iot.vmp.storager.IVideoManagerStorage;
  21 +import gov.nist.javax.sip.message.SIPRequest;
21 22 import org.slf4j.Logger;
22 23 import org.slf4j.LoggerFactory;
23 24 import org.springframework.beans.factory.InitializingBean;
... ... @@ -82,7 +83,7 @@ public class ByeRequestProcessor extends SIPRequestProcessorParent implements In
82 83 public void process(RequestEvent evt) {
83 84  
84 85 try {
85   - responseAck(getServerTransaction(evt), Response.OK);
  86 + responseAck((SIPRequest) evt.getRequest(), Response.OK);
86 87 } catch (SipException | InvalidArgumentException | ParseException e) {
87 88 logger.error("[回复BYE信息失败],{}", e.getMessage());
88 89 }
... ...
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/InviteRequestProcessor.java
... ... @@ -7,6 +7,7 @@ import com.genersoft.iot.vmp.gb28181.bean.*;
7 7 import com.genersoft.iot.vmp.gb28181.event.SipSubscribe;
8 8 import com.genersoft.iot.vmp.gb28181.session.VideoStreamSessionManager;
9 9 import com.genersoft.iot.vmp.gb28181.transmit.SIPProcessorObserver;
  10 +import com.genersoft.iot.vmp.gb28181.transmit.SIPSender;
10 11 import com.genersoft.iot.vmp.gb28181.transmit.cmd.ISIPCommander;
11 12 import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommanderFroPlatform;
12 13 import com.genersoft.iot.vmp.gb28181.transmit.event.request.ISIPRequestProcessor;
... ... @@ -81,7 +82,7 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements
81 82 private IPlayService playService;
82 83  
83 84 @Autowired
84   - private ISIPCommander commander;
  85 + private SIPSender sipSender;
85 86  
86 87 @Autowired
87 88 private ZLMRTPServerFactory zlmrtpServerFactory;
... ... @@ -124,16 +125,15 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements
124 125 public void process(RequestEvent evt) {
125 126 // Invite Request消息实现,此消息一般为级联消息,上级给下级发送请求视频指令
126 127 try {
127   - Request request = evt.getRequest();
  128 + SIPRequest request = (SIPRequest)evt.getRequest();
128 129 String channelId = SipUtils.getChannelIdFromRequest(request);
129 130 String requesterId = SipUtils.getUserIdFromFromHeader(request);
130 131 CallIdHeader callIdHeader = (CallIdHeader) request.getHeader(CallIdHeader.NAME);
131   - ServerTransaction serverTransaction = getServerTransaction(evt);
132 132 if (requesterId == null || channelId == null) {
133 133 logger.info("无法从FromHeader的Address中获取到平台id,返回400");
134 134 // 参数不全, 发400,请求错误
135 135 try {
136   - responseAck(serverTransaction, Response.BAD_REQUEST);
  136 + responseAck(request, Response.BAD_REQUEST);
137 137 } catch (SipException | InvalidArgumentException | ParseException e) {
138 138 logger.error("[命令发送失败] invite BAD_REQUEST: {}", e.getMessage());
139 139 }
... ... @@ -144,7 +144,7 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements
144 144 // 查询请求是否来自上级平台\设备
145 145 ParentPlatform platform = storager.queryParentPlatByServerGBId(requesterId);
146 146 if (platform == null) {
147   - inviteFromDeviceHandle(serverTransaction, requesterId);
  147 + inviteFromDeviceHandle(request, requesterId);
148 148  
149 149 } else {
150 150 // 查询平台下是否有该通道
... ... @@ -159,12 +159,12 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements
159 159 if (channel != null && gbStream == null) {
160 160 // if (channel.getStatus() == 0) {
161 161 // logger.info("通道离线,返回400");
162   -// responseAck(serverTransaction, Response.BAD_REQUEST, "channel [" + channel.getChannelId() + "] offline");
  162 +// responseAck(request, Response.BAD_REQUEST, "channel [" + channel.getChannelId() + "] offline");
163 163 // return;
164 164 // }
165 165 // 通道存在,发100,TRYING
166 166 try {
167   - responseAck(serverTransaction, Response.TRYING);
  167 + responseAck(request, Response.TRYING);
168 168 } catch (SipException | InvalidArgumentException | ParseException e) {
169 169 logger.error("[命令发送失败] invite TRYING: {}", e.getMessage());
170 170 }
... ... @@ -176,7 +176,7 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements
176 176 if ("proxy".equals(gbStream.getStreamType())) {
177 177 logger.info("[ app={}, stream={} ]找不到zlm {},返回410", gbStream.getApp(), gbStream.getStream(), mediaServerId);
178 178 try {
179   - responseAck(serverTransaction, Response.GONE);
  179 + responseAck(request, Response.GONE);
180 180 } catch (SipException | InvalidArgumentException | ParseException e) {
181 181 logger.error("[命令发送失败] invite GONE: {}", e.getMessage());
182 182 }
... ... @@ -186,7 +186,7 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements
186 186 if (streamPushItem == null || streamPushItem.getServerId().equals(userSetting.getServerId())) {
187 187 logger.info("[ app={}, stream={} ]找不到zlm {},返回410", gbStream.getApp(), gbStream.getStream(), mediaServerId);
188 188 try {
189   - responseAck(serverTransaction, Response.GONE);
  189 + responseAck(request, Response.GONE);
190 190 } catch (SipException | InvalidArgumentException | ParseException e) {
191 191 logger.error("[命令发送失败] invite GONE: {}", e.getMessage());
192 192 }
... ... @@ -199,7 +199,7 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements
199 199 if (streamPushItem == null) {
200 200 logger.info("[ app={}, stream={} ]找不到zlm {},返回410", gbStream.getApp(), gbStream.getStream(), mediaServerId);
201 201 try {
202   - responseAck(serverTransaction, Response.GONE);
  202 + responseAck(request, Response.GONE);
203 203 } catch (SipException | InvalidArgumentException | ParseException e) {
204 204 logger.error("[命令发送失败] invite GONE: {}", e.getMessage());
205 205 }
... ... @@ -210,7 +210,7 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements
210 210 if (proxyByAppAndStream == null) {
211 211 logger.info("[ app={}, stream={} ]找不到zlm {},返回410", gbStream.getApp(), gbStream.getStream(), mediaServerId);
212 212 try {
213   - responseAck(serverTransaction, Response.GONE);
  213 + responseAck(request, Response.GONE);
214 214 } catch (SipException | InvalidArgumentException | ParseException e) {
215 215 logger.error("[命令发送失败] invite GONE: {}", e.getMessage());
216 216 }
... ... @@ -219,14 +219,14 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements
219 219 }
220 220 }
221 221 try {
222   - responseAck(serverTransaction, Response.CALL_IS_BEING_FORWARDED);
  222 + responseAck(request, Response.CALL_IS_BEING_FORWARDED);
223 223 } catch (SipException | InvalidArgumentException | ParseException e) {
224 224 logger.error("[命令发送失败] invite CALL_IS_BEING_FORWARDED: {}", e.getMessage());
225 225 }
226 226 } else if (catalog != null) {
227 227 try {
228 228 // 目录不支持点播
229   - responseAck(serverTransaction, Response.BAD_REQUEST, "catalog channel can not play");
  229 + responseAck(request, Response.BAD_REQUEST, "catalog channel can not play");
230 230 } catch (SipException | InvalidArgumentException | ParseException e) {
231 231 logger.error("[命令发送失败] invite 目录不支持点播: {}", e.getMessage());
232 232 }
... ... @@ -235,7 +235,7 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements
235 235 logger.info("通道不存在,返回404");
236 236 try {
237 237 // 通道不存在,发404,资源不存在
238   - responseAck(serverTransaction, Response.NOT_FOUND);
  238 + responseAck(request, Response.NOT_FOUND);
239 239 } catch (SipException | InvalidArgumentException | ParseException e) {
240 240 logger.error("[命令发送失败] invite 通道不存在: {}", e.getMessage());
241 241 }
... ... @@ -311,7 +311,7 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements
311 311 // 回复不支持的格式
312 312 try {
313 313 // 不支持的格式,发415
314   - responseAck(serverTransaction, Response.UNSUPPORTED_MEDIA_TYPE);
  314 + responseAck(request, Response.UNSUPPORTED_MEDIA_TYPE);
315 315 } catch (SipException | InvalidArgumentException | ParseException e) {
316 316 logger.error("[命令发送失败] invite 不支持的格式: {}", e.getMessage());
317 317 }
... ... @@ -328,7 +328,7 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements
328 328 if (device == null) {
329 329 logger.warn("点播平台{}的通道{}时未找到设备信息", requesterId, channel);
330 330 try {
331   - responseAck(serverTransaction, Response.SERVER_INTERNAL_ERROR);
  331 + responseAck(request, Response.SERVER_INTERNAL_ERROR);
332 332 } catch (SipException | InvalidArgumentException | ParseException e) {
333 333 logger.error("[命令发送失败] invite 未找到设备信息: {}", e.getMessage());
334 334 }
... ... @@ -338,7 +338,7 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements
338 338 if (mediaServerItem == null) {
339 339 logger.warn("未找到可用的zlm");
340 340 try {
341   - responseAck(serverTransaction, Response.BUSY_HERE);
  341 + responseAck(request, Response.BUSY_HERE);
342 342 } catch (SipException | InvalidArgumentException | ParseException e) {
343 343 logger.error("[命令发送失败] invite BUSY_HERE: {}", e.getMessage());
344 344 }
... ... @@ -354,7 +354,7 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements
354 354 if (sendRtpItem == null) {
355 355 logger.warn("服务器端口资源不足");
356 356 try {
357   - responseAck(serverTransaction, Response.BUSY_HERE);
  357 + responseAck(request, Response.BUSY_HERE);
358 358 } catch (SipException | InvalidArgumentException | ParseException e) {
359 359 logger.error("[命令发送失败] invite 服务器端口资源不足: {}", e.getMessage());
360 360 }
... ... @@ -403,7 +403,7 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements
403 403 logger.error("[命令发送失败] 国标级联 发送BYE: {}", e.getMessage());
404 404 }
405 405 }, 60 * 1000);
406   - responseSdpAck(serverTransaction, content.toString(), platform);
  406 + responseSdpAck(request, content.toString(), platform);
407 407  
408 408 } catch (SipException e) {
409 409 e.printStackTrace();
... ... @@ -415,15 +415,10 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements
415 415 };
416 416 SipSubscribe.Event errorEvent = ((event) -> {
417 417 // 未知错误。直接转发设备点播的错误
418   - Response response = null;
419 418 try {
420   - response = getMessageFactory().createResponse(event.statusCode, evt.getRequest());
421   - serverTransaction.sendResponse(response);
422   - System.out.println("未知错误。直接转发设备点播的错误");
423   - if (serverTransaction.getDialog() != null) {
424   - serverTransaction.getDialog().delete();
425   - }
426   - } catch (ParseException | SipException | InvalidArgumentException e) {
  419 + Response response = getMessageFactory().createResponse(event.statusCode, evt.getRequest());
  420 + sipSender.transmitRequest(response);
  421 + } catch (ParseException | SipException e) {
427 422 e.printStackTrace();
428 423 }
429 424 });
... ... @@ -443,7 +438,7 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements
443 438 }
444 439 redisCatchStorage.deleteSendRTPServer(platform.getServerGBId(), channelId, callIdHeader.getCallId(), null);
445 440 try {
446   - responseAck(serverTransaction, Response.REQUEST_TIMEOUT);
  441 + responseAck(request, Response.REQUEST_TIMEOUT);
447 442 } catch (SipException e) {
448 443 e.printStackTrace();
449 444 } catch (InvalidArgumentException e) {
... ... @@ -503,26 +498,26 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements
503 498 if("push".equals(gbStream.getStreamType())) {
504 499 if (streamPushItem != null && streamPushItem.isPushIng()) {
505 500 // 推流状态
506   - pushStream(evt, serverTransaction, gbStream, streamPushItem, platform, callIdHeader, mediaServerItem, port, tcpActive,
  501 + pushStream(evt, request, gbStream, streamPushItem, platform, callIdHeader, mediaServerItem, port, tcpActive,
507 502 mediaTransmissionTCP, channelId, addressStr, ssrc, requesterId);
508 503 } else {
509 504 // 未推流 拉起
510   - notifyStreamOnline(evt, serverTransaction,gbStream, streamPushItem, platform, callIdHeader, mediaServerItem, port, tcpActive,
  505 + notifyStreamOnline(evt, request,gbStream, streamPushItem, platform, callIdHeader, mediaServerItem, port, tcpActive,
511 506 mediaTransmissionTCP, channelId, addressStr, ssrc, requesterId);
512 507 }
513 508 }else if ("proxy".equals(gbStream.getStreamType())){
514 509 if(null != proxyByAppAndStream &&proxyByAppAndStream.isStatus()){
515   - pushProxyStream(evt, serverTransaction, gbStream, platform, callIdHeader, mediaServerItem, port, tcpActive,
  510 + pushProxyStream(evt, request, gbStream, platform, callIdHeader, mediaServerItem, port, tcpActive,
516 511 mediaTransmissionTCP, channelId, addressStr, ssrc, requesterId);
517 512 }else{
518 513 //开启代理拉流
519 514 boolean start1 = streamProxyService.start(gbStream.getApp(), gbStream.getStream());
520 515 if(start1) {
521   - pushProxyStream(evt, serverTransaction, gbStream, platform, callIdHeader, mediaServerItem, port, tcpActive,
  516 + pushProxyStream(evt, request, gbStream, platform, callIdHeader, mediaServerItem, port, tcpActive,
522 517 mediaTransmissionTCP, channelId, addressStr, ssrc, requesterId);
523 518 }else{
524 519 //失败后通知
525   - notifyStreamOnline(evt, serverTransaction,gbStream, null, platform, callIdHeader, mediaServerItem, port, tcpActive,
  520 + notifyStreamOnline(evt, request,gbStream, null, platform, callIdHeader, mediaServerItem, port, tcpActive,
526 521 mediaTransmissionTCP, channelId, addressStr, ssrc, requesterId);
527 522 }
528 523 }
... ... @@ -540,7 +535,7 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements
540 535 /**
541 536 * 安排推流
542 537 */
543   - private void pushProxyStream(RequestEvent evt, ServerTransaction serverTransaction, GbStream gbStream, ParentPlatform platform,
  538 + private void pushProxyStream(RequestEvent evt, SIPRequest request, GbStream gbStream, ParentPlatform platform,
544 539 CallIdHeader callIdHeader, MediaServerItem mediaServerItem,
545 540 int port, Boolean tcpActive, boolean mediaTransmissionTCP,
546 541 String channelId, String addressStr, String ssrc, String requesterId) {
... ... @@ -554,7 +549,7 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements
554 549 if (sendRtpItem == null) {
555 550 logger.warn("服务器端口资源不足");
556 551 try {
557   - responseAck(serverTransaction, Response.BUSY_HERE);
  552 + responseAck(request, Response.BUSY_HERE);
558 553 } catch (SipException | InvalidArgumentException | ParseException e) {
559 554 logger.error("[命令发送失败] invite 服务器端口资源不足: {}", e.getMessage());
560 555 }
... ... @@ -567,10 +562,9 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements
567 562 // 写入redis, 超时时回复
568 563 sendRtpItem.setStatus(1);
569 564 sendRtpItem.setCallId(callIdHeader.getCallId());
570   - SIPRequest request = (SIPRequest) evt.getRequest();
571 565 sendRtpItem.setFromTag(request.getFromTag());
572 566  
573   - SIPResponse response = sendStreamAck(mediaServerItem, serverTransaction, sendRtpItem, platform, evt);
  567 + SIPResponse response = sendStreamAck(mediaServerItem, request, sendRtpItem, platform, evt);
574 568 if (response != null) {
575 569 sendRtpItem.setToTag(response.getToTag());
576 570 }
... ... @@ -579,7 +573,7 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements
579 573 }
580 574  
581 575 }
582   - private void pushStream(RequestEvent evt, ServerTransaction serverTransaction, GbStream gbStream, StreamPushItem streamPushItem, ParentPlatform platform,
  576 + private void pushStream(RequestEvent evt, SIPRequest request, GbStream gbStream, StreamPushItem streamPushItem, ParentPlatform platform,
583 577 CallIdHeader callIdHeader, MediaServerItem mediaServerItem,
584 578 int port, Boolean tcpActive, boolean mediaTransmissionTCP,
585 579 String channelId, String addressStr, String ssrc, String requesterId) {
... ... @@ -595,7 +589,7 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements
595 589 if (sendRtpItem == null) {
596 590 logger.warn("服务器端口资源不足");
597 591 try {
598   - responseAck(serverTransaction, Response.BUSY_HERE);
  592 + responseAck(request, Response.BUSY_HERE);
599 593 } catch (SipException | InvalidArgumentException | ParseException e) {
600 594 logger.error("[命令发送失败] invite 服务器端口资源不足: {}", e.getMessage());
601 595 }
... ... @@ -609,9 +603,8 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements
609 603 sendRtpItem.setStatus(1);
610 604 sendRtpItem.setCallId(callIdHeader.getCallId());
611 605  
612   - SIPRequest request = (SIPRequest) evt.getRequest();
613 606 sendRtpItem.setFromTag(request.getFromTag());
614   - SIPResponse response = sendStreamAck(mediaServerItem, serverTransaction, sendRtpItem, platform, evt);
  607 + SIPResponse response = sendStreamAck(mediaServerItem, request, sendRtpItem, platform, evt);
615 608 if (response != null) {
616 609 sendRtpItem.setToTag(response.getToTag());
617 610 }
... ... @@ -620,20 +613,20 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements
620 613  
621 614 } else {
622 615 // 不在线 拉起
623   - notifyStreamOnline(evt, serverTransaction,gbStream, streamPushItem, platform, callIdHeader, mediaServerItem, port, tcpActive,
  616 + notifyStreamOnline(evt, request,gbStream, streamPushItem, platform, callIdHeader, mediaServerItem, port, tcpActive,
624 617 mediaTransmissionTCP, channelId, addressStr, ssrc, requesterId);
625 618 }
626 619  
627 620 } else {
628 621 // 其他平台内容
629   - otherWvpPushStream(evt, serverTransaction, gbStream, streamPushItem, platform, callIdHeader, mediaServerItem, port, tcpActive,
  622 + otherWvpPushStream(evt, request, gbStream, streamPushItem, platform, callIdHeader, mediaServerItem, port, tcpActive,
630 623 mediaTransmissionTCP, channelId, addressStr, ssrc, requesterId);
631 624 }
632 625 }
633 626 /**
634 627 * 通知流上线
635 628 */
636   - private void notifyStreamOnline(RequestEvent evt, ServerTransaction serverTransaction, GbStream gbStream, StreamPushItem streamPushItem, ParentPlatform platform,
  629 + private void notifyStreamOnline(RequestEvent evt, SIPRequest request, GbStream gbStream, StreamPushItem streamPushItem, ParentPlatform platform,
637 630 CallIdHeader callIdHeader, MediaServerItem mediaServerItem,
638 631 int port, Boolean tcpActive, boolean mediaTransmissionTCP,
639 632 String channelId, String addressStr, String ssrc, String requesterId) {
... ... @@ -641,7 +634,7 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements
641 634 // TODO 控制启用以使设备上线
642 635 logger.info("[ app={}, stream={} ]通道未推流,启用流后开始推流", gbStream.getApp(), gbStream.getStream());
643 636 try {
644   - responseAck(serverTransaction, Response.BAD_REQUEST, "channel [" + gbStream.getGbId() + "] offline");
  637 + responseAck(request, Response.BAD_REQUEST, "channel [" + gbStream.getGbId() + "] offline");
645 638 } catch (SipException | InvalidArgumentException | ParseException e) {
646 639 logger.error("[命令发送失败] invite 通道未推流: {}", e.getMessage());
647 640 }
... ... @@ -649,7 +642,7 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements
649 642 if (!platform.isStartOfflinePush()) {
650 643 // 平台设置中关闭了拉起离线的推流则直接回复
651 644 try {
652   - responseAck(serverTransaction, Response.TEMPORARILY_UNAVAILABLE, "channel stream not pushing");
  645 + responseAck(request, Response.TEMPORARILY_UNAVAILABLE, "channel stream not pushing");
653 646 } catch (SipException | InvalidArgumentException | ParseException e) {
654 647 logger.error("[命令发送失败] invite 通道未推流: {}", e.getMessage());
655 648 }
... ... @@ -667,7 +660,7 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements
667 660 logger.info("[ app={}, stream={} ] 等待设备开始推流超时", gbStream.getApp(), gbStream.getStream());
668 661 try {
669 662 mediaListManager.removedChannelOnlineEventLister(gbStream.getApp(), gbStream.getStream());
670   - responseAck(serverTransaction, Response.REQUEST_TIMEOUT); // 超时
  663 + responseAck(request, Response.REQUEST_TIMEOUT); // 超时
671 664 } catch (SipException e) {
672 665 e.printStackTrace();
673 666 } catch (InvalidArgumentException e) {
... ... @@ -690,7 +683,7 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements
690 683 if (sendRtpItem == null) {
691 684 logger.warn("上级点时创建sendRTPItem失败,可能是服务器端口资源不足");
692 685 try {
693   - responseAck(serverTransaction, Response.BUSY_HERE);
  686 + responseAck(request, Response.BUSY_HERE);
694 687 } catch (SipException e) {
695 688 e.printStackTrace();
696 689 } catch (InvalidArgumentException e) {
... ... @@ -708,16 +701,15 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements
708 701 sendRtpItem.setStatus(1);
709 702 sendRtpItem.setCallId(callIdHeader.getCallId());
710 703  
711   - SIPRequest request = (SIPRequest) evt.getRequest();
712 704 sendRtpItem.setFromTag(request.getFromTag());
713   - SIPResponse response = sendStreamAck(mediaServerItem, serverTransaction, sendRtpItem, platform, evt);
  705 + SIPResponse response = sendStreamAck(mediaServerItem, request, sendRtpItem, platform, evt);
714 706 if (response != null) {
715 707 sendRtpItem.setToTag(response.getToTag());
716 708 }
717 709 redisCatchStorage.updateSendRTPSever(sendRtpItem);
718 710 } else {
719 711 // 其他平台内容
720   - otherWvpPushStream(evt, serverTransaction, gbStream, streamPushItem, platform, callIdHeader, mediaServerItem, port, tcpActive,
  712 + otherWvpPushStream(evt, request, gbStream, streamPushItem, platform, callIdHeader, mediaServerItem, port, tcpActive,
721 713 mediaTransmissionTCP, channelId, addressStr, ssrc, requesterId);
722 714 }
723 715 });
... ... @@ -728,7 +720,7 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements
728 720 dynamicTask.stop(callIdHeader.getCallId());
729 721 mediaListManager.removedChannelOnlineEventLister(gbStream.getApp(), gbStream.getStream());
730 722 try {
731   - responseAck(serverTransaction, Response.TEMPORARILY_UNAVAILABLE, response.getMsg());
  723 + responseAck(request, Response.TEMPORARILY_UNAVAILABLE, response.getMsg());
732 724 } catch (SipException | InvalidArgumentException | ParseException e) {
733 725 logger.error("[命令发送失败] 国标级联 点播回复: {}", e.getMessage());
734 726 }
... ... @@ -740,7 +732,7 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements
740 732 /**
741 733 * 来自其他wvp的推流
742 734 */
743   - private void otherWvpPushStream(RequestEvent evt, ServerTransaction serverTransaction, GbStream gbStream, StreamPushItem streamPushItem, ParentPlatform platform,
  735 + private void otherWvpPushStream(RequestEvent evt, SIPRequest request, GbStream gbStream, StreamPushItem streamPushItem, ParentPlatform platform,
744 736 CallIdHeader callIdHeader, MediaServerItem mediaServerItem,
745 737 int port, Boolean tcpActive, boolean mediaTransmissionTCP,
746 738 String channelId, String addressStr, String ssrc, String requesterId) {
... ... @@ -753,7 +745,7 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements
753 745 if (sendRtpItem == null || responseSendItemMsg.getMediaServerItem() == null) {
754 746 logger.warn("服务器端口资源不足");
755 747 try {
756   - responseAck(serverTransaction, Response.BUSY_HERE);
  748 + responseAck(request, Response.BUSY_HERE);
757 749 } catch (SipException e) {
758 750 e.printStackTrace();
759 751 } catch (InvalidArgumentException e) {
... ... @@ -772,9 +764,8 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements
772 764 sendRtpItem.setStatus(1);
773 765 sendRtpItem.setCallId(callIdHeader.getCallId());
774 766  
775   - SIPRequest request = (SIPRequest) evt.getRequest();
776 767 sendRtpItem.setFromTag(request.getFromTag());
777   - SIPResponse response = sendStreamAck(responseSendItemMsg.getMediaServerItem(), serverTransaction,sendRtpItem, platform, evt);
  768 + SIPResponse response = sendStreamAck(responseSendItemMsg.getMediaServerItem(), request,sendRtpItem, platform, evt);
778 769 if (response != null) {
779 770 sendRtpItem.setToTag(response.getToTag());
780 771 }
... ... @@ -788,24 +779,24 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements
788 779 StreamPushItem currentStreamPushItem = streamPushService.getPush(streamPushItem.getApp(), streamPushItem.getStream());
789 780 if (currentStreamPushItem.isPushIng()) {
790 781 // 在线状态
791   - pushStream(evt, serverTransaction, gbStream, streamPushItem, platform, callIdHeader, mediaServerItem, port, tcpActive,
  782 + pushStream(evt, request, gbStream, streamPushItem, platform, callIdHeader, mediaServerItem, port, tcpActive,
792 783 mediaTransmissionTCP, channelId, addressStr, ssrc, requesterId);
793 784  
794 785 } else {
795 786 // 不在线 拉起
796   - notifyStreamOnline(evt, serverTransaction, gbStream, streamPushItem, platform, callIdHeader, mediaServerItem, port, tcpActive,
  787 + notifyStreamOnline(evt, request, gbStream, streamPushItem, platform, callIdHeader, mediaServerItem, port, tcpActive,
797 788 mediaTransmissionTCP, channelId, addressStr, ssrc, requesterId);
798 789 }
799 790 }
800 791 try {
801   - responseAck(serverTransaction, Response.BUSY_HERE);
  792 + responseAck(request, Response.BUSY_HERE);
802 793 } catch (InvalidArgumentException | ParseException | SipException e) {
803 794 logger.error("[命令发送失败] 国标级联 点播回复 BUSY_HERE: {}", e.getMessage());
804 795 }
805 796 });
806 797 }
807 798  
808   - public SIPResponse sendStreamAck(MediaServerItem mediaServerItem, ServerTransaction serverTransaction, SendRtpItem sendRtpItem, ParentPlatform platform, RequestEvent evt) {
  799 + public SIPResponse sendStreamAck(MediaServerItem mediaServerItem, SIPRequest request, SendRtpItem sendRtpItem, ParentPlatform platform, RequestEvent evt) {
809 800  
810 801 StringBuffer content = new StringBuffer(200);
811 802 content.append("v=0\r\n");
... ... @@ -828,7 +819,7 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements
828 819 content.append("f=\r\n");
829 820  
830 821 try {
831   - return responseSdpAck(serverTransaction, content.toString(), platform);
  822 + return responseSdpAck(request, content.toString(), platform);
832 823 } catch (SipException e) {
833 824 e.printStackTrace();
834 825 } catch (InvalidArgumentException e) {
... ... @@ -839,18 +830,18 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements
839 830 return null;
840 831 }
841 832  
842   - public void inviteFromDeviceHandle(ServerTransaction serverTransaction, String requesterId) {
  833 + public void inviteFromDeviceHandle(SIPRequest request, String requesterId) {
843 834  
844 835 // 非上级平台请求,查询是否设备请求(通常为接收语音广播的设备)
845 836 Device device = redisCatchStorage.getDevice(requesterId);
846 837 if (device != null) {
847 838 logger.info("收到设备" + requesterId + "的语音广播Invite请求");
848 839 try {
849   - responseAck(serverTransaction, Response.TRYING);
  840 + responseAck(request, Response.TRYING);
850 841 } catch (SipException | InvalidArgumentException | ParseException e) {
851 842 logger.error("[命令发送失败] invite BAD_REQUEST: {}", e.getMessage());
852 843 }
853   - String contentString = new String(serverTransaction.getRequest().getRawContent());
  844 + String contentString = new String(request.getRawContent());
854 845 // jainSip不支持y=字段, 移除移除以解析。
855 846 String substring = contentString;
856 847 String ssrc = "0000000404";
... ... @@ -900,7 +891,7 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements
900 891 logger.info("不支持的媒体格式,返回415");
901 892 // 回复不支持的格式
902 893 try {
903   - responseAck(serverTransaction, Response.UNSUPPORTED_MEDIA_TYPE); // 不支持的格式,发415
  894 + responseAck(request, Response.UNSUPPORTED_MEDIA_TYPE); // 不支持的格式,发415
904 895 } catch (SipException | InvalidArgumentException | ParseException e) {
905 896 logger.error("[命令发送失败] invite 不支持的媒体格式,返回415, {}", e.getMessage());
906 897 }
... ... @@ -918,7 +909,7 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements
918 909 } else {
919 910 logger.warn("来自无效设备/平台的请求");
920 911 try {
921   - responseAck(serverTransaction, Response.BAD_REQUEST);; // 不支持的格式,发415
  912 + responseAck(request, Response.BAD_REQUEST);; // 不支持的格式,发415
922 913 } catch (SipException | InvalidArgumentException | ParseException e) {
923 914 logger.error("[命令发送失败] invite 来自无效设备/平台的请求, {}", e.getMessage());
924 915 }
... ...
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/NotifyRequestProcessor.java
... ... @@ -20,6 +20,7 @@ import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
20 20 import com.genersoft.iot.vmp.storager.IVideoManagerStorage;
21 21 import com.genersoft.iot.vmp.utils.DateUtil;
22 22 import com.genersoft.iot.vmp.utils.redis.RedisUtil;
  23 +import gov.nist.javax.sip.message.SIPRequest;
23 24 import org.dom4j.DocumentException;
24 25 import org.dom4j.Element;
25 26 import org.slf4j.Logger;
... ... @@ -34,7 +35,6 @@ import org.springframework.util.StringUtils;
34 35  
35 36 import javax.sip.InvalidArgumentException;
36 37 import javax.sip.RequestEvent;
37   -import javax.sip.ServerTransaction;
38 38 import javax.sip.SipException;
39 39 import javax.sip.header.FromHeader;
40 40 import javax.sip.message.Response;
... ... @@ -93,9 +93,8 @@ public class NotifyRequestProcessor extends SIPRequestProcessorParent implements
93 93  
94 94 @Override
95 95 public void process(RequestEvent evt) {
96   - ServerTransaction serverTransaction = getServerTransaction(evt);
97 96 try {
98   - responseAck(serverTransaction, Response.OK);
  97 + responseAck((SIPRequest) evt.getRequest(), Response.OK, null, null);
99 98 }catch (SipException | InvalidArgumentException | ParseException e) {
100 99 e.printStackTrace();
101 100 }
... ...
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/RegisterRequestProcessor.java
... ... @@ -4,6 +4,7 @@ import com.genersoft.iot.vmp.conf.SipConfig;
4 4 import com.genersoft.iot.vmp.gb28181.bean.Device;
5 5 import com.genersoft.iot.vmp.gb28181.bean.WvpSipDate;
6 6 import com.genersoft.iot.vmp.gb28181.transmit.SIPProcessorObserver;
  7 +import com.genersoft.iot.vmp.gb28181.transmit.SIPSender;
7 8 import com.genersoft.iot.vmp.gb28181.transmit.event.request.ISIPRequestProcessor;
8 9 import com.genersoft.iot.vmp.gb28181.transmit.event.request.SIPRequestProcessorParent;
9 10 import com.genersoft.iot.vmp.gb28181.auth.DigestServerAuthenticationHelper;
... ... @@ -22,9 +23,7 @@ import org.springframework.stereotype.Component;
22 23 import org.springframework.util.ObjectUtils;
23 24 import org.springframework.util.StringUtils;
24 25  
25   -import javax.sip.InvalidArgumentException;
26 26 import javax.sip.RequestEvent;
27   -import javax.sip.ServerTransaction;
28 27 import javax.sip.SipException;
29 28 import javax.sip.header.*;
30 29 import javax.sip.message.Request;
... ... @@ -53,6 +52,9 @@ public class RegisterRequestProcessor extends SIPRequestProcessorParent implemen
53 52 @Autowired
54 53 private IDeviceService deviceService;
55 54  
  55 + @Autowired
  56 + private SIPSender sipSender;
  57 +
56 58 @Override
57 59 public void afterPropertiesSet() throws Exception {
58 60 // 添加消息处理的订阅
... ... @@ -86,7 +88,7 @@ public class RegisterRequestProcessor extends SIPRequestProcessorParent implemen
86 88 logger.info("[注册请求] 未携带授权头 回复401: {}", requestAddress);
87 89 response = getMessageFactory().createResponse(Response.UNAUTHORIZED, request);
88 90 new DigestServerAuthenticationHelper().generateChallenge(getHeaderFactory(), response, sipConfig.getDomain());
89   - sendResponse(evt, response);
  91 + sipSender.transmitRequest(response);
90 92 return;
91 93 }
92 94  
... ... @@ -99,7 +101,7 @@ public class RegisterRequestProcessor extends SIPRequestProcessorParent implemen
99 101 response = getMessageFactory().createResponse(Response.FORBIDDEN, request);
100 102 response.setReasonPhrase("wrong password");
101 103 logger.info("[注册请求] 密码/SIP服务器ID错误, 回复403: {}", requestAddress);
102   - sendResponse(evt, response);
  104 + sipSender.transmitRequest(response);
103 105 return;
104 106 }
105 107  
... ... @@ -116,11 +118,7 @@ public class RegisterRequestProcessor extends SIPRequestProcessorParent implemen
116 118  
117 119 if (expiresHeader == null) {
118 120 response = getMessageFactory().createResponse(Response.BAD_REQUEST, request);
119   - ServerTransaction serverTransaction = getServerTransaction(evt);
120   - serverTransaction.sendResponse(response);
121   - if (serverTransaction.getDialog() != null) {
122   - serverTransaction.getDialog().delete();
123   - }
  121 + sipSender.transmitRequest(response);
124 122 return;
125 123 }
126 124 // 添加Contact头
... ... @@ -162,7 +160,7 @@ public class RegisterRequestProcessor extends SIPRequestProcessorParent implemen
162 160 device.setTransport("TCP".equalsIgnoreCase(transport) ? "TCP" : "UDP");
163 161 }
164 162  
165   - sendResponse(evt, response);
  163 + sipSender.transmitRequest(response);
166 164 // 注册成功
167 165 // 保存到redis
168 166 if (registerFlag) {
... ... @@ -173,22 +171,8 @@ public class RegisterRequestProcessor extends SIPRequestProcessorParent implemen
173 171 logger.info("[注销成功] deviceId: {}->{}" ,deviceId, requestAddress);
174 172 deviceService.offline(deviceId);
175 173 }
176   - } catch (SipException | InvalidArgumentException | NoSuchAlgorithmException | ParseException e) {
  174 + } catch (SipException | NoSuchAlgorithmException | ParseException e) {
177 175 e.printStackTrace();
178 176 }
179   -
180   - }
181   -
182   - private void sendResponse(RequestEvent evt, Response response) throws InvalidArgumentException, SipException {
183   - ServerTransaction serverTransaction = getServerTransaction(evt);
184   - if (serverTransaction == null) {
185   - logger.warn("[回复失败]:{}", response);
186   - return;
187   - }
188   - serverTransaction.sendResponse(response);
189   - if (serverTransaction.getDialog() != null) {
190   - serverTransaction.getDialog().delete();
191   - }
192 177 }
193   -
194 178 }
... ...
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/SubscribeRequestProcessor.java
... ... @@ -9,6 +9,8 @@ import com.genersoft.iot.vmp.gb28181.bean.SubscribeHolder;
9 9 import com.genersoft.iot.vmp.gb28181.bean.SubscribeInfo;
10 10 import com.genersoft.iot.vmp.gb28181.task.impl.MobilePositionSubscribeHandlerTask;
11 11 import com.genersoft.iot.vmp.gb28181.transmit.SIPProcessorObserver;
  12 +import com.genersoft.iot.vmp.gb28181.transmit.SIPSender;
  13 +import com.genersoft.iot.vmp.gb28181.transmit.cmd.ISIPCommander;
12 14 import com.genersoft.iot.vmp.gb28181.transmit.cmd.ISIPCommanderForPlatform;
13 15 import com.genersoft.iot.vmp.gb28181.transmit.event.request.ISIPRequestProcessor;
14 16 import com.genersoft.iot.vmp.gb28181.transmit.event.request.SIPRequestProcessorParent;
... ... @@ -19,23 +21,16 @@ import com.genersoft.iot.vmp.storager.IVideoManagerStorage;
19 21 import gov.nist.javax.sip.SipProviderImpl;
20 22 import gov.nist.javax.sip.message.SIPRequest;
21 23 import gov.nist.javax.sip.message.SIPResponse;
22   -import gov.nist.javax.sip.stack.SIPClientTransaction;
23   -import gov.nist.javax.sip.stack.SIPDialog;
24   -import gov.nist.javax.sip.stack.SIPServerTransaction;
25   -import gov.nist.javax.sip.stack.SIPServerTransactionImpl;
26 24 import org.dom4j.DocumentException;
27 25 import org.dom4j.Element;
28 26 import org.slf4j.Logger;
29 27 import org.slf4j.LoggerFactory;
30 28 import org.springframework.beans.factory.InitializingBean;
31 29 import org.springframework.beans.factory.annotation.Autowired;
32   -import org.springframework.beans.factory.annotation.Qualifier;
33   -import org.springframework.context.annotation.Lazy;
34 30 import org.springframework.stereotype.Component;
35 31  
36 32 import javax.sip.*;
37 33 import javax.sip.header.ExpiresHeader;
38   -import javax.sip.message.Request;
39 34 import javax.sip.message.Response;
40 35 import java.text.ParseException;
41 36  
... ... @@ -58,6 +53,9 @@ public class SubscribeRequestProcessor extends SIPRequestProcessorParent impleme
58 53 @Autowired
59 54 private SubscribeHolder subscribeHolder;
60 55  
  56 + @Autowired
  57 + private SIPSender sipSender;
  58 +
61 59 @Override
62 60 public void afterPropertiesSet() throws Exception {
63 61 // 添加消息处理的订阅
... ... @@ -71,8 +69,7 @@ public class SubscribeRequestProcessor extends SIPRequestProcessorParent impleme
71 69 */
72 70 @Override
73 71 public void process(RequestEvent evt) {
74   - ServerTransaction serverTransaction = getServerTransaction(evt);
75   - Request request = evt.getRequest();
  72 + SIPRequest request = (SIPRequest) evt.getRequest();
76 73 try {
77 74 Element rootElement = getRootElement(evt);
78 75 if (rootElement == null) {
... ... @@ -81,12 +78,12 @@ public class SubscribeRequestProcessor extends SIPRequestProcessorParent impleme
81 78 }
82 79 String cmd = XmlUtil.getText(rootElement, "CmdType");
83 80 if (CmdType.MOBILE_POSITION.equals(cmd)) {
84   - processNotifyMobilePosition(serverTransaction, rootElement);
  81 + processNotifyMobilePosition(request, rootElement);
85 82 // } else if (CmdType.ALARM.equals(cmd)) {
86 83 // logger.info("接收到Alarm订阅");
87 84 // processNotifyAlarm(serverTransaction, rootElement);
88 85 } else if (CmdType.CATALOG.equals(cmd)) {
89   - processNotifyCatalogList(serverTransaction, rootElement);
  86 + processNotifyCatalogList(request, rootElement);
90 87 } else {
91 88 logger.info("接收到消息:" + cmd);
92 89  
... ... @@ -96,13 +93,7 @@ public class SubscribeRequestProcessor extends SIPRequestProcessorParent impleme
96 93 response.setExpires(expireHeader);
97 94 }
98 95 logger.info("response : " + response);
99   - ServerTransaction transaction = getServerTransaction(evt);
100   - if (transaction != null) {
101   - transaction.sendResponse(response);
102   - transaction.terminate();
103   - } else {
104   - logger.info("processRequest serverTransactionId is null.");
105   - }
  96 + sipSender.transmitRequest(response);
106 97 }
107 98 } catch (ParseException | SipException | InvalidArgumentException | DocumentException e) {
108 99 e.printStackTrace();
... ... @@ -113,14 +104,14 @@ public class SubscribeRequestProcessor extends SIPRequestProcessorParent impleme
113 104 /**
114 105 * 处理移动位置订阅消息
115 106 */
116   - private void processNotifyMobilePosition(ServerTransaction serverTransaction, Element rootElement) throws SipException {
117   - if (serverTransaction == null) {
  107 + private void processNotifyMobilePosition(SIPRequest request, Element rootElement) throws SipException {
  108 + if (request == null) {
118 109 return;
119 110 }
120   - String platformId = SipUtils.getUserIdFromFromHeader(serverTransaction.getRequest());
  111 + String platformId = SipUtils.getUserIdFromFromHeader(request);
121 112 String deviceId = XmlUtil.getText(rootElement, "DeviceID");
122 113 ParentPlatform platform = storager.queryParentPlatByServerGBId(platformId);
123   - SubscribeInfo subscribeInfo = new SubscribeInfo(serverTransaction, platformId);
  114 + SubscribeInfo subscribeInfo = new SubscribeInfo(request, platformId);
124 115 if (platform == null) {
125 116 return;
126 117 }
... ... @@ -149,7 +140,7 @@ public class SubscribeRequestProcessor extends SIPRequestProcessorParent impleme
149 140  
150 141 try {
151 142 ParentPlatform parentPlatform = storager.queryParentPlatByServerGBId(platformId);
152   - SIPResponse response = responseXmlAck(serverTransaction, resultXml.toString(), parentPlatform, subscribeInfo.getExpires());
  143 + SIPResponse response = responseXmlAck(request, resultXml.toString(), parentPlatform, subscribeInfo.getExpires());
153 144 if (subscribeInfo.getExpires() == 0) {
154 145 subscribeHolder.removeMobilePositionSubscribe(platformId);
155 146 }else {
... ... @@ -166,17 +157,17 @@ public class SubscribeRequestProcessor extends SIPRequestProcessorParent impleme
166 157  
167 158 }
168 159  
169   - private void processNotifyCatalogList(ServerTransaction serverTransaction, Element rootElement) throws SipException {
170   - if (serverTransaction == null) {
  160 + private void processNotifyCatalogList(SIPRequest request, Element rootElement) throws SipException {
  161 + if (request == null) {
171 162 return;
172 163 }
173   - String platformId = SipUtils.getUserIdFromFromHeader(serverTransaction.getRequest());
  164 + String platformId = SipUtils.getUserIdFromFromHeader(request);
174 165 String deviceId = XmlUtil.getText(rootElement, "DeviceID");
175 166 ParentPlatform platform = storager.queryParentPlatByServerGBId(platformId);
176 167 if (platform == null){
177 168 return;
178 169 }
179   - SubscribeInfo subscribeInfo = new SubscribeInfo(serverTransaction, platformId);
  170 + SubscribeInfo subscribeInfo = new SubscribeInfo(request, platformId);
180 171  
181 172 String sn = XmlUtil.getText(rootElement, "SN");
182 173 logger.info("[回复上级的目录订阅请求]: {}/{}", platformId, deviceId);
... ... @@ -196,7 +187,7 @@ public class SubscribeRequestProcessor extends SIPRequestProcessorParent impleme
196 187 }
197 188 try {
198 189 ParentPlatform parentPlatform = storager.queryParentPlatByServerGBId(platformId);
199   - SIPResponse response = responseXmlAck(serverTransaction, resultXml.toString(), parentPlatform, subscribeInfo.getExpires());
  190 + SIPResponse response = responseXmlAck(request, resultXml.toString(), parentPlatform, subscribeInfo.getExpires());
200 191 if (subscribeInfo.getExpires() == 0) {
201 192 subscribeHolder.removeCatalogSubscribe(platformId);
202 193 }else {
... ...
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/info/InfoRequestProcessor.java
... ... @@ -19,7 +19,6 @@ import org.springframework.beans.factory.annotation.Autowired;
19 19 import org.springframework.stereotype.Component;
20 20 import javax.sip.InvalidArgumentException;
21 21 import javax.sip.RequestEvent;
22   -import javax.sip.ServerTransaction;
23 22 import javax.sip.SipException;
24 23 import javax.sip.header.*;
25 24 import javax.sip.message.Response;
... ... @@ -62,8 +61,9 @@ public class InfoRequestProcessor extends SIPRequestProcessorParent implements I
62 61 @Override
63 62 public void process(RequestEvent evt) {
64 63 logger.debug("接收到消息:" + evt.getRequest());
65   - String deviceId = SipUtils.getUserIdFromFromHeader(evt.getRequest());
66   - CallIdHeader callIdHeader = (CallIdHeader)evt.getRequest().getHeader(CallIdHeader.NAME);
  64 + SIPRequest request = (SIPRequest) evt.getRequest();
  65 + String deviceId = SipUtils.getUserIdFromFromHeader(request);
  66 + CallIdHeader callIdHeader = request.getCallIdHeader();
67 67 // 先从会话内查找
68 68 SsrcTransaction ssrcTransaction = sessionManager.getSsrcTransaction(null, null, callIdHeader.getCallId(), null);
69 69  
... ... @@ -71,7 +71,6 @@ public class InfoRequestProcessor extends SIPRequestProcessorParent implements I
71 71 if (ssrcTransaction != null) {
72 72 deviceId = ssrcTransaction.getDeviceId();
73 73 }
74   - ServerTransaction serverTransaction = getServerTransaction(evt);
75 74 // 查询设备是否存在
76 75 Device device = redisCatchStorage.getDevice(deviceId);
77 76 // 查询上级平台是否存在
... ... @@ -79,7 +78,6 @@ public class InfoRequestProcessor extends SIPRequestProcessorParent implements I
79 78 try {
80 79 if (device != null && parentPlatform != null) {
81 80 logger.warn("[重复]平台与设备编号重复:{}", deviceId);
82   - SIPRequest request = (SIPRequest) evt.getRequest();
83 81 String hostAddress = request.getRemoteAddress().getHostAddress();
84 82 int remotePort = request.getRemotePort();
85 83 if (device.getHostAddress().equals(hostAddress + ":" + remotePort)) {
... ... @@ -90,7 +88,7 @@ public class InfoRequestProcessor extends SIPRequestProcessorParent implements I
90 88 }
91 89 if (device == null && parentPlatform == null) {
92 90 // 不存在则回复404
93   - responseAck(serverTransaction, Response.NOT_FOUND, "device "+ deviceId +" not found");
  91 + responseAck(request, Response.NOT_FOUND, "device "+ deviceId +" not found");
94 92 logger.warn("[设备未找到 ]: {}", deviceId);
95 93 if (sipSubscribe.getErrorSubscribe(callIdHeader.getCallId()) != null){
96 94 DeviceNotFoundEvent deviceNotFoundEvent = new DeviceNotFoundEvent(evt.getDialog());
... ... @@ -107,21 +105,21 @@ public class InfoRequestProcessor extends SIPRequestProcessorParent implements I
107 105 String streamId = sendRtpItem.getStreamId();
108 106 StreamInfo streamInfo = redisCatchStorage.queryPlayback(null, null, streamId, null);
109 107 if (null == streamInfo) {
110   - responseAck(serverTransaction, Response.NOT_FOUND, "stream " + streamId + " not found");
  108 + responseAck(request, Response.NOT_FOUND, "stream " + streamId + " not found");
111 109 return;
112 110 }
113 111 Device device1 = storager.queryVideoDevice(streamInfo.getDeviceID());
114 112 cmder.playbackControlCmd(device1,streamInfo,new String(evt.getRequest().getRawContent()),eventResult -> {
115 113 // 失败的回复
116 114 try {
117   - responseAck(serverTransaction, eventResult.statusCode, eventResult.msg);
  115 + responseAck(request, eventResult.statusCode, eventResult.msg);
118 116 } catch (SipException | InvalidArgumentException | ParseException e) {
119 117 logger.error("[命令发送失败] 国标级联 录像控制: {}", e.getMessage());
120 118 }
121 119 }, eventResult -> {
122 120 // 成功的回复
123 121 try {
124   - responseAck(serverTransaction, eventResult.statusCode);
  122 + responseAck(request, eventResult.statusCode);
125 123 } catch (SipException | InvalidArgumentException | ParseException e) {
126 124 logger.error("[命令发送失败] 国标级联 录像控制: {}", e.getMessage());
127 125 }
... ...
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/MessageRequestProcessor.java
... ... @@ -23,12 +23,8 @@ import org.springframework.stereotype.Component;
23 23  
24 24 import javax.sip.InvalidArgumentException;
25 25 import javax.sip.RequestEvent;
26   -import javax.sip.ServerTransaction;
27 26 import javax.sip.SipException;
28   -import javax.sip.address.SipURI;
29   -import javax.sip.header.CSeqHeader;
30 27 import javax.sip.header.CallIdHeader;
31   -import javax.sip.message.Request;
32 28 import javax.sip.message.Response;
33 29 import java.text.ParseException;
34 30 import java.util.Map;
... ... @@ -80,16 +76,13 @@ public class MessageRequestProcessor extends SIPRequestProcessorParent implement
80 76 if (ssrcTransaction != null) {
81 77 deviceId = ssrcTransaction.getDeviceId();
82 78 }
83   -
84   - ServerTransaction serverTransaction = getServerTransaction(evt);
85   -
  79 + SIPRequest request = (SIPRequest) evt.getRequest();
86 80 // 查询设备是否存在
87 81 Device device = redisCatchStorage.getDevice(deviceId);
88 82 // 查询上级平台是否存在
89 83 ParentPlatform parentPlatform = storage.queryParentPlatByServerGBId(deviceId);
90 84 try {
91 85 if (device != null && parentPlatform != null) {
92   - SIPRequest request = (SIPRequest) evt.getRequest();
93 86 String hostAddress = request.getRemoteAddress().getHostAddress();
94 87 int remotePort = request.getRemotePort();
95 88 if (device.getHostAddress().equals(hostAddress + ":" + remotePort)) {
... ... @@ -100,7 +93,7 @@ public class MessageRequestProcessor extends SIPRequestProcessorParent implement
100 93 }
101 94 if (device == null && parentPlatform == null) {
102 95 // 不存在则回复404
103   - responseAck(serverTransaction, Response.NOT_FOUND, "device "+ deviceId +" not found");
  96 + responseAck(request, Response.NOT_FOUND, "device "+ deviceId +" not found");
104 97 logger.warn("[设备未找到 ]: {}", deviceId);
105 98 if (sipSubscribe.getErrorSubscribe(callIdHeader.getCallId()) != null){
106 99 DeviceNotFoundEvent deviceNotFoundEvent = new DeviceNotFoundEvent(evt.getDialog());
... ... @@ -114,13 +107,13 @@ public class MessageRequestProcessor extends SIPRequestProcessorParent implement
114 107 rootElement = getRootElement(evt);
115 108 if (rootElement == null) {
116 109 logger.error("处理MESSAGE请求 未获取到消息体{}", evt.getRequest());
117   - responseAck(serverTransaction, Response.BAD_REQUEST, "content is null");
  110 + responseAck(request, Response.BAD_REQUEST, "content is null");
118 111 return;
119 112 }
120 113 } catch (DocumentException e) {
121 114 logger.warn("解析XML消息内容异常", e);
122 115 // 不存在则回复404
123   - responseAck(serverTransaction, Response.BAD_REQUEST, e.getMessage());
  116 + responseAck(request, Response.BAD_REQUEST, e.getMessage());
124 117 }
125 118 String name = rootElement.getName();
126 119 IMessageHandler messageHandler = messageHandlerMap.get(name);
... ... @@ -133,7 +126,7 @@ public class MessageRequestProcessor extends SIPRequestProcessorParent implement
133 126 }else {
134 127 // 不支持的message
135 128 // 不存在则回复415
136   - responseAck(serverTransaction, Response.UNSUPPORTED_MEDIA_TYPE, "Unsupported message type, must Control/Notify/Query/Response");
  129 + responseAck(request, Response.UNSUPPORTED_MEDIA_TYPE, "Unsupported message type, must Control/Notify/Query/Response");
137 130 }
138 131 }
139 132 } catch (SipException e) {
... ...
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/control/cmd/DeviceControlQueryMessageHandler.java
... ... @@ -11,6 +11,7 @@ import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.control
11 11 import com.genersoft.iot.vmp.storager.IVideoManagerStorage;
12 12 import com.genersoft.iot.vmp.utils.SpringBeanFactory;
13 13 import gov.nist.javax.sip.SipStackImpl;
  14 +import gov.nist.javax.sip.message.SIPRequest;
14 15 import org.dom4j.Element;
15 16 import org.slf4j.Logger;
16 17 import org.slf4j.LoggerFactory;
... ... @@ -67,10 +68,10 @@ public class DeviceControlQueryMessageHandler extends SIPRequestProcessorParent
67 68 @Override
68 69 public void handForPlatform(RequestEvent evt, ParentPlatform parentPlatform, Element rootElement) {
69 70  
70   - ServerTransaction serverTransaction = getServerTransaction(evt);
  71 + SIPRequest request = (SIPRequest) evt.getRequest();
71 72  
72 73 // 此处是上级发出的DeviceControl指令
73   - String targetGBId = ((SipURI) ((HeaderAddress) evt.getRequest().getHeader(ToHeader.NAME)).getAddress().getURI()).getUser();
  74 + String targetGBId = ((SipURI) request.getToHeader().getAddress().getURI()).getUser();
74 75 String channelId = getText(rootElement, "DeviceID");
75 76 // 远程启动功能
76 77 if (!ObjectUtils.isEmpty(getText(rootElement, "TeleBoot"))) {
... ... @@ -111,7 +112,7 @@ public class DeviceControlQueryMessageHandler extends SIPRequestProcessorParent
111 112 Device deviceForPlatform = storager.queryVideoDeviceByPlatformIdAndChannelId(parentPlatform.getServerGBId(), channelId);
112 113 if (deviceForPlatform == null) {
113 114 try {
114   - responseAck(serverTransaction, Response.NOT_FOUND);
  115 + responseAck(request, Response.NOT_FOUND);
115 116 } catch (SipException | InvalidArgumentException | ParseException e) {
116 117 logger.error("[命令发送失败] 错误信息: {}", e.getMessage());
117 118 }
... ... @@ -121,14 +122,14 @@ public class DeviceControlQueryMessageHandler extends SIPRequestProcessorParent
121 122 cmder.fronEndCmd(deviceForPlatform, channelId, cmdString, eventResult -> {
122 123 // 失败的回复
123 124 try {
124   - responseAck(serverTransaction, eventResult.statusCode, eventResult.msg);
  125 + responseAck(request, eventResult.statusCode, eventResult.msg);
125 126 } catch (SipException | InvalidArgumentException | ParseException e) {
126 127 logger.error("[命令发送失败] 云台/前端回复: {}", e.getMessage());
127 128 }
128 129 }, eventResult -> {
129 130 // 成功的回复
130 131 try {
131   - responseAck(serverTransaction, eventResult.statusCode);
  132 + responseAck(request, eventResult.statusCode);
132 133 } catch (SipException | InvalidArgumentException | ParseException e) {
133 134 logger.error("[命令发送失败] 云台/前端回复: {}", e.getMessage());
134 135 }
... ...
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/notify/cmd/AlarmNotifyMessageHandler.java
... ... @@ -16,6 +16,7 @@ import com.genersoft.iot.vmp.service.IDeviceChannelService;
16 16 import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
17 17 import com.genersoft.iot.vmp.storager.IVideoManagerStorage;
18 18 import com.genersoft.iot.vmp.utils.DateUtil;
  19 +import gov.nist.javax.sip.message.SIPRequest;
19 20 import org.dom4j.Element;
20 21 import org.slf4j.Logger;
21 22 import org.slf4j.LoggerFactory;
... ... @@ -97,7 +98,7 @@ public class AlarmNotifyMessageHandler extends SIPRequestProcessorParent impleme
97 98 SipMsgInfo sipMsgInfo = taskQueue.poll();
98 99 // 回复200 OK
99 100 try {
100   - responseAck(getServerTransaction(sipMsgInfo.getEvt()), Response.OK);
  101 + responseAck((SIPRequest) sipMsgInfo.getEvt().getRequest(), Response.OK);
101 102 } catch (SipException | InvalidArgumentException | ParseException e) {
102 103 logger.error("[处理报警通知], 回复200OK失败", e);
103 104 }
... ... @@ -216,7 +217,7 @@ public class AlarmNotifyMessageHandler extends SIPRequestProcessorParent impleme
216 217 logger.info("收到来自平台[{}]的报警通知", parentPlatform.getServerGBId());
217 218 // 回复200 OK
218 219 try {
219   - responseAck(getServerTransaction(evt), Response.OK);
  220 + responseAck((SIPRequest) evt.getRequest(), Response.OK);
220 221 } catch (SipException | InvalidArgumentException | ParseException e) {
221 222 logger.error("[命令发送失败] 国标级联 报警通知回复: {}", e.getMessage());
222 223 }
... ...
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/notify/cmd/KeepaliveNotifyMessageHandler.java
... ... @@ -10,6 +10,7 @@ import com.genersoft.iot.vmp.service.IDeviceService;
10 10 import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
11 11 import com.genersoft.iot.vmp.storager.IVideoManagerStorage;
12 12 import com.genersoft.iot.vmp.utils.DateUtil;
  13 +import gov.nist.javax.sip.message.SIPRequest;
13 14 import org.dom4j.Element;
14 15 import org.slf4j.Logger;
15 16 import org.slf4j.LoggerFactory;
... ... @@ -54,7 +55,7 @@ public class KeepaliveNotifyMessageHandler extends SIPRequestProcessorParent imp
54 55 }
55 56 // 回复200 OK
56 57 try {
57   - responseAck(getServerTransaction(evt), Response.OK);
  58 + responseAck((SIPRequest) evt.getRequest(), Response.OK);
58 59 } catch (SipException | InvalidArgumentException | ParseException e) {
59 60 logger.error("[命令发送失败] 国标级联 心跳回复: {}", e.getMessage());
60 61 }
... ...
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/notify/cmd/MediaStatusNotifyMessageHandler.java
... ... @@ -14,6 +14,7 @@ import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.IMessag
14 14 import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.notify.NotifyMessageHandler;
15 15 import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
16 16 import com.genersoft.iot.vmp.storager.IVideoManagerStorage;
  17 +import gov.nist.javax.sip.message.SIPRequest;
17 18 import org.dom4j.Element;
18 19 import org.slf4j.Logger;
19 20 import org.slf4j.LoggerFactory;
... ... @@ -67,7 +68,7 @@ public class MediaStatusNotifyMessageHandler extends SIPRequestProcessorParent i
67 68  
68 69 // 回复200 OK
69 70 try {
70   - responseAck(getServerTransaction(evt), Response.OK);
  71 + responseAck((SIPRequest) evt.getRequest(), Response.OK);
71 72 } catch (SipException | InvalidArgumentException | ParseException e) {
72 73 logger.error("[命令发送失败] 国标级联 录像流推送完毕,回复200OK: {}", e.getMessage());
73 74 }
... ...
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/notify/cmd/MobilePositionNotifyMessageHandler.java
... ... @@ -11,6 +11,7 @@ import com.genersoft.iot.vmp.service.IDeviceChannelService;
11 11 import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
12 12 import com.genersoft.iot.vmp.storager.IVideoManagerStorage;
13 13 import com.genersoft.iot.vmp.utils.DateUtil;
  14 +import gov.nist.javax.sip.message.SIPRequest;
14 15 import org.dom4j.DocumentException;
15 16 import org.dom4j.Element;
16 17 import org.slf4j.Logger;
... ... @@ -83,7 +84,7 @@ public class MobilePositionNotifyMessageHandler extends SIPRequestProcessorParen
83 84 if (rootElementAfterCharset == null) {
84 85 try {
85 86 logger.warn("[ 移动设备位置数据通知 ] content cannot be null, {}", sipMsgInfo.getEvt().getRequest());
86   - responseAck(getServerTransaction(sipMsgInfo.getEvt()), Response.BAD_REQUEST);
  87 + responseAck((SIPRequest) sipMsgInfo.getEvt().getRequest(), Response.BAD_REQUEST);
87 88 } catch (SipException | InvalidArgumentException | ParseException e) {
88 89 logger.error("[命令发送失败] 移动设备位置数据通知 内容为空: {}", e.getMessage());
89 90 }
... ... @@ -138,7 +139,7 @@ public class MobilePositionNotifyMessageHandler extends SIPRequestProcessorParen
138 139 storager.updateChannelPosition(deviceChannel);
139 140 //回复 200 OK
140 141 try {
141   - responseAck(getServerTransaction(sipMsgInfo.getEvt()), Response.OK);
  142 + responseAck((SIPRequest) sipMsgInfo.getEvt().getRequest(), Response.OK);
142 143 } catch (SipException | InvalidArgumentException | ParseException e) {
143 144 logger.error("[命令发送失败] 移动设备位置数据回复200: {}", e.getMessage());
144 145 }
... ...
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/query/cmd/AlarmQueryMessageHandler.java
... ... @@ -9,6 +9,7 @@ import com.genersoft.iot.vmp.gb28181.transmit.event.request.SIPRequestProcessorP
9 9 import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.IMessageHandler;
10 10 import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.query.QueryMessageHandler;
11 11 import com.genersoft.iot.vmp.storager.IVideoManagerStorage;
  12 +import gov.nist.javax.sip.message.SIPRequest;
12 13 import org.dom4j.Element;
13 14 import org.slf4j.Logger;
14 15 import org.slf4j.LoggerFactory;
... ... @@ -58,7 +59,7 @@ public class AlarmQueryMessageHandler extends SIPRequestProcessorParent implemen
58 59  
59 60 logger.info("不支持alarm查询");
60 61 try {
61   - responseAck(getServerTransaction(evt), Response.NOT_FOUND, "not support alarm query");
  62 + responseAck((SIPRequest) evt.getRequest(), Response.NOT_FOUND, "not support alarm query");
62 63 } catch (SipException | InvalidArgumentException | ParseException e) {
63 64 logger.error("[命令发送失败] 国标级联 alarm查询回复200OK: {}", e.getMessage());
64 65 }
... ...
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/query/cmd/CatalogQueryMessageHandler.java
... ... @@ -9,6 +9,7 @@ import com.genersoft.iot.vmp.gb28181.transmit.event.request.SIPRequestProcessorP
9 9 import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.IMessageHandler;
10 10 import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.query.QueryMessageHandler;
11 11 import com.genersoft.iot.vmp.storager.IVideoManagerStorage;
  12 +import gov.nist.javax.sip.message.SIPRequest;
12 13 import org.dom4j.Element;
13 14 import org.slf4j.Logger;
14 15 import org.slf4j.LoggerFactory;
... ... @@ -66,7 +67,7 @@ public class CatalogQueryMessageHandler extends SIPRequestProcessorParent implem
66 67 FromHeader fromHeader = (FromHeader) evt.getRequest().getHeader(FromHeader.NAME);
67 68 try {
68 69 // 回复200 OK
69   - responseAck(getServerTransaction(evt), Response.OK);
  70 + responseAck((SIPRequest) evt.getRequest(), Response.OK);
70 71 } catch (SipException | InvalidArgumentException | ParseException e) {
71 72 logger.error("[命令发送失败] 国标级联 目录查询回复200OK: {}", e.getMessage());
72 73 }
... ...
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/query/cmd/DeviceInfoQueryMessageHandler.java
... ... @@ -6,6 +6,7 @@ import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommanderFroPlatform;
6 6 import com.genersoft.iot.vmp.gb28181.transmit.event.request.SIPRequestProcessorParent;
7 7 import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.IMessageHandler;
8 8 import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.query.QueryMessageHandler;
  9 +import gov.nist.javax.sip.message.SIPRequest;
9 10 import org.dom4j.Element;
10 11 import org.slf4j.Logger;
11 12 import org.slf4j.LoggerFactory;
... ... @@ -48,7 +49,7 @@ public class DeviceInfoQueryMessageHandler extends SIPRequestProcessorParent imp
48 49 FromHeader fromHeader = (FromHeader) evt.getRequest().getHeader(FromHeader.NAME);
49 50 try {
50 51 // 回复200 OK
51   - responseAck(getServerTransaction(evt), Response.OK);
  52 + responseAck((SIPRequest) evt.getRequest(), Response.OK);
52 53 } catch (SipException | InvalidArgumentException | ParseException e) {
53 54 logger.error("[命令发送失败] DeviceInfo查询回复: {}", e.getMessage());
54 55 }
... ...
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/query/cmd/DeviceStatusQueryMessageHandler.java
... ... @@ -9,6 +9,7 @@ import com.genersoft.iot.vmp.gb28181.transmit.event.request.SIPRequestProcessorP
9 9 import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.IMessageHandler;
10 10 import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.query.QueryMessageHandler;
11 11 import com.genersoft.iot.vmp.storager.IVideoManagerStorage;
  12 +import gov.nist.javax.sip.message.SIPRequest;
12 13 import org.dom4j.Element;
13 14 import org.slf4j.Logger;
14 15 import org.slf4j.LoggerFactory;
... ... @@ -61,7 +62,7 @@ public class DeviceStatusQueryMessageHandler extends SIPRequestProcessorParent i
61 62 FromHeader fromHeader = (FromHeader) evt.getRequest().getHeader(FromHeader.NAME);
62 63 // 回复200 OK
63 64 try {
64   - responseAck(getServerTransaction(evt), Response.OK);
  65 + responseAck((SIPRequest) evt.getRequest(), Response.OK);
65 66 } catch (SipException | InvalidArgumentException | ParseException e) {
66 67 logger.error("[命令发送失败] 国标级联 DeviceStatus查询回复200OK: {}", e.getMessage());
67 68 }
... ...
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/query/cmd/RecordInfoQueryMessageHandler.java
... ... @@ -12,6 +12,7 @@ import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.query.Q
12 12 import com.genersoft.iot.vmp.utils.DateUtil;
13 13 import com.genersoft.iot.vmp.storager.IVideoManagerStorage;
14 14 import com.genersoft.iot.vmp.storager.dao.dto.ChannelSourceInfo;
  15 +import gov.nist.javax.sip.message.SIPRequest;
15 16 import org.dom4j.Element;
16 17 import org.slf4j.Logger;
17 18 import org.slf4j.LoggerFactory;
... ... @@ -21,9 +22,7 @@ import org.springframework.stereotype.Component;
21 22  
22 23 import javax.sip.InvalidArgumentException;
23 24 import javax.sip.RequestEvent;
24   -import javax.sip.ServerTransaction;
25 25 import javax.sip.SipException;
26   -import javax.sip.header.FromHeader;
27 26 import javax.sip.message.Response;
28 27 import java.text.ParseException;
29 28 import java.util.List;
... ... @@ -68,8 +67,7 @@ public class RecordInfoQueryMessageHandler extends SIPRequestProcessorParent imp
68 67 @Override
69 68 public void handForPlatform(RequestEvent evt, ParentPlatform parentPlatform, Element rootElement) {
70 69  
71   - FromHeader fromHeader = (FromHeader) evt.getRequest().getHeader(FromHeader.NAME);
72   - ServerTransaction serverTransaction = getServerTransaction(evt);
  70 + SIPRequest request = (SIPRequest) evt.getRequest();
73 71 Element snElement = rootElement.element("SN");
74 72 int sn = Integer.parseInt(snElement.getText());
75 73 Element deviceIDElement = rootElement.element("DeviceID");
... ... @@ -104,7 +102,7 @@ public class RecordInfoQueryMessageHandler extends SIPRequestProcessorParent imp
104 102 // 接收录像数据
105 103 recordEndEventListener.addEndEventHandler(deviceChannel.getDeviceId(), channelId, (recordInfo)->{
106 104 try {
107   - cmderFroPlatform.recordInfo(deviceChannel, parentPlatform, fromHeader.getTag(), recordInfo);
  105 + cmderFroPlatform.recordInfo(deviceChannel, parentPlatform, request.getFromTag(), recordInfo);
108 106 } catch (SipException | InvalidArgumentException | ParseException e) {
109 107 logger.error("[命令发送失败] 国标级联 回复录像数据: {}", e.getMessage());
110 108 }
... ... @@ -114,14 +112,14 @@ public class RecordInfoQueryMessageHandler extends SIPRequestProcessorParent imp
114 112 DateUtil.ISO8601Toyyyy_MM_dd_HH_mm_ss(endTime), sn, secrecy, type, (eventResult -> {
115 113 // 回复200 OK
116 114 try {
117   - responseAck(serverTransaction, Response.OK);
  115 + responseAck(request, Response.OK);
118 116 } catch (SipException | InvalidArgumentException | ParseException e) {
119 117 logger.error("[命令发送失败] 录像查询回复: {}", e.getMessage());
120 118 }
121 119 }),(eventResult -> {
122 120 // 查询失败
123 121 try {
124   - responseAck(serverTransaction, eventResult.statusCode, eventResult.msg);
  122 + responseAck(request, eventResult.statusCode, eventResult.msg);
125 123 } catch (SipException | InvalidArgumentException | ParseException e) {
126 124 logger.error("[命令发送失败] 录像查询回复: {}", e.getMessage());
127 125 }
... ... @@ -133,13 +131,13 @@ public class RecordInfoQueryMessageHandler extends SIPRequestProcessorParent imp
133 131 }else if (channelSources.get(1).getCount() > 0) { // 直播流
134 132 // TODO
135 133 try {
136   - responseAck(serverTransaction, Response.NOT_IMPLEMENTED); // 回复未实现
  134 + responseAck(request, Response.NOT_IMPLEMENTED); // 回复未实现
137 135 } catch (SipException | InvalidArgumentException | ParseException e) {
138 136 logger.error("[命令发送失败] 录像查询: {}", e.getMessage());
139 137 }
140 138 }else { // 错误的请求
141 139 try {
142   - responseAck(serverTransaction, Response.BAD_REQUEST);
  140 + responseAck(request, Response.BAD_REQUEST);
143 141 } catch (SipException | InvalidArgumentException | ParseException e) {
144 142 logger.error("[命令发送失败] 录像查询: {}", e.getMessage());
145 143 }
... ...
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/response/cmd/BroadcastResponseMessageHandler.java
... ... @@ -9,6 +9,7 @@ import com.genersoft.iot.vmp.gb28181.transmit.event.request.SIPRequestProcessorP
9 9 import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.IMessageHandler;
10 10 import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.response.ResponseMessageHandler;
11 11 import com.genersoft.iot.vmp.gb28181.utils.XmlUtil;
  12 +import gov.nist.javax.sip.message.SIPRequest;
12 13 import org.dom4j.Element;
13 14 import org.slf4j.Logger;
14 15 import org.slf4j.LoggerFactory;
... ... @@ -18,7 +19,6 @@ import org.springframework.stereotype.Component;
18 19  
19 20 import javax.sip.InvalidArgumentException;
20 21 import javax.sip.RequestEvent;
21   -import javax.sip.ServerTransaction;
22 22 import javax.sip.SipException;
23 23 import javax.sip.message.Response;
24 24 import java.text.ParseException;
... ... @@ -47,9 +47,8 @@ public class BroadcastResponseMessageHandler extends SIPRequestProcessorParent i
47 47 try {
48 48 String channelId = getText(rootElement, "DeviceID");
49 49 String key = DeferredResultHolder.CALLBACK_CMD_BROADCAST + device.getDeviceId() + channelId;
50   - ServerTransaction serverTransaction = getServerTransaction(evt);
51 50 // 回复200 OK
52   - responseAck(serverTransaction, Response.OK);
  51 + responseAck((SIPRequest) evt.getRequest(), Response.OK);
53 52 // 此处是对本平台发出Broadcast指令的应答
54 53 JSONObject json = new JSONObject();
55 54 XmlUtil.node2Json(rootElement, json);
... ...
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/response/cmd/CatalogResponseMessageHandler.java
... ... @@ -14,6 +14,7 @@ import com.genersoft.iot.vmp.gb28181.utils.NumericUtil;
14 14 import com.genersoft.iot.vmp.gb28181.utils.XmlUtil;
15 15 import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
16 16 import com.genersoft.iot.vmp.storager.IVideoManagerStorage;
  17 +import gov.nist.javax.sip.message.SIPRequest;
17 18 import org.dom4j.DocumentException;
18 19 import org.dom4j.Element;
19 20 import org.slf4j.Logger;
... ... @@ -27,7 +28,6 @@ import org.springframework.util.StringUtils;
27 28  
28 29 import javax.sip.InvalidArgumentException;
29 30 import javax.sip.RequestEvent;
30   -import javax.sip.ServerTransaction;
31 31 import javax.sip.SipException;
32 32 import javax.sip.message.Response;
33 33 import java.text.ParseException;
... ... @@ -71,9 +71,8 @@ public class CatalogResponseMessageHandler extends SIPRequestProcessorParent imp
71 71 public void handForDevice(RequestEvent evt, Device device, Element element) {
72 72 taskQueue.offer(new HandlerCatchData(evt, device, element));
73 73 // 回复200 OK
74   - ServerTransaction serverTransaction = getServerTransaction(evt);
75 74 try {
76   - responseAck(serverTransaction, Response.OK);
  75 + responseAck((SIPRequest) evt.getRequest(), Response.OK);
77 76 } catch (SipException | InvalidArgumentException | ParseException e) {
78 77 logger.error("[命令发送失败] 目录查询回复: {}", e.getMessage());
79 78 }
... ...
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/response/cmd/ConfigDownloadResponseMessageHandler.java
... ... @@ -10,6 +10,7 @@ import com.genersoft.iot.vmp.gb28181.transmit.event.request.SIPRequestProcessorP
10 10 import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.IMessageHandler;
11 11 import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.response.ResponseMessageHandler;
12 12 import com.genersoft.iot.vmp.gb28181.utils.XmlUtil;
  13 +import gov.nist.javax.sip.message.SIPRequest;
13 14 import org.dom4j.Element;
14 15 import org.slf4j.Logger;
15 16 import org.slf4j.LoggerFactory;
... ... @@ -52,7 +53,7 @@ public class ConfigDownloadResponseMessageHandler extends SIPRequestProcessorPar
52 53 String key = DeferredResultHolder.CALLBACK_CMD_CONFIGDOWNLOAD + device.getDeviceId() + channelId;
53 54 try {
54 55 // 回复200 OK
55   - responseAck(getServerTransaction(evt), Response.OK);
  56 + responseAck((SIPRequest) evt.getRequest(), Response.OK);
56 57 } catch (SipException | InvalidArgumentException | ParseException e) {
57 58 logger.error("[命令发送失败] 设备配置查询: {}", e.getMessage());
58 59 }
... ...
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/response/cmd/DeviceControlResponseMessageHandler.java
... ... @@ -9,6 +9,7 @@ import com.genersoft.iot.vmp.gb28181.transmit.event.request.SIPRequestProcessorP
9 9 import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.IMessageHandler;
10 10 import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.response.ResponseMessageHandler;
11 11 import com.genersoft.iot.vmp.gb28181.utils.XmlUtil;
  12 +import gov.nist.javax.sip.message.SIPRequest;
12 13 import org.dom4j.Element;
13 14 import org.slf4j.Logger;
14 15 import org.slf4j.LoggerFactory;
... ... @@ -46,7 +47,7 @@ public class DeviceControlResponseMessageHandler extends SIPRequestProcessorPare
46 47 public void handForDevice(RequestEvent evt, Device device, Element element) {
47 48 // 此处是对本平台发出DeviceControl指令的应答
48 49 try {
49   - responseAck(getServerTransaction(evt), Response.OK);
  50 + responseAck((SIPRequest) evt.getRequest(), Response.OK);
50 51 } catch (SipException | InvalidArgumentException | ParseException e) {
51 52 logger.error("[命令发送失败] 国标级联 设备控制: {}", e.getMessage());
52 53 }
... ...
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/response/cmd/DeviceInfoResponseMessageHandler.java
... ... @@ -13,6 +13,7 @@ import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.respons
13 13 import com.genersoft.iot.vmp.service.IDeviceService;
14 14 import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
15 15 import com.genersoft.iot.vmp.storager.IVideoManagerStorage;
  16 +import gov.nist.javax.sip.message.SIPRequest;
16 17 import org.dom4j.DocumentException;
17 18 import org.dom4j.Element;
18 19 import org.slf4j.Logger;
... ... @@ -21,11 +22,9 @@ import org.springframework.beans.factory.InitializingBean;
21 22 import org.springframework.beans.factory.annotation.Autowired;
22 23 import org.springframework.stereotype.Component;
23 24 import org.springframework.util.ObjectUtils;
24   -import org.springframework.util.StringUtils;
25 25  
26 26 import javax.sip.InvalidArgumentException;
27 27 import javax.sip.RequestEvent;
28   -import javax.sip.ServerTransaction;
29 28 import javax.sip.SipException;
30 29 import javax.sip.message.Response;
31 30 import java.text.ParseException;
... ... @@ -75,14 +74,14 @@ public class DeviceInfoResponseMessageHandler extends SIPRequestProcessorParent
75 74 logger.warn("[接收到DeviceInfo应答消息,但是设备已经离线]:" + (device != null ? device.getDeviceId():"" ));
76 75 return;
77 76 }
78   - ServerTransaction serverTransaction = getServerTransaction(evt);
  77 + SIPRequest request = (SIPRequest) evt.getRequest();
79 78 try {
80 79 rootElement = getRootElement(evt, device.getCharset());
81 80  
82   - if (rootElement == null) {
  81 + if (rootElement == null) {
83 82 logger.warn("[ 接收到DeviceInfo应答消息 ] content cannot be null, {}", evt.getRequest());
84 83 try {
85   - responseAck(serverTransaction, Response.BAD_REQUEST);
  84 + responseAck((SIPRequest) evt.getRequest(), Response.BAD_REQUEST);
86 85 } catch (SipException | InvalidArgumentException | ParseException e) {
87 86 logger.error("[命令发送失败] DeviceInfo应答消息 BAD_REQUEST: {}", e.getMessage());
88 87 }
... ... @@ -110,7 +109,7 @@ public class DeviceInfoResponseMessageHandler extends SIPRequestProcessorParent
110 109 }
111 110 try {
112 111 // 回复200 OK
113   - responseAck(serverTransaction, Response.OK);
  112 + responseAck(request, Response.OK);
114 113 } catch (SipException | InvalidArgumentException | ParseException e) {
115 114 logger.error("[命令发送失败] DeviceInfo应答消息 200: {}", e.getMessage());
116 115 }
... ...
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/response/cmd/DeviceStatusResponseMessageHandler.java
... ... @@ -13,6 +13,7 @@ import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.respons
13 13 import com.genersoft.iot.vmp.gb28181.utils.XmlUtil;
14 14 import com.genersoft.iot.vmp.service.IDeviceService;
15 15 import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
  16 +import gov.nist.javax.sip.message.SIPRequest;
16 17 import org.dom4j.Element;
17 18 import org.slf4j.Logger;
18 19 import org.slf4j.LoggerFactory;
... ... @@ -59,7 +60,7 @@ public class DeviceStatusResponseMessageHandler extends SIPRequestProcessorParen
59 60 }
60 61 // 回复200 OK
61 62 try {
62   - responseAck(getServerTransaction(evt), Response.OK);
  63 + responseAck((SIPRequest) evt.getRequest(), Response.OK);
63 64 } catch (SipException | InvalidArgumentException | ParseException e) {
64 65 logger.error("[命令发送失败] 国标级联 设备状态应答回复200OK: {}", e.getMessage());
65 66 }
... ...
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/response/cmd/MobilePositionResponseMessageHandler.java
... ... @@ -13,6 +13,7 @@ import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
13 13 import com.genersoft.iot.vmp.storager.IVideoManagerStorage;
14 14 import com.genersoft.iot.vmp.utils.DateUtil;
15 15 import com.genersoft.iot.vmp.utils.GpsUtil;
  16 +import gov.nist.javax.sip.message.SIPRequest;
16 17 import org.dom4j.DocumentException;
17 18 import org.dom4j.Element;
18 19 import org.slf4j.Logger;
... ... @@ -21,11 +22,9 @@ import org.springframework.beans.factory.InitializingBean;
21 22 import org.springframework.beans.factory.annotation.Autowired;
22 23 import org.springframework.stereotype.Component;
23 24 import org.springframework.util.ObjectUtils;
24   -import org.springframework.util.StringUtils;
25 25  
26 26 import javax.sip.InvalidArgumentException;
27 27 import javax.sip.RequestEvent;
28   -import javax.sip.ServerTransaction;
29 28 import javax.sip.SipException;
30 29 import javax.sip.message.Response;
31 30 import java.text.ParseException;
... ... @@ -64,15 +63,14 @@ public class MobilePositionResponseMessageHandler extends SIPRequestProcessorPar
64 63  
65 64 @Override
66 65 public void handForDevice(RequestEvent evt, Device device, Element rootElement) {
67   -
68   - ServerTransaction serverTransaction = getServerTransaction(evt);
  66 + SIPRequest request = (SIPRequest) evt.getRequest();
69 67  
70 68 try {
71 69 rootElement = getRootElement(evt, device.getCharset());
72 70 if (rootElement == null) {
73 71 logger.warn("[ 移动设备位置数据查询回复 ] content cannot be null, {}", evt.getRequest());
74 72 try {
75   - responseAck(serverTransaction, Response.BAD_REQUEST);
  73 + responseAck(request, Response.BAD_REQUEST);
76 74 } catch (SipException | InvalidArgumentException | ParseException e) {
77 75 logger.error("[命令发送失败] 移动设备位置数据查询 BAD_REQUEST: {}", e.getMessage());
78 76 }
... ... @@ -138,7 +136,7 @@ public class MobilePositionResponseMessageHandler extends SIPRequestProcessorPar
138 136 redisCatchStorage.sendMobilePositionMsg(jsonObject);
139 137 //回复 200 OK
140 138 try {
141   - responseAck(serverTransaction, Response.OK);
  139 + responseAck(request, Response.OK);
142 140 } catch (SipException | InvalidArgumentException | ParseException e) {
143 141 logger.error("[命令发送失败] 移动设备位置数据查询 200: {}", e.getMessage());
144 142 }
... ...
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/response/cmd/PresetQueryResponseMessageHandler.java
... ... @@ -7,6 +7,7 @@ import com.genersoft.iot.vmp.gb28181.transmit.callback.RequestMessage;
7 7 import com.genersoft.iot.vmp.gb28181.transmit.event.request.SIPRequestProcessorParent;
8 8 import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.IMessageHandler;
9 9 import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.response.ResponseMessageHandler;
  10 +import gov.nist.javax.sip.message.SIPRequest;
10 11 import org.dom4j.DocumentException;
11 12 import org.dom4j.Element;
12 13 import org.slf4j.Logger;
... ... @@ -17,7 +18,6 @@ import org.springframework.stereotype.Component;
17 18  
18 19 import javax.sip.InvalidArgumentException;
19 20 import javax.sip.RequestEvent;
20   -import javax.sip.ServerTransaction;
21 21 import javax.sip.SipException;
22 22 import javax.sip.message.Response;
23 23 import java.text.ParseException;
... ... @@ -51,7 +51,7 @@ public class PresetQueryResponseMessageHandler extends SIPRequestProcessorParent
51 51 @Override
52 52 public void handForDevice(RequestEvent evt, Device device, Element element) {
53 53  
54   - ServerTransaction serverTransaction = getServerTransaction(evt);
  54 + SIPRequest request = (SIPRequest) evt.getRequest();
55 55  
56 56 try {
57 57 Element rootElement = getRootElement(evt, device.getCharset());
... ... @@ -59,7 +59,7 @@ public class PresetQueryResponseMessageHandler extends SIPRequestProcessorParent
59 59 if (rootElement == null) {
60 60 logger.warn("[ 设备预置位查询应答 ] content cannot be null, {}", evt.getRequest());
61 61 try {
62   - responseAck(serverTransaction, Response.BAD_REQUEST);
  62 + responseAck(request, Response.BAD_REQUEST);
63 63 } catch (InvalidArgumentException | ParseException | SipException e) {
64 64 logger.error("[命令发送失败] 设备预置位查询应答处理: {}", e.getMessage());
65 65 }
... ... @@ -72,7 +72,7 @@ public class PresetQueryResponseMessageHandler extends SIPRequestProcessorParent
72 72 String key = DeferredResultHolder.CALLBACK_CMD_PRESETQUERY + deviceId;
73 73 if (snElement == null || presetListNumElement == null) {
74 74 try {
75   - responseAck(serverTransaction, Response.BAD_REQUEST, "xml error");
  75 + responseAck(request, Response.BAD_REQUEST, "xml error");
76 76 } catch (InvalidArgumentException | ParseException | SipException e) {
77 77 logger.error("[命令发送失败] 设备预置位查询应答处理: {}", e.getMessage());
78 78 }
... ... @@ -103,7 +103,7 @@ public class PresetQueryResponseMessageHandler extends SIPRequestProcessorParent
103 103 requestMessage.setData(presetQuerySipReqList);
104 104 deferredResultHolder.invokeAllResult(requestMessage);
105 105 try {
106   - responseAck(serverTransaction, Response.OK);
  106 + responseAck(request, Response.OK);
107 107 } catch (InvalidArgumentException | ParseException | SipException e) {
108 108 logger.error("[命令发送失败] 设备预置位查询应答处理: {}", e.getMessage());
109 109 }
... ...
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/response/cmd/RecordInfoResponseMessageHandler.java
... ... @@ -10,6 +10,7 @@ import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.IMessag
10 10 import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.response.ResponseMessageHandler;
11 11 import com.genersoft.iot.vmp.utils.DateUtil;
12 12 import com.genersoft.iot.vmp.vmanager.bean.WVPResult;
  13 +import gov.nist.javax.sip.message.SIPRequest;
13 14 import org.dom4j.DocumentException;
14 15 import org.dom4j.Element;
15 16 import org.slf4j.Logger;
... ... @@ -71,7 +72,7 @@ public class RecordInfoResponseMessageHandler extends SIPRequestProcessorParent
71 72 public void handForDevice(RequestEvent evt, Device device, Element rootElement) {
72 73 try {
73 74 // 回复200 OK
74   - responseAck(getServerTransaction(evt), Response.OK);
  75 + responseAck((SIPRequest) evt.getRequest(), Response.OK);
75 76 }catch (SipException | InvalidArgumentException | ParseException e) {
76 77 logger.error("[命令发送失败] 国标级联 国标录像: {}", e.getMessage());
77 78 }
... ...
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/response/impl/InviteResponseProcessor.java
... ... @@ -5,6 +5,7 @@ import com.genersoft.iot.vmp.gb28181.bean.Device;
5 5 import com.genersoft.iot.vmp.gb28181.bean.SsrcTransaction;
6 6 import com.genersoft.iot.vmp.gb28181.session.VideoStreamSessionManager;
7 7 import com.genersoft.iot.vmp.gb28181.transmit.SIPProcessorObserver;
  8 +import com.genersoft.iot.vmp.gb28181.transmit.SIPSender;
8 9 import com.genersoft.iot.vmp.gb28181.transmit.cmd.ISIPCommander;
9 10 import com.genersoft.iot.vmp.gb28181.transmit.cmd.SIPRequestHeaderProvider;
10 11 import com.genersoft.iot.vmp.gb28181.transmit.event.response.SIPResponseProcessorAbstract;
... ... @@ -49,25 +50,14 @@ public class InviteResponseProcessor extends SIPResponseProcessorAbstract {
49 50 private final String method = "INVITE";
50 51  
51 52 @Autowired
52   - private VideoStreamSessionManager streamSession;
53   -
54   - @Autowired
55 53 private SIPProcessorObserver sipProcessorObserver;
56 54  
57   - @Autowired
58   - private SipConfig sipConfig;
59 55  
60 56 @Autowired
61 57 private SipFactory sipFactory;
62 58  
63 59 @Autowired
64   - private GitUtil gitUtil;
65   -
66   - @Autowired
67   - private ISIPCommander commander;
68   -
69   - @Autowired
70   - private IDeviceService deviceService;
  60 + private SIPSender sipSender;
71 61  
72 62 @Autowired
73 63 private SIPRequestHeaderProvider headerProvider;
... ... @@ -121,8 +111,7 @@ public class InviteResponseProcessor extends SIPResponseProcessorAbstract {
121 111 Request reqAck = headerProvider.createAckRequest(requestUri, response);
122 112  
123 113 logger.info("[回复ack] {}-> {}:{} ", sdp.getOrigin().getUsername(), event.getRemoteIpAddress(), event.getRemotePort());
124   - commander.transmitRequest(response.getTopmostViaHeader().getTransport(), reqAck, null, null);
125   -
  114 + sipSender.transmitRequest(reqAck);
126 115 }
127 116 } catch (InvalidArgumentException | ParseException | SipException | SdpParseException e) {
128 117 logger.info("[点播回复ACK],异常:", e );
... ...
src/main/java/com/genersoft/iot/vmp/gb28181/utils/SipUtils.java
... ... @@ -4,6 +4,7 @@ import com.genersoft.iot.vmp.utils.GitUtil;
4 4 import gov.nist.javax.sip.address.AddressImpl;
5 5 import gov.nist.javax.sip.address.SipUri;
6 6 import gov.nist.javax.sip.header.Subject;
  7 +import org.springframework.util.ObjectUtils;
7 8  
8 9 import javax.sip.PeerUnavailableException;
9 10 import javax.sip.SipFactory;
... ... @@ -52,10 +53,15 @@ public class SipUtils {
52 53  
53 54 public static UserAgentHeader createUserAgentHeader(SipFactory sipFactory, GitUtil gitUtil) throws PeerUnavailableException, ParseException {
54 55 List<String> agentParam = new ArrayList<>();
55   - agentParam.add("WVP-Pro v");
56   - if (gitUtil != null && gitUtil.getCommitTime() != null) {
57   - agentParam.add(gitUtil.getBuildVersion() + ".");
58   - agentParam.add(gitUtil.getCommitTime());
  56 + agentParam.add("WVP-Pro ");
  57 + if (gitUtil != null ) {
  58 + if (!ObjectUtils.isEmpty(gitUtil.getBuildVersion())) {
  59 + agentParam.add("v");
  60 + agentParam.add(gitUtil.getBuildVersion() + ".");
  61 + }
  62 + if (!ObjectUtils.isEmpty(gitUtil.getCommitTime())) {
  63 + agentParam.add(gitUtil.getCommitTime());
  64 + }
59 65 }
60 66 return sipFactory.createHeaderFactory().createUserAgentHeader(agentParam);
61 67 }
... ...
src/main/java/com/genersoft/iot/vmp/utils/GitUtil.java
... ... @@ -11,22 +11,22 @@ import org.springframework.stereotype.Component;
11 11 @PropertySource(value = {"classpath:git.properties" }, ignoreResourceNotFound = true)
12 12 public class GitUtil {
13 13  
14   - @Value("${git.branch:null}")
  14 + @Value("${git.branch:}")
15 15 private String branch;
16   - @Value("${git.commit.id:null}")
  16 + @Value("${git.commit.id:}")
17 17 private String gitCommitId;
18   - @Value("${git.remote.origin.url:null}")
  18 + @Value("${git.remote.origin.url:}")
19 19 private String gitUrl;
20   - @Value("${git.build.time:null}")
  20 + @Value("${git.build.time:}")
21 21 private String buildDate;
22 22  
23   - @Value("${git.build.version:null}")
  23 + @Value("${git.build.version:}")
24 24 private String buildVersion;
25 25  
26   - @Value("${git.commit.id.abbrev:null}")
  26 + @Value("${git.commit.id.abbrev:}")
27 27 private String commitIdShort;
28 28  
29   - @Value("${git.commit.time:null}")
  29 + @Value("${git.commit.time:}")
30 30 private String commitTime;
31 31  
32 32 public String getGitCommitId() {
... ...