Commit 5f50a3cfd9571eced413d23d729fb0b68b16df0a
1 parent
4df90d9b
修复语音对讲Bye消息的发送
Showing
7 changed files
with
56 additions
and
3 deletions
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/ISIPCommander.java
| ... | ... | @@ -166,6 +166,8 @@ public interface ISIPCommander { |
| 166 | 166 | void playbackControlCmd(Device device, StreamInfo streamInfo, String content,SipSubscribe.Event errorEvent, SipSubscribe.Event okEvent) throws SipException, InvalidArgumentException, ParseException; |
| 167 | 167 | |
| 168 | 168 | |
| 169 | + void streamByeCmdForDeviceInvite(Device device, String channelId, SipTransactionInfo sipTransactionInfo, SipSubscribe.Event okEvent) throws InvalidArgumentException, SipException, ParseException, SsrcTransactionNotFoundException; | |
| 170 | + | |
| 169 | 171 | /** |
| 170 | 172 | * /** |
| 171 | 173 | * 语音广播 | ... | ... |
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/SIPRequestHeaderProvider.java
| ... | ... | @@ -195,6 +195,41 @@ public class SIPRequestHeaderProvider { |
| 195 | 195 | return request; |
| 196 | 196 | } |
| 197 | 197 | |
| 198 | + public Request createByteRequestForDeviceInvite(Device device, String channelId, SipTransactionInfo transactionInfo) throws ParseException, InvalidArgumentException, PeerUnavailableException { | |
| 199 | + Request request = null; | |
| 200 | + //请求行 | |
| 201 | + SipURI requestLine = SipFactory.getInstance().createAddressFactory().createSipURI(channelId, device.getHostAddress()); | |
| 202 | + // via | |
| 203 | + ArrayList<ViaHeader> viaHeaders = new ArrayList<ViaHeader>(); | |
| 204 | + ViaHeader viaHeader = SipFactory.getInstance().createHeaderFactory().createViaHeader(sipLayer.getLocalIp(device.getLocalIp()), sipConfig.getPort(), device.getTransport(), SipUtils.getNewViaTag()); | |
| 205 | + viaHeaders.add(viaHeader); | |
| 206 | + //from | |
| 207 | + SipURI fromSipURI = SipFactory.getInstance().createAddressFactory().createSipURI(sipConfig.getId(),sipConfig.getDomain()); | |
| 208 | + Address fromAddress = SipFactory.getInstance().createAddressFactory().createAddress(fromSipURI); | |
| 209 | + FromHeader fromHeader = SipFactory.getInstance().createHeaderFactory().createFromHeader(fromAddress, transactionInfo.getToTag()); | |
| 210 | + //to | |
| 211 | + SipURI toSipURI = SipFactory.getInstance().createAddressFactory().createSipURI(channelId,device.getHostAddress()); | |
| 212 | + Address toAddress = SipFactory.getInstance().createAddressFactory().createAddress(toSipURI); | |
| 213 | + ToHeader toHeader = SipFactory.getInstance().createHeaderFactory().createToHeader(toAddress, transactionInfo.getFromTag()); | |
| 214 | + | |
| 215 | + //Forwards | |
| 216 | + MaxForwardsHeader maxForwards = SipFactory.getInstance().createHeaderFactory().createMaxForwardsHeader(70); | |
| 217 | + | |
| 218 | + //ceq | |
| 219 | + CSeqHeader cSeqHeader = SipFactory.getInstance().createHeaderFactory().createCSeqHeader(redisCatchStorage.getCSEQ(), Request.BYE); | |
| 220 | + CallIdHeader callIdHeader = SipFactory.getInstance().createHeaderFactory().createCallIdHeader(transactionInfo.getCallId()); | |
| 221 | + request = SipFactory.getInstance().createMessageFactory().createRequest(requestLine, Request.BYE, callIdHeader, cSeqHeader,fromHeader, toHeader, viaHeaders, maxForwards); | |
| 222 | + | |
| 223 | + request.addHeader(SipUtils.createUserAgentHeader(gitUtil)); | |
| 224 | + | |
| 225 | + Address concatAddress = SipFactory.getInstance().createAddressFactory().createAddress(SipFactory.getInstance().createAddressFactory().createSipURI(sipConfig.getId(), sipLayer.getLocalIp(device.getLocalIp())+":"+sipConfig.getPort())); | |
| 226 | + request.addHeader(SipFactory.getInstance().createHeaderFactory().createContactHeader(concatAddress)); | |
| 227 | + | |
| 228 | + request.addHeader(SipUtils.createUserAgentHeader(gitUtil)); | |
| 229 | + | |
| 230 | + return request; | |
| 231 | + } | |
| 232 | + | |
| 198 | 233 | public Request createSubscribeRequest(Device device, String content, SIPRequest requestOld, Integer expires, String event, CallIdHeader callIdHeader) throws ParseException, InvalidArgumentException, PeerUnavailableException { |
| 199 | 234 | Request request = null; |
| 200 | 235 | // sipuri | ... | ... |
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java
| ... | ... | @@ -700,6 +700,12 @@ public class SIPCommander implements ISIPCommander { |
| 700 | 700 | sipSender.transmitRequest(sipLayer.getLocalIp(device.getLocalIp()), byteRequest, null, okEvent); |
| 701 | 701 | } |
| 702 | 702 | |
| 703 | + @Override | |
| 704 | + public void streamByeCmdForDeviceInvite(Device device, String channelId, SipTransactionInfo sipTransactionInfo, SipSubscribe.Event okEvent) throws InvalidArgumentException, SipException, ParseException, SsrcTransactionNotFoundException { | |
| 705 | + Request byteRequest = headerProvider.createByteRequestForDeviceInvite(device, channelId, sipTransactionInfo); | |
| 706 | + sipSender.transmitRequest(sipLayer.getLocalIp(device.getLocalIp()), byteRequest, null, okEvent); | |
| 707 | + } | |
| 708 | + | |
| 703 | 709 | /** |
| 704 | 710 | * 语音广播 |
| 705 | 711 | * | ... | ... |
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/InviteRequestProcessor.java
| ... | ... | @@ -2,6 +2,7 @@ package com.genersoft.iot.vmp.gb28181.transmit.event.request.impl; |
| 2 | 2 | |
| 3 | 3 | import com.alibaba.fastjson2.JSON; |
| 4 | 4 | import com.alibaba.fastjson2.JSONObject; |
| 5 | +import com.genersoft.iot.vmp.common.InviteSessionType; | |
| 5 | 6 | import com.genersoft.iot.vmp.common.StreamInfo; |
| 6 | 7 | import com.genersoft.iot.vmp.common.VideoManagerConstants; |
| 7 | 8 | import com.genersoft.iot.vmp.conf.DynamicTask; |
| ... | ... | @@ -10,6 +11,7 @@ import com.genersoft.iot.vmp.conf.UserSetting; |
| 10 | 11 | import com.genersoft.iot.vmp.gb28181.bean.*; |
| 11 | 12 | import com.genersoft.iot.vmp.gb28181.session.AudioBroadcastManager; |
| 12 | 13 | import com.genersoft.iot.vmp.gb28181.session.SSRCFactory; |
| 14 | +import com.genersoft.iot.vmp.gb28181.session.VideoStreamSessionManager; | |
| 13 | 15 | import com.genersoft.iot.vmp.gb28181.transmit.SIPProcessorObserver; |
| 14 | 16 | import com.genersoft.iot.vmp.gb28181.transmit.SIPSender; |
| 15 | 17 | import com.genersoft.iot.vmp.gb28181.transmit.cmd.ISIPCommanderForPlatform; |
| ... | ... | @@ -126,6 +128,9 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements |
| 126 | 128 | @Autowired |
| 127 | 129 | private RedisGbPlayMsgListener redisGbPlayMsgListener; |
| 128 | 130 | |
| 131 | + @Autowired | |
| 132 | + private VideoStreamSessionManager streamSession; | |
| 133 | + | |
| 129 | 134 | |
| 130 | 135 | @Override |
| 131 | 136 | public void afterPropertiesSet() throws Exception { |
| ... | ... | @@ -1139,9 +1144,10 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements |
| 1139 | 1144 | audioBroadcastCatch.setStatus(AudioBroadcastCatchStatus.Ok); |
| 1140 | 1145 | audioBroadcastCatch.setSipTransactionInfoByRequset(sipResponse); |
| 1141 | 1146 | audioBroadcastManager.update(audioBroadcastCatch); |
| 1142 | - | |
| 1147 | + streamSession.put(device.getDeviceId(), sendRtpItem.getChannelId(), request.getCallIdHeader().getCallId(), sendRtpItem.getStream(), sendRtpItem.getSsrc(), sendRtpItem.getMediaServerId(), sipResponse, InviteSessionType.BROADCAST); | |
| 1143 | 1148 | // 开启发流,大华在收到200OK后就会开始建立连接 |
| 1144 | 1149 | if (!device.isBroadcastPushAfterAck()) { |
| 1150 | + logger.info("[语音喊话] 回复200OK后发现 BroadcastPushAfterAck为False,现在开始推流"); | |
| 1145 | 1151 | playService.startPushStream(sendRtpItem, sipResponse, parentPlatform, request.getCallIdHeader()); |
| 1146 | 1152 | } |
| 1147 | 1153 | ... | ... |
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/MessageHandlerAbstract.java
| ... | ... | @@ -3,9 +3,13 @@ package com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message; |
| 3 | 3 | import com.genersoft.iot.vmp.gb28181.bean.Device; |
| 4 | 4 | import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform; |
| 5 | 5 | import com.genersoft.iot.vmp.gb28181.transmit.event.request.SIPRequestProcessorParent; |
| 6 | +import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.query.cmd.CatalogQueryMessageHandler; | |
| 7 | +import com.genersoft.iot.vmp.storager.IVideoManagerStorage; | |
| 8 | +import gov.nist.javax.sip.message.SIPRequest; | |
| 6 | 9 | import org.dom4j.Element; |
| 7 | 10 | import org.slf4j.Logger; |
| 8 | 11 | import org.slf4j.LoggerFactory; |
| 12 | +import org.springframework.beans.factory.annotation.Autowired; | |
| 9 | 13 | |
| 10 | 14 | import javax.sip.InvalidArgumentException; |
| 11 | 15 | import javax.sip.RequestEvent; | ... | ... |
src/main/java/com/genersoft/iot/vmp/service/impl/PlayServiceImpl.java
| ... | ... | @@ -1139,7 +1139,7 @@ public class PlayServiceImpl implements IPlayService { |
| 1139 | 1139 | param.put("stream", sendRtpItem.getStream()); |
| 1140 | 1140 | zlmresTfulUtils.stopSendRtp(mediaInfo, param); |
| 1141 | 1141 | try { |
| 1142 | - cmder.streamByeCmd(device, sendRtpItem.getChannelId(), audioBroadcastCatch.getSipTransactionInfo(), null); | |
| 1142 | + cmder.streamByeCmdForDeviceInvite(device, sendRtpItem.getChannelId(), audioBroadcastCatch.getSipTransactionInfo(), null); | |
| 1143 | 1143 | } catch (InvalidArgumentException | ParseException | SipException | |
| 1144 | 1144 | SsrcTransactionNotFoundException e) { |
| 1145 | 1145 | logger.error("[消息发送失败] 发送语音喊话BYE失败"); | ... | ... |
src/main/java/com/genersoft/iot/vmp/vmanager/ps/PsController.java
| ... | ... | @@ -100,7 +100,7 @@ public class PsController { |
| 100 | 100 | } |
| 101 | 101 | } |
| 102 | 102 | String receiveKey = VideoManagerConstants.WVP_OTHER_RECEIVE_PS_INFO + userSetting.getServerId() + "_" + callId + "_" + stream; |
| 103 | - int localPort = zlmServerFactory.createRTPServer(mediaServerItem, stream, ssrcInt, null, false, tcpMode); | |
| 103 | + int localPort = zlmServerFactory.createRTPServer(mediaServerItem, stream, ssrcInt, null, false, false, tcpMode); | |
| 104 | 104 | if (localPort == 0) { |
| 105 | 105 | throw new ControllerException(ErrorCode.ERROR100.getCode(), "获取端口失败"); |
| 106 | 106 | } | ... | ... |