From 03d6ad289baddf8feed64ffca5f1b13828bea710 Mon Sep 17 00:00:00 2001 From: 648540858 <648540858@qq.com> Date: 星期四, 01 九月 2022 14:50:28 +0800 Subject: [PATCH] Merge branch 'wvp-28181-2.0' --- src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java | 190 ++++++++++++++++++++++++++++------------------ 1 files changed, 115 insertions(+), 75 deletions(-) diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java index 96b92e9..9c31e2a 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java @@ -10,12 +10,12 @@ import com.genersoft.iot.vmp.gb28181.session.VideoStreamSessionManager; import com.genersoft.iot.vmp.gb28181.transmit.cmd.ISIPCommander; import com.genersoft.iot.vmp.gb28181.transmit.cmd.SIPRequestHeaderProvider; +import com.genersoft.iot.vmp.gb28181.utils.HeaderUtils; import com.genersoft.iot.vmp.media.zlm.dto.HookSubscribeFactory; import com.genersoft.iot.vmp.media.zlm.dto.HookSubscribeForStreamChange; -import com.genersoft.iot.vmp.media.zlm.dto.HookType; import com.genersoft.iot.vmp.utils.DateUtil; import com.genersoft.iot.vmp.gb28181.utils.NumericUtil; -import com.genersoft.iot.vmp.media.zlm.ZLMHttpHookSubscribe; +import com.genersoft.iot.vmp.media.zlm.ZlmHttpHookSubscribe; import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem; import com.genersoft.iot.vmp.service.IMediaServerService; import com.genersoft.iot.vmp.service.bean.SSRCInfo; @@ -32,19 +32,16 @@ import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.context.annotation.DependsOn; import org.springframework.stereotype.Component; -import org.springframework.util.StringUtils; +import org.springframework.util.ObjectUtils; import javax.sip.*; import javax.sip.address.Address; import javax.sip.address.SipURI; -import javax.sip.address.URI; import javax.sip.header.*; import javax.sip.message.Request; import java.lang.reflect.Field; import java.text.ParseException; -import java.util.ArrayList; import java.util.HashSet; -import java.util.List; /** * @description:璁惧鑳藉姏鎺ュ彛锛岀敤浜庡畾涔夎澶囩殑鎺у埗銆佹煡璇㈣兘鍔� @@ -87,7 +84,7 @@ private UserSetting userSetting; @Autowired - private ZLMHttpHookSubscribe subscribe; + private ZlmHttpHookSubscribe subscribe; @Autowired private SipSubscribe sipSubscribe; @@ -350,7 +347,7 @@ */ @Override public void playStreamCmd(MediaServerItem mediaServerItem, SSRCInfo ssrcInfo, Device device, String channelId, - ZLMHttpHookSubscribe.Event event, SipSubscribe.Event okEvent, SipSubscribe.Event errorEvent) { + ZlmHttpHookSubscribe.Event event, SipSubscribe.Event okEvent, SipSubscribe.Event errorEvent) { String stream = ssrcInfo.getStream(); try { if (device == null) { @@ -639,7 +636,7 @@ hookEvent.call(new InviteStreamInfo(mediaServerItem, json, callIdHeader.getCallId(), "rtp", ssrcInfo.getStream())); subscribe.removeSubscribe(hookSubscribe); hookSubscribe.getContent().put("regist", false); - hookSubscribe.getContent().put("schema", "rtmp"); + hookSubscribe.getContent().put("schema", "rtsp"); // 娣诲姞娴佹敞閿�鐨勮闃咃紝娉ㄩ攢浜嗗悗鍚戣澶囧彂閫乥ye subscribe.addSubscribe(hookSubscribe, (MediaServerItem mediaServerItemForEnd, JSONObject jsonForEnd)->{ @@ -673,6 +670,46 @@ @Override public void streamByeCmd(String deviceId, String channelId, String stream, String callId) { streamByeCmd(deviceId, channelId, stream, callId, null); + } + + @Override + public void streamByeCmd(SIPDialog dialog, String channelId, SIPRequest request, SipSubscribe.Event okEvent) throws SipException, ParseException, InvalidArgumentException { + Request byeRequest = dialog.createRequest(Request.BYE); + SipURI byeURI = (SipURI) byeRequest.getRequestURI(); + byeURI.setHost(request.getRemoteAddress().getHostAddress()); + byeURI.setPort(request.getRemotePort()); + byeURI.setUser(channelId); + ViaHeader viaHeader = (ViaHeader) byeRequest.getHeader(ViaHeader.NAME); + String protocol = viaHeader.getTransport().toUpperCase(); + viaHeader.setRPort(); + // 澧炲姞Contact header + Address concatAddress = sipFactory.createAddressFactory().createAddress(sipFactory.createAddressFactory().createSipURI(sipConfig.getId(), sipConfig.getIp()+":"+sipConfig.getPort())); + byeRequest.addHeader(sipFactory.createHeaderFactory().createContactHeader(concatAddress)); + List<String> agentParam = new ArrayList<>(); + agentParam.add("wvp-pro"); + // TODO 娣诲姞鐗堟湰淇℃伅浠ュ強鏃ユ湡 + UserAgentHeader userAgentHeader = null; + try { + userAgentHeader = sipFactory.createHeaderFactory().createUserAgentHeader(agentParam); + } catch (ParseException e) { + throw new RuntimeException(e); + } + byeRequest.addHeader(userAgentHeader); + ClientTransaction clientTransaction = null; + if("TCP".equals(protocol)) { + clientTransaction = tcpSipProvider.getNewClientTransaction(byeRequest); + } else if("UDP".equals(protocol)) { + clientTransaction = udpSipProvider.getNewClientTransaction(byeRequest); + } + + CallIdHeader callIdHeader = (CallIdHeader) byeRequest.getHeader(CallIdHeader.NAME); + if (okEvent != null) { + sipSubscribe.addOkSubscribe(callIdHeader.getCallId(), okEvent); + } + CSeqHeader cSeqHeader = (CSeqHeader)byeRequest.getHeader(CSeqHeader.NAME); + cSeqHeader.setSeqNumber(redisCatchStorage.getCSEQ()); + dialog.sendRequest(clientTransaction); + } /** @@ -727,34 +764,40 @@ } } - streamByeCmd(dialog, (SIPRequest)transaction.getRequest(), okEvent); + Request byeRequest = dialog.createRequest(Request.BYE); + SipURI byeURI = (SipURI) byeRequest.getRequestURI(); + SIPRequest request = (SIPRequest)transaction.getRequest(); + byeURI.setHost(request.getRemoteAddress().getHostAddress()); + byeURI.setPort(request.getRemotePort()); + byeURI.setUser(channelId); + ViaHeader viaHeader = (ViaHeader) byeRequest.getHeader(ViaHeader.NAME); + String protocol = viaHeader.getTransport().toUpperCase(); + viaHeader.setRPort(); + // 澧炲姞Contact header + Address concatAddress = sipFactory.createAddressFactory().createAddress(sipFactory.createAddressFactory().createSipURI(sipConfig.getId(), sipConfig.getIp()+":"+sipConfig.getPort())); + byeRequest.addHeader(sipFactory.createHeaderFactory().createContactHeader(concatAddress)); + UserAgentHeader userAgentHeader = HeaderUtils.createUserAgentHeader(sipFactory); + byeRequest.addHeader(userAgentHeader); + ClientTransaction clientTransaction = null; + if("TCP".equals(protocol)) { + clientTransaction = tcpSipProvider.getNewClientTransaction(byeRequest); + } else if("UDP".equals(protocol)) { + clientTransaction = udpSipProvider.getNewClientTransaction(byeRequest); + } + + CallIdHeader callIdHeader = (CallIdHeader) byeRequest.getHeader(CallIdHeader.NAME); + if (okEvent != null) { + sipSubscribe.addOkSubscribe(callIdHeader.getCallId(), okEvent); + } + CSeqHeader cSeqHeader = (CSeqHeader)byeRequest.getHeader(CSeqHeader.NAME); + cSeqHeader.setSeqNumber(redisCatchStorage.getCSEQ()); + dialog.sendRequest(clientTransaction); } catch (SipException | ParseException e) { e.printStackTrace(); + } catch (InvalidArgumentException e) { + throw new RuntimeException(e); } - } - - @Override - public void streamByeCmd(SIPDialog dialog, SIPRequest request, SipSubscribe.Event okEvent) throws SipException, ParseException { - Request byeRequest = dialog.createRequest(Request.BYE); - SipURI byeURI = (SipURI) byeRequest.getRequestURI(); - byeURI.setHost(request.getRemoteAddress().getHostAddress()); - byeURI.setPort(request.getRemotePort()); - ViaHeader viaHeader = (ViaHeader) byeRequest.getHeader(ViaHeader.NAME); - String protocol = viaHeader.getTransport().toUpperCase(); - ClientTransaction clientTransaction = null; - if("TCP".equals(protocol)) { - clientTransaction = tcpSipProvider.getNewClientTransaction(byeRequest); - } else if("UDP".equals(protocol)) { - clientTransaction = udpSipProvider.getNewClientTransaction(byeRequest); - } - - CallIdHeader callIdHeader = (CallIdHeader) byeRequest.getHeader(CallIdHeader.NAME); - if (okEvent != null) { - sipSubscribe.addOkSubscribe(callIdHeader.getCallId(), okEvent); - } - - dialog.sendRequest(clientTransaction); } /** @@ -805,7 +848,7 @@ cmdXml.append("<Control>\r\n"); cmdXml.append("<CmdType>DeviceControl</CmdType>\r\n"); cmdXml.append("<SN>" + (int)((Math.random()*9+1)*100000) + "</SN>\r\n"); - if (StringUtils.isEmpty(channelId)) { + if (ObjectUtils.isEmpty(channelId)) { cmdXml.append("<DeviceID>" + device.getDeviceId() + "</DeviceID>\r\n"); } else { cmdXml.append("<DeviceID>" + channelId + "</DeviceID>\r\n"); @@ -908,16 +951,16 @@ cmdXml.append("<SN>" + (int)((Math.random()*9+1)*100000) + "</SN>\r\n"); cmdXml.append("<DeviceID>" + device.getDeviceId() + "</DeviceID>\r\n"); cmdXml.append("<AlarmCmd>ResetAlarm</AlarmCmd>\r\n"); - if (!StringUtils.isEmpty(alarmMethod) || !StringUtils.isEmpty(alarmType)) { + if (!ObjectUtils.isEmpty(alarmMethod) || !ObjectUtils.isEmpty(alarmType)) { cmdXml.append("<Info>\r\n"); } - if (!StringUtils.isEmpty(alarmMethod)) { + if (!ObjectUtils.isEmpty(alarmMethod)) { cmdXml.append("<AlarmMethod>" + alarmMethod + "</AlarmMethod>\r\n"); } - if (!StringUtils.isEmpty(alarmType)) { + if (!ObjectUtils.isEmpty(alarmType)) { cmdXml.append("<AlarmType>" + alarmType + "</AlarmType>\r\n"); } - if (!StringUtils.isEmpty(alarmMethod) || !StringUtils.isEmpty(alarmType)) { + if (!ObjectUtils.isEmpty(alarmMethod) || !ObjectUtils.isEmpty(alarmType)) { cmdXml.append("</Info>\r\n"); } cmdXml.append("</Control>\r\n"); @@ -951,7 +994,7 @@ cmdXml.append("<Control>\r\n"); cmdXml.append("<CmdType>DeviceControl</CmdType>\r\n"); cmdXml.append("<SN>" + (int)((Math.random()*9+1)*100000) + "</SN>\r\n"); - if (StringUtils.isEmpty(channelId)) { + if (ObjectUtils.isEmpty(channelId)) { cmdXml.append("<DeviceID>" + device.getDeviceId() + "</DeviceID>\r\n"); } else { cmdXml.append("<DeviceID>" + channelId + "</DeviceID>\r\n"); @@ -990,7 +1033,7 @@ cmdXml.append("<Control>\r\n"); cmdXml.append("<CmdType>DeviceControl</CmdType>\r\n"); cmdXml.append("<SN>" + (int)((Math.random()*9+1)*100000) + "</SN>\r\n"); - if (StringUtils.isEmpty(channelId)) { + if (ObjectUtils.isEmpty(channelId)) { cmdXml.append("<DeviceID>" + device.getDeviceId() + "</DeviceID>\r\n"); } else { cmdXml.append("<DeviceID>" + channelId + "</DeviceID>\r\n"); @@ -1059,13 +1102,13 @@ cmdXml.append("<Control>\r\n"); cmdXml.append("<CmdType>DeviceConfig</CmdType>\r\n"); cmdXml.append("<SN>" + (int)((Math.random()*9+1)*100000) + "</SN>\r\n"); - if (StringUtils.isEmpty(channelId)) { + if (ObjectUtils.isEmpty(channelId)) { cmdXml.append("<DeviceID>" + device.getDeviceId() + "</DeviceID>\r\n"); } else { cmdXml.append("<DeviceID>" + channelId + "</DeviceID>\r\n"); } cmdXml.append("<BasicParam>\r\n"); - if (!StringUtils.isEmpty(name)) { + if (!ObjectUtils.isEmpty(name)) { cmdXml.append("<Name>" + name + "</Name>\r\n"); } if (NumericUtil.isInteger(expiration)) { @@ -1275,22 +1318,22 @@ cmdXml.append("<CmdType>Alarm</CmdType>\r\n"); cmdXml.append("<SN>" + (int)((Math.random()*9+1)*100000) + "</SN>\r\n"); cmdXml.append("<DeviceID>" + device.getDeviceId() + "</DeviceID>\r\n"); - if (!StringUtils.isEmpty(startPriority)) { + if (!ObjectUtils.isEmpty(startPriority)) { cmdXml.append("<StartAlarmPriority>" + startPriority + "</StartAlarmPriority>\r\n"); } - if (!StringUtils.isEmpty(endPriority)) { + if (!ObjectUtils.isEmpty(endPriority)) { cmdXml.append("<EndAlarmPriority>" + endPriority + "</EndAlarmPriority>\r\n"); } - if (!StringUtils.isEmpty(alarmMethod)) { + if (!ObjectUtils.isEmpty(alarmMethod)) { cmdXml.append("<AlarmMethod>" + alarmMethod + "</AlarmMethod>\r\n"); } - if (!StringUtils.isEmpty(alarmType)) { + if (!ObjectUtils.isEmpty(alarmType)) { cmdXml.append("<AlarmType>" + alarmType + "</AlarmType>\r\n"); } - if (!StringUtils.isEmpty(startTime)) { + if (!ObjectUtils.isEmpty(startTime)) { cmdXml.append("<StartAlarmTime>" + startTime + "</StartAlarmTime>\r\n"); } - if (!StringUtils.isEmpty(endTime)) { + if (!ObjectUtils.isEmpty(endTime)) { cmdXml.append("<EndAlarmTime>" + endTime + "</EndAlarmTime>\r\n"); } cmdXml.append("</Query>\r\n"); @@ -1325,7 +1368,7 @@ cmdXml.append("<Query>\r\n"); cmdXml.append("<CmdType>ConfigDownload</CmdType>\r\n"); cmdXml.append("<SN>" + (int)((Math.random()*9+1)*100000) + "</SN>\r\n"); - if (StringUtils.isEmpty(channelId)) { + if (ObjectUtils.isEmpty(channelId)) { cmdXml.append("<DeviceID>" + device.getDeviceId() + "</DeviceID>\r\n"); } else { cmdXml.append("<DeviceID>" + channelId + "</DeviceID>\r\n"); @@ -1361,7 +1404,7 @@ cmdXml.append("<Query>\r\n"); cmdXml.append("<CmdType>PresetQuery</CmdType>\r\n"); cmdXml.append("<SN>" + (int)((Math.random()*9+1)*100000) + "</SN>\r\n"); - if (StringUtils.isEmpty(channelId)) { + if (ObjectUtils.isEmpty(channelId)) { cmdXml.append("<DeviceID>" + device.getDeviceId() + "</DeviceID>\r\n"); } else { cmdXml.append("<DeviceID>" + channelId + "</DeviceID>\r\n"); @@ -1450,7 +1493,7 @@ request.setContent(subscribePostitionXml.toString(), contentTypeHeader); CSeqHeader cSeqHeader = (CSeqHeader)request.getHeader(CSeqHeader.NAME); - cSeqHeader.setSeqNumber(redisCatchStorage.getCSEQ(Request.SUBSCRIBE)); + cSeqHeader.setSeqNumber(redisCatchStorage.getCSEQ()); request.removeHeader(CSeqHeader.NAME); request.addHeader(cSeqHeader); }else { @@ -1492,22 +1535,22 @@ cmdXml.append("<CmdType>Alarm</CmdType>\r\n"); cmdXml.append("<SN>" + (int)((Math.random()*9+1)*100000) + "</SN>\r\n"); cmdXml.append("<DeviceID>" + device.getDeviceId() + "</DeviceID>\r\n"); - if (!StringUtils.isEmpty(startPriority)) { + if (!ObjectUtils.isEmpty(startPriority)) { cmdXml.append("<StartAlarmPriority>" + startPriority + "</StartAlarmPriority>\r\n"); } - if (!StringUtils.isEmpty(endPriority)) { + if (!ObjectUtils.isEmpty(endPriority)) { cmdXml.append("<EndAlarmPriority>" + endPriority + "</EndAlarmPriority>\r\n"); } - if (!StringUtils.isEmpty(alarmMethod)) { + if (!ObjectUtils.isEmpty(alarmMethod)) { cmdXml.append("<AlarmMethod>" + alarmMethod + "</AlarmMethod>\r\n"); } - if (!StringUtils.isEmpty(alarmType)) { + if (!ObjectUtils.isEmpty(alarmType)) { cmdXml.append("<AlarmType>" + alarmType + "</AlarmType>\r\n"); } - if (!StringUtils.isEmpty(startTime)) { + if (!ObjectUtils.isEmpty(startTime)) { cmdXml.append("<StartAlarmTime>" + startTime + "</StartAlarmTime>\r\n"); } - if (!StringUtils.isEmpty(endTime)) { + if (!ObjectUtils.isEmpty(endTime)) { cmdXml.append("<EndAlarmTime>" + endTime + "</EndAlarmTime>\r\n"); } cmdXml.append("</Query>\r\n"); @@ -1554,7 +1597,7 @@ request.setContent(cmdXml.toString(), contentTypeHeader); CSeqHeader cSeqHeader = (CSeqHeader)request.getHeader(CSeqHeader.NAME); - cSeqHeader.setSeqNumber(redisCatchStorage.getCSEQ(Request.SUBSCRIBE)); + cSeqHeader.setSeqNumber(redisCatchStorage.getCSEQ()); request.removeHeader(CSeqHeader.NAME); request.addHeader(cSeqHeader); @@ -1588,7 +1631,7 @@ dragXml.append("<Control>\r\n"); dragXml.append("<CmdType>DeviceControl</CmdType>\r\n"); dragXml.append("<SN>" + (int) ((Math.random() * 9 + 1) * 100000) + "</SN>\r\n"); - if (StringUtils.isEmpty(channelId)) { + if (ObjectUtils.isEmpty(channelId)) { dragXml.append("<DeviceID>" + device.getDeviceId() + "</DeviceID>\r\n"); } else { dragXml.append("<DeviceID>" + channelId + "</DeviceID>\r\n"); @@ -1625,14 +1668,11 @@ clientTransaction = udpSipProvider.getNewClientTransaction(request); } if (request.getHeader(UserAgentHeader.NAME) == null) { - List<String> agentParam = new ArrayList<>(); - agentParam.add("wvp-pro"); - // TODO 娣诲姞鐗堟湰淇℃伅浠ュ強鏃ユ湡 UserAgentHeader userAgentHeader = null; try { - userAgentHeader = sipFactory.createHeaderFactory().createUserAgentHeader(agentParam); + userAgentHeader = HeaderUtils.createUserAgentHeader(sipFactory); } catch (ParseException e) { - throw new RuntimeException(e); + logger.error("娣诲姞UserAgentHeader澶辫触", e); } request.addHeader(userAgentHeader); } @@ -1664,10 +1704,9 @@ @Override public void playPauseCmd(Device device, StreamInfo streamInfo) { try { - Long cseq = redisCatchStorage.getCSEQ(Request.INFO); StringBuffer content = new StringBuffer(200); content.append("PAUSE RTSP/1.0\r\n"); - content.append("CSeq: " + cseq + "\r\n"); + content.append("CSeq: " + getInfoCseq() + "\r\n"); content.append("PauseTime: now\r\n"); Request request = headerProvider.createInfoRequest(device, streamInfo, content.toString()); if (request == null) { @@ -1695,10 +1734,9 @@ @Override public void playResumeCmd(Device device, StreamInfo streamInfo) { try { - Long cseq = redisCatchStorage.getCSEQ(Request.INFO); StringBuffer content = new StringBuffer(200); content.append("PLAY RTSP/1.0\r\n"); - content.append("CSeq: " + cseq + "\r\n"); + content.append("CSeq: " + getInfoCseq() + "\r\n"); content.append("Range: npt=now-\r\n"); Request request = headerProvider.createInfoRequest(device, streamInfo, content.toString()); if (request == null) { @@ -1725,10 +1763,9 @@ @Override public void playSeekCmd(Device device, StreamInfo streamInfo, long seekTime) { try { - Long cseq = redisCatchStorage.getCSEQ(Request.INFO); StringBuffer content = new StringBuffer(200); content.append("PLAY RTSP/1.0\r\n"); - content.append("CSeq: " + cseq + "\r\n"); + content.append("CSeq: " + getInfoCseq() + "\r\n"); content.append("Range: npt=" + Math.abs(seekTime) + "-\r\n"); Request request = headerProvider.createInfoRequest(device, streamInfo, content.toString()); @@ -1756,11 +1793,11 @@ @Override public void playSpeedCmd(Device device, StreamInfo streamInfo, Double speed) { try { - Long cseq = redisCatchStorage.getCSEQ(Request.INFO); + StringBuffer content = new StringBuffer(200); content.append("PLAY RTSP/1.0\r\n"); - content.append("CSeq: " + cseq + "\r\n"); - content.append("Scale: " + String.format("%.1f",speed) + "\r\n"); + content.append("CSeq: " + getInfoCseq() + "\r\n"); + content.append("Scale: " + String.format("%.6f",speed) + "\r\n"); Request request = headerProvider.createInfoRequest(device, streamInfo, content.toString()); if (request == null) { return; @@ -1779,7 +1816,11 @@ e.printStackTrace(); } } - + + private int getInfoCseq() { + return (int) ((Math.random() * 9 + 1) * Math.pow(10, 8)); + } + @Override public void playbackControlCmd(Device device, StreamInfo streamInfo, String content,SipSubscribe.Event errorEvent, SipSubscribe.Event okEvent) { try { @@ -1787,7 +1828,6 @@ if (request == null) { return; } - logger.info(request.toString()); ClientTransaction clientTransaction = null; if ("TCP".equals(device.getTransport())) { clientTransaction = tcpSipProvider.getNewClientTransaction(request); -- Gitblit v1.8.0