Commit 74714711aa87dcd1259f5aebe55d362be732ffa2
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() { | ... | ... |