Commit a29a0a0785f966294ba01982fba62c1ff0f23bea
1 parent
ef742e71
增加对设备的兼容性
Showing
6 changed files
with
24 additions
and
23 deletions
src/main/java/com/genersoft/iot/vmp/gb28181/session/SsrcUtil.java
| ... | ... | @@ -5,7 +5,10 @@ import java.util.List; |
| 5 | 5 | import java.util.Random; |
| 6 | 6 | |
| 7 | 7 | import com.genersoft.iot.vmp.conf.SipConfig; |
| 8 | +import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommander; | |
| 8 | 9 | import com.genersoft.iot.vmp.utils.SpringBeanFactory; |
| 10 | +import org.slf4j.Logger; | |
| 11 | +import org.slf4j.LoggerFactory; | |
| 9 | 12 | |
| 10 | 13 | /** |
| 11 | 14 | * @Description:SIP信令中的SSRC工具类。SSRC值由10位十进制整数组成的字符串,第一位为0代表实况,为1则代表回放;第二位至第六位由监控域ID的第4位到第8位组成;最后4位为不重复的4个整数 |
| ... | ... | @@ -14,6 +17,8 @@ import com.genersoft.iot.vmp.utils.SpringBeanFactory; |
| 14 | 17 | */ |
| 15 | 18 | public class SsrcUtil { |
| 16 | 19 | |
| 20 | + private final static Logger logger = LoggerFactory.getLogger(SsrcUtil.class); | |
| 21 | + | |
| 17 | 22 | private static String ssrcPrefix; |
| 18 | 23 | |
| 19 | 24 | private static List<String> isUsed; |
| ... | ... | @@ -59,6 +64,10 @@ public class SsrcUtil { |
| 59 | 64 | * |
| 60 | 65 | */ |
| 61 | 66 | public static void releaseSsrc(String ssrc) { |
| 67 | + if (ssrc == null) { | |
| 68 | + logger.error("要释放ssrc为null"); | |
| 69 | + return; | |
| 70 | + } | |
| 62 | 71 | String sn = ssrc.substring(6); |
| 63 | 72 | isUsed.remove(sn); |
| 64 | 73 | notUsed.add(sn); | ... | ... |
src/main/java/com/genersoft/iot/vmp/gb28181/session/VideoStreamSessionManager.java
| ... | ... | @@ -42,7 +42,9 @@ public class VideoStreamSessionManager { |
| 42 | 42 | |
| 43 | 43 | public void remove(String deviceId, String channelId) { |
| 44 | 44 | sessionMap.remove(deviceId + "_" + channelId); |
| 45 | - SsrcUtil.releaseSsrc(ssrcMap.get(deviceId + "_" + channelId)); | |
| 45 | + if (ssrcMap.get(deviceId + "_" + channelId) != null) { | |
| 46 | + SsrcUtil.releaseSsrc(ssrcMap.get(deviceId + "_" + channelId)); | |
| 47 | + } | |
| 46 | 48 | ssrcMap.remove(deviceId + "_" + channelId); |
| 47 | 49 | streamIdMap.remove(deviceId + "_" + channelId); |
| 48 | 50 | } | ... | ... |
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/SIPRequestHeaderProvider.java
| ... | ... | @@ -69,8 +69,7 @@ public class SIPRequestHeaderProvider { |
| 69 | 69 | SipURI requestLine = sipFactory.createAddressFactory().createSipURI(channelId, device.getHostAddress()); |
| 70 | 70 | //via |
| 71 | 71 | ArrayList<ViaHeader> viaHeaders = new ArrayList<ViaHeader>(); |
| 72 | - ViaHeader viaHeader = sipFactory.createHeaderFactory().createViaHeader(device.getIp(), device.getPort(), device.getTransport(), viaTag); | |
| 73 | -// ViaHeader viaHeader = sipFactory.createHeaderFactory().createViaHeader(sipConfig.getSipIp(), sipConfig.getSipPort(), device.getTransport(), viaTag); | |
| 72 | + ViaHeader viaHeader = sipFactory.createHeaderFactory().createViaHeader(sipConfig.getSipIp(), sipConfig.getSipPort(), device.getTransport(), viaTag); | |
| 74 | 73 | viaHeader.setRPort(); |
| 75 | 74 | viaHeaders.add(viaHeader); |
| 76 | 75 | ... | ... |
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java
| ... | ... | @@ -21,6 +21,7 @@ import com.genersoft.iot.vmp.media.zlm.ZLMRESTfulUtils; |
| 21 | 21 | import com.genersoft.iot.vmp.media.zlm.ZLMRTPServerFactory; |
| 22 | 22 | import com.genersoft.iot.vmp.storager.IRedisCatchStorage; |
| 23 | 23 | import com.genersoft.iot.vmp.storager.IVideoManagerStorager; |
| 24 | +import gov.nist.javax.sip.message.SIPRequest; | |
| 24 | 25 | import org.slf4j.Logger; |
| 25 | 26 | import org.slf4j.LoggerFactory; |
| 26 | 27 | import org.springframework.beans.factory.annotation.Autowired; |
| ... | ... | @@ -625,15 +626,9 @@ public class SIPCommander implements ISIPCommander { |
| 625 | 626 | } |
| 626 | 627 | Request byeRequest = dialog.createRequest(Request.BYE); |
| 627 | 628 | SipURI byeURI = (SipURI) byeRequest.getRequestURI(); |
| 628 | - String vh = transaction.getRequest().getHeader(ViaHeader.NAME).toString(); | |
| 629 | - Pattern p = Pattern.compile("(\\d+\\.\\d+\\.\\d+\\.\\d+)\\:(\\d+)"); | |
| 630 | - Matcher matcher = p.matcher(vh); | |
| 631 | - if (matcher.find()) { | |
| 632 | - String ip = matcher.group(1); | |
| 633 | - byeURI.setHost(ip); | |
| 634 | - String port = matcher.group(2); | |
| 635 | - byeURI.setPort(Integer.parseInt(port)); | |
| 636 | - } | |
| 629 | + SIPRequest request = (SIPRequest)transaction.getRequest(); | |
| 630 | + byeURI.setHost(request.getRemoteAddress().getHostName()); | |
| 631 | + byeURI.setPort(request.getRemotePort()); | |
| 637 | 632 | ViaHeader viaHeader = (ViaHeader) byeRequest.getHeader(ViaHeader.NAME); |
| 638 | 633 | String protocol = viaHeader.getTransport().toUpperCase(); |
| 639 | 634 | ClientTransaction clientTransaction = null; | ... | ... |
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/response/impl/InviteResponseProcessor.java
| ... | ... | @@ -2,16 +2,13 @@ package com.genersoft.iot.vmp.gb28181.transmit.response.impl; |
| 2 | 2 | |
| 3 | 3 | import java.text.ParseException; |
| 4 | 4 | |
| 5 | -import javax.sip.Dialog; | |
| 6 | -import javax.sip.InvalidArgumentException; | |
| 7 | -import javax.sip.ResponseEvent; | |
| 8 | -import javax.sip.SipException; | |
| 5 | +import javax.sip.*; | |
| 9 | 6 | import javax.sip.address.SipURI; |
| 10 | 7 | import javax.sip.header.CSeqHeader; |
| 11 | -import javax.sip.header.ViaHeader; | |
| 12 | 8 | import javax.sip.message.Request; |
| 13 | 9 | import javax.sip.message.Response; |
| 14 | 10 | |
| 11 | +import gov.nist.javax.sip.ResponseEventExt; | |
| 15 | 12 | import org.springframework.stereotype.Component; |
| 16 | 13 | |
| 17 | 14 | import com.genersoft.iot.vmp.conf.SipConfig; |
| ... | ... | @@ -46,16 +43,15 @@ public class InviteResponseProcessor implements ISIPResponseProcessor { |
| 46 | 43 | // 成功响应 |
| 47 | 44 | // 下发ack |
| 48 | 45 | if (statusCode == Response.OK) { |
| 46 | + ResponseEventExt event = (ResponseEventExt)evt; | |
| 49 | 47 | Dialog dialog = evt.getDialog(); |
| 50 | 48 | CSeqHeader cseq = (CSeqHeader) response.getHeader(CSeqHeader.NAME); |
| 51 | 49 | Request reqAck = dialog.createAck(cseq.getSeqNumber()); |
| 52 | - | |
| 53 | 50 | SipURI requestURI = (SipURI) reqAck.getRequestURI(); |
| 54 | - ViaHeader viaHeader = (ViaHeader) response.getHeader(ViaHeader.NAME); | |
| 55 | - requestURI.setHost(viaHeader.getHost()); | |
| 56 | - requestURI.setPort(viaHeader.getPort()); | |
| 51 | + requestURI.setHost(event.getRemoteIpAddress()); | |
| 52 | + requestURI.setPort(event.getRemotePort()); | |
| 57 | 53 | reqAck.setRequestURI(requestURI); |
| 58 | - | |
| 54 | + System.out.println("向 " + event.getRemoteIpAddress() + ":" + event.getRemotePort() + "回复ack"); | |
| 59 | 55 | dialog.sendAck(reqAck); |
| 60 | 56 | } |
| 61 | 57 | } catch (InvalidArgumentException | SipException e) { | ... | ... |
src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookListener.java
| ... | ... | @@ -251,7 +251,7 @@ public class ZLMHttpHookListener { |
| 251 | 251 | JSONArray tracks = json.getJSONArray("tracks"); |
| 252 | 252 | boolean regist = json.getBoolean("regist"); |
| 253 | 253 | if (tracks != null) { |
| 254 | - System.out.println("222222" + schema); | |
| 254 | + System.out.println("on_stream_changed->>" + schema); | |
| 255 | 255 | } |
| 256 | 256 | if ("rtmp".equals(schema)){ |
| 257 | 257 | ... | ... |