Merge branch 'master' of https://github.com/swwheihei/wvp.git
Conflicts:
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/response/impl/InviteResponseProcessor.java
New file |
| | |
| | | MIT License |
| | | |
| | | Copyright (c) 2020 swwhaha |
| | | |
| | | Permission is hereby granted, free of charge, to any person obtaining a copy |
| | | of this software and associated documentation files (the "Software"), to deal |
| | | in the Software without restriction, including without limitation the rights |
| | | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
| | | copies of the Software, and to permit persons to whom the Software is |
| | | furnished to do so, subject to the following conditions: |
| | | |
| | | The above copyright notice and this permission notice shall be included in all |
| | | copies or substantial portions of the Software. |
| | | |
| | | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
| | | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
| | | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
| | | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
| | | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
| | | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE |
| | | SOFTWARE. |
| | |
| | | </dependency> |
| | | <dependency> |
| | | <groupId>org.springframework.boot</groupId> |
| | | <artifactId>spring-boot-starter-undertow</artifactId> |
| | | <artifactId>spring-boot-starter-tomcat</artifactId> |
| | | </dependency> |
| | | <dependency> |
| | | <groupId>org.springframework.boot</groupId> |
| | |
| | | <dependency> |
| | | <groupId>org.dom4j</groupId> |
| | | <artifactId>dom4j</artifactId> |
| | | <version>2.1.1</version> |
| | | <version>2.1.3</version> |
| | | </dependency> |
| | | <dependency> |
| | | <groupId>com.google.code.gson</groupId> |
| | |
| | |
|
| | | /**
|
| | | * @Description:TODO(è¿éç¨ä¸å¥è¯æè¿°è¿ä¸ªç±»çä½ç¨)
|
| | | * @author: swwheihei
|
| | | * @author: songww
|
| | | * @date: 2019å¹´5æ30æ¥ ä¸å3:04:04
|
| | | *
|
| | | */
|
| | |
| | |
|
| | | /**
|
| | | * @Description:Redisä¸é´ä»¶é
置类ï¼ä½¿ç¨spring-data-rediséæï¼èªå¨ä»application.ymlä¸å è½½redisé
ç½®
|
| | | * @author: swwheihei
|
| | | * @author: songww
|
| | | * @date: 2019å¹´5æ30æ¥ ä¸å10:58:25
|
| | | *
|
| | | */
|
| | |
| | |
|
| | | /**
|
| | | * @Description:TODO(è¿éç¨ä¸å¥è¯æè¿°è¿ä¸ªç±»çä½ç¨)
|
| | | * @author: swwheihei
|
| | | * @author: songww
|
| | | * @date: 2020å¹´5æ6æ¥ ä¸å2:46:00
|
| | | */
|
| | | @Configuration("vmConfig")
|
| | |
| | | package com.genersoft.iot.vmp.gb28181; |
| | | |
| | | import java.text.ParseException;
|
| | | import java.util.Properties; |
| | | |
| | | import javax.annotation.PostConstruct; |
| | |
| | | * 0; public static final int TRACE_MESSAGES = 16; public static final int |
| | | * TRACE_EXCEPTION = 17; public static final int TRACE_DEBUG = 32; |
| | | */ |
| | | properties.setProperty("gov.nist.javax.sip.TRACE_LEVEL", "0"); |
| | | properties.setProperty("gov.nist.javax.sip.TRACE_LEVEL", "32");
|
| | | properties.setProperty("gov.nist.javax.sip.SERVER_LOG", "sip_server_log"); |
| | | properties.setProperty("gov.nist.javax.sip.DEBUG_LOG", "sip_debug_log"); |
| | | sipStack = (SipStackImpl) sipFactory.createSipStack(properties); |
| | |
| | | } |
| | | |
| | | private void startTcpListener() throws Exception { |
| | | ListeningPoint tcpListeningPoint = sipStack.createListeningPoint(sipConfig.getSipIp(), sipConfig.getSipPort(), "TCP"); |
| | | ListeningPoint tcpListeningPoint = sipStack.createListeningPoint(sipConfig.getSipIp(), sipConfig.getSipPort(),
|
| | | "TCP");
|
| | | tcpSipProvider = sipStack.createSipProvider(tcpListeningPoint); |
| | | tcpSipProvider.addSipListener(this); |
| | | } |
| | | |
| | | private void startUdpListener() throws Exception { |
| | | ListeningPoint udpListeningPoint = sipStack.createListeningPoint(sipConfig.getSipIp(), sipConfig.getSipPort(), "UDP"); |
| | | ListeningPoint udpListeningPoint = sipStack.createListeningPoint(sipConfig.getSipIp(), sipConfig.getSipPort(),
|
| | | "UDP");
|
| | | udpSipProvider = sipStack.createSipProvider(udpListeningPoint); |
| | | udpSipProvider.addSipListener(this); |
| | | } |
| | |
| | | int status = response.getStatusCode(); |
| | | if ((status >= 200) && (status < 300)) { // Success! |
| | | ISIPResponseProcessor processor = processorFactory.createResponseProcessor(evt); |
| | | try {
|
| | | processor.process(evt, this, sipConfig); |
| | | } catch (ParseException e) {
|
| | | // TODO Auto-generated catch block
|
| | | e.printStackTrace();
|
| | | }
|
| | | // } else if (status == Response.TRYING) {
|
| | | // tryingä¸ä¼åå¤
|
| | | } else if ((status >= 100) && (status < 200)) {
|
| | | // å¢å å
¶å®æ éåå¤çååºï¼å¦101ã180ç
|
| | | } else { |
| | | logger.warn("æ¥æ¶å°å¤±è´¥çresponseååºï¼statusï¼" + status + ",message:" + response.getContent().toString()); |
| | | logger.warn("æ¥æ¶å°å¤±è´¥çresponseååºï¼statusï¼" + status + ",message:" + response.getReasonPhrase()/* .getContent().toString()*/);
|
| | | } |
| | | // tryingä¸ä¼åå¤ |
| | | if (status == Response.TRYING) { |
| | | // if (status == Response.TRYING) {
|
| | | |
| | | } |
| | | // }
|
| | | } |
| | | |
| | | /** |
| | |
| | |
|
| | | /**
|
| | | * @Description:注åé»è¾å¤çï¼å½è®¾å¤æ³¨åå触åé»è¾ã
|
| | | * @author: swwheihei
|
| | | * @author: songww
|
| | | * @date: 2020å¹´5æ8æ¥ ä¸å9:41:46
|
| | | */
|
| | | @Component
|
| | |
| | |
|
| | | /**
|
| | | * @Description:设å¤å½åä¿¡æ¯bean
|
| | | * @author: swwheihei
|
| | | * @author: songww
|
| | | * @date: 2020å¹´5æ8æ¥ ä¸å2:05:56
|
| | | */
|
| | | public class RecordInfo {
|
| | |
| | |
|
| | | /**
|
| | | * @Description:设å¤å½åbean
|
| | | * @author: swwheihei
|
| | | * @author: songww
|
| | | * @date: 2020å¹´5æ8æ¥ ä¸å2:06:54
|
| | | */
|
| | | public class RecordItem {
|
| | |
| | |
|
| | | /**
|
| | | * @Description:设å¤ç¦»å¨çº¿ç¶ææ£æµå¨ï¼ç¨äºæ£æµè®¾å¤ç¶æ
|
| | | * @author: swwheihei
|
| | | * @author: songww
|
| | | * @date: 2020å¹´5æ13æ¥ ä¸å2:40:29
|
| | | */
|
| | | @Component
|
| | |
| | |
|
| | | /**
|
| | | * @Description:Eventäºä»¶éç¥æ¨éå¨ï¼æ¯ææ¨éå¨çº¿äºä»¶ã离线äºä»¶
|
| | | * @author: swwheihei
|
| | | * @author: songww
|
| | | * @date: 2020å¹´5æ6æ¥ ä¸å11:30:50
|
| | | */
|
| | | @Component
|
| | |
| | |
|
| | | /**
|
| | | * @Description:设å¤å¿è·³è¶
æ¶çå¬,åå©redisè¿æç¹æ§ï¼è¿è¡çå¬ï¼çå¬å°è¯´æè®¾å¤å¿è·³è¶
æ¶ï¼åé离线äºä»¶
|
| | | * @author: swwheihei
|
| | | * @author: songww
|
| | | * @date: 2020å¹´5æ6æ¥ ä¸å11:35:46
|
| | | */
|
| | | @Component
|
| | |
| | |
|
| | | /**
|
| | | * @Description:TODO(è¿éç¨ä¸å¥è¯æè¿°è¿ä¸ªç±»çä½ç¨)
|
| | | * @author: swwheihei
|
| | | * @author: songww
|
| | | * @date: 2020å¹´5æ6æ¥ ä¸å11:33:13
|
| | | */
|
| | | public class OfflineEvent extends ApplicationEvent {
|
| | |
| | | * @Description: 离线äºä»¶çå¬å¨ï¼çå¬å°ç¦»çº¿åï¼ä¿®æ¹è®¾å¤ç¦»å¨çº¿ç¶æã 设å¤ç¦»çº¿æä¸¤ä¸ªæ¥æºï¼
|
| | | * 1ã设å¤ä¸»å¨æ³¨éï¼åéæ³¨éæä»¤ï¼{@link com.genersoft.iot.vmp.gb28181.transmit.request.impl.RegisterRequestProcessor}
|
| | | * 2ãè®¾å¤æªç¥åå 离线ï¼å¿è·³è¶
æ¶,{@link com.genersoft.iot.vmp.gb28181.event.offline.OfflineEventListener}
|
| | | * @author: swwheihei
|
| | | * @author: songww
|
| | | * @date: 2020å¹´5æ6æ¥ ä¸å1:51:23
|
| | | */
|
| | | @Component
|
| | |
| | |
|
| | | /**
|
| | | * @Description:TODO(è¿éç¨ä¸å¥è¯æè¿°è¿ä¸ªç±»çä½ç¨)
|
| | | * @author: swwheihei
|
| | | * @author: songww
|
| | | * @date: 2020å¹´5æ6æ¥ ä¸å11:32:56
|
| | | */
|
| | | public class OnlineEvent extends ApplicationEvent {
|
| | |
| | | * @Description: å¨çº¿äºä»¶çå¬å¨ï¼çå¬å°ç¦»çº¿åï¼ä¿®æ¹è®¾å¤ç¦»å¨çº¿ç¶æã 设å¤å¨çº¿æä¸¤ä¸ªæ¥æºï¼
|
| | | * 1ã设å¤ä¸»å¨æ³¨éï¼åéæ³¨éæä»¤ï¼{@link com.genersoft.iot.vmp.gb28181.transmit.request.impl.RegisterRequestProcessor}
|
| | | * 2ãè®¾å¤æªç¥åå 离线ï¼å¿è·³è¶
æ¶,{@link com.genersoft.iot.vmp.gb28181.transmit.request.impl.MessageRequestProcessor}
|
| | | * @author: swwheihei
|
| | | * @author: songww
|
| | | * @date: 2020å¹´5æ6æ¥ ä¸å1:51:23
|
| | | */
|
| | | @Component
|
| | |
| | |
|
| | | /**
|
| | | * @Description:SIP信令ä¸çSSRCå·¥å
·ç±»ãSSRCå¼ç±10ä½åè¿å¶æ´æ°ç»æçå符串ï¼ç¬¬ä¸ä½ä¸º0代表å®åµï¼ä¸º1åä»£è¡¨åæ¾ï¼ç¬¬äºä½è³ç¬¬å
ä½ç±çæ§åIDç第4ä½å°ç¬¬8ä½ç»æï¼æå4ä½ä¸ºä¸éå¤ç4ä¸ªæ´æ°
|
| | | * @author: swwheihei
|
| | | * @author: songww
|
| | | * @date: 2020å¹´5æ10æ¥ ä¸å11:57:57
|
| | | */
|
| | | public class SsrcUtil {
|
| | |
| | |
|
| | | /**
|
| | | * @Description:è§é¢æµsession管çå¨ï¼ç®¡çè§é¢é¢è§ãé¢è§åæ¾çéä¿¡å¥æ
|
| | | * @author: swwheihei
|
| | | * @author: songww
|
| | | * @date: 2020å¹´5æ13æ¥ ä¸å4:03:02
|
| | | */
|
| | | @Component
|
| | |
| | |
|
| | | /**
|
| | | * @Description:TODO(è¿éç¨ä¸å¥è¯æè¿°è¿ä¸ªç±»çä½ç¨)
|
| | | * @author: swwheihei
|
| | | * @author: songww
|
| | | * @date: 2020å¹´5æ3æ¥ ä¸å4:24:37
|
| | | */
|
| | | @Component
|
| | |
| | |
|
| | | /**
|
| | | * @Description:TODO(è¿éç¨ä¸å¥è¯æè¿°è¿ä¸ªç±»çä½ç¨)
|
| | | * @author: swwheihei
|
| | | * @author: songww
|
| | | * @date: 2020å¹´5æ8æ¥ ä¸å7:59:05
|
| | | */
|
| | | @Component
|
| | |
| | |
|
| | | /**
|
| | | * @Description:TODO(è¿éç¨ä¸å¥è¯æè¿°è¿ä¸ªç±»çä½ç¨)
|
| | | * @author: swwheihei
|
| | | * @author: songww
|
| | | * @date: 2020å¹´5æ8æ¥ ä¸å1:09:18
|
| | | */
|
| | | public class RequestMessage {
|
| | |
| | |
|
| | | /**
|
| | | * @Description:设å¤è½åæ¥å£ï¼ç¨äºå®ä¹è®¾å¤çæ§å¶ãæ¥è¯¢è½å
|
| | | * @author: swwheihei
|
| | | * @author: songww
|
| | | * @date: 2020å¹´5æ3æ¥ ä¸å9:16:34
|
| | | */
|
| | | public interface ISIPCommander {
|
| | |
| | |
|
| | | /**
|
| | | * @Description:æå头å½ä»¤requeståé å¨ TODO åä½ä»£ç 太å¤å¾
ä¼å
|
| | | * @author: swwheihei
|
| | | * @author: songww
|
| | | * @date: 2020å¹´5æ6æ¥ ä¸å9:29:02
|
| | | */
|
| | | @Component
|
| | |
| | | SipURI requestLine = layer.getAddressFactory().createSipURI(channelId, host.getAddress());
|
| | | //via
|
| | | ArrayList<ViaHeader> viaHeaders = new ArrayList<ViaHeader>();
|
| | | ViaHeader viaHeader = layer.getHeaderFactory().createViaHeader(sipConfig.getSipIp(), sipConfig.getSipPort(), device.getTransport(), viaTag);
|
| | | // ViaHeader viaHeader = layer.getHeaderFactory().createViaHeader(sipConfig.getSipIp(), sipConfig.getSipPort(), device.getTransport(), viaTag);
|
| | | ViaHeader viaHeader = layer.getHeaderFactory().createViaHeader(device.getHost().getIp(), device.getHost().getPort(), device.getTransport(), viaTag);
|
| | | viaHeader.setRPort();
|
| | | viaHeaders.add(viaHeader);
|
| | | //from
|
| | |
| | | request = layer.getMessageFactory().createRequest(requestLine, Request.INVITE, callIdHeader, cSeqHeader,fromHeader, toHeader, viaHeaders, maxForwards);
|
| | |
|
| | | Address concatAddress = layer.getAddressFactory().createAddress(layer.getAddressFactory().createSipURI(sipConfig.getSipId(), sipConfig.getSipIp()+":"+sipConfig.getSipPort()));
|
| | | // Address concatAddress = layer.getAddressFactory().createAddress(layer.getAddressFactory().createSipURI(sipConfig.getSipId(), device.getHost().getIp()+":"+device.getHost().getPort()));
|
| | | request.addHeader(layer.getHeaderFactory().createContactHeader(concatAddress));
|
| | |
|
| | | ContentTypeHeader contentTypeHeader = layer.getHeaderFactory().createContentTypeHeader("Application", "SDP");
|
| | |
| | | SipURI requestLine = layer.getAddressFactory().createSipURI(device.getDeviceId(), host.getAddress());
|
| | | //via
|
| | | ArrayList<ViaHeader> viaHeaders = new ArrayList<ViaHeader>();
|
| | | ViaHeader viaHeader = layer.getHeaderFactory().createViaHeader(sipConfig.getSipIp(), sipConfig.getSipPort(), device.getTransport(), viaTag);
|
| | | // ViaHeader viaHeader = layer.getHeaderFactory().createViaHeader(sipConfig.getSipIp(), sipConfig.getSipPort(), device.getTransport(), viaTag);
|
| | | ViaHeader viaHeader = layer.getHeaderFactory().createViaHeader(device.getHost().getIp(), device.getHost().getPort(), device.getTransport(), viaTag);
|
| | | viaHeader.setRPort();
|
| | | viaHeaders.add(viaHeader);
|
| | | //from
|
| | |
| | | request = layer.getMessageFactory().createRequest(requestLine, Request.INVITE, callIdHeader, cSeqHeader,fromHeader, toHeader, viaHeaders, maxForwards);
|
| | |
|
| | | Address concatAddress = layer.getAddressFactory().createAddress(layer.getAddressFactory().createSipURI(sipConfig.getSipId(), sipConfig.getSipIp()+":"+sipConfig.getSipPort()));
|
| | | // Address concatAddress = layer.getAddressFactory().createAddress(layer.getAddressFactory().createSipURI(sipConfig.getSipId(), device.getHost().getIp()+":"+device.getHost().getPort()));
|
| | | request.addHeader(layer.getHeaderFactory().createContactHeader(concatAddress));
|
| | |
|
| | | ContentTypeHeader contentTypeHeader = layer.getHeaderFactory().createContentTypeHeader("Application", "SDP");
|
| | |
| | | import javax.sip.InvalidArgumentException;
|
| | | import javax.sip.SipException;
|
| | | import javax.sip.TransactionDoesNotExistException;
|
| | | import javax.sip.address.Address;
|
| | | import javax.sip.address.SipURI;
|
| | | import javax.sip.header.ViaHeader;
|
| | | import javax.sip.message.Request;
|
| | |
|
| | | import org.springframework.beans.factory.annotation.Autowired;
|
| | | import org.springframework.boot.autoconfigure.security.SecurityProperties.Headers;
|
| | | import org.springframework.stereotype.Component;
|
| | |
|
| | | import com.genersoft.iot.vmp.conf.SipConfig;
|
| | |
| | | import com.genersoft.iot.vmp.gb28181.transmit.cmd.SIPRequestHeaderProvider;
|
| | | import com.genersoft.iot.vmp.gb28181.utils.DateUtil;
|
| | |
|
| | | import java.util.regex.Pattern;
|
| | | import java.util.regex.Matcher;
|
| | |
|
| | | /**
|
| | | * @Description:设å¤è½åæ¥å£ï¼ç¨äºå®ä¹è®¾å¤çæ§å¶ãæ¥è¯¢è½å
|
| | | * @author: swwheihei
|
| | | * @author: songww
|
| | | * @date: 2020å¹´5æ3æ¥ ä¸å9:22:48
|
| | | */
|
| | | @Component
|
| | |
| | | }
|
| | |
|
| | | /**
|
| | | * äºå°æä»¤ç è®¡ç® |
| | | *
|
| | | * @param leftRight é头左移å³ç§» 0:忢 1:左移 2:å³ç§»
|
| | | * @param upDown é头ä¸ç§»ä¸ç§» 0:忢 1:ä¸ç§» 2:ä¸ç§»
|
| | | * @param inOut é头æ¾å¤§ç¼©å° 0:忢 1:ç¼©å° 2:æ¾å¤§
|
| | | * @param moveSpeed é头移å¨é度 é»è®¤ 0XFF (0-255)
|
| | | * @param zoomSpeed é头缩æ¾é度 é»è®¤ 0X1 (0-255)
|
| | | */
|
| | | public static String cmdString(int leftRight, int upDown, int inOut, int moveSpeed, int zoomSpeed) {
|
| | | int cmdCode = 0;
|
| | | if (leftRight == 2) {
|
| | | cmdCode|=0x01; // å³ç§»
|
| | | } else if(leftRight == 1) {
|
| | | cmdCode|=0x02; // 左移
|
| | | }
|
| | | if (upDown == 2) {
|
| | | cmdCode|=0x04; // ä¸ç§»
|
| | | } else if(upDown == 1) {
|
| | | cmdCode|=0x08; // ä¸ç§»
|
| | | }
|
| | | if (inOut == 2) {
|
| | | cmdCode |= 0x10; // æ¾å¤§
|
| | | } else if(inOut == 1) {
|
| | | cmdCode |= 0x20; // 缩å°
|
| | | }
|
| | | StringBuilder builder = new StringBuilder("A50F01");
|
| | | String strTmp;
|
| | | strTmp = String.format("%02X", cmdCode);
|
| | | builder.append(strTmp, 0, 2);
|
| | | strTmp = String.format("%02X", moveSpeed);
|
| | | builder.append(strTmp, 0, 2);
|
| | | builder.append(strTmp, 0, 2);
|
| | | strTmp = String.format("%X", zoomSpeed);
|
| | | builder.append(strTmp, 0, 1).append("0");
|
| | | //è®¡ç®æ ¡éªç
|
| | | int checkCode = (0XA5 + 0X0F + 0X01 + cmdCode + moveSpeed + moveSpeed + (zoomSpeed /*<< 4*/ & 0XF0)) % 0X100;
|
| | | strTmp = String.format("%02X", checkCode);
|
| | | builder.append(strTmp, 0, 2);
|
| | | return builder.toString();
|
| | | }
|
| | |
|
| | |
|
| | | /**
|
| | | * äºå°æ§å¶ï¼æ¯ææ¹åä¸ç¼©æ¾æ§å¶
|
| | | *
|
| | | * @param device æ§å¶è®¾å¤
|
| | |
| | | public boolean ptzCmd(Device device, String channelId, int leftRight, int upDown, int inOut, int moveSpeed,
|
| | | int zoomSpeed) {
|
| | | try {
|
| | | String cmdStr= cmdString(leftRight, upDown, inOut, moveSpeed, zoomSpeed);
|
| | | StringBuffer ptzXml = new StringBuffer(200);
|
| | | ptzXml.append("<?xml version=\"1.0\" ?>");
|
| | | ptzXml.append("<Control>");
|
| | | ptzXml.append("<CmdType>DeviceControl</CmdType>");
|
| | | ptzXml.append("<SN>" + (int)((Math.random()*9+1)*100000) + "</SN>");
|
| | | ptzXml.append("<DeviceID>" + channelId + "</DeviceID>");
|
| | | ptzXml.append("<PTZCmd>" + "</PTZCmd>");
|
| | | ptzXml.append("<PTZCmd>" + cmdStr + "</PTZCmd>");
|
| | | ptzXml.append("<Info>");
|
| | | ptzXml.append("</Info>");
|
| | | ptzXml.append("</Control>");
|
| | |
| | | Request request = headerProvider.createMessageRequest(device, ptzXml.toString(), "ViaPtzBranch", "FromPtzTag", "ToPtzTag");
|
| | |
|
| | | transmitRequest(device, request);
|
| | | |
| | | return true;
|
| | | } catch (SipException | ParseException | InvalidArgumentException e) {
|
| | | e.printStackTrace();
|
| | |
| | | return;
|
| | | }
|
| | | Request byeRequest = dialog.createRequest(Request.BYE);
|
| | | SipURI byeURI = (SipURI) byeRequest.getRequestURI();
|
| | | String vh = transaction.getRequest().getHeader(ViaHeader.NAME).toString();
|
| | | Pattern p = Pattern.compile("(\\d+\\.\\d+\\.\\d+\\.\\d+)\\:(\\d+)");
|
| | | Matcher matcher = p.matcher(vh);
|
| | | if (matcher.find()) {
|
| | | byeURI.setHost(matcher.group(1));
|
| | | }
|
| | | ViaHeader viaHeader = (ViaHeader) byeRequest.getHeader(ViaHeader.NAME);
|
| | | String protocol = viaHeader.getTransport().toUpperCase();
|
| | | ClientTransaction clientTransaction = null;
|
| | |
| | | e.printStackTrace();
|
| | | } catch (SipException e) {
|
| | | e.printStackTrace();
|
| | | } catch (ParseException e) {
|
| | | e.printStackTrace();
|
| | | }
|
| | | }
|
| | |
|
| | |
| | |
|
| | | /**
|
| | | * @Description:å¤çæ¥æ¶IPCamera忥çSIPåè®®è¯·æ±æ¶æ¯
|
| | | * @author: swwheihei
|
| | | * @author: songww
|
| | | * @date: 2020å¹´5æ3æ¥ ä¸å4:42:22
|
| | | */
|
| | | public interface ISIPRequestProcessor {
|
| | |
| | |
|
| | | /**
|
| | | * @Description:ACK请æ±å¤çå¨
|
| | | * @author: swwheihei
|
| | | * @author: songww
|
| | | * @date: 2020å¹´5æ3æ¥ ä¸å5:31:45
|
| | | */
|
| | | @Component
|
| | |
| | |
|
| | | /**
|
| | | * @Description: BYE请æ±å¤çå¨
|
| | | * @author: swwheihei
|
| | | * @author: songww
|
| | | * @date: 2020å¹´5æ3æ¥ ä¸å5:32:05
|
| | | */
|
| | | @Component
|
| | |
| | |
|
| | | /**
|
| | | * @Description:CANCEL请æ±å¤çå¨
|
| | | * @author: swwheihei
|
| | | * @author: songww
|
| | | * @date: 2020å¹´5æ3æ¥ ä¸å5:32:23
|
| | | */
|
| | | @Component
|
| | |
| | |
|
| | | /**
|
| | | * @Description:å¤çINVITE请æ±
|
| | | * @author: swwheihei
|
| | | * @author: songww
|
| | | * @date: 2020å¹´5æ3æ¥ ä¸å4:43:52
|
| | | */
|
| | | @Component
|
| | |
| | |
|
| | | /**
|
| | | * @Description:MESSAGE请æ±å¤çå¨
|
| | | * @author: swwheihei
|
| | | * @author: songww
|
| | | * @date: 2020å¹´5æ3æ¥ ä¸å5:32:41
|
| | | */
|
| | | @Component
|
| | |
| | |
|
| | | Request request = evt.getRequest();
|
| | | SAXReader reader = new SAXReader();
|
| | | reader.setEncoding("gbk");
|
| | | Document xml;
|
| | | try {
|
| | | xml = reader.read(new ByteArrayInputStream(request.getRawContent()));
|
| | |
| | | private Element getRootElement(RequestEvent evt) throws DocumentException {
|
| | | Request request = evt.getRequest();
|
| | | SAXReader reader = new SAXReader();
|
| | | reader.setEncoding("GB2312");
|
| | | reader.setEncoding("gbk");
|
| | | Document xml = reader.read(new ByteArrayInputStream(request.getRawContent()));
|
| | | return xml.getRootElement();
|
| | | }
|
| | |
| | |
|
| | | /**
|
| | | * @Description:æä¸æ¯æçæ¶æ¯è¯·æ±å¤çå¨
|
| | | * @author: swwheihei
|
| | | * @author: songww
|
| | | * @date: 2020å¹´5æ3æ¥ ä¸å5:32:59
|
| | | */
|
| | | @Component
|
| | |
| | |
|
| | | /**
|
| | | * @Description:æ¶å°æ³¨åè¯·æ± å¤ç
|
| | | * @author: swwheihei
|
| | | * @author: songww
|
| | | * @date: 2020å¹´5æ3æ¥ ä¸å4:47:25
|
| | | */
|
| | | @Component
|
| | |
| | |
|
| | | /**
|
| | | * @Description:SUBSCRIBE请æ±å¤çå¨
|
| | | * @author: swwheihei
|
| | | * @author: songww
|
| | | * @date: 2020å¹´5æ3æ¥ ä¸å5:31:20
|
| | | */
|
| | | @Component
|
| | |
| | | package com.genersoft.iot.vmp.gb28181.transmit.response;
|
| | |
|
| | | import java.text.ParseException;
|
| | |
|
| | | import javax.sip.ResponseEvent;
|
| | |
|
| | | import com.genersoft.iot.vmp.conf.SipConfig;
|
| | |
| | |
|
| | | /**
|
| | | * @Description:å¤çæ¥æ¶IPCamera忥çSIPåè®®ååºæ¶æ¯
|
| | | * @author: swwheihei
|
| | | * @author: songww
|
| | | * @date: 2020å¹´5æ3æ¥ ä¸å4:42:22
|
| | | */
|
| | | public interface ISIPResponseProcessor {
|
| | |
|
| | | public void process(ResponseEvent evt, SipLayer layer, SipConfig config);
|
| | | public void process(ResponseEvent evt, SipLayer layer, SipConfig config) throws ParseException;
|
| | |
|
| | | }
|
| | |
| | |
|
| | | /**
|
| | | * @Description: BYE请æ±ååºå¨
|
| | | * @author: swwheihei
|
| | | * @author: songww
|
| | | * @date: 2020å¹´5æ3æ¥ ä¸å5:32:05
|
| | | */
|
| | | @Component
|
| | |
| | |
|
| | | /**
|
| | | * @Description:CANCELååºå¤çå¨
|
| | | * @author: swwheihei
|
| | | * @author: songww
|
| | | * @date: 2020å¹´5æ3æ¥ ä¸å5:32:23
|
| | | */
|
| | | @Component
|
| | |
| | |
|
| | | import java.text.ParseException;
|
| | |
|
| | | import javax.sip.ClientTransaction;
|
| | | import javax.sip.Dialog;
|
| | | import javax.sip.InvalidArgumentException;
|
| | | import javax.sip.ResponseEvent;
|
| | |
| | | import com.genersoft.iot.vmp.gb28181.transmit.SIPProcessorFactory;
|
| | | import com.genersoft.iot.vmp.gb28181.transmit.response.ISIPResponseProcessor;
|
| | |
|
| | |
|
| | | /**
|
| | | * @Description:å¤çINVITEååº
|
| | | * @author: swwheihei
|
| | | * @author: songww
|
| | | * @date: 2020å¹´5æ3æ¥ ä¸å4:43:52
|
| | | */
|
| | | @Component
|
| | |
| | | /**
|
| | | * å¤çinviteååº
|
| | | *
|
| | | * @param evt
|
| | | * ååºæ¶æ¯
|
| | | * @param evt ååºæ¶æ¯
|
| | | * @throws ParseException
|
| | | */
|
| | | @Override
|
| | | public void process(ResponseEvent evt, SipLayer layer, SipConfig config) {
|
| | | public void process(ResponseEvent evt, SipLayer layer, SipConfig config) throws ParseException {
|
| | | try {
|
| | | Response response = evt.getResponse();
|
| | | int statusCode = response.getStatusCode();
|
| | | //tryingä¸ä¼åå¤
|
| | | if(statusCode == Response.TRYING){
|
| | |
|
| | | }
|
| | | //æåååº
|
| | | //ä¸åack
|
| | |
| | | // return;
|
| | | // }
|
| | | // Dialog clientDialog = clientTransaction.getDialog();
|
| | | //
|
| | | // CSeqHeader clientCSeqHeader = (CSeqHeader) response.getHeader(CSeqHeader.NAME);
|
| | |
|
| | | // CSeqHeader clientCSeqHeader = (CSeqHeader)
|
| | | // response.getHeader(CSeqHeader.NAME);
|
| | | // long cseqId = clientCSeqHeader.getSeqNumber();
|
| | | // /*
|
| | | // createAck彿°ï¼å建çackRequestï¼ä¼éç¨Inviteååºç200OKï¼ä¸çcontactåæ®µä¸çå°åï¼ä½ä¸ºç®æ å°åã
|
| | |
| | | // Request ackRequest = clientDialog.createAck(cseqId);
|
| | | // SipURI requestURI = (SipURI) ackRequest.getRequestURI();
|
| | | // ViaHeader viaHeader = (ViaHeader) response.getHeader(ViaHeader.NAME);
|
| | | // try {
|
| | | // requestURI.setHost(viaHeader.getHost());
|
| | | // } catch (Exception e) {
|
| | | // e.printStackTrace();
|
| | | // }
|
| | | // requestURI.setPort(viaHeader.getPort());
|
| | | // clientDialog.sendAck(ackRequest);
|
| | |
|
| | | Dialog dialog = evt.getDialog();
|
| | | Request reqAck =dialog.createAck(1L);
|
| | | CSeqHeader cseq = (CSeqHeader) response.getHeader(CSeqHeader.NAME);
|
| | | Request reqAck = dialog.createAck(cseq.getSeqNumber());
|
| | |
|
| | | SipURI requestURI = (SipURI) reqAck.getRequestURI();
|
| | | ViaHeader viaHeader = (ViaHeader) response.getHeader(ViaHeader.NAME);
|
| | | // String viaHost =viaHeader.getHost();
|
| | | //getHost()彿°ååçIPå°åæ¯â[xxx.xxx.xxx.xxx:yyyy]âçæ ¼å¼ï¼éç¨æ£åè¡¨è¾¾å¼æªå为âxxx.xxx.xxx.xxx"æ ¼å¼
|
| | | // Pattern p = Pattern.compile("(?<=//|)((\\w)+\\.)+\\w+");
|
| | | // Matcher matcher = p.matcher(viaHeader.getHost());
|
| | | // if (matcher.find()) {
|
| | | // requestURI.setHost(matcher.group());
|
| | | // }
|
| | | requestURI.setHost(viaHeader.getHost());
|
| | | requestURI.setPort(viaHeader.getPort());
|
| | | reqAck.setRequestURI(requestURI);
|
| | | dialog.sendAck(reqAck);
|
| | | }
|
| | | } catch (InvalidArgumentException | SipException e) {
|
| | |
| | |
|
| | | /**
|
| | | * @Description:æä¸æ¯æçæ¶æ¯ååºå¤çå¨
|
| | | * @author: swwheihei
|
| | | * @author: songww
|
| | | * @date: 2020å¹´5æ3æ¥ ä¸å5:32:59
|
| | | */
|
| | | @Component
|
| | |
| | |
|
| | | /**
|
| | | * @Description:æ¶é´å·¥å
·ç±»ï¼ä¸»è¦å¤çISO 8601æ ¼å¼è½¬æ¢
|
| | | * @author: swwheihei
|
| | | * @author: songww
|
| | | * @date: 2020å¹´5æ8æ¥ ä¸å3:24:42
|
| | | */
|
| | | public class DateUtil {
|
| | |
| | |
|
| | | /**
|
| | | * @Description:é对 ZLMediaServerçhookäºä»¶çå¬
|
| | | * @author: swwheihei
|
| | | * @author: songww
|
| | | * @date: 2020å¹´5æ8æ¥ ä¸å10:46:48
|
| | | */
|
| | | @RestController
|
| | | @RequestMapping("/hook/zlm")
|
| | | @RequestMapping("/index/hook")
|
| | | public class ZLMHttpHookListener {
|
| | |
|
| | | private final static Logger logger = LoggerFactory.getLogger(ZLMHttpHookListener.class);
|
| | |
| | |
|
| | | /**
|
| | | * @Description:è§é¢è®¾å¤æ°æ®å卿¥å£
|
| | | * @author: swwheihei
|
| | | * @author: songww
|
| | | * @date: 2020å¹´5æ6æ¥ ä¸å2:14:31
|
| | | */
|
| | | public interface IVideoManagerStorager {
|
| | |
| | |
|
| | | /**
|
| | | * @Description:è§é¢è®¾å¤æ°æ®åå¨å·¥åï¼æ ¹æ®åå¨çç¥ï¼è¿å对åºçåå¨å¨
|
| | | * @author: swwheihei
|
| | | * @author: songww
|
| | | * @date: 2020å¹´5æ6æ¥ ä¸å2:15:16
|
| | | */
|
| | | @Component
|
| | |
| | |
|
| | | /**
|
| | | * @Description:è§é¢è®¾å¤æ°æ®åå¨-jdbcå®ç°
|
| | | * @author: swwheihei
|
| | | * @author: songww
|
| | | * @date: 2020å¹´5æ6æ¥ ä¸å2:28:12
|
| | | */
|
| | | @Component("jdbcStorager")
|
| | |
| | |
|
| | | /**
|
| | | * @Description:è§é¢è®¾å¤æ°æ®åå¨-rediså®ç°
|
| | | * @author: swwheihei
|
| | | * @author: songww
|
| | | * @date: 2020å¹´5æ6æ¥ ä¸å2:31:42
|
| | | */
|
| | | @Component("redisStorager")
|
| | |
| | |
|
| | | /**
|
| | | * @Description:spring beanè·åå·¥åï¼è·åspringä¸çå·²åå§åçbean
|
| | | * @author: swwheihei
|
| | | * @author: songww
|
| | | * @date: 2019å¹´6æ25æ¥ ä¸å4:51:52
|
| | | *
|
| | | */
|
| | |
| | |
|
| | | /**
|
| | | * @Description:使ç¨fastjsonå®ç°redisçåºåå
|
| | | * @author: swwheihei
|
| | | * @author: songww
|
| | | * @date: 2020å¹´5æ6æ¥ ä¸å8:40:11
|
| | | */
|
| | | public class FastJsonRedisSerializer<T> implements RedisSerializer<T> {
|
| | |
| | |
|
| | | /**
|
| | | * @Description:Rediså·¥å
·ç±»
|
| | | * @author: swwheihei
|
| | | * @author: songww
|
| | | * @date: 2020å¹´5æ6æ¥ ä¸å8:27:29
|
| | | */
|
| | | @Component
|
| | |
| | | server: |
| | | port: 8080 |
| | | sip: |
| | | ip: 10.200.64.63 |
| | | # ip: 10.200.64.63 |
| | | ip: 192.168.0.102 |
| | | port: 5060 |
| | | # æ ¹æ®å½æ 6.1.2ä¸è§å®ï¼domainå®éç¨IDç»ä¸ç¼ç çååä½ç¼ç ã彿 éå½Dä¸å®ä¹å8ä½ä¸ºä¸å¿ç¼ç ï¼ç±ç级ãå¸çº§ãåºçº§ãåºå±ç¼å·ç»æï¼åç
§GB/T 2260-2007ï¼ |
| | | # å两ä½ä¸ºè¡ä¸ç¼ç ï¼å®ä¹åç
§éå½D.3 |
| | |
| | | domain: 3701020049 |
| | | id: 37010200492000000001 |
| | | # é»è®¤è®¾å¤è®¤è¯å¯ç ï¼åç»æ©å±ä½¿ç¨è®¾å¤åç¬å¯ç |
| | | password: admin |
| | | password: admin123 |
| | | media: |
| | | ip: 10.200.64.88 |
| | | # ip: 10.200.64.88 |
| | | ip: 192.168.0.102 |
| | | port: 10000 |