Commit 3745c80567cfdbd02cb60b2351d048f63eb6c1a2
1 parent
7997e40e
重构28181信令的message结构
Showing
40 changed files
with
2200 additions
and
204 deletions
src/main/java/com/genersoft/iot/vmp/gb28181/SipLayer.java
| @@ -77,7 +77,7 @@ public class SipLayer{ | @@ -77,7 +77,7 @@ public class SipLayer{ | ||
| 77 | return sipStack; | 77 | return sipStack; |
| 78 | } | 78 | } |
| 79 | 79 | ||
| 80 | - @Bean("tcpSipProvider") | 80 | + @Bean(name = "tcpSipProvider") |
| 81 | @DependsOn("sipStack") | 81 | @DependsOn("sipStack") |
| 82 | private SipProviderImpl startTcpListener() { | 82 | private SipProviderImpl startTcpListener() { |
| 83 | ListeningPoint tcpListeningPoint = null; | 83 | ListeningPoint tcpListeningPoint = null; |
| @@ -100,7 +100,7 @@ public class SipLayer{ | @@ -100,7 +100,7 @@ public class SipLayer{ | ||
| 100 | return tcpSipProvider; | 100 | return tcpSipProvider; |
| 101 | } | 101 | } |
| 102 | 102 | ||
| 103 | - @Bean("udpSipProvider") | 103 | + @Bean(name = "udpSipProvider") |
| 104 | @DependsOn("sipStack") | 104 | @DependsOn("sipStack") |
| 105 | private SipProviderImpl startUdpListener() { | 105 | private SipProviderImpl startUdpListener() { |
| 106 | ListeningPoint udpListeningPoint = null; | 106 | ListeningPoint udpListeningPoint = null; |
src/main/java/com/genersoft/iot/vmp/gb28181/event/online/OnlineEventListener.java
| @@ -16,8 +16,8 @@ import java.text.SimpleDateFormat; | @@ -16,8 +16,8 @@ import java.text.SimpleDateFormat; | ||
| 16 | 16 | ||
| 17 | /** | 17 | /** |
| 18 | * @description: 在线事件监听器,监听到离线后,修改设备离在线状态。 设备在线有两个来源: | 18 | * @description: 在线事件监听器,监听到离线后,修改设备离在线状态。 设备在线有两个来源: |
| 19 | - * 1、设备主动注销,发送注销指令,{@link com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.RegisterRequestProcessor} | ||
| 20 | - * 2、设备未知原因离线,心跳超时,{@link com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.MessageRequestProcessor} | 19 | + * 1、设备主动注销,发送注销指令 |
| 20 | + * 2、设备未知原因离线,心跳超时 | ||
| 21 | * @author: swwheihei | 21 | * @author: swwheihei |
| 22 | * @date: 2020年5月6日 下午1:51:23 | 22 | * @date: 2020年5月6日 下午1:51:23 |
| 23 | */ | 23 | */ |
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/SIPProcessorObserver.java
| 1 | package com.genersoft.iot.vmp.gb28181.transmit; | 1 | package com.genersoft.iot.vmp.gb28181.transmit; |
| 2 | 2 | ||
| 3 | +import com.genersoft.iot.vmp.gb28181.event.SipSubscribe; | ||
| 3 | import com.genersoft.iot.vmp.gb28181.transmit.event.request.ISIPRequestProcessor; | 4 | import com.genersoft.iot.vmp.gb28181.transmit.event.request.ISIPRequestProcessor; |
| 4 | import com.genersoft.iot.vmp.gb28181.transmit.event.response.ISIPResponseProcessor; | 5 | import com.genersoft.iot.vmp.gb28181.transmit.event.response.ISIPResponseProcessor; |
| 5 | import com.genersoft.iot.vmp.gb28181.transmit.event.timeout.ITimeoutProcessor; | 6 | import com.genersoft.iot.vmp.gb28181.transmit.event.timeout.ITimeoutProcessor; |
| 6 | import org.slf4j.Logger; | 7 | import org.slf4j.Logger; |
| 7 | import org.slf4j.LoggerFactory; | 8 | import org.slf4j.LoggerFactory; |
| 9 | +import org.springframework.beans.factory.annotation.Autowired; | ||
| 8 | import org.springframework.stereotype.Component; | 10 | import org.springframework.stereotype.Component; |
| 9 | 11 | ||
| 10 | import javax.sip.*; | 12 | import javax.sip.*; |
| 11 | import javax.sip.header.CSeqHeader; | 13 | import javax.sip.header.CSeqHeader; |
| 14 | +import javax.sip.header.CallIdHeader; | ||
| 15 | +import javax.sip.message.Response; | ||
| 12 | import java.util.Map; | 16 | import java.util.Map; |
| 13 | import java.util.concurrent.ConcurrentHashMap; | 17 | import java.util.concurrent.ConcurrentHashMap; |
| 14 | 18 | ||
| @@ -26,6 +30,9 @@ public class SIPProcessorObserver implements SipListener { | @@ -26,6 +30,9 @@ public class SIPProcessorObserver implements SipListener { | ||
| 26 | private static Map<String, ISIPResponseProcessor> responseProcessorMap = new ConcurrentHashMap<>(); | 30 | private static Map<String, ISIPResponseProcessor> responseProcessorMap = new ConcurrentHashMap<>(); |
| 27 | private static ITimeoutProcessor timeoutProcessor; | 31 | private static ITimeoutProcessor timeoutProcessor; |
| 28 | 32 | ||
| 33 | + @Autowired | ||
| 34 | + private SipSubscribe sipSubscribe; | ||
| 35 | + | ||
| 29 | /** | 36 | /** |
| 30 | * 添加 request订阅 | 37 | * 添加 request订阅 |
| 31 | * @param method 方法名 | 38 | * @param method 方法名 |
| @@ -73,14 +80,54 @@ public class SIPProcessorObserver implements SipListener { | @@ -73,14 +80,54 @@ public class SIPProcessorObserver implements SipListener { | ||
| 73 | */ | 80 | */ |
| 74 | @Override | 81 | @Override |
| 75 | public void processResponse(ResponseEvent responseEvent) { | 82 | public void processResponse(ResponseEvent responseEvent) { |
| 76 | - CSeqHeader cseqHeader = (CSeqHeader) responseEvent.getResponse().getHeader(CSeqHeader.NAME); | ||
| 77 | - String method = cseqHeader.getMethod(); | ||
| 78 | - ISIPResponseProcessor sipRequestProcessor = responseProcessorMap.get(method); | ||
| 79 | - if (sipRequestProcessor == null) { | ||
| 80 | - logger.warn("不支持方法{}的response", method); | ||
| 81 | - return; | 83 | + logger.debug(responseEvent.getResponse().toString()); |
| 84 | +// CSeqHeader cseqHeader = (CSeqHeader) responseEvent.getResponse().getHeader(CSeqHeader.NAME); | ||
| 85 | +// String method = cseqHeader.getMethod(); | ||
| 86 | +// ISIPResponseProcessor sipRequestProcessor = responseProcessorMap.get(method); | ||
| 87 | +// if (sipRequestProcessor == null) { | ||
| 88 | +// logger.warn("不支持方法{}的response", method); | ||
| 89 | +// return; | ||
| 90 | +// } | ||
| 91 | +// sipRequestProcessor.process(responseEvent); | ||
| 92 | + | ||
| 93 | + | ||
| 94 | + Response response = responseEvent.getResponse(); | ||
| 95 | + logger.debug(responseEvent.getResponse().toString()); | ||
| 96 | + int status = response.getStatusCode(); | ||
| 97 | + if (((status >= 200) && (status < 300)) || status == 401) { // Success! | ||
| 98 | +// ISIPResponseProcessor processor = processorFactory.createResponseProcessor(evt); | ||
| 99 | + CSeqHeader cseqHeader = (CSeqHeader) responseEvent.getResponse().getHeader(CSeqHeader.NAME); | ||
| 100 | + String method = cseqHeader.getMethod(); | ||
| 101 | + ISIPResponseProcessor sipRequestProcessor = responseProcessorMap.get(method); | ||
| 102 | + if (sipRequestProcessor != null) { | ||
| 103 | + sipRequestProcessor.process(responseEvent); | ||
| 104 | + } | ||
| 105 | + if (responseEvent.getResponse() != null && sipSubscribe.getOkSubscribesSize() > 0 ) { | ||
| 106 | + CallIdHeader callIdHeader = (CallIdHeader)responseEvent.getResponse().getHeader(CallIdHeader.NAME); | ||
| 107 | + if (callIdHeader != null) { | ||
| 108 | + SipSubscribe.Event subscribe = sipSubscribe.getOkSubscribe(callIdHeader.getCallId()); | ||
| 109 | + if (subscribe != null) { | ||
| 110 | + SipSubscribe.EventResult eventResult = new SipSubscribe.EventResult(responseEvent); | ||
| 111 | + subscribe.response(eventResult); | ||
| 112 | + } | ||
| 113 | + } | ||
| 114 | + } | ||
| 115 | + } else if ((status >= 100) && (status < 200)) { | ||
| 116 | + // 增加其它无需回复的响应,如101、180等 | ||
| 117 | + } else { | ||
| 118 | + logger.warn("接收到失败的response响应!status:" + status + ",message:" + response.getReasonPhrase()/* .getContent().toString()*/); | ||
| 119 | + if (responseEvent.getResponse() != null && sipSubscribe.getErrorSubscribesSize() > 0 ) { | ||
| 120 | + CallIdHeader callIdHeader = (CallIdHeader)responseEvent.getResponse().getHeader(CallIdHeader.NAME); | ||
| 121 | + if (callIdHeader != null) { | ||
| 122 | + SipSubscribe.Event subscribe = sipSubscribe.getErrorSubscribe(callIdHeader.getCallId()); | ||
| 123 | + if (subscribe != null) { | ||
| 124 | + SipSubscribe.EventResult eventResult = new SipSubscribe.EventResult(responseEvent); | ||
| 125 | + subscribe.response(eventResult); | ||
| 126 | + } | ||
| 127 | + } | ||
| 128 | + } | ||
| 82 | } | 129 | } |
| 83 | - sipRequestProcessor.process(responseEvent); | 130 | + |
| 84 | } | 131 | } |
| 85 | 132 | ||
| 86 | /** | 133 | /** |
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/callback/CheckForAllRecordsThread.java
| 1 | package com.genersoft.iot.vmp.gb28181.transmit.callback; | 1 | package com.genersoft.iot.vmp.gb28181.transmit.callback; |
| 2 | 2 | ||
| 3 | -import java.util.ArrayList; | ||
| 4 | -import java.util.Comparator; | ||
| 5 | -import java.util.List; | ||
| 6 | -import java.util.concurrent.TimeUnit; | ||
| 7 | - | ||
| 8 | import com.genersoft.iot.vmp.gb28181.bean.RecordInfo; | 3 | import com.genersoft.iot.vmp.gb28181.bean.RecordInfo; |
| 9 | import com.genersoft.iot.vmp.gb28181.bean.RecordItem; | 4 | import com.genersoft.iot.vmp.gb28181.bean.RecordItem; |
| 10 | -import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.MessageRequestProcessor; | 5 | +import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.response.cmd.RecordInfoMessageHandler; |
| 11 | import com.genersoft.iot.vmp.utils.redis.RedisUtil; | 6 | import com.genersoft.iot.vmp.utils.redis.RedisUtil; |
| 12 | - | ||
| 13 | import org.slf4j.Logger; | 7 | import org.slf4j.Logger; |
| 14 | 8 | ||
| 9 | +import java.util.ArrayList; | ||
| 10 | +import java.util.Comparator; | ||
| 11 | +import java.util.List; | ||
| 12 | +import java.util.concurrent.TimeUnit; | ||
| 13 | + | ||
| 15 | @SuppressWarnings("unchecked") | 14 | @SuppressWarnings("unchecked") |
| 16 | public class CheckForAllRecordsThread extends Thread { | 15 | public class CheckForAllRecordsThread extends Thread { |
| 17 | 16 | ||
| @@ -58,7 +57,7 @@ public class CheckForAllRecordsThread extends Thread { | @@ -58,7 +57,7 @@ public class CheckForAllRecordsThread extends Thread { | ||
| 58 | msg.setData(recordInfo); | 57 | msg.setData(recordInfo); |
| 59 | deferredResultHolder.invokeAllResult(msg); | 58 | deferredResultHolder.invokeAllResult(msg); |
| 60 | logger.info("处理完成,返回结果"); | 59 | logger.info("处理完成,返回结果"); |
| 61 | - MessageRequestProcessor.threadNameList.remove(cacheKey); | 60 | + RecordInfoMessageHandler.threadNameList.remove(cacheKey); |
| 62 | } | 61 | } |
| 63 | 62 | ||
| 64 | public void setRedis(RedisUtil redis) { | 63 | public void setRedis(RedisUtil redis) { |
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/SIPRequestProcessorAbstract.java
| 1 | package com.genersoft.iot.vmp.gb28181.transmit.event.request; | 1 | package com.genersoft.iot.vmp.gb28181.transmit.event.request; |
| 2 | 2 | ||
| 3 | import gov.nist.javax.sip.SipProviderImpl; | 3 | import gov.nist.javax.sip.SipProviderImpl; |
| 4 | -import gov.nist.javax.sip.SipStackImpl; | ||
| 5 | -import gov.nist.javax.sip.message.SIPRequest; | ||
| 6 | -import gov.nist.javax.sip.stack.SIPServerTransaction; | ||
| 7 | -import org.dom4j.Document; | ||
| 8 | -import org.dom4j.DocumentException; | ||
| 9 | -import org.dom4j.Element; | ||
| 10 | -import org.dom4j.io.SAXReader; | ||
| 11 | -import org.slf4j.Logger; | ||
| 12 | -import org.slf4j.LoggerFactory; | ||
| 13 | -import org.springframework.beans.factory.InitializingBean; | ||
| 14 | import org.springframework.beans.factory.annotation.Autowired; | 4 | import org.springframework.beans.factory.annotation.Autowired; |
| 15 | import org.springframework.beans.factory.annotation.Qualifier; | 5 | import org.springframework.beans.factory.annotation.Qualifier; |
| 16 | 6 | ||
| 17 | -import javax.sip.*; | ||
| 18 | -import javax.sip.address.Address; | ||
| 19 | -import javax.sip.address.AddressFactory; | ||
| 20 | -import javax.sip.address.SipURI; | ||
| 21 | -import javax.sip.header.ContentTypeHeader; | ||
| 22 | -import javax.sip.header.HeaderFactory; | ||
| 23 | -import javax.sip.header.ViaHeader; | ||
| 24 | -import javax.sip.message.MessageFactory; | ||
| 25 | -import javax.sip.message.Request; | ||
| 26 | -import javax.sip.message.Response; | ||
| 27 | -import java.io.ByteArrayInputStream; | ||
| 28 | -import java.text.ParseException; | ||
| 29 | - | ||
| 30 | /** | 7 | /** |
| 31 | * @description:处理接收IPCamera发来的SIP协议请求消息 | 8 | * @description:处理接收IPCamera发来的SIP协议请求消息 |
| 32 | * @author: songww | 9 | * @author: songww |
| 33 | * @date: 2020年5月3日 下午4:42:22 | 10 | * @date: 2020年5月3日 下午4:42:22 |
| 34 | */ | 11 | */ |
| 35 | -public abstract class SIPRequestProcessorAbstract implements InitializingBean, ISIPRequestProcessor { | 12 | +public abstract class SIPRequestProcessorAbstract { |
| 36 | 13 | ||
| 37 | - private final static Logger logger = LoggerFactory.getLogger(SIPRequestProcessorAbstract.class); | ||
| 38 | 14 | ||
| 39 | @Autowired | 15 | @Autowired |
| 40 | @Qualifier(value="tcpSipProvider") | 16 | @Qualifier(value="tcpSipProvider") |
| @@ -44,136 +20,4 @@ public abstract class SIPRequestProcessorAbstract implements InitializingBean, I | @@ -44,136 +20,4 @@ public abstract class SIPRequestProcessorAbstract implements InitializingBean, I | ||
| 44 | @Qualifier(value="udpSipProvider") | 20 | @Qualifier(value="udpSipProvider") |
| 45 | private SipProviderImpl udpSipProvider; | 21 | private SipProviderImpl udpSipProvider; |
| 46 | 22 | ||
| 47 | - /** | ||
| 48 | - * 根据 RequestEvent 获取 ServerTransaction | ||
| 49 | - * @param evt | ||
| 50 | - * @return | ||
| 51 | - */ | ||
| 52 | - public ServerTransaction getServerTransaction(RequestEvent evt) { | ||
| 53 | - Request request = evt.getRequest(); | ||
| 54 | - ServerTransaction serverTransaction = evt.getServerTransaction(); | ||
| 55 | - // 判断TCP还是UDP | ||
| 56 | - boolean isTcp = false; | ||
| 57 | - ViaHeader reqViaHeader = (ViaHeader) request.getHeader(ViaHeader.NAME); | ||
| 58 | - String transport = reqViaHeader.getTransport(); | ||
| 59 | - if (transport.equals("TCP")) { | ||
| 60 | - isTcp = true; | ||
| 61 | - } | ||
| 62 | - | ||
| 63 | - if (serverTransaction == null) { | ||
| 64 | - try { | ||
| 65 | - if (isTcp) { | ||
| 66 | - SipStackImpl stack = (SipStackImpl)tcpSipProvider.getSipStack(); | ||
| 67 | - serverTransaction = (SIPServerTransaction) stack.findTransaction((SIPRequest)request, true); | ||
| 68 | - if (serverTransaction == null) { | ||
| 69 | - serverTransaction = tcpSipProvider.getNewServerTransaction(request); | ||
| 70 | - } | ||
| 71 | - } else { | ||
| 72 | - SipStackImpl stack = (SipStackImpl)udpSipProvider.getSipStack(); | ||
| 73 | - serverTransaction = (SIPServerTransaction) stack.findTransaction((SIPRequest)request, true); | ||
| 74 | - if (serverTransaction == null) { | ||
| 75 | - serverTransaction = udpSipProvider.getNewServerTransaction(request); | ||
| 76 | - } | ||
| 77 | - } | ||
| 78 | - } catch (TransactionAlreadyExistsException e) { | ||
| 79 | - logger.error(e.getMessage()); | ||
| 80 | - } catch (TransactionUnavailableException e) { | ||
| 81 | - logger.error(e.getMessage()); | ||
| 82 | - } | ||
| 83 | - } | ||
| 84 | - return serverTransaction; | ||
| 85 | - } | ||
| 86 | - | ||
| 87 | - public AddressFactory getAddressFactory() { | ||
| 88 | - try { | ||
| 89 | - return SipFactory.getInstance().createAddressFactory(); | ||
| 90 | - } catch (PeerUnavailableException e) { | ||
| 91 | - e.printStackTrace(); | ||
| 92 | - } | ||
| 93 | - return null; | ||
| 94 | - } | ||
| 95 | - | ||
| 96 | - public HeaderFactory getHeaderFactory() { | ||
| 97 | - try { | ||
| 98 | - return SipFactory.getInstance().createHeaderFactory(); | ||
| 99 | - } catch (PeerUnavailableException e) { | ||
| 100 | - e.printStackTrace(); | ||
| 101 | - } | ||
| 102 | - return null; | ||
| 103 | - } | ||
| 104 | - | ||
| 105 | - public MessageFactory getMessageFactory() { | ||
| 106 | - try { | ||
| 107 | - return SipFactory.getInstance().createMessageFactory(); | ||
| 108 | - } catch (PeerUnavailableException e) { | ||
| 109 | - e.printStackTrace(); | ||
| 110 | - } | ||
| 111 | - return null; | ||
| 112 | - } | ||
| 113 | - | ||
| 114 | - /*** | ||
| 115 | - * 回复状态码 | ||
| 116 | - * 100 trying | ||
| 117 | - * 200 OK | ||
| 118 | - * 400 | ||
| 119 | - * 404 | ||
| 120 | - * @param evt | ||
| 121 | - * @throws SipException | ||
| 122 | - * @throws InvalidArgumentException | ||
| 123 | - * @throws ParseException | ||
| 124 | - */ | ||
| 125 | - public void responseAck(RequestEvent evt, int statusCode) throws SipException, InvalidArgumentException, ParseException { | ||
| 126 | - Response response = getMessageFactory().createResponse(statusCode, evt.getRequest()); | ||
| 127 | - ServerTransaction serverTransaction = getServerTransaction(evt); | ||
| 128 | - serverTransaction.sendResponse(response); | ||
| 129 | - if (statusCode >= 200) { | ||
| 130 | - if (serverTransaction.getDialog() != null) serverTransaction.getDialog().delete(); | ||
| 131 | - } | ||
| 132 | - } | ||
| 133 | - | ||
| 134 | - public void responseAck(RequestEvent evt, int statusCode, String msg) throws SipException, InvalidArgumentException, ParseException { | ||
| 135 | - Response response = getMessageFactory().createResponse(statusCode, evt.getRequest()); | ||
| 136 | - response.setReasonPhrase(msg); | ||
| 137 | - ServerTransaction serverTransaction = getServerTransaction(evt); | ||
| 138 | - serverTransaction.sendResponse(response); | ||
| 139 | - if (statusCode >= 200) { | ||
| 140 | - if (serverTransaction.getDialog() != null) serverTransaction.getDialog().delete(); | ||
| 141 | - } | ||
| 142 | - } | ||
| 143 | - | ||
| 144 | - /** | ||
| 145 | - * 回复带sdp的200 | ||
| 146 | - * @param evt | ||
| 147 | - * @param sdp | ||
| 148 | - * @throws SipException | ||
| 149 | - * @throws InvalidArgumentException | ||
| 150 | - * @throws ParseException | ||
| 151 | - */ | ||
| 152 | - public void responseAck(RequestEvent evt, String sdp) throws SipException, InvalidArgumentException, ParseException { | ||
| 153 | - Response response = getMessageFactory().createResponse(Response.OK, evt.getRequest()); | ||
| 154 | - SipFactory sipFactory = SipFactory.getInstance(); | ||
| 155 | - ContentTypeHeader contentTypeHeader = sipFactory.createHeaderFactory().createContentTypeHeader("APPLICATION", "SDP"); | ||
| 156 | - response.setContent(sdp, contentTypeHeader); | ||
| 157 | - | ||
| 158 | - SipURI sipURI = (SipURI)evt.getRequest().getRequestURI(); | ||
| 159 | - | ||
| 160 | - Address concatAddress = sipFactory.createAddressFactory().createAddress( | ||
| 161 | - sipFactory.createAddressFactory().createSipURI(sipURI.getUser(), sipURI.getHost()+":"+sipURI.getPort() | ||
| 162 | - )); | ||
| 163 | - response.addHeader(sipFactory.createHeaderFactory().createContactHeader(concatAddress)); | ||
| 164 | - getServerTransaction(evt).sendResponse(response); | ||
| 165 | - } | ||
| 166 | - | ||
| 167 | - public Element getRootElement(RequestEvent evt) throws DocumentException { | ||
| 168 | - return getRootElement(evt, "gb2312"); | ||
| 169 | - } | ||
| 170 | - public Element getRootElement(RequestEvent evt, String charset) throws DocumentException { | ||
| 171 | - if (charset == null) charset = "gb2312"; | ||
| 172 | - Request request = evt.getRequest(); | ||
| 173 | - SAXReader reader = new SAXReader(); | ||
| 174 | - reader.setEncoding(charset); | ||
| 175 | - Document xml = reader.read(new ByteArrayInputStream(request.getRawContent())); | ||
| 176 | - return xml.getRootElement(); | ||
| 177 | - } | ||
| 178 | - | ||
| 179 | } | 23 | } |
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/SIPRequestProcessorParent.java
0 → 100644
| 1 | +package com.genersoft.iot.vmp.gb28181.transmit.event.request; | ||
| 2 | + | ||
| 3 | +import gov.nist.javax.sip.SipProviderImpl; | ||
| 4 | +import gov.nist.javax.sip.SipStackImpl; | ||
| 5 | +import gov.nist.javax.sip.message.SIPRequest; | ||
| 6 | +import gov.nist.javax.sip.stack.SIPServerTransaction; | ||
| 7 | +import org.dom4j.Document; | ||
| 8 | +import org.dom4j.DocumentException; | ||
| 9 | +import org.dom4j.Element; | ||
| 10 | +import org.dom4j.io.SAXReader; | ||
| 11 | +import org.slf4j.Logger; | ||
| 12 | +import org.slf4j.LoggerFactory; | ||
| 13 | +import org.springframework.beans.factory.annotation.Autowired; | ||
| 14 | +import org.springframework.beans.factory.annotation.Qualifier; | ||
| 15 | + | ||
| 16 | +import javax.sip.*; | ||
| 17 | +import javax.sip.address.Address; | ||
| 18 | +import javax.sip.address.AddressFactory; | ||
| 19 | +import javax.sip.address.SipURI; | ||
| 20 | +import javax.sip.header.ContentTypeHeader; | ||
| 21 | +import javax.sip.header.HeaderFactory; | ||
| 22 | +import javax.sip.header.ViaHeader; | ||
| 23 | +import javax.sip.message.MessageFactory; | ||
| 24 | +import javax.sip.message.Request; | ||
| 25 | +import javax.sip.message.Response; | ||
| 26 | +import java.io.ByteArrayInputStream; | ||
| 27 | +import java.text.ParseException; | ||
| 28 | + | ||
| 29 | +/** | ||
| 30 | + * @description:处理接收IPCamera发来的SIP协议请求消息 | ||
| 31 | + * @author: songww | ||
| 32 | + * @date: 2020年5月3日 下午4:42:22 | ||
| 33 | + */ | ||
| 34 | +public abstract class SIPRequestProcessorParent { | ||
| 35 | + | ||
| 36 | + private final static Logger logger = LoggerFactory.getLogger(SIPRequestProcessorParent.class); | ||
| 37 | + | ||
| 38 | + @Autowired | ||
| 39 | + @Qualifier(value="tcpSipProvider") | ||
| 40 | + private SipProviderImpl tcpSipProvider; | ||
| 41 | + | ||
| 42 | + @Autowired | ||
| 43 | + @Qualifier(value="udpSipProvider") | ||
| 44 | + private SipProviderImpl udpSipProvider; | ||
| 45 | + | ||
| 46 | + /** | ||
| 47 | + * 根据 RequestEvent 获取 ServerTransaction | ||
| 48 | + * @param evt | ||
| 49 | + * @return | ||
| 50 | + */ | ||
| 51 | + public ServerTransaction getServerTransaction(RequestEvent evt) { | ||
| 52 | + Request request = evt.getRequest(); | ||
| 53 | + ServerTransaction serverTransaction = evt.getServerTransaction(); | ||
| 54 | + // 判断TCP还是UDP | ||
| 55 | + boolean isTcp = false; | ||
| 56 | + ViaHeader reqViaHeader = (ViaHeader) request.getHeader(ViaHeader.NAME); | ||
| 57 | + String transport = reqViaHeader.getTransport(); | ||
| 58 | + if (transport.equals("TCP")) { | ||
| 59 | + isTcp = true; | ||
| 60 | + } | ||
| 61 | + | ||
| 62 | + if (serverTransaction == null) { | ||
| 63 | + try { | ||
| 64 | + if (isTcp) { | ||
| 65 | + SipStackImpl stack = (SipStackImpl)tcpSipProvider.getSipStack(); | ||
| 66 | + serverTransaction = (SIPServerTransaction) stack.findTransaction((SIPRequest)request, true); | ||
| 67 | + if (serverTransaction == null) { | ||
| 68 | + serverTransaction = tcpSipProvider.getNewServerTransaction(request); | ||
| 69 | + } | ||
| 70 | + } else { | ||
| 71 | + SipStackImpl stack = (SipStackImpl)udpSipProvider.getSipStack(); | ||
| 72 | + serverTransaction = (SIPServerTransaction) stack.findTransaction((SIPRequest)request, true); | ||
| 73 | + if (serverTransaction == null) { | ||
| 74 | + serverTransaction = udpSipProvider.getNewServerTransaction(request); | ||
| 75 | + } | ||
| 76 | + } | ||
| 77 | + } catch (TransactionAlreadyExistsException e) { | ||
| 78 | + logger.error(e.getMessage()); | ||
| 79 | + } catch (TransactionUnavailableException e) { | ||
| 80 | + logger.error(e.getMessage()); | ||
| 81 | + } | ||
| 82 | + } | ||
| 83 | + return serverTransaction; | ||
| 84 | + } | ||
| 85 | + | ||
| 86 | + public AddressFactory getAddressFactory() { | ||
| 87 | + try { | ||
| 88 | + return SipFactory.getInstance().createAddressFactory(); | ||
| 89 | + } catch (PeerUnavailableException e) { | ||
| 90 | + e.printStackTrace(); | ||
| 91 | + } | ||
| 92 | + return null; | ||
| 93 | + } | ||
| 94 | + | ||
| 95 | + public HeaderFactory getHeaderFactory() { | ||
| 96 | + try { | ||
| 97 | + return SipFactory.getInstance().createHeaderFactory(); | ||
| 98 | + } catch (PeerUnavailableException e) { | ||
| 99 | + e.printStackTrace(); | ||
| 100 | + } | ||
| 101 | + return null; | ||
| 102 | + } | ||
| 103 | + | ||
| 104 | + public MessageFactory getMessageFactory() { | ||
| 105 | + try { | ||
| 106 | + return SipFactory.getInstance().createMessageFactory(); | ||
| 107 | + } catch (PeerUnavailableException e) { | ||
| 108 | + e.printStackTrace(); | ||
| 109 | + } | ||
| 110 | + return null; | ||
| 111 | + } | ||
| 112 | + | ||
| 113 | + /*** | ||
| 114 | + * 回复状态码 | ||
| 115 | + * 100 trying | ||
| 116 | + * 200 OK | ||
| 117 | + * 400 | ||
| 118 | + * 404 | ||
| 119 | + * @param evt | ||
| 120 | + * @throws SipException | ||
| 121 | + * @throws InvalidArgumentException | ||
| 122 | + * @throws ParseException | ||
| 123 | + */ | ||
| 124 | + public void responseAck(RequestEvent evt, int statusCode) throws SipException, InvalidArgumentException, ParseException { | ||
| 125 | + Response response = getMessageFactory().createResponse(statusCode, evt.getRequest()); | ||
| 126 | + ServerTransaction serverTransaction = getServerTransaction(evt); | ||
| 127 | + serverTransaction.sendResponse(response); | ||
| 128 | + if (statusCode >= 200) { | ||
| 129 | + if (serverTransaction.getDialog() != null) serverTransaction.getDialog().delete(); | ||
| 130 | + } | ||
| 131 | + } | ||
| 132 | + | ||
| 133 | + public void responseAck(RequestEvent evt, int statusCode, String msg) throws SipException, InvalidArgumentException, ParseException { | ||
| 134 | + Response response = getMessageFactory().createResponse(statusCode, evt.getRequest()); | ||
| 135 | + response.setReasonPhrase(msg); | ||
| 136 | + ServerTransaction serverTransaction = getServerTransaction(evt); | ||
| 137 | + serverTransaction.sendResponse(response); | ||
| 138 | + if (statusCode >= 200) { | ||
| 139 | + if (serverTransaction.getDialog() != null) serverTransaction.getDialog().delete(); | ||
| 140 | + } | ||
| 141 | + } | ||
| 142 | + | ||
| 143 | + /** | ||
| 144 | + * 回复带sdp的200 | ||
| 145 | + * @param evt | ||
| 146 | + * @param sdp | ||
| 147 | + * @throws SipException | ||
| 148 | + * @throws InvalidArgumentException | ||
| 149 | + * @throws ParseException | ||
| 150 | + */ | ||
| 151 | + public void responseAck(RequestEvent evt, String sdp) throws SipException, InvalidArgumentException, ParseException { | ||
| 152 | + Response response = getMessageFactory().createResponse(Response.OK, evt.getRequest()); | ||
| 153 | + SipFactory sipFactory = SipFactory.getInstance(); | ||
| 154 | + ContentTypeHeader contentTypeHeader = sipFactory.createHeaderFactory().createContentTypeHeader("APPLICATION", "SDP"); | ||
| 155 | + response.setContent(sdp, contentTypeHeader); | ||
| 156 | + | ||
| 157 | + SipURI sipURI = (SipURI)evt.getRequest().getRequestURI(); | ||
| 158 | + | ||
| 159 | + Address concatAddress = sipFactory.createAddressFactory().createAddress( | ||
| 160 | + sipFactory.createAddressFactory().createSipURI(sipURI.getUser(), sipURI.getHost()+":"+sipURI.getPort() | ||
| 161 | + )); | ||
| 162 | + response.addHeader(sipFactory.createHeaderFactory().createContactHeader(concatAddress)); | ||
| 163 | + getServerTransaction(evt).sendResponse(response); | ||
| 164 | + } | ||
| 165 | + | ||
| 166 | + public Element getRootElement(RequestEvent evt) throws DocumentException { | ||
| 167 | + return getRootElement(evt, "gb2312"); | ||
| 168 | + } | ||
| 169 | + public Element getRootElement(RequestEvent evt, String charset) throws DocumentException { | ||
| 170 | + if (charset == null) charset = "gb2312"; | ||
| 171 | + Request request = evt.getRequest(); | ||
| 172 | + SAXReader reader = new SAXReader(); | ||
| 173 | + reader.setEncoding(charset); | ||
| 174 | + Document xml = reader.read(new ByteArrayInputStream(request.getRawContent())); | ||
| 175 | + return xml.getRootElement(); | ||
| 176 | + } | ||
| 177 | + | ||
| 178 | +} |
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/AckRequestProcessor.java
| @@ -3,13 +3,15 @@ package com.genersoft.iot.vmp.gb28181.transmit.event.request.impl; | @@ -3,13 +3,15 @@ package com.genersoft.iot.vmp.gb28181.transmit.event.request.impl; | ||
| 3 | import com.genersoft.iot.vmp.common.StreamInfo; | 3 | import com.genersoft.iot.vmp.common.StreamInfo; |
| 4 | import com.genersoft.iot.vmp.gb28181.bean.SendRtpItem; | 4 | import com.genersoft.iot.vmp.gb28181.bean.SendRtpItem; |
| 5 | import com.genersoft.iot.vmp.gb28181.transmit.SIPProcessorObserver; | 5 | import com.genersoft.iot.vmp.gb28181.transmit.SIPProcessorObserver; |
| 6 | -import com.genersoft.iot.vmp.gb28181.transmit.event.request.SIPRequestProcessorAbstract; | 6 | +import com.genersoft.iot.vmp.gb28181.transmit.event.request.ISIPRequestProcessor; |
| 7 | +import com.genersoft.iot.vmp.gb28181.transmit.event.request.SIPRequestProcessorParent; | ||
| 7 | import com.genersoft.iot.vmp.media.zlm.ZLMRTPServerFactory; | 8 | import com.genersoft.iot.vmp.media.zlm.ZLMRTPServerFactory; |
| 8 | import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem; | 9 | import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem; |
| 9 | import com.genersoft.iot.vmp.service.IMediaServerService; | 10 | import com.genersoft.iot.vmp.service.IMediaServerService; |
| 10 | import com.genersoft.iot.vmp.storager.IRedisCatchStorage; | 11 | import com.genersoft.iot.vmp.storager.IRedisCatchStorage; |
| 11 | import org.slf4j.Logger; | 12 | import org.slf4j.Logger; |
| 12 | import org.slf4j.LoggerFactory; | 13 | import org.slf4j.LoggerFactory; |
| 14 | +import org.springframework.beans.factory.InitializingBean; | ||
| 13 | import org.springframework.beans.factory.annotation.Autowired; | 15 | import org.springframework.beans.factory.annotation.Autowired; |
| 14 | import org.springframework.stereotype.Component; | 16 | import org.springframework.stereotype.Component; |
| 15 | 17 | ||
| @@ -29,7 +31,7 @@ import java.util.Map; | @@ -29,7 +31,7 @@ import java.util.Map; | ||
| 29 | * @date: 2020年5月3日 下午5:31:45 | 31 | * @date: 2020年5月3日 下午5:31:45 |
| 30 | */ | 32 | */ |
| 31 | @Component | 33 | @Component |
| 32 | -public class AckRequestProcessor extends SIPRequestProcessorAbstract { | 34 | +public class AckRequestProcessor extends SIPRequestProcessorParent implements InitializingBean, ISIPRequestProcessor { |
| 33 | 35 | ||
| 34 | private Logger logger = LoggerFactory.getLogger(AckRequestProcessor.class); | 36 | private Logger logger = LoggerFactory.getLogger(AckRequestProcessor.class); |
| 35 | private String method = "ACK"; | 37 | private String method = "ACK"; |
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/ByeRequestProcessor.java
| @@ -5,7 +5,8 @@ import com.genersoft.iot.vmp.gb28181.bean.Device; | @@ -5,7 +5,8 @@ import com.genersoft.iot.vmp.gb28181.bean.Device; | ||
| 5 | import com.genersoft.iot.vmp.gb28181.bean.SendRtpItem; | 5 | import com.genersoft.iot.vmp.gb28181.bean.SendRtpItem; |
| 6 | import com.genersoft.iot.vmp.gb28181.transmit.SIPProcessorObserver; | 6 | import com.genersoft.iot.vmp.gb28181.transmit.SIPProcessorObserver; |
| 7 | import com.genersoft.iot.vmp.gb28181.transmit.cmd.ISIPCommander; | 7 | import com.genersoft.iot.vmp.gb28181.transmit.cmd.ISIPCommander; |
| 8 | -import com.genersoft.iot.vmp.gb28181.transmit.event.request.SIPRequestProcessorAbstract; | 8 | +import com.genersoft.iot.vmp.gb28181.transmit.event.request.ISIPRequestProcessor; |
| 9 | +import com.genersoft.iot.vmp.gb28181.transmit.event.request.SIPRequestProcessorParent; | ||
| 9 | import com.genersoft.iot.vmp.media.zlm.ZLMRTPServerFactory; | 10 | import com.genersoft.iot.vmp.media.zlm.ZLMRTPServerFactory; |
| 10 | import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem; | 11 | import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem; |
| 11 | import com.genersoft.iot.vmp.service.IMediaServerService; | 12 | import com.genersoft.iot.vmp.service.IMediaServerService; |
| @@ -13,6 +14,7 @@ import com.genersoft.iot.vmp.storager.IRedisCatchStorage; | @@ -13,6 +14,7 @@ import com.genersoft.iot.vmp.storager.IRedisCatchStorage; | ||
| 13 | import com.genersoft.iot.vmp.storager.IVideoManagerStorager; | 14 | import com.genersoft.iot.vmp.storager.IVideoManagerStorager; |
| 14 | import org.slf4j.Logger; | 15 | import org.slf4j.Logger; |
| 15 | import org.slf4j.LoggerFactory; | 16 | import org.slf4j.LoggerFactory; |
| 17 | +import org.springframework.beans.factory.InitializingBean; | ||
| 16 | import org.springframework.beans.factory.annotation.Autowired; | 18 | import org.springframework.beans.factory.annotation.Autowired; |
| 17 | import org.springframework.stereotype.Component; | 19 | import org.springframework.stereotype.Component; |
| 18 | 20 | ||
| @@ -32,7 +34,7 @@ import java.util.Map; | @@ -32,7 +34,7 @@ import java.util.Map; | ||
| 32 | * @date: 2021年3月9日 | 34 | * @date: 2021年3月9日 |
| 33 | */ | 35 | */ |
| 34 | @Component | 36 | @Component |
| 35 | -public class ByeRequestProcessor extends SIPRequestProcessorAbstract { | 37 | +public class ByeRequestProcessor extends SIPRequestProcessorParent implements InitializingBean, ISIPRequestProcessor { |
| 36 | 38 | ||
| 37 | private Logger logger = LoggerFactory.getLogger(ByeRequestProcessor.class); | 39 | private Logger logger = LoggerFactory.getLogger(ByeRequestProcessor.class); |
| 38 | 40 |
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/CancelRequestProcessor.java
| 1 | package com.genersoft.iot.vmp.gb28181.transmit.event.request.impl; | 1 | package com.genersoft.iot.vmp.gb28181.transmit.event.request.impl; |
| 2 | 2 | ||
| 3 | import com.genersoft.iot.vmp.gb28181.transmit.SIPProcessorObserver; | 3 | import com.genersoft.iot.vmp.gb28181.transmit.SIPProcessorObserver; |
| 4 | -import com.genersoft.iot.vmp.gb28181.transmit.event.request.SIPRequestProcessorAbstract; | 4 | +import com.genersoft.iot.vmp.gb28181.transmit.event.request.ISIPRequestProcessor; |
| 5 | +import com.genersoft.iot.vmp.gb28181.transmit.event.request.SIPRequestProcessorParent; | ||
| 6 | +import org.springframework.beans.factory.InitializingBean; | ||
| 5 | import org.springframework.beans.factory.annotation.Autowired; | 7 | import org.springframework.beans.factory.annotation.Autowired; |
| 6 | import org.springframework.stereotype.Component; | 8 | import org.springframework.stereotype.Component; |
| 7 | 9 | ||
| @@ -13,7 +15,7 @@ import javax.sip.RequestEvent; | @@ -13,7 +15,7 @@ import javax.sip.RequestEvent; | ||
| 13 | * @date: 2020年5月3日 下午5:32:23 | 15 | * @date: 2020年5月3日 下午5:32:23 |
| 14 | */ | 16 | */ |
| 15 | @Component | 17 | @Component |
| 16 | -public class CancelRequestProcessor extends SIPRequestProcessorAbstract { | 18 | +public class CancelRequestProcessor extends SIPRequestProcessorParent implements InitializingBean, ISIPRequestProcessor { |
| 17 | 19 | ||
| 18 | private String method = "CANCEL"; | 20 | private String method = "CANCEL"; |
| 19 | 21 |
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/InviteRequestProcessor.java
| @@ -4,7 +4,8 @@ import com.genersoft.iot.vmp.gb28181.bean.*; | @@ -4,7 +4,8 @@ import com.genersoft.iot.vmp.gb28181.bean.*; | ||
| 4 | import com.genersoft.iot.vmp.gb28181.transmit.SIPProcessorObserver; | 4 | import com.genersoft.iot.vmp.gb28181.transmit.SIPProcessorObserver; |
| 5 | import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommander; | 5 | import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommander; |
| 6 | import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommanderFroPlatform; | 6 | import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommanderFroPlatform; |
| 7 | -import com.genersoft.iot.vmp.gb28181.transmit.event.request.SIPRequestProcessorAbstract; | 7 | +import com.genersoft.iot.vmp.gb28181.transmit.event.request.ISIPRequestProcessor; |
| 8 | +import com.genersoft.iot.vmp.gb28181.transmit.event.request.SIPRequestProcessorParent; | ||
| 8 | import com.genersoft.iot.vmp.media.zlm.ZLMRTPServerFactory; | 9 | import com.genersoft.iot.vmp.media.zlm.ZLMRTPServerFactory; |
| 9 | import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem; | 10 | import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem; |
| 10 | import com.genersoft.iot.vmp.service.IMediaServerService; | 11 | import com.genersoft.iot.vmp.service.IMediaServerService; |
| @@ -16,6 +17,7 @@ import gov.nist.javax.sip.address.AddressImpl; | @@ -16,6 +17,7 @@ import gov.nist.javax.sip.address.AddressImpl; | ||
| 16 | import gov.nist.javax.sip.address.SipUri; | 17 | import gov.nist.javax.sip.address.SipUri; |
| 17 | import org.slf4j.Logger; | 18 | import org.slf4j.Logger; |
| 18 | import org.slf4j.LoggerFactory; | 19 | import org.slf4j.LoggerFactory; |
| 20 | +import org.springframework.beans.factory.InitializingBean; | ||
| 19 | import org.springframework.beans.factory.annotation.Autowired; | 21 | import org.springframework.beans.factory.annotation.Autowired; |
| 20 | import org.springframework.stereotype.Component; | 22 | import org.springframework.stereotype.Component; |
| 21 | 23 | ||
| @@ -38,7 +40,7 @@ import java.util.Vector; | @@ -38,7 +40,7 @@ import java.util.Vector; | ||
| 38 | */ | 40 | */ |
| 39 | @SuppressWarnings("rawtypes") | 41 | @SuppressWarnings("rawtypes") |
| 40 | @Component | 42 | @Component |
| 41 | -public class InviteRequestProcessor extends SIPRequestProcessorAbstract { | 43 | +public class InviteRequestProcessor extends SIPRequestProcessorParent implements InitializingBean, ISIPRequestProcessor { |
| 42 | 44 | ||
| 43 | private final static Logger logger = LoggerFactory.getLogger(InviteRequestProcessor.class); | 45 | private final static Logger logger = LoggerFactory.getLogger(InviteRequestProcessor.class); |
| 44 | 46 |
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/MessageRequestProcessor.java renamed to src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/MessageRequestProcessor1.java
| @@ -15,7 +15,8 @@ import com.genersoft.iot.vmp.gb28181.transmit.callback.DeferredResultHolder; | @@ -15,7 +15,8 @@ import com.genersoft.iot.vmp.gb28181.transmit.callback.DeferredResultHolder; | ||
| 15 | import com.genersoft.iot.vmp.gb28181.transmit.callback.RequestMessage; | 15 | import com.genersoft.iot.vmp.gb28181.transmit.callback.RequestMessage; |
| 16 | import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommander; | 16 | import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommander; |
| 17 | import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommanderFroPlatform; | 17 | import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommanderFroPlatform; |
| 18 | -import com.genersoft.iot.vmp.gb28181.transmit.event.request.SIPRequestProcessorAbstract; | 18 | +import com.genersoft.iot.vmp.gb28181.transmit.event.request.ISIPRequestProcessor; |
| 19 | +import com.genersoft.iot.vmp.gb28181.transmit.event.request.SIPRequestProcessorParent; | ||
| 19 | import com.genersoft.iot.vmp.gb28181.utils.DateUtil; | 20 | import com.genersoft.iot.vmp.gb28181.utils.DateUtil; |
| 20 | import com.genersoft.iot.vmp.gb28181.utils.NumericUtil; | 21 | import com.genersoft.iot.vmp.gb28181.utils.NumericUtil; |
| 21 | import com.genersoft.iot.vmp.gb28181.utils.SipUtils; | 22 | import com.genersoft.iot.vmp.gb28181.utils.SipUtils; |
| @@ -33,6 +34,7 @@ import org.dom4j.DocumentException; | @@ -33,6 +34,7 @@ import org.dom4j.DocumentException; | ||
| 33 | import org.dom4j.Element; | 34 | import org.dom4j.Element; |
| 34 | import org.slf4j.Logger; | 35 | import org.slf4j.Logger; |
| 35 | import org.slf4j.LoggerFactory; | 36 | import org.slf4j.LoggerFactory; |
| 37 | +import org.springframework.beans.factory.InitializingBean; | ||
| 36 | import org.springframework.beans.factory.annotation.Autowired; | 38 | import org.springframework.beans.factory.annotation.Autowired; |
| 37 | import org.springframework.stereotype.Component; | 39 | import org.springframework.stereotype.Component; |
| 38 | import org.springframework.util.StringUtils; | 40 | import org.springframework.util.StringUtils; |
| @@ -44,24 +46,24 @@ import javax.sip.header.HeaderAddress; | @@ -44,24 +46,24 @@ import javax.sip.header.HeaderAddress; | ||
| 44 | import javax.sip.header.ToHeader; | 46 | import javax.sip.header.ToHeader; |
| 45 | import javax.sip.message.Response; | 47 | import javax.sip.message.Response; |
| 46 | import java.text.ParseException; | 48 | import java.text.ParseException; |
| 47 | -import java.util.ArrayList; | ||
| 48 | -import java.util.Iterator; | ||
| 49 | -import java.util.List; | ||
| 50 | -import java.util.UUID; | 49 | +import java.util.*; |
| 50 | +import java.util.concurrent.ConcurrentHashMap; | ||
| 51 | 51 | ||
| 52 | import static com.genersoft.iot.vmp.gb28181.utils.XmlUtil.getText; | 52 | import static com.genersoft.iot.vmp.gb28181.utils.XmlUtil.getText; |
| 53 | 53 | ||
| 54 | /** | 54 | /** |
| 55 | - * @description:MESSAGE请求处理器 | ||
| 56 | - * @author: swwheihei | ||
| 57 | - * @date: 2020年5月3日 下午5:32:41 | 55 | + * @description: MESSAGE请求分发处理器, |
| 56 | + * @author: panlinlin | ||
| 57 | + * @date: 2021年11月8日 10:28 | ||
| 58 | */ | 58 | */ |
| 59 | @SuppressWarnings(value={"unchecked", "rawtypes"}) | 59 | @SuppressWarnings(value={"unchecked", "rawtypes"}) |
| 60 | @Component | 60 | @Component |
| 61 | -public class MessageRequestProcessor extends SIPRequestProcessorAbstract { | 61 | +public class MessageRequestProcessor1 extends SIPRequestProcessorParent implements InitializingBean, ISIPRequestProcessor { |
| 62 | 62 | ||
| 63 | public static volatile List<String> threadNameList = new ArrayList(); | 63 | public static volatile List<String> threadNameList = new ArrayList(); |
| 64 | - private final static Logger logger = LoggerFactory.getLogger(MessageRequestProcessor.class); | 64 | + private final static Logger logger = LoggerFactory.getLogger(MessageRequestProcessor1.class); |
| 65 | + private static Map<String, ISIPRequestProcessor> messageHandlerMap = new ConcurrentHashMap<>(); | ||
| 66 | + | ||
| 65 | 67 | ||
| 66 | private final static String CACHE_RECORDINFO_KEY = "CACHE_RECORDINFO_"; | 68 | private final static String CACHE_RECORDINFO_KEY = "CACHE_RECORDINFO_"; |
| 67 | private static final String MESSAGE_KEEP_ALIVE = "Keepalive"; | 69 | private static final String MESSAGE_KEEP_ALIVE = "Keepalive"; |
| @@ -77,7 +79,7 @@ public class MessageRequestProcessor extends SIPRequestProcessorAbstract { | @@ -77,7 +79,7 @@ public class MessageRequestProcessor extends SIPRequestProcessorAbstract { | ||
| 77 | private static final String MESSAGE_DEVICE_CONFIG = "DeviceConfig"; | 79 | private static final String MESSAGE_DEVICE_CONFIG = "DeviceConfig"; |
| 78 | private static final String MESSAGE_MOBILE_POSITION = "MobilePosition"; | 80 | private static final String MESSAGE_MOBILE_POSITION = "MobilePosition"; |
| 79 | private static final String MESSAGE_PRESET_QUERY = "PresetQuery"; | 81 | private static final String MESSAGE_PRESET_QUERY = "PresetQuery"; |
| 80 | - private String method = "MESSAGE"; | 82 | + private String method = "MESSAGE1111"; |
| 81 | 83 | ||
| 82 | @Autowired | 84 | @Autowired |
| 83 | private UserSetup userSetup; | 85 | private UserSetup userSetup; |
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/NotifyRequestProcessor.java
| @@ -8,7 +8,8 @@ import com.genersoft.iot.vmp.gb28181.event.EventPublisher; | @@ -8,7 +8,8 @@ import com.genersoft.iot.vmp.gb28181.event.EventPublisher; | ||
| 8 | import com.genersoft.iot.vmp.gb28181.transmit.SIPProcessorObserver; | 8 | import com.genersoft.iot.vmp.gb28181.transmit.SIPProcessorObserver; |
| 9 | import com.genersoft.iot.vmp.gb28181.transmit.callback.DeferredResultHolder; | 9 | import com.genersoft.iot.vmp.gb28181.transmit.callback.DeferredResultHolder; |
| 10 | import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommander; | 10 | import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommander; |
| 11 | -import com.genersoft.iot.vmp.gb28181.transmit.event.request.SIPRequestProcessorAbstract; | 11 | +import com.genersoft.iot.vmp.gb28181.transmit.event.request.ISIPRequestProcessor; |
| 12 | +import com.genersoft.iot.vmp.gb28181.transmit.event.request.SIPRequestProcessorParent; | ||
| 12 | import com.genersoft.iot.vmp.gb28181.utils.NumericUtil; | 13 | import com.genersoft.iot.vmp.gb28181.utils.NumericUtil; |
| 13 | import com.genersoft.iot.vmp.gb28181.utils.SipUtils; | 14 | import com.genersoft.iot.vmp.gb28181.utils.SipUtils; |
| 14 | import com.genersoft.iot.vmp.gb28181.utils.XmlUtil; | 15 | import com.genersoft.iot.vmp.gb28181.utils.XmlUtil; |
| @@ -20,6 +21,7 @@ import org.dom4j.DocumentException; | @@ -20,6 +21,7 @@ import org.dom4j.DocumentException; | ||
| 20 | import org.dom4j.Element; | 21 | import org.dom4j.Element; |
| 21 | import org.slf4j.Logger; | 22 | import org.slf4j.Logger; |
| 22 | import org.slf4j.LoggerFactory; | 23 | import org.slf4j.LoggerFactory; |
| 24 | +import org.springframework.beans.factory.InitializingBean; | ||
| 23 | import org.springframework.beans.factory.annotation.Autowired; | 25 | import org.springframework.beans.factory.annotation.Autowired; |
| 24 | import org.springframework.stereotype.Component; | 26 | import org.springframework.stereotype.Component; |
| 25 | import org.springframework.util.StringUtils; | 27 | import org.springframework.util.StringUtils; |
| @@ -38,7 +40,7 @@ import java.util.Iterator; | @@ -38,7 +40,7 @@ import java.util.Iterator; | ||
| 38 | * @date: 2021年1月27日 | 40 | * @date: 2021年1月27日 |
| 39 | */ | 41 | */ |
| 40 | @Component | 42 | @Component |
| 41 | -public class NotifyRequestProcessor extends SIPRequestProcessorAbstract { | 43 | +public class NotifyRequestProcessor extends SIPRequestProcessorParent implements InitializingBean, ISIPRequestProcessor { |
| 42 | 44 | ||
| 43 | 45 | ||
| 44 | private final static Logger logger = LoggerFactory.getLogger(NotifyRequestProcessor.class); | 46 | private final static Logger logger = LoggerFactory.getLogger(NotifyRequestProcessor.class); |
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/RegisterRequestProcessor.java
| @@ -8,7 +8,8 @@ import com.genersoft.iot.vmp.gb28181.bean.Device; | @@ -8,7 +8,8 @@ import com.genersoft.iot.vmp.gb28181.bean.Device; | ||
| 8 | import com.genersoft.iot.vmp.gb28181.bean.WvpSipDate; | 8 | import com.genersoft.iot.vmp.gb28181.bean.WvpSipDate; |
| 9 | import com.genersoft.iot.vmp.gb28181.event.EventPublisher; | 9 | import com.genersoft.iot.vmp.gb28181.event.EventPublisher; |
| 10 | import com.genersoft.iot.vmp.gb28181.transmit.SIPProcessorObserver; | 10 | import com.genersoft.iot.vmp.gb28181.transmit.SIPProcessorObserver; |
| 11 | -import com.genersoft.iot.vmp.gb28181.transmit.event.request.SIPRequestProcessorAbstract; | 11 | +import com.genersoft.iot.vmp.gb28181.transmit.event.request.ISIPRequestProcessor; |
| 12 | +import com.genersoft.iot.vmp.gb28181.transmit.event.request.SIPRequestProcessorParent; | ||
| 12 | import com.genersoft.iot.vmp.storager.IVideoManagerStorager; | 13 | import com.genersoft.iot.vmp.storager.IVideoManagerStorager; |
| 13 | import gov.nist.javax.sip.RequestEventExt; | 14 | import gov.nist.javax.sip.RequestEventExt; |
| 14 | import gov.nist.javax.sip.address.AddressImpl; | 15 | import gov.nist.javax.sip.address.AddressImpl; |
| @@ -17,6 +18,7 @@ import gov.nist.javax.sip.header.Expires; | @@ -17,6 +18,7 @@ import gov.nist.javax.sip.header.Expires; | ||
| 17 | import gov.nist.javax.sip.header.SIPDateHeader; | 18 | import gov.nist.javax.sip.header.SIPDateHeader; |
| 18 | import org.slf4j.Logger; | 19 | import org.slf4j.Logger; |
| 19 | import org.slf4j.LoggerFactory; | 20 | import org.slf4j.LoggerFactory; |
| 21 | +import org.springframework.beans.factory.InitializingBean; | ||
| 20 | import org.springframework.beans.factory.annotation.Autowired; | 22 | import org.springframework.beans.factory.annotation.Autowired; |
| 21 | import org.springframework.stereotype.Component; | 23 | import org.springframework.stereotype.Component; |
| 22 | import org.springframework.util.StringUtils; | 24 | import org.springframework.util.StringUtils; |
| @@ -39,7 +41,7 @@ import java.util.Locale; | @@ -39,7 +41,7 @@ import java.util.Locale; | ||
| 39 | * @date: 2020年5月3日 下午4:47:25 | 41 | * @date: 2020年5月3日 下午4:47:25 |
| 40 | */ | 42 | */ |
| 41 | @Component | 43 | @Component |
| 42 | -public class RegisterRequestProcessor extends SIPRequestProcessorAbstract { | 44 | +public class RegisterRequestProcessor extends SIPRequestProcessorParent implements InitializingBean, ISIPRequestProcessor { |
| 43 | 45 | ||
| 44 | private Logger logger = LoggerFactory.getLogger(RegisterRequestProcessor.class); | 46 | private Logger logger = LoggerFactory.getLogger(RegisterRequestProcessor.class); |
| 45 | 47 |
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/SubscribeRequestProcessor.java
| 1 | package com.genersoft.iot.vmp.gb28181.transmit.event.request.impl; | 1 | package com.genersoft.iot.vmp.gb28181.transmit.event.request.impl; |
| 2 | 2 | ||
| 3 | import com.genersoft.iot.vmp.gb28181.transmit.SIPProcessorObserver; | 3 | import com.genersoft.iot.vmp.gb28181.transmit.SIPProcessorObserver; |
| 4 | -import com.genersoft.iot.vmp.gb28181.transmit.event.request.SIPRequestProcessorAbstract; | 4 | +import com.genersoft.iot.vmp.gb28181.transmit.event.request.ISIPRequestProcessor; |
| 5 | +import com.genersoft.iot.vmp.gb28181.transmit.event.request.SIPRequestProcessorParent; | ||
| 5 | import org.slf4j.Logger; | 6 | import org.slf4j.Logger; |
| 6 | import org.slf4j.LoggerFactory; | 7 | import org.slf4j.LoggerFactory; |
| 8 | +import org.springframework.beans.factory.InitializingBean; | ||
| 7 | import org.springframework.beans.factory.annotation.Autowired; | 9 | import org.springframework.beans.factory.annotation.Autowired; |
| 8 | import org.springframework.stereotype.Component; | 10 | import org.springframework.stereotype.Component; |
| 9 | 11 | ||
| @@ -22,7 +24,7 @@ import java.text.ParseException; | @@ -22,7 +24,7 @@ import java.text.ParseException; | ||
| 22 | * @date: 2020年5月3日 下午5:31:20 | 24 | * @date: 2020年5月3日 下午5:31:20 |
| 23 | */ | 25 | */ |
| 24 | @Component | 26 | @Component |
| 25 | -public class SubscribeRequestProcessor extends SIPRequestProcessorAbstract { | 27 | +public class SubscribeRequestProcessor extends SIPRequestProcessorParent implements InitializingBean, ISIPRequestProcessor { |
| 26 | 28 | ||
| 27 | private Logger logger = LoggerFactory.getLogger(SubscribeRequestProcessor.class); | 29 | private Logger logger = LoggerFactory.getLogger(SubscribeRequestProcessor.class); |
| 28 | private String method = "SUBSCRIBE"; | 30 | private String method = "SUBSCRIBE"; |
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/IMessageHandler.java
0 → 100644
| 1 | +package com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message; | ||
| 2 | + | ||
| 3 | +import com.genersoft.iot.vmp.gb28181.bean.Device; | ||
| 4 | +import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform; | ||
| 5 | +import org.dom4j.Element; | ||
| 6 | + | ||
| 7 | +import javax.sip.RequestEvent; | ||
| 8 | + | ||
| 9 | +public interface IMessageHandler { | ||
| 10 | + /** | ||
| 11 | + * 处理来自设备的信息 | ||
| 12 | + * @param evt | ||
| 13 | + * @param device | ||
| 14 | + */ | ||
| 15 | + void handForDevice(RequestEvent evt, Device device, Element element); | ||
| 16 | + | ||
| 17 | + /** | ||
| 18 | + * 处理来自平台的信息 | ||
| 19 | + * @param evt | ||
| 20 | + * @param parentPlatform | ||
| 21 | + */ | ||
| 22 | + void handForPlatform(RequestEvent evt, ParentPlatform parentPlatform, Element element); | ||
| 23 | +} |
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/MessageHandlerAbstract.java
0 → 100644
| 1 | +package com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message; | ||
| 2 | + | ||
| 3 | +import com.genersoft.iot.vmp.gb28181.bean.Device; | ||
| 4 | +import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform; | ||
| 5 | +import com.genersoft.iot.vmp.gb28181.transmit.event.request.SIPRequestProcessorParent; | ||
| 6 | +import org.dom4j.Element; | ||
| 7 | +import org.springframework.beans.factory.annotation.Autowired; | ||
| 8 | + | ||
| 9 | +import javax.sip.RequestEvent; | ||
| 10 | +import java.util.Map; | ||
| 11 | +import java.util.concurrent.ConcurrentHashMap; | ||
| 12 | + | ||
| 13 | +import static com.genersoft.iot.vmp.gb28181.utils.XmlUtil.getText; | ||
| 14 | + | ||
| 15 | +public abstract class MessageHandlerAbstract extends SIPRequestProcessorParent implements IMessageHandler{ | ||
| 16 | + | ||
| 17 | + public static Map<String, IMessageHandler> messageHandlerMap = new ConcurrentHashMap<>(); | ||
| 18 | + | ||
| 19 | + @Autowired | ||
| 20 | + public MessageRequestProcessor messageRequestProcessor; | ||
| 21 | + | ||
| 22 | + public void addHandler(String cmdType, IMessageHandler messageHandler) { | ||
| 23 | + messageHandlerMap.put(cmdType, messageHandler); | ||
| 24 | + } | ||
| 25 | + | ||
| 26 | + @Override | ||
| 27 | + public void handForDevice(RequestEvent evt, Device device, Element element) { | ||
| 28 | + String cmd = getText(element, "CmdType"); | ||
| 29 | + IMessageHandler messageHandler = messageHandlerMap.get(cmd); | ||
| 30 | + if (messageHandler != null) { | ||
| 31 | + messageHandler.handForDevice(evt, device, element); | ||
| 32 | + } | ||
| 33 | + } | ||
| 34 | + | ||
| 35 | + @Override | ||
| 36 | + public void handForPlatform(RequestEvent evt, ParentPlatform parentPlatform, Element element) { | ||
| 37 | + String cmd = getText(element, "CmdType"); | ||
| 38 | + IMessageHandler messageHandler = messageHandlerMap.get(cmd); | ||
| 39 | + if (messageHandler != null) { | ||
| 40 | + messageHandler.handForPlatform(evt, parentPlatform, element); | ||
| 41 | + } | ||
| 42 | + } | ||
| 43 | +} |
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/MessageRequestProcessor.java
0 → 100644
| 1 | +package com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message; | ||
| 2 | + | ||
| 3 | +import com.genersoft.iot.vmp.gb28181.bean.Device; | ||
| 4 | +import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform; | ||
| 5 | +import com.genersoft.iot.vmp.gb28181.transmit.SIPProcessorObserver; | ||
| 6 | +import com.genersoft.iot.vmp.gb28181.transmit.event.request.ISIPRequestProcessor; | ||
| 7 | +import com.genersoft.iot.vmp.gb28181.transmit.event.request.SIPRequestProcessorParent; | ||
| 8 | +import com.genersoft.iot.vmp.gb28181.utils.SipUtils; | ||
| 9 | +import com.genersoft.iot.vmp.storager.IVideoManagerStorager; | ||
| 10 | +import org.dom4j.DocumentException; | ||
| 11 | +import org.dom4j.Element; | ||
| 12 | +import org.slf4j.Logger; | ||
| 13 | +import org.slf4j.LoggerFactory; | ||
| 14 | +import org.springframework.beans.factory.InitializingBean; | ||
| 15 | +import org.springframework.beans.factory.annotation.Autowired; | ||
| 16 | +import org.springframework.stereotype.Component; | ||
| 17 | + | ||
| 18 | +import javax.sip.InvalidArgumentException; | ||
| 19 | +import javax.sip.RequestEvent; | ||
| 20 | +import javax.sip.SipException; | ||
| 21 | +import javax.sip.message.Response; | ||
| 22 | +import java.text.ParseException; | ||
| 23 | +import java.util.Map; | ||
| 24 | +import java.util.concurrent.ConcurrentHashMap; | ||
| 25 | + | ||
| 26 | +@Component | ||
| 27 | +public class MessageRequestProcessor extends SIPRequestProcessorParent implements InitializingBean, ISIPRequestProcessor { | ||
| 28 | + | ||
| 29 | + private final static Logger logger = LoggerFactory.getLogger(MessageRequestProcessor.class); | ||
| 30 | + | ||
| 31 | + private final String method = "MESSAGE"; | ||
| 32 | + | ||
| 33 | + private static Map<String, IMessageHandler> messageHandlerMap = new ConcurrentHashMap<>(); | ||
| 34 | + | ||
| 35 | + @Autowired | ||
| 36 | + private SIPProcessorObserver sipProcessorObserver; | ||
| 37 | + | ||
| 38 | + @Autowired | ||
| 39 | + private IVideoManagerStorager storage; | ||
| 40 | + | ||
| 41 | + @Override | ||
| 42 | + public void afterPropertiesSet() throws Exception { | ||
| 43 | + // 添加消息处理的订阅 | ||
| 44 | + sipProcessorObserver.addRequestProcessor(method, this); | ||
| 45 | + } | ||
| 46 | + | ||
| 47 | + public void addHandler(String name, IMessageHandler handler) { | ||
| 48 | + messageHandlerMap.put(name, handler); | ||
| 49 | + } | ||
| 50 | + | ||
| 51 | + @Override | ||
| 52 | + public void process(RequestEvent evt) { | ||
| 53 | + logger.debug("接收到消息:" + evt.getRequest()); | ||
| 54 | + String deviceId = SipUtils.getUserIdFromFromHeader(evt.getRequest()); | ||
| 55 | + // 查询设备是否存在 | ||
| 56 | + Device device = storage.queryVideoDevice(deviceId); | ||
| 57 | + // 查询上级平台是否存在 | ||
| 58 | + ParentPlatform parentPlatform = storage.queryParentPlatByServerGBId(deviceId); | ||
| 59 | + try { | ||
| 60 | + if (device == null && parentPlatform == null) { | ||
| 61 | + // 不存在则回复404 | ||
| 62 | + responseAck(evt, Response.NOT_FOUND, "device id not found"); | ||
| 63 | + }else { | ||
| 64 | + Element rootElement = getRootElement(evt); | ||
| 65 | + String name = rootElement.getName(); | ||
| 66 | + IMessageHandler messageHandler = messageHandlerMap.get(name); | ||
| 67 | + if (messageHandler != null) { | ||
| 68 | + if (device != null) { | ||
| 69 | + messageHandler.handForDevice(evt, device, rootElement); | ||
| 70 | + }else { // 由于上面已经判断都为null则直接返回,所以这里device和parentPlatform必有一个不为null | ||
| 71 | + messageHandler.handForPlatform(evt, parentPlatform, rootElement); | ||
| 72 | + } | ||
| 73 | + }else { | ||
| 74 | + // 不支持的message | ||
| 75 | + // 不存在则回复415 | ||
| 76 | + responseAck(evt, Response.UNSUPPORTED_MEDIA_TYPE, "Unsupported message type, must Control/Notify/Query/Response"); | ||
| 77 | + } | ||
| 78 | + } | ||
| 79 | + } catch (SipException e) { | ||
| 80 | + logger.warn("SIP 回复错误", e); | ||
| 81 | + } catch (InvalidArgumentException e) { | ||
| 82 | + logger.warn("参数无效", e); | ||
| 83 | + } catch (ParseException e) { | ||
| 84 | + logger.warn("SIP回复时解析异常", e); | ||
| 85 | + } catch (DocumentException e) { | ||
| 86 | + logger.warn("解析XML消息内容异常", e); | ||
| 87 | + } | ||
| 88 | + } | ||
| 89 | + | ||
| 90 | + | ||
| 91 | +} |
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/control/ControlMessageHandler.java
0 → 100644
| 1 | +package com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.control; | ||
| 2 | + | ||
| 3 | +import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.MessageHandlerAbstract; | ||
| 4 | +import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.MessageRequestProcessor; | ||
| 5 | +import org.springframework.beans.factory.InitializingBean; | ||
| 6 | +import org.springframework.beans.factory.annotation.Autowired; | ||
| 7 | +import org.springframework.stereotype.Component; | ||
| 8 | + | ||
| 9 | +@Component | ||
| 10 | +public class ControlMessageHandler extends MessageHandlerAbstract implements InitializingBean { | ||
| 11 | + | ||
| 12 | + private final String messageType = "Control"; | ||
| 13 | + | ||
| 14 | + @Autowired | ||
| 15 | + private MessageRequestProcessor messageRequestProcessor; | ||
| 16 | + | ||
| 17 | + @Override | ||
| 18 | + public void afterPropertiesSet() throws Exception { | ||
| 19 | + messageRequestProcessor.addHandler(messageType, this); | ||
| 20 | + } | ||
| 21 | +} |
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/notify/NotifyMessageHandler.java
0 → 100644
| 1 | +package com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.notify; | ||
| 2 | + | ||
| 3 | +import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.MessageHandlerAbstract; | ||
| 4 | +import org.springframework.beans.factory.InitializingBean; | ||
| 5 | +import org.springframework.stereotype.Component; | ||
| 6 | + | ||
| 7 | +@Component | ||
| 8 | +public class NotifyMessageHandler extends MessageHandlerAbstract implements InitializingBean { | ||
| 9 | + | ||
| 10 | + private final String messageType = "Notify"; | ||
| 11 | + | ||
| 12 | + @Override | ||
| 13 | + public void afterPropertiesSet() throws Exception { | ||
| 14 | + messageRequestProcessor.addHandler(messageType, this); | ||
| 15 | + } | ||
| 16 | +} |
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/notify/cmd/AlarmMessageHandler.java
0 → 100644
| 1 | +package com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.notify.cmd; | ||
| 2 | + | ||
| 3 | +import com.genersoft.iot.vmp.conf.UserSetup; | ||
| 4 | +import com.genersoft.iot.vmp.gb28181.bean.*; | ||
| 5 | +import com.genersoft.iot.vmp.gb28181.event.DeviceOffLineDetector; | ||
| 6 | +import com.genersoft.iot.vmp.gb28181.event.EventPublisher; | ||
| 7 | +import com.genersoft.iot.vmp.gb28181.transmit.event.request.SIPRequestProcessorParent; | ||
| 8 | +import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.IMessageHandler; | ||
| 9 | +import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.notify.NotifyMessageHandler; | ||
| 10 | +import com.genersoft.iot.vmp.gb28181.utils.NumericUtil; | ||
| 11 | +import com.genersoft.iot.vmp.service.IDeviceAlarmService; | ||
| 12 | +import com.genersoft.iot.vmp.storager.IVideoManagerStorager; | ||
| 13 | +import com.genersoft.iot.vmp.utils.GpsUtil; | ||
| 14 | +import org.dom4j.Element; | ||
| 15 | +import org.slf4j.Logger; | ||
| 16 | +import org.slf4j.LoggerFactory; | ||
| 17 | +import org.springframework.beans.factory.InitializingBean; | ||
| 18 | +import org.springframework.beans.factory.annotation.Autowired; | ||
| 19 | +import org.springframework.util.StringUtils; | ||
| 20 | + | ||
| 21 | +import javax.sip.RequestEvent; | ||
| 22 | + | ||
| 23 | +import static com.genersoft.iot.vmp.gb28181.utils.XmlUtil.getText; | ||
| 24 | + | ||
| 25 | +public class AlarmMessageHandler extends SIPRequestProcessorParent implements InitializingBean, IMessageHandler { | ||
| 26 | + | ||
| 27 | + private Logger logger = LoggerFactory.getLogger(AlarmMessageHandler.class); | ||
| 28 | + private final String cmdType = "Alarm"; | ||
| 29 | + | ||
| 30 | + @Autowired | ||
| 31 | + private NotifyMessageHandler notifyMessageHandler; | ||
| 32 | + | ||
| 33 | + @Autowired | ||
| 34 | + private EventPublisher publisher; | ||
| 35 | + | ||
| 36 | + @Autowired | ||
| 37 | + private UserSetup userSetup; | ||
| 38 | + | ||
| 39 | + @Autowired | ||
| 40 | + private IVideoManagerStorager storager; | ||
| 41 | + | ||
| 42 | + @Autowired | ||
| 43 | + private IDeviceAlarmService deviceAlarmService; | ||
| 44 | + | ||
| 45 | + @Autowired | ||
| 46 | + private DeviceOffLineDetector offLineDetector; | ||
| 47 | + | ||
| 48 | + @Override | ||
| 49 | + public void afterPropertiesSet() throws Exception { | ||
| 50 | + notifyMessageHandler.addHandler(cmdType, this); | ||
| 51 | + } | ||
| 52 | + | ||
| 53 | + @Override | ||
| 54 | + public void handForDevice(RequestEvent evt, Device device, Element rootElement) { | ||
| 55 | + Element deviceIdElement = rootElement.element("DeviceID"); | ||
| 56 | + String channelId = deviceIdElement.getText().toString(); | ||
| 57 | + DeviceAlarm deviceAlarm = new DeviceAlarm(); | ||
| 58 | + deviceAlarm.setDeviceId(device.getDeviceId()); | ||
| 59 | + deviceAlarm.setChannelId(channelId); | ||
| 60 | + deviceAlarm.setAlarmPriority(getText(rootElement, "AlarmPriority")); | ||
| 61 | + deviceAlarm.setAlarmMethod(getText(rootElement, "AlarmMethod")); | ||
| 62 | + deviceAlarm.setAlarmTime(getText(rootElement, "AlarmTime")); | ||
| 63 | + if (getText(rootElement, "AlarmDescription") == null) { | ||
| 64 | + deviceAlarm.setAlarmDescription(""); | ||
| 65 | + } else { | ||
| 66 | + deviceAlarm.setAlarmDescription(getText(rootElement, "AlarmDescription")); | ||
| 67 | + } | ||
| 68 | + if (NumericUtil.isDouble(getText(rootElement, "Longitude"))) { | ||
| 69 | + deviceAlarm.setLongitude(Double.parseDouble(getText(rootElement, "Longitude"))); | ||
| 70 | + } else { | ||
| 71 | + deviceAlarm.setLongitude(0.00); | ||
| 72 | + } | ||
| 73 | + if (NumericUtil.isDouble(getText(rootElement, "Latitude"))) { | ||
| 74 | + deviceAlarm.setLatitude(Double.parseDouble(getText(rootElement, "Latitude"))); | ||
| 75 | + } else { | ||
| 76 | + deviceAlarm.setLatitude(0.00); | ||
| 77 | + } | ||
| 78 | + | ||
| 79 | + if (!StringUtils.isEmpty(deviceAlarm.getAlarmMethod())) { | ||
| 80 | + if ( deviceAlarm.getAlarmMethod().equals("4")) { | ||
| 81 | + MobilePosition mobilePosition = new MobilePosition(); | ||
| 82 | + mobilePosition.setDeviceId(deviceAlarm.getDeviceId()); | ||
| 83 | + mobilePosition.setTime(deviceAlarm.getAlarmTime()); | ||
| 84 | + mobilePosition.setLongitude(deviceAlarm.getLongitude()); | ||
| 85 | + mobilePosition.setLatitude(deviceAlarm.getLatitude()); | ||
| 86 | + mobilePosition.setReportSource("GPS Alarm"); | ||
| 87 | + BaiduPoint bp = new BaiduPoint(); | ||
| 88 | + bp = GpsUtil.Wgs84ToBd09(String.valueOf(mobilePosition.getLongitude()), String.valueOf(mobilePosition.getLatitude())); | ||
| 89 | + logger.info("百度坐标:" + bp.getBdLng() + ", " + bp.getBdLat()); | ||
| 90 | + mobilePosition.setGeodeticSystem("BD-09"); | ||
| 91 | + mobilePosition.setCnLng(bp.getBdLng()); | ||
| 92 | + mobilePosition.setCnLat(bp.getBdLat()); | ||
| 93 | + if (!userSetup.getSavePositionHistory()) { | ||
| 94 | + storager.clearMobilePositionsByDeviceId(device.getDeviceId()); | ||
| 95 | + } | ||
| 96 | + storager.insertMobilePosition(mobilePosition); | ||
| 97 | + } | ||
| 98 | + } | ||
| 99 | + logger.debug("存储报警信息、报警分类"); | ||
| 100 | + // 存储报警信息、报警分类 | ||
| 101 | + deviceAlarmService.add(deviceAlarm); | ||
| 102 | + | ||
| 103 | + if (offLineDetector.isOnline(device.getDeviceId())) { | ||
| 104 | + publisher.deviceAlarmEventPublish(deviceAlarm); | ||
| 105 | + } | ||
| 106 | + } | ||
| 107 | + | ||
| 108 | + @Override | ||
| 109 | + public void handForPlatform(RequestEvent evt, ParentPlatform parentPlatform, Element element) { | ||
| 110 | + | ||
| 111 | + } | ||
| 112 | +} |
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/notify/cmd/KeepaliveMessageHandler.java
0 → 100644
| 1 | +package com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.notify.cmd; | ||
| 2 | + | ||
| 3 | +import com.genersoft.iot.vmp.common.VideoManagerConstants; | ||
| 4 | +import com.genersoft.iot.vmp.gb28181.bean.Device; | ||
| 5 | +import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform; | ||
| 6 | +import com.genersoft.iot.vmp.gb28181.event.EventPublisher; | ||
| 7 | +import com.genersoft.iot.vmp.gb28181.transmit.event.request.SIPRequestProcessorParent; | ||
| 8 | +import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.IMessageHandler; | ||
| 9 | +import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.notify.NotifyMessageHandler; | ||
| 10 | +import org.dom4j.Element; | ||
| 11 | +import org.slf4j.Logger; | ||
| 12 | +import org.slf4j.LoggerFactory; | ||
| 13 | +import org.springframework.beans.factory.InitializingBean; | ||
| 14 | +import org.springframework.beans.factory.annotation.Autowired; | ||
| 15 | + | ||
| 16 | +import javax.sip.InvalidArgumentException; | ||
| 17 | +import javax.sip.RequestEvent; | ||
| 18 | +import javax.sip.SipException; | ||
| 19 | +import javax.sip.message.Response; | ||
| 20 | +import java.text.ParseException; | ||
| 21 | + | ||
| 22 | +public class KeepaliveMessageHandler extends SIPRequestProcessorParent implements InitializingBean, IMessageHandler { | ||
| 23 | + | ||
| 24 | + private Logger logger = LoggerFactory.getLogger(KeepaliveMessageHandler.class); | ||
| 25 | + private final String cmdType = "Keepalive"; | ||
| 26 | + | ||
| 27 | + @Autowired | ||
| 28 | + private NotifyMessageHandler notifyMessageHandler; | ||
| 29 | + | ||
| 30 | + @Autowired | ||
| 31 | + private EventPublisher publisher; | ||
| 32 | + | ||
| 33 | + @Override | ||
| 34 | + public void afterPropertiesSet() throws Exception { | ||
| 35 | + notifyMessageHandler.addHandler(cmdType, this); | ||
| 36 | + } | ||
| 37 | + | ||
| 38 | + @Override | ||
| 39 | + public void handForDevice(RequestEvent evt, Device device, Element element) { | ||
| 40 | + // 检查设备是否存在并在线, 不在线则设置为在线 | ||
| 41 | + try { | ||
| 42 | + if (device != null ) { | ||
| 43 | + // 回复200 OK | ||
| 44 | + responseAck(evt, Response.OK); | ||
| 45 | + publisher.onlineEventPublish(device, VideoManagerConstants.EVENT_ONLINE_KEEPLIVE); | ||
| 46 | + } | ||
| 47 | + } catch (SipException e) { | ||
| 48 | + e.printStackTrace(); | ||
| 49 | + } catch (InvalidArgumentException e) { | ||
| 50 | + e.printStackTrace(); | ||
| 51 | + } catch (ParseException e) { | ||
| 52 | + e.printStackTrace(); | ||
| 53 | + } | ||
| 54 | + } | ||
| 55 | + | ||
| 56 | + @Override | ||
| 57 | + public void handForPlatform(RequestEvent evt, ParentPlatform parentPlatform, Element element) { | ||
| 58 | + // 不会收到上级平台的心跳信息 | ||
| 59 | + | ||
| 60 | + } | ||
| 61 | +} |
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/notify/cmd/MediaStatusMessageHandler.java
0 → 100644
| 1 | +package com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.notify.cmd; | ||
| 2 | + | ||
| 3 | +import com.genersoft.iot.vmp.common.StreamInfo; | ||
| 4 | +import com.genersoft.iot.vmp.gb28181.bean.Device; | ||
| 5 | +import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform; | ||
| 6 | +import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommander; | ||
| 7 | +import com.genersoft.iot.vmp.gb28181.transmit.event.request.SIPRequestProcessorParent; | ||
| 8 | +import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.IMessageHandler; | ||
| 9 | +import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.notify.NotifyMessageHandler; | ||
| 10 | +import com.genersoft.iot.vmp.storager.IRedisCatchStorage; | ||
| 11 | +import org.dom4j.Element; | ||
| 12 | +import org.slf4j.Logger; | ||
| 13 | +import org.slf4j.LoggerFactory; | ||
| 14 | +import org.springframework.beans.factory.InitializingBean; | ||
| 15 | +import org.springframework.beans.factory.annotation.Autowired; | ||
| 16 | + | ||
| 17 | +import javax.sip.InvalidArgumentException; | ||
| 18 | +import javax.sip.RequestEvent; | ||
| 19 | +import javax.sip.SipException; | ||
| 20 | +import javax.sip.message.Response; | ||
| 21 | + | ||
| 22 | +import java.text.ParseException; | ||
| 23 | + | ||
| 24 | +import static com.genersoft.iot.vmp.gb28181.utils.XmlUtil.getText; | ||
| 25 | + | ||
| 26 | +public class MediaStatusMessageHandler extends SIPRequestProcessorParent implements InitializingBean, IMessageHandler { | ||
| 27 | + | ||
| 28 | + private Logger logger = LoggerFactory.getLogger(MediaStatusMessageHandler.class); | ||
| 29 | + private final String cmdType = "MediaStatus"; | ||
| 30 | + | ||
| 31 | + @Autowired | ||
| 32 | + private NotifyMessageHandler notifyMessageHandler; | ||
| 33 | + | ||
| 34 | + @Autowired | ||
| 35 | + private SIPCommander cmder; | ||
| 36 | + | ||
| 37 | + @Autowired | ||
| 38 | + private IRedisCatchStorage redisCatchStorage; | ||
| 39 | + | ||
| 40 | + @Override | ||
| 41 | + public void afterPropertiesSet() throws Exception { | ||
| 42 | + notifyMessageHandler.addHandler(cmdType, this); | ||
| 43 | + } | ||
| 44 | + | ||
| 45 | + @Override | ||
| 46 | + public void handForDevice(RequestEvent evt, Device device, Element rootElement) { | ||
| 47 | + | ||
| 48 | + // 回复200 OK | ||
| 49 | + try { | ||
| 50 | + responseAck(evt, Response.OK); | ||
| 51 | + } catch (SipException e) { | ||
| 52 | + e.printStackTrace(); | ||
| 53 | + } catch (InvalidArgumentException e) { | ||
| 54 | + e.printStackTrace(); | ||
| 55 | + } catch (ParseException e) { | ||
| 56 | + e.printStackTrace(); | ||
| 57 | + } | ||
| 58 | + String NotifyType =getText(rootElement, "NotifyType"); | ||
| 59 | + if (NotifyType.equals("121")){ | ||
| 60 | + logger.info("媒体播放完毕,通知关流"); | ||
| 61 | + StreamInfo streamInfo = redisCatchStorage.queryPlaybackByDevice(device.getDeviceId(), "*"); | ||
| 62 | + if (streamInfo != null) { | ||
| 63 | + redisCatchStorage.stopPlayback(streamInfo); | ||
| 64 | + cmder.streamByeCmd(streamInfo.getDeviceID(), streamInfo.getChannelId()); | ||
| 65 | + } | ||
| 66 | + } | ||
| 67 | + } | ||
| 68 | + | ||
| 69 | + @Override | ||
| 70 | + public void handForPlatform(RequestEvent evt, ParentPlatform parentPlatform, Element element) { | ||
| 71 | + | ||
| 72 | + } | ||
| 73 | +} |
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/notify/cmd/MobilePositionMessageHandler.java
0 → 100644
| 1 | +package com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.notify.cmd; | ||
| 2 | + | ||
| 3 | +import com.genersoft.iot.vmp.conf.UserSetup; | ||
| 4 | +import com.genersoft.iot.vmp.gb28181.bean.BaiduPoint; | ||
| 5 | +import com.genersoft.iot.vmp.gb28181.bean.Device; | ||
| 6 | +import com.genersoft.iot.vmp.gb28181.bean.MobilePosition; | ||
| 7 | +import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform; | ||
| 8 | +import com.genersoft.iot.vmp.gb28181.transmit.event.request.SIPRequestProcessorParent; | ||
| 9 | +import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.IMessageHandler; | ||
| 10 | +import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.notify.NotifyMessageHandler; | ||
| 11 | +import com.genersoft.iot.vmp.gb28181.utils.NumericUtil; | ||
| 12 | +import com.genersoft.iot.vmp.storager.IVideoManagerStorager; | ||
| 13 | +import com.genersoft.iot.vmp.utils.GpsUtil; | ||
| 14 | +import org.dom4j.DocumentException; | ||
| 15 | +import org.dom4j.Element; | ||
| 16 | +import org.slf4j.Logger; | ||
| 17 | +import org.slf4j.LoggerFactory; | ||
| 18 | +import org.springframework.beans.factory.InitializingBean; | ||
| 19 | +import org.springframework.beans.factory.annotation.Autowired; | ||
| 20 | +import org.springframework.util.StringUtils; | ||
| 21 | + | ||
| 22 | +import javax.sip.InvalidArgumentException; | ||
| 23 | +import javax.sip.RequestEvent; | ||
| 24 | +import javax.sip.SipException; | ||
| 25 | +import javax.sip.message.Response; | ||
| 26 | +import java.text.ParseException; | ||
| 27 | + | ||
| 28 | +import static com.genersoft.iot.vmp.gb28181.utils.XmlUtil.getText; | ||
| 29 | + | ||
| 30 | +public class MobilePositionMessageHandler extends SIPRequestProcessorParent implements InitializingBean, IMessageHandler { | ||
| 31 | + | ||
| 32 | + private Logger logger = LoggerFactory.getLogger(MobilePositionMessageHandler.class); | ||
| 33 | + private final String cmdType = "MobilePosition"; | ||
| 34 | + | ||
| 35 | + @Autowired | ||
| 36 | + private NotifyMessageHandler notifyMessageHandler; | ||
| 37 | + | ||
| 38 | + @Autowired | ||
| 39 | + private UserSetup userSetup; | ||
| 40 | + | ||
| 41 | + @Autowired | ||
| 42 | + private IVideoManagerStorager storager; | ||
| 43 | + | ||
| 44 | + @Override | ||
| 45 | + public void afterPropertiesSet() throws Exception { | ||
| 46 | + notifyMessageHandler.addHandler(cmdType, this); | ||
| 47 | + } | ||
| 48 | + | ||
| 49 | + @Override | ||
| 50 | + public void handForDevice(RequestEvent evt, Device device, Element rootElement) { | ||
| 51 | + | ||
| 52 | + try { | ||
| 53 | + rootElement = getRootElement(evt, device.getCharset()); | ||
| 54 | + | ||
| 55 | + MobilePosition mobilePosition = new MobilePosition(); | ||
| 56 | + if (!StringUtils.isEmpty(device.getName())) { | ||
| 57 | + mobilePosition.setDeviceName(device.getName()); | ||
| 58 | + } | ||
| 59 | + mobilePosition.setDeviceId(device.getDeviceId()); | ||
| 60 | + mobilePosition.setChannelId(getText(rootElement, "DeviceID")); | ||
| 61 | + mobilePosition.setTime(getText(rootElement, "Time")); | ||
| 62 | + mobilePosition.setLongitude(Double.parseDouble(getText(rootElement, "Longitude"))); | ||
| 63 | + mobilePosition.setLatitude(Double.parseDouble(getText(rootElement, "Latitude"))); | ||
| 64 | + if (NumericUtil.isDouble(getText(rootElement, "Speed"))) { | ||
| 65 | + mobilePosition.setSpeed(Double.parseDouble(getText(rootElement, "Speed"))); | ||
| 66 | + } else { | ||
| 67 | + mobilePosition.setSpeed(0.0); | ||
| 68 | + } | ||
| 69 | + if (NumericUtil.isDouble(getText(rootElement, "Direction"))) { | ||
| 70 | + mobilePosition.setDirection(Double.parseDouble(getText(rootElement, "Direction"))); | ||
| 71 | + } else { | ||
| 72 | + mobilePosition.setDirection(0.0); | ||
| 73 | + } | ||
| 74 | + if (NumericUtil.isDouble(getText(rootElement, "Altitude"))) { | ||
| 75 | + mobilePosition.setAltitude(Double.parseDouble(getText(rootElement, "Altitude"))); | ||
| 76 | + } else { | ||
| 77 | + mobilePosition.setAltitude(0.0); | ||
| 78 | + } | ||
| 79 | + mobilePosition.setReportSource("Mobile Position"); | ||
| 80 | + BaiduPoint bp = new BaiduPoint(); | ||
| 81 | + bp = GpsUtil.Wgs84ToBd09(String.valueOf(mobilePosition.getLongitude()), String.valueOf(mobilePosition.getLatitude())); | ||
| 82 | + logger.info("百度坐标:" + bp.getBdLng() + ", " + bp.getBdLat()); | ||
| 83 | + mobilePosition.setGeodeticSystem("BD-09"); | ||
| 84 | + mobilePosition.setCnLng(bp.getBdLng()); | ||
| 85 | + mobilePosition.setCnLat(bp.getBdLat()); | ||
| 86 | + if (!userSetup.getSavePositionHistory()) { | ||
| 87 | + storager.clearMobilePositionsByDeviceId(device.getDeviceId()); | ||
| 88 | + } | ||
| 89 | + storager.insertMobilePosition(mobilePosition); | ||
| 90 | + //回复 200 OK | ||
| 91 | + responseAck(evt, Response.OK); | ||
| 92 | + } catch (DocumentException | SipException | InvalidArgumentException | ParseException e) { | ||
| 93 | + e.printStackTrace(); | ||
| 94 | + } | ||
| 95 | + } | ||
| 96 | + | ||
| 97 | + @Override | ||
| 98 | + public void handForPlatform(RequestEvent evt, ParentPlatform parentPlatform, Element element) { | ||
| 99 | + | ||
| 100 | + } | ||
| 101 | +} |
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/query/QueryMessageHandler.java
0 → 100644
| 1 | +package com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.query; | ||
| 2 | + | ||
| 3 | +import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.MessageHandlerAbstract; | ||
| 4 | +import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.MessageRequestProcessor; | ||
| 5 | +import org.springframework.beans.factory.InitializingBean; | ||
| 6 | +import org.springframework.beans.factory.annotation.Autowired; | ||
| 7 | +import org.springframework.stereotype.Component; | ||
| 8 | + | ||
| 9 | +@Component | ||
| 10 | +public class QueryMessageHandler extends MessageHandlerAbstract implements InitializingBean { | ||
| 11 | + | ||
| 12 | + private final String messageType = "Query"; | ||
| 13 | + | ||
| 14 | + @Autowired | ||
| 15 | + private MessageRequestProcessor messageRequestProcessor; | ||
| 16 | + | ||
| 17 | + @Override | ||
| 18 | + public void afterPropertiesSet() throws Exception { | ||
| 19 | + messageRequestProcessor.addHandler(messageType, this); | ||
| 20 | + } | ||
| 21 | +} |
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/query/cmd/CatalogMessageHandler.java
0 → 100644
| 1 | +package com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.query.cmd; | ||
| 2 | + | ||
| 3 | +import com.genersoft.iot.vmp.conf.SipConfig; | ||
| 4 | +import com.genersoft.iot.vmp.gb28181.bean.Device; | ||
| 5 | +import com.genersoft.iot.vmp.gb28181.bean.DeviceChannel; | ||
| 6 | +import com.genersoft.iot.vmp.gb28181.bean.GbStream; | ||
| 7 | +import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform; | ||
| 8 | +import com.genersoft.iot.vmp.gb28181.event.EventPublisher; | ||
| 9 | +import com.genersoft.iot.vmp.gb28181.transmit.callback.DeferredResultHolder; | ||
| 10 | +import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommanderFroPlatform; | ||
| 11 | +import com.genersoft.iot.vmp.gb28181.transmit.event.request.SIPRequestProcessorParent; | ||
| 12 | +import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.IMessageHandler; | ||
| 13 | +import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.query.QueryMessageHandler; | ||
| 14 | +import com.genersoft.iot.vmp.storager.IVideoManagerStorager; | ||
| 15 | +import com.genersoft.iot.vmp.vmanager.gb28181.platform.bean.ChannelReduce; | ||
| 16 | +import org.dom4j.Element; | ||
| 17 | +import org.slf4j.Logger; | ||
| 18 | +import org.slf4j.LoggerFactory; | ||
| 19 | +import org.springframework.beans.factory.InitializingBean; | ||
| 20 | +import org.springframework.beans.factory.annotation.Autowired; | ||
| 21 | + | ||
| 22 | +import javax.sip.InvalidArgumentException; | ||
| 23 | +import javax.sip.RequestEvent; | ||
| 24 | +import javax.sip.SipException; | ||
| 25 | +import javax.sip.header.FromHeader; | ||
| 26 | +import javax.sip.message.Response; | ||
| 27 | +import java.text.ParseException; | ||
| 28 | +import java.util.List; | ||
| 29 | + | ||
| 30 | +public class CatalogMessageHandler extends SIPRequestProcessorParent implements InitializingBean, IMessageHandler { | ||
| 31 | + | ||
| 32 | + private Logger logger = LoggerFactory.getLogger(CatalogMessageHandler.class); | ||
| 33 | + private final String cmdType = "Catalog"; | ||
| 34 | + | ||
| 35 | + @Autowired | ||
| 36 | + private QueryMessageHandler queryMessageHandler; | ||
| 37 | + | ||
| 38 | + @Autowired | ||
| 39 | + private IVideoManagerStorager storager; | ||
| 40 | + | ||
| 41 | + @Autowired | ||
| 42 | + private SIPCommanderFroPlatform cmderFroPlatform; | ||
| 43 | + | ||
| 44 | + @Autowired | ||
| 45 | + private SipConfig config; | ||
| 46 | + | ||
| 47 | + @Autowired | ||
| 48 | + private EventPublisher publisher; | ||
| 49 | + | ||
| 50 | + @Override | ||
| 51 | + public void afterPropertiesSet() throws Exception { | ||
| 52 | + queryMessageHandler.addHandler(cmdType, this); | ||
| 53 | + } | ||
| 54 | + | ||
| 55 | + @Override | ||
| 56 | + public void handForDevice(RequestEvent evt, Device device, Element element) { | ||
| 57 | + | ||
| 58 | + } | ||
| 59 | + | ||
| 60 | + @Override | ||
| 61 | + public void handForPlatform(RequestEvent evt, ParentPlatform parentPlatform, Element rootElement) { | ||
| 62 | + | ||
| 63 | + String key = DeferredResultHolder.CALLBACK_CMD_CATALOG + parentPlatform.getServerGBId(); | ||
| 64 | + FromHeader fromHeader = (FromHeader) evt.getRequest().getHeader(FromHeader.NAME); | ||
| 65 | + try { | ||
| 66 | + // 回复200 OK | ||
| 67 | + responseAck(evt, Response.OK); | ||
| 68 | + Element snElement = rootElement.element("SN"); | ||
| 69 | + String sn = snElement.getText(); | ||
| 70 | + // 准备回复通道信息 | ||
| 71 | + List<ChannelReduce> channelReduces = storager.queryChannelListInParentPlatform(parentPlatform.getServerGBId()); | ||
| 72 | + // 查询关联的直播通道 | ||
| 73 | + List<GbStream> gbStreams = storager.queryGbStreamListInPlatform(parentPlatform.getServerGBId()); | ||
| 74 | + int size = channelReduces.size() + gbStreams.size(); | ||
| 75 | + // 回复级联的通道 | ||
| 76 | + if (channelReduces.size() > 0) { | ||
| 77 | + for (ChannelReduce channelReduce : channelReduces) { | ||
| 78 | + DeviceChannel deviceChannel = storager.queryChannel(channelReduce.getDeviceId(), channelReduce.getChannelId()); | ||
| 79 | + cmderFroPlatform.catalogQuery(deviceChannel, parentPlatform, sn, fromHeader.getTag(), size); | ||
| 80 | + } | ||
| 81 | + } | ||
| 82 | + // 回复直播的通道 | ||
| 83 | + if (gbStreams.size() > 0) { | ||
| 84 | + for (GbStream gbStream : gbStreams) { | ||
| 85 | + DeviceChannel deviceChannel = new DeviceChannel(); | ||
| 86 | + deviceChannel.setChannelId(gbStream.getGbId()); | ||
| 87 | + deviceChannel.setName(gbStream.getName()); | ||
| 88 | + deviceChannel.setLongitude(gbStream.getLongitude()); | ||
| 89 | + deviceChannel.setLatitude(gbStream.getLatitude()); | ||
| 90 | + deviceChannel.setDeviceId(parentPlatform.getDeviceGBId()); | ||
| 91 | + deviceChannel.setManufacture("wvp-pro"); | ||
| 92 | + deviceChannel.setStatus(gbStream.isStatus()?1:0); | ||
| 93 | + // deviceChannel.setParentId(parentPlatform.getDeviceGBId()); | ||
| 94 | + deviceChannel.setRegisterWay(1); | ||
| 95 | + deviceChannel.setCivilCode(config.getDomain()); | ||
| 96 | + deviceChannel.setModel("live"); | ||
| 97 | + deviceChannel.setOwner("wvp-pro"); | ||
| 98 | + deviceChannel.setParental(0); | ||
| 99 | + deviceChannel.setSecrecy("0"); | ||
| 100 | + deviceChannel.setSecrecy("0"); | ||
| 101 | + | ||
| 102 | + cmderFroPlatform.catalogQuery(deviceChannel, parentPlatform, sn, fromHeader.getTag(), size); | ||
| 103 | + } | ||
| 104 | + } | ||
| 105 | + if (size == 0) { | ||
| 106 | + // 回复无通道 | ||
| 107 | + cmderFroPlatform.catalogQuery(null, parentPlatform, sn, fromHeader.getTag(), size); | ||
| 108 | + } | ||
| 109 | + } catch (SipException e) { | ||
| 110 | + e.printStackTrace(); | ||
| 111 | + } catch (InvalidArgumentException e) { | ||
| 112 | + e.printStackTrace(); | ||
| 113 | + } catch (ParseException e) { | ||
| 114 | + e.printStackTrace(); | ||
| 115 | + } | ||
| 116 | + | ||
| 117 | + } | ||
| 118 | +} |
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/query/cmd/DeviceControlMessageHandler.java
0 → 100644
| 1 | +package com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.query.cmd; | ||
| 2 | + | ||
| 3 | +import com.genersoft.iot.vmp.VManageBootstrap; | ||
| 4 | +import com.genersoft.iot.vmp.gb28181.bean.Device; | ||
| 5 | +import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform; | ||
| 6 | +import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommander; | ||
| 7 | +import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommanderFroPlatform; | ||
| 8 | +import com.genersoft.iot.vmp.gb28181.transmit.event.request.SIPRequestProcessorParent; | ||
| 9 | +import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.IMessageHandler; | ||
| 10 | +import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.query.QueryMessageHandler; | ||
| 11 | +import com.genersoft.iot.vmp.storager.IVideoManagerStorager; | ||
| 12 | +import com.genersoft.iot.vmp.utils.SpringBeanFactory; | ||
| 13 | +import gov.nist.javax.sip.SipStackImpl; | ||
| 14 | +import org.dom4j.Element; | ||
| 15 | +import org.slf4j.Logger; | ||
| 16 | +import org.slf4j.LoggerFactory; | ||
| 17 | +import org.springframework.beans.factory.InitializingBean; | ||
| 18 | +import org.springframework.beans.factory.annotation.Autowired; | ||
| 19 | +import org.springframework.util.StringUtils; | ||
| 20 | + | ||
| 21 | +import javax.sip.ListeningPoint; | ||
| 22 | +import javax.sip.ObjectInUseException; | ||
| 23 | +import javax.sip.RequestEvent; | ||
| 24 | +import javax.sip.SipProvider; | ||
| 25 | +import javax.sip.address.SipURI; | ||
| 26 | +import javax.sip.header.HeaderAddress; | ||
| 27 | +import javax.sip.header.ToHeader; | ||
| 28 | +import java.util.Iterator; | ||
| 29 | + | ||
| 30 | +import static com.genersoft.iot.vmp.gb28181.utils.XmlUtil.getText; | ||
| 31 | + | ||
| 32 | +public class DeviceControlMessageHandler extends SIPRequestProcessorParent implements InitializingBean, IMessageHandler { | ||
| 33 | + | ||
| 34 | + private Logger logger = LoggerFactory.getLogger(DeviceControlMessageHandler.class); | ||
| 35 | + private final String cmdType = "DeviceControl"; | ||
| 36 | + | ||
| 37 | + @Autowired | ||
| 38 | + private QueryMessageHandler queryMessageHandler; | ||
| 39 | + | ||
| 40 | + @Autowired | ||
| 41 | + private IVideoManagerStorager storager; | ||
| 42 | + | ||
| 43 | + @Autowired | ||
| 44 | + private SIPCommander cmder; | ||
| 45 | + | ||
| 46 | + @Autowired | ||
| 47 | + private SIPCommanderFroPlatform cmderFroPlatform; | ||
| 48 | + | ||
| 49 | + @Override | ||
| 50 | + public void afterPropertiesSet() throws Exception { | ||
| 51 | + queryMessageHandler.addHandler(cmdType, this); | ||
| 52 | + } | ||
| 53 | + | ||
| 54 | + @Override | ||
| 55 | + public void handForDevice(RequestEvent evt, Device device, Element element) { | ||
| 56 | + | ||
| 57 | + } | ||
| 58 | + | ||
| 59 | + @Override | ||
| 60 | + public void handForPlatform(RequestEvent evt, ParentPlatform parentPlatform, Element rootElement) { | ||
| 61 | + | ||
| 62 | + // 此处是上级发出的DeviceControl指令 | ||
| 63 | + String targetGBId = ((SipURI) ((HeaderAddress) evt.getRequest().getHeader(ToHeader.NAME)).getAddress().getURI()).getUser(); | ||
| 64 | + String channelId = getText(rootElement, "DeviceID"); | ||
| 65 | + // 远程启动功能 | ||
| 66 | + if (!StringUtils.isEmpty(getText(rootElement, "TeleBoot"))) { | ||
| 67 | + if (parentPlatform.getServerGBId().equals(targetGBId)) { | ||
| 68 | + // 远程启动本平台:需要在重新启动程序后先对SipStack解绑 | ||
| 69 | + logger.info("执行远程启动本平台命令"); | ||
| 70 | + cmderFroPlatform.unregister(parentPlatform, null, null); | ||
| 71 | + | ||
| 72 | + Thread restartThread = new Thread(new Runnable() { | ||
| 73 | + @Override | ||
| 74 | + public void run() { | ||
| 75 | + try { | ||
| 76 | + Thread.sleep(3000); | ||
| 77 | + SipProvider up = (SipProvider) SpringBeanFactory.getBean("udpSipProvider"); | ||
| 78 | + SipStackImpl stack = (SipStackImpl)up.getSipStack(); | ||
| 79 | + stack.stop(); | ||
| 80 | + Iterator listener = stack.getListeningPoints(); | ||
| 81 | + while (listener.hasNext()) { | ||
| 82 | + stack.deleteListeningPoint((ListeningPoint) listener.next()); | ||
| 83 | + } | ||
| 84 | + Iterator providers = stack.getSipProviders(); | ||
| 85 | + while (providers.hasNext()) { | ||
| 86 | + stack.deleteSipProvider((SipProvider) providers.next()); | ||
| 87 | + } | ||
| 88 | + VManageBootstrap.restart(); | ||
| 89 | + } catch (InterruptedException ignored) { | ||
| 90 | + } catch (ObjectInUseException e) { | ||
| 91 | + e.printStackTrace(); | ||
| 92 | + } | ||
| 93 | + } | ||
| 94 | + }); | ||
| 95 | + | ||
| 96 | + restartThread.setDaemon(false); | ||
| 97 | + restartThread.start(); | ||
| 98 | + } else { | ||
| 99 | + // 远程启动指定设备 | ||
| 100 | + } | ||
| 101 | + } | ||
| 102 | + // 云台/前端控制命令 | ||
| 103 | + if (!StringUtils.isEmpty(getText(rootElement,"PTZCmd")) && !parentPlatform.getServerGBId().equals(targetGBId)) { | ||
| 104 | + String cmdString = getText(rootElement,"PTZCmd"); | ||
| 105 | + Device deviceForPlatform = storager.queryVideoDeviceByPlatformIdAndChannelId(parentPlatform.getServerGBId(), channelId); | ||
| 106 | + cmder.fronEndCmd(deviceForPlatform, channelId, cmdString); | ||
| 107 | + } | ||
| 108 | + } | ||
| 109 | +} |
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/query/cmd/DeviceInfoMessageHandler.java
0 → 100644
| 1 | +package com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.query.cmd; | ||
| 2 | + | ||
| 3 | +import com.genersoft.iot.vmp.gb28181.bean.Device; | ||
| 4 | +import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform; | ||
| 5 | +import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommanderFroPlatform; | ||
| 6 | +import com.genersoft.iot.vmp.gb28181.transmit.event.request.SIPRequestProcessorParent; | ||
| 7 | +import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.IMessageHandler; | ||
| 8 | +import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.query.QueryMessageHandler; | ||
| 9 | +import org.dom4j.Element; | ||
| 10 | +import org.slf4j.Logger; | ||
| 11 | +import org.slf4j.LoggerFactory; | ||
| 12 | +import org.springframework.beans.factory.InitializingBean; | ||
| 13 | +import org.springframework.beans.factory.annotation.Autowired; | ||
| 14 | + | ||
| 15 | +import javax.sip.InvalidArgumentException; | ||
| 16 | +import javax.sip.RequestEvent; | ||
| 17 | +import javax.sip.SipException; | ||
| 18 | +import javax.sip.header.FromHeader; | ||
| 19 | +import javax.sip.message.Response; | ||
| 20 | +import java.text.ParseException; | ||
| 21 | + | ||
| 22 | +public class DeviceInfoMessageHandler extends SIPRequestProcessorParent implements InitializingBean, IMessageHandler { | ||
| 23 | + | ||
| 24 | + private Logger logger = LoggerFactory.getLogger(DeviceInfoMessageHandler.class); | ||
| 25 | + private final String cmdType = "DeviceInfo"; | ||
| 26 | + | ||
| 27 | + @Autowired | ||
| 28 | + private QueryMessageHandler queryMessageHandler; | ||
| 29 | + | ||
| 30 | + @Autowired | ||
| 31 | + private SIPCommanderFroPlatform cmderFroPlatform; | ||
| 32 | + | ||
| 33 | + @Override | ||
| 34 | + public void afterPropertiesSet() throws Exception { | ||
| 35 | + queryMessageHandler.addHandler(cmdType, this); | ||
| 36 | + } | ||
| 37 | + | ||
| 38 | + @Override | ||
| 39 | + public void handForDevice(RequestEvent evt, Device device, Element rootElement) { | ||
| 40 | + | ||
| 41 | + } | ||
| 42 | + | ||
| 43 | + @Override | ||
| 44 | + public void handForPlatform(RequestEvent evt, ParentPlatform parentPlatform, Element rootElement) { | ||
| 45 | + logger.info("接收到DeviceInfo查询消息"); | ||
| 46 | + FromHeader fromHeader = (FromHeader) evt.getRequest().getHeader(FromHeader.NAME); | ||
| 47 | + try { | ||
| 48 | + // 回复200 OK | ||
| 49 | + responseAck(evt, Response.OK); | ||
| 50 | + } catch (SipException e) { | ||
| 51 | + e.printStackTrace(); | ||
| 52 | + } catch (InvalidArgumentException e) { | ||
| 53 | + e.printStackTrace(); | ||
| 54 | + } catch (ParseException e) { | ||
| 55 | + e.printStackTrace(); | ||
| 56 | + } | ||
| 57 | + String sn = rootElement.element("SN").getText(); | ||
| 58 | + cmderFroPlatform.deviceInfoResponse(parentPlatform, sn, fromHeader.getTag()); | ||
| 59 | + } | ||
| 60 | +} |
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/query/cmd/DeviceStatusMessageHandler.java
0 → 100644
| 1 | +package com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.query.cmd; | ||
| 2 | + | ||
| 3 | +import com.genersoft.iot.vmp.conf.SipConfig; | ||
| 4 | +import com.genersoft.iot.vmp.gb28181.bean.Device; | ||
| 5 | +import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform; | ||
| 6 | +import com.genersoft.iot.vmp.gb28181.event.EventPublisher; | ||
| 7 | +import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommanderFroPlatform; | ||
| 8 | +import com.genersoft.iot.vmp.gb28181.transmit.event.request.SIPRequestProcessorParent; | ||
| 9 | +import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.IMessageHandler; | ||
| 10 | +import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.query.QueryMessageHandler; | ||
| 11 | +import com.genersoft.iot.vmp.storager.IVideoManagerStorager; | ||
| 12 | +import org.dom4j.Element; | ||
| 13 | +import org.slf4j.Logger; | ||
| 14 | +import org.slf4j.LoggerFactory; | ||
| 15 | +import org.springframework.beans.factory.InitializingBean; | ||
| 16 | +import org.springframework.beans.factory.annotation.Autowired; | ||
| 17 | + | ||
| 18 | +import javax.sip.InvalidArgumentException; | ||
| 19 | +import javax.sip.RequestEvent; | ||
| 20 | +import javax.sip.SipException; | ||
| 21 | +import javax.sip.header.FromHeader; | ||
| 22 | +import javax.sip.message.Response; | ||
| 23 | +import java.text.ParseException; | ||
| 24 | + | ||
| 25 | +public class DeviceStatusMessageHandler extends SIPRequestProcessorParent implements InitializingBean, IMessageHandler { | ||
| 26 | + | ||
| 27 | + private Logger logger = LoggerFactory.getLogger(DeviceStatusMessageHandler.class); | ||
| 28 | + private final String cmdType = "DeviceStatus"; | ||
| 29 | + | ||
| 30 | + @Autowired | ||
| 31 | + private QueryMessageHandler queryMessageHandler; | ||
| 32 | + | ||
| 33 | + @Autowired | ||
| 34 | + private IVideoManagerStorager storager; | ||
| 35 | + | ||
| 36 | + @Autowired | ||
| 37 | + private SIPCommanderFroPlatform cmderFroPlatform; | ||
| 38 | + | ||
| 39 | + @Autowired | ||
| 40 | + private SipConfig config; | ||
| 41 | + | ||
| 42 | + @Autowired | ||
| 43 | + private EventPublisher publisher; | ||
| 44 | + | ||
| 45 | + @Override | ||
| 46 | + public void afterPropertiesSet() throws Exception { | ||
| 47 | + queryMessageHandler.addHandler(cmdType, this); | ||
| 48 | + } | ||
| 49 | + | ||
| 50 | + @Override | ||
| 51 | + public void handForDevice(RequestEvent evt, Device device, Element element) { | ||
| 52 | + | ||
| 53 | + } | ||
| 54 | + | ||
| 55 | + @Override | ||
| 56 | + public void handForPlatform(RequestEvent evt, ParentPlatform parentPlatform, Element rootElement) { | ||
| 57 | + | ||
| 58 | + logger.info("接收到DeviceStatus查询消息"); | ||
| 59 | + FromHeader fromHeader = (FromHeader) evt.getRequest().getHeader(FromHeader.NAME); | ||
| 60 | + // 回复200 OK | ||
| 61 | + try { | ||
| 62 | + responseAck(evt, Response.OK); | ||
| 63 | + } catch (SipException e) { | ||
| 64 | + e.printStackTrace(); | ||
| 65 | + } catch (InvalidArgumentException e) { | ||
| 66 | + e.printStackTrace(); | ||
| 67 | + } catch (ParseException e) { | ||
| 68 | + e.printStackTrace(); | ||
| 69 | + } | ||
| 70 | + String sn = rootElement.element("SN").getText(); | ||
| 71 | + cmderFroPlatform.deviceStatusResponse(parentPlatform, sn, fromHeader.getTag()); | ||
| 72 | + } | ||
| 73 | +} |
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/response/ResponseMessageHandler.java
0 → 100644
| 1 | +package com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.response; | ||
| 2 | + | ||
| 3 | +import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.MessageHandlerAbstract; | ||
| 4 | +import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.MessageRequestProcessor; | ||
| 5 | +import org.springframework.beans.factory.InitializingBean; | ||
| 6 | +import org.springframework.beans.factory.annotation.Autowired; | ||
| 7 | +import org.springframework.stereotype.Component; | ||
| 8 | + | ||
| 9 | +@Component | ||
| 10 | +public class ResponseMessageHandler extends MessageHandlerAbstract implements InitializingBean { | ||
| 11 | + | ||
| 12 | + private final String messageType = "Response"; | ||
| 13 | + | ||
| 14 | + @Autowired | ||
| 15 | + private MessageRequestProcessor messageRequestProcessor; | ||
| 16 | + | ||
| 17 | + @Override | ||
| 18 | + public void afterPropertiesSet() throws Exception { | ||
| 19 | + messageRequestProcessor.addHandler(messageType, this); | ||
| 20 | + } | ||
| 21 | +} |
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/response/cmd/AlarmMessageHandler.java
0 → 100644
| 1 | +package com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.response.cmd; | ||
| 2 | + | ||
| 3 | +import com.alibaba.fastjson.JSONObject; | ||
| 4 | +import com.genersoft.iot.vmp.gb28181.bean.Device; | ||
| 5 | +import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform; | ||
| 6 | +import com.genersoft.iot.vmp.gb28181.transmit.callback.DeferredResultHolder; | ||
| 7 | +import com.genersoft.iot.vmp.gb28181.transmit.callback.RequestMessage; | ||
| 8 | +import com.genersoft.iot.vmp.gb28181.transmit.event.request.SIPRequestProcessorParent; | ||
| 9 | +import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.IMessageHandler; | ||
| 10 | +import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.response.ResponseMessageHandler; | ||
| 11 | +import com.genersoft.iot.vmp.gb28181.utils.XmlUtil; | ||
| 12 | +import org.dom4j.Element; | ||
| 13 | +import org.slf4j.Logger; | ||
| 14 | +import org.slf4j.LoggerFactory; | ||
| 15 | +import org.springframework.beans.factory.InitializingBean; | ||
| 16 | +import org.springframework.beans.factory.annotation.Autowired; | ||
| 17 | +import org.springframework.stereotype.Component; | ||
| 18 | + | ||
| 19 | +import javax.sip.RequestEvent; | ||
| 20 | + | ||
| 21 | +@Component | ||
| 22 | +public class AlarmMessageHandler extends SIPRequestProcessorParent implements InitializingBean, IMessageHandler { | ||
| 23 | + | ||
| 24 | + private Logger logger = LoggerFactory.getLogger(AlarmMessageHandler.class); | ||
| 25 | + private final String cmdType = "Alarm"; | ||
| 26 | + | ||
| 27 | + @Autowired | ||
| 28 | + private ResponseMessageHandler responseMessageHandler; | ||
| 29 | + | ||
| 30 | + @Autowired | ||
| 31 | + private DeferredResultHolder deferredResultHolder; | ||
| 32 | + | ||
| 33 | + @Override | ||
| 34 | + public void afterPropertiesSet() throws Exception { | ||
| 35 | + responseMessageHandler.addHandler(cmdType, this); | ||
| 36 | + } | ||
| 37 | + | ||
| 38 | + @Override | ||
| 39 | + public void handForDevice(RequestEvent evt, Device device, Element rootElement) { | ||
| 40 | + Element deviceIdElement = rootElement.element("DeviceID"); | ||
| 41 | + String channelId = deviceIdElement.getText().toString(); | ||
| 42 | + String key = DeferredResultHolder.CALLBACK_CMD_ALARM + device.getDeviceId() + channelId; | ||
| 43 | + JSONObject json = new JSONObject(); | ||
| 44 | + XmlUtil.node2Json(rootElement, json); | ||
| 45 | + if (logger.isDebugEnabled()) { | ||
| 46 | + logger.debug(json.toJSONString()); | ||
| 47 | + } | ||
| 48 | + RequestMessage msg = new RequestMessage(); | ||
| 49 | + msg.setKey(key); | ||
| 50 | + msg.setData(json); | ||
| 51 | + deferredResultHolder.invokeAllResult(msg); | ||
| 52 | + } | ||
| 53 | + | ||
| 54 | + @Override | ||
| 55 | + public void handForPlatform(RequestEvent evt, ParentPlatform parentPlatform, Element element) { | ||
| 56 | + | ||
| 57 | + } | ||
| 58 | +} |
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/response/cmd/BroadcastMessageHandler.java
0 → 100644
| 1 | +package com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.response.cmd; | ||
| 2 | + | ||
| 3 | +import com.alibaba.fastjson.JSONObject; | ||
| 4 | +import com.genersoft.iot.vmp.gb28181.bean.Device; | ||
| 5 | +import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform; | ||
| 6 | +import com.genersoft.iot.vmp.gb28181.transmit.callback.DeferredResultHolder; | ||
| 7 | +import com.genersoft.iot.vmp.gb28181.transmit.callback.RequestMessage; | ||
| 8 | +import com.genersoft.iot.vmp.gb28181.transmit.event.request.SIPRequestProcessorParent; | ||
| 9 | +import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.IMessageHandler; | ||
| 10 | +import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.response.ResponseMessageHandler; | ||
| 11 | +import com.genersoft.iot.vmp.gb28181.utils.XmlUtil; | ||
| 12 | +import org.dom4j.Element; | ||
| 13 | +import org.slf4j.Logger; | ||
| 14 | +import org.slf4j.LoggerFactory; | ||
| 15 | +import org.springframework.beans.factory.InitializingBean; | ||
| 16 | +import org.springframework.beans.factory.annotation.Autowired; | ||
| 17 | +import org.springframework.stereotype.Component; | ||
| 18 | + | ||
| 19 | +import javax.sip.InvalidArgumentException; | ||
| 20 | +import javax.sip.RequestEvent; | ||
| 21 | +import javax.sip.SipException; | ||
| 22 | +import javax.sip.message.Response; | ||
| 23 | +import java.text.ParseException; | ||
| 24 | + | ||
| 25 | +import static com.genersoft.iot.vmp.gb28181.utils.XmlUtil.getText; | ||
| 26 | + | ||
| 27 | +@Component | ||
| 28 | +public class BroadcastMessageHandler extends SIPRequestProcessorParent implements InitializingBean, IMessageHandler { | ||
| 29 | + | ||
| 30 | + private Logger logger = LoggerFactory.getLogger(BroadcastMessageHandler.class); | ||
| 31 | + private final String cmdType = "Broadcast"; | ||
| 32 | + | ||
| 33 | + @Autowired | ||
| 34 | + private ResponseMessageHandler responseMessageHandler; | ||
| 35 | + | ||
| 36 | + @Autowired | ||
| 37 | + private DeferredResultHolder deferredResultHolder; | ||
| 38 | + | ||
| 39 | + @Override | ||
| 40 | + public void afterPropertiesSet() throws Exception { | ||
| 41 | + responseMessageHandler.addHandler(cmdType, this); | ||
| 42 | + } | ||
| 43 | + | ||
| 44 | + @Override | ||
| 45 | + public void handForDevice(RequestEvent evt, Device device, Element rootElement) { | ||
| 46 | + try { | ||
| 47 | + String channelId = getText(rootElement, "DeviceID"); | ||
| 48 | + String key = DeferredResultHolder.CALLBACK_CMD_BROADCAST + device.getDeviceId() + channelId; | ||
| 49 | + // 回复200 OK | ||
| 50 | + responseAck(evt, Response.OK); | ||
| 51 | + // 此处是对本平台发出Broadcast指令的应答 | ||
| 52 | + JSONObject json = new JSONObject(); | ||
| 53 | + XmlUtil.node2Json(rootElement, json); | ||
| 54 | + if (logger.isDebugEnabled()) { | ||
| 55 | + logger.debug(json.toJSONString()); | ||
| 56 | + } | ||
| 57 | + RequestMessage msg = new RequestMessage(); | ||
| 58 | + msg.setKey(key); | ||
| 59 | + msg.setData(json); | ||
| 60 | + deferredResultHolder.invokeAllResult(msg); | ||
| 61 | + | ||
| 62 | + | ||
| 63 | + } catch (ParseException | SipException | InvalidArgumentException e) { | ||
| 64 | + e.printStackTrace(); | ||
| 65 | + } | ||
| 66 | + } | ||
| 67 | + | ||
| 68 | + @Override | ||
| 69 | + public void handForPlatform(RequestEvent evt, ParentPlatform parentPlatform, Element element) { | ||
| 70 | + | ||
| 71 | + } | ||
| 72 | +} |
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/response/cmd/CatalogMessageHandler.java
0 → 100644
| 1 | +package com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.response.cmd; | ||
| 2 | + | ||
| 3 | +import com.genersoft.iot.vmp.common.VideoManagerConstants; | ||
| 4 | +import com.genersoft.iot.vmp.conf.SipConfig; | ||
| 5 | +import com.genersoft.iot.vmp.gb28181.bean.Device; | ||
| 6 | +import com.genersoft.iot.vmp.gb28181.bean.DeviceChannel; | ||
| 7 | +import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform; | ||
| 8 | +import com.genersoft.iot.vmp.gb28181.event.DeviceOffLineDetector; | ||
| 9 | +import com.genersoft.iot.vmp.gb28181.event.EventPublisher; | ||
| 10 | +import com.genersoft.iot.vmp.gb28181.transmit.callback.DeferredResultHolder; | ||
| 11 | +import com.genersoft.iot.vmp.gb28181.transmit.callback.RequestMessage; | ||
| 12 | +import com.genersoft.iot.vmp.gb28181.transmit.event.request.SIPRequestProcessorParent; | ||
| 13 | +import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.IMessageHandler; | ||
| 14 | +import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.response.ResponseMessageHandler; | ||
| 15 | +import com.genersoft.iot.vmp.gb28181.utils.NumericUtil; | ||
| 16 | +import com.genersoft.iot.vmp.storager.IVideoManagerStorager; | ||
| 17 | +import org.dom4j.DocumentException; | ||
| 18 | +import org.dom4j.Element; | ||
| 19 | +import org.slf4j.Logger; | ||
| 20 | +import org.slf4j.LoggerFactory; | ||
| 21 | +import org.springframework.beans.factory.InitializingBean; | ||
| 22 | +import org.springframework.beans.factory.annotation.Autowired; | ||
| 23 | +import org.springframework.stereotype.Component; | ||
| 24 | + | ||
| 25 | +import javax.sip.InvalidArgumentException; | ||
| 26 | +import javax.sip.RequestEvent; | ||
| 27 | +import javax.sip.SipException; | ||
| 28 | +import javax.sip.message.Response; | ||
| 29 | +import java.text.ParseException; | ||
| 30 | +import java.util.Iterator; | ||
| 31 | + | ||
| 32 | +import static com.genersoft.iot.vmp.gb28181.utils.XmlUtil.getText; | ||
| 33 | + | ||
| 34 | +@Component | ||
| 35 | +public class CatalogMessageHandler extends SIPRequestProcessorParent implements InitializingBean, IMessageHandler { | ||
| 36 | + | ||
| 37 | + private Logger logger = LoggerFactory.getLogger(CatalogMessageHandler.class); | ||
| 38 | + private final String cmdType = "Catalog"; | ||
| 39 | + | ||
| 40 | + @Autowired | ||
| 41 | + private ResponseMessageHandler responseMessageHandler; | ||
| 42 | + | ||
| 43 | + @Autowired | ||
| 44 | + private IVideoManagerStorager storager; | ||
| 45 | + | ||
| 46 | + @Autowired | ||
| 47 | + private DeferredResultHolder deferredResultHolder; | ||
| 48 | + | ||
| 49 | + @Autowired | ||
| 50 | + private DeviceOffLineDetector offLineDetector; | ||
| 51 | + | ||
| 52 | + @Autowired | ||
| 53 | + private SipConfig config; | ||
| 54 | + | ||
| 55 | + @Autowired | ||
| 56 | + private EventPublisher publisher; | ||
| 57 | + | ||
| 58 | + @Override | ||
| 59 | + public void afterPropertiesSet() throws Exception { | ||
| 60 | + responseMessageHandler.addHandler(cmdType, this); | ||
| 61 | + } | ||
| 62 | + | ||
| 63 | + @Override | ||
| 64 | + public void handForDevice(RequestEvent evt, Device device, Element element) { | ||
| 65 | + String key = DeferredResultHolder.CALLBACK_CMD_CATALOG + device.getDeviceId(); | ||
| 66 | + Element rootElement = null; | ||
| 67 | + try { | ||
| 68 | + rootElement = getRootElement(evt, device.getCharset()); | ||
| 69 | + Element deviceListElement = rootElement.element("DeviceList"); | ||
| 70 | + Iterator<Element> deviceListIterator = deviceListElement.elementIterator(); | ||
| 71 | + if (deviceListIterator != null) { | ||
| 72 | + | ||
| 73 | + // 遍历DeviceList | ||
| 74 | + while (deviceListIterator.hasNext()) { | ||
| 75 | + Element itemDevice = deviceListIterator.next(); | ||
| 76 | + Element channelDeviceElement = itemDevice.element("DeviceID"); | ||
| 77 | + if (channelDeviceElement == null) { | ||
| 78 | + continue; | ||
| 79 | + } | ||
| 80 | + String channelDeviceId = channelDeviceElement.getText(); | ||
| 81 | + Element channdelNameElement = itemDevice.element("Name"); | ||
| 82 | + String channelName = channdelNameElement != null ? channdelNameElement.getTextTrim().toString() : ""; | ||
| 83 | + Element statusElement = itemDevice.element("Status"); | ||
| 84 | + String status = statusElement != null ? statusElement.getText().toString() : "ON"; | ||
| 85 | + DeviceChannel deviceChannel = new DeviceChannel(); | ||
| 86 | + deviceChannel.setName(channelName); | ||
| 87 | + deviceChannel.setChannelId(channelDeviceId); | ||
| 88 | + // ONLINE OFFLINE HIKVISION DS-7716N-E4 NVR的兼容性处理 | ||
| 89 | + if (status.equals("ON") || status.equals("On") || status.equals("ONLINE")) { | ||
| 90 | + deviceChannel.setStatus(1); | ||
| 91 | + } | ||
| 92 | + if (status.equals("OFF") || status.equals("Off") || status.equals("OFFLINE")) { | ||
| 93 | + deviceChannel.setStatus(0); | ||
| 94 | + } | ||
| 95 | + | ||
| 96 | + deviceChannel.setManufacture(getText(itemDevice, "Manufacturer")); | ||
| 97 | + deviceChannel.setModel(getText(itemDevice, "Model")); | ||
| 98 | + deviceChannel.setOwner(getText(itemDevice, "Owner")); | ||
| 99 | + deviceChannel.setCivilCode(getText(itemDevice, "CivilCode")); | ||
| 100 | + deviceChannel.setBlock(getText(itemDevice, "Block")); | ||
| 101 | + deviceChannel.setAddress(getText(itemDevice, "Address")); | ||
| 102 | + if (getText(itemDevice, "Parental") == null || getText(itemDevice, "Parental") == "") { | ||
| 103 | + deviceChannel.setParental(0); | ||
| 104 | + } else { | ||
| 105 | + deviceChannel.setParental(Integer.parseInt(getText(itemDevice, "Parental"))); | ||
| 106 | + } | ||
| 107 | + deviceChannel.setParentId(getText(itemDevice, "ParentID")); | ||
| 108 | + if (getText(itemDevice, "SafetyWay") == null || getText(itemDevice, "SafetyWay") == "") { | ||
| 109 | + deviceChannel.setSafetyWay(0); | ||
| 110 | + } else { | ||
| 111 | + deviceChannel.setSafetyWay(Integer.parseInt(getText(itemDevice, "SafetyWay"))); | ||
| 112 | + } | ||
| 113 | + if (getText(itemDevice, "RegisterWay") == null || getText(itemDevice, "RegisterWay") == "") { | ||
| 114 | + deviceChannel.setRegisterWay(1); | ||
| 115 | + } else { | ||
| 116 | + deviceChannel.setRegisterWay(Integer.parseInt(getText(itemDevice, "RegisterWay"))); | ||
| 117 | + } | ||
| 118 | + deviceChannel.setCertNum(getText(itemDevice, "CertNum")); | ||
| 119 | + if (getText(itemDevice, "Certifiable") == null || getText(itemDevice, "Certifiable") == "") { | ||
| 120 | + deviceChannel.setCertifiable(0); | ||
| 121 | + } else { | ||
| 122 | + deviceChannel.setCertifiable(Integer.parseInt(getText(itemDevice, "Certifiable"))); | ||
| 123 | + } | ||
| 124 | + if (getText(itemDevice, "ErrCode") == null || getText(itemDevice, "ErrCode") == "") { | ||
| 125 | + deviceChannel.setErrCode(0); | ||
| 126 | + } else { | ||
| 127 | + deviceChannel.setErrCode(Integer.parseInt(getText(itemDevice, "ErrCode"))); | ||
| 128 | + } | ||
| 129 | + deviceChannel.setEndTime(getText(itemDevice, "EndTime")); | ||
| 130 | + deviceChannel.setSecrecy(getText(itemDevice, "Secrecy")); | ||
| 131 | + deviceChannel.setIpAddress(getText(itemDevice, "IPAddress")); | ||
| 132 | + if (getText(itemDevice, "Port") == null || getText(itemDevice, "Port") == "") { | ||
| 133 | + deviceChannel.setPort(0); | ||
| 134 | + } else { | ||
| 135 | + deviceChannel.setPort(Integer.parseInt(getText(itemDevice, "Port"))); | ||
| 136 | + } | ||
| 137 | + deviceChannel.setPassword(getText(itemDevice, "Password")); | ||
| 138 | + if (NumericUtil.isDouble(getText(itemDevice, "Longitude"))) { | ||
| 139 | + deviceChannel.setLongitude(Double.parseDouble(getText(itemDevice, "Longitude"))); | ||
| 140 | + } else { | ||
| 141 | + deviceChannel.setLongitude(0.00); | ||
| 142 | + } | ||
| 143 | + if (NumericUtil.isDouble(getText(itemDevice, "Latitude"))) { | ||
| 144 | + deviceChannel.setLatitude(Double.parseDouble(getText(itemDevice, "Latitude"))); | ||
| 145 | + } else { | ||
| 146 | + deviceChannel.setLatitude(0.00); | ||
| 147 | + } | ||
| 148 | + if (getText(itemDevice, "PTZType") == null || getText(itemDevice, "PTZType") == "") { | ||
| 149 | + deviceChannel.setPTZType(0); | ||
| 150 | + } else { | ||
| 151 | + deviceChannel.setPTZType(Integer.parseInt(getText(itemDevice, "PTZType"))); | ||
| 152 | + } | ||
| 153 | + deviceChannel.setHasAudio(true); // 默认含有音频,播放时再检查是否有音频及是否AAC | ||
| 154 | + storager.updateChannel(device.getDeviceId(), deviceChannel); | ||
| 155 | + } | ||
| 156 | + | ||
| 157 | + RequestMessage msg = new RequestMessage(); | ||
| 158 | + msg.setKey(key); | ||
| 159 | + msg.setData(device); | ||
| 160 | + deferredResultHolder.invokeAllResult(msg); | ||
| 161 | + // 回复200 OK | ||
| 162 | + responseAck(evt, Response.OK); | ||
| 163 | + if (offLineDetector.isOnline(device.getDeviceId())) { | ||
| 164 | + publisher.onlineEventPublish(device, VideoManagerConstants.EVENT_ONLINE_MESSAGE); | ||
| 165 | + } | ||
| 166 | + } | ||
| 167 | + } catch (DocumentException e) { | ||
| 168 | + e.printStackTrace(); | ||
| 169 | + } catch (InvalidArgumentException e) { | ||
| 170 | + e.printStackTrace(); | ||
| 171 | + } catch (ParseException e) { | ||
| 172 | + e.printStackTrace(); | ||
| 173 | + } catch (SipException e) { | ||
| 174 | + e.printStackTrace(); | ||
| 175 | + } | ||
| 176 | + } | ||
| 177 | + | ||
| 178 | + @Override | ||
| 179 | + public void handForPlatform(RequestEvent evt, ParentPlatform parentPlatform, Element rootElement) { | ||
| 180 | + | ||
| 181 | + } | ||
| 182 | +} |
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/response/cmd/ConfigDownloadMessageHandler.java
0 → 100644
| 1 | +package com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.response.cmd; | ||
| 2 | + | ||
| 3 | +import com.alibaba.fastjson.JSONObject; | ||
| 4 | +import com.genersoft.iot.vmp.gb28181.bean.Device; | ||
| 5 | +import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform; | ||
| 6 | +import com.genersoft.iot.vmp.gb28181.event.EventPublisher; | ||
| 7 | +import com.genersoft.iot.vmp.gb28181.transmit.callback.DeferredResultHolder; | ||
| 8 | +import com.genersoft.iot.vmp.gb28181.transmit.callback.RequestMessage; | ||
| 9 | +import com.genersoft.iot.vmp.gb28181.transmit.event.request.SIPRequestProcessorParent; | ||
| 10 | +import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.IMessageHandler; | ||
| 11 | +import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.response.ResponseMessageHandler; | ||
| 12 | +import com.genersoft.iot.vmp.gb28181.utils.XmlUtil; | ||
| 13 | +import org.dom4j.Element; | ||
| 14 | +import org.slf4j.Logger; | ||
| 15 | +import org.slf4j.LoggerFactory; | ||
| 16 | +import org.springframework.beans.factory.InitializingBean; | ||
| 17 | +import org.springframework.beans.factory.annotation.Autowired; | ||
| 18 | +import org.springframework.stereotype.Component; | ||
| 19 | + | ||
| 20 | +import javax.sip.InvalidArgumentException; | ||
| 21 | +import javax.sip.RequestEvent; | ||
| 22 | +import javax.sip.SipException; | ||
| 23 | +import javax.sip.message.Response; | ||
| 24 | +import java.text.ParseException; | ||
| 25 | + | ||
| 26 | +import static com.genersoft.iot.vmp.gb28181.utils.XmlUtil.getText; | ||
| 27 | + | ||
| 28 | +@Component | ||
| 29 | +public class ConfigDownloadMessageHandler extends SIPRequestProcessorParent implements InitializingBean, IMessageHandler { | ||
| 30 | + | ||
| 31 | + private Logger logger = LoggerFactory.getLogger(ConfigDownloadMessageHandler.class); | ||
| 32 | + private final String cmdType = "ConfigDownload"; | ||
| 33 | + | ||
| 34 | + @Autowired | ||
| 35 | + private ResponseMessageHandler responseMessageHandler; | ||
| 36 | + | ||
| 37 | + @Autowired | ||
| 38 | + private EventPublisher publisher; | ||
| 39 | + | ||
| 40 | + @Autowired | ||
| 41 | + private DeferredResultHolder deferredResultHolder; | ||
| 42 | + | ||
| 43 | + @Override | ||
| 44 | + public void afterPropertiesSet() throws Exception { | ||
| 45 | + responseMessageHandler.addHandler(cmdType, this); | ||
| 46 | + } | ||
| 47 | + | ||
| 48 | + | ||
| 49 | + @Override | ||
| 50 | + public void handForDevice(RequestEvent evt, Device device, Element element) { | ||
| 51 | + String channelId = getText(element, "DeviceID"); | ||
| 52 | + String key = DeferredResultHolder.CALLBACK_CMD_CONFIGDOWNLOAD + device.getDeviceId() + channelId; | ||
| 53 | + try { | ||
| 54 | + // 回复200 OK | ||
| 55 | + responseAck(evt, Response.OK); | ||
| 56 | + // 此处是对本平台发出DeviceControl指令的应答 | ||
| 57 | + JSONObject json = new JSONObject(); | ||
| 58 | + XmlUtil.node2Json(element, json); | ||
| 59 | + if (logger.isDebugEnabled()) { | ||
| 60 | + logger.debug(json.toJSONString()); | ||
| 61 | + } | ||
| 62 | + RequestMessage msg = new RequestMessage(); | ||
| 63 | + msg.setKey(key); | ||
| 64 | + msg.setData(json); | ||
| 65 | + deferredResultHolder.invokeAllResult(msg); | ||
| 66 | + } catch (SipException e) { | ||
| 67 | + e.printStackTrace(); | ||
| 68 | + } catch (InvalidArgumentException e) { | ||
| 69 | + e.printStackTrace(); | ||
| 70 | + } catch (ParseException e) { | ||
| 71 | + e.printStackTrace(); | ||
| 72 | + } | ||
| 73 | + | ||
| 74 | + } | ||
| 75 | + | ||
| 76 | + @Override | ||
| 77 | + public void handForPlatform(RequestEvent evt, ParentPlatform parentPlatform, Element element) { | ||
| 78 | + // 不会收到上级平台的心跳信息 | ||
| 79 | + | ||
| 80 | + } | ||
| 81 | +} |
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/response/cmd/DeviceConfigMessageHandler.java
0 → 100644
| 1 | +package com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.response.cmd; | ||
| 2 | + | ||
| 3 | +import com.alibaba.fastjson.JSONObject; | ||
| 4 | +import com.genersoft.iot.vmp.gb28181.bean.Device; | ||
| 5 | +import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform; | ||
| 6 | +import com.genersoft.iot.vmp.gb28181.transmit.callback.DeferredResultHolder; | ||
| 7 | +import com.genersoft.iot.vmp.gb28181.transmit.callback.RequestMessage; | ||
| 8 | +import com.genersoft.iot.vmp.gb28181.transmit.event.request.SIPRequestProcessorParent; | ||
| 9 | +import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.IMessageHandler; | ||
| 10 | +import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.response.ResponseMessageHandler; | ||
| 11 | +import com.genersoft.iot.vmp.gb28181.utils.XmlUtil; | ||
| 12 | +import org.dom4j.Element; | ||
| 13 | +import org.slf4j.Logger; | ||
| 14 | +import org.slf4j.LoggerFactory; | ||
| 15 | +import org.springframework.beans.factory.InitializingBean; | ||
| 16 | +import org.springframework.beans.factory.annotation.Autowired; | ||
| 17 | +import org.springframework.stereotype.Component; | ||
| 18 | + | ||
| 19 | +import javax.sip.RequestEvent; | ||
| 20 | + | ||
| 21 | +import static com.genersoft.iot.vmp.gb28181.utils.XmlUtil.getText; | ||
| 22 | + | ||
| 23 | +@Component | ||
| 24 | +public class DeviceConfigMessageHandler extends SIPRequestProcessorParent implements InitializingBean, IMessageHandler { | ||
| 25 | + | ||
| 26 | + private Logger logger = LoggerFactory.getLogger(DeviceConfigMessageHandler.class); | ||
| 27 | + private final String cmdType = "DeviceConfig"; | ||
| 28 | + | ||
| 29 | + @Autowired | ||
| 30 | + private ResponseMessageHandler responseMessageHandler; | ||
| 31 | + | ||
| 32 | + @Autowired | ||
| 33 | + private DeferredResultHolder deferredResultHolder; | ||
| 34 | + | ||
| 35 | + @Override | ||
| 36 | + public void afterPropertiesSet() throws Exception { | ||
| 37 | + responseMessageHandler.addHandler(cmdType, this); | ||
| 38 | + } | ||
| 39 | + | ||
| 40 | + @Override | ||
| 41 | + public void handForDevice(RequestEvent evt, Device device, Element element) { | ||
| 42 | + JSONObject json = new JSONObject(); | ||
| 43 | + XmlUtil.node2Json(element, json); | ||
| 44 | + String channelId = getText(element, "DeviceID"); | ||
| 45 | + if (logger.isDebugEnabled()) { | ||
| 46 | + logger.debug(json.toJSONString()); | ||
| 47 | + } | ||
| 48 | + String key = DeferredResultHolder.CALLBACK_CMD_DEVICECONFIG + device.getDeviceId() + channelId; | ||
| 49 | + RequestMessage msg = new RequestMessage(); | ||
| 50 | + msg.setKey(key); | ||
| 51 | + msg.setData(json); | ||
| 52 | + deferredResultHolder.invokeAllResult(msg); | ||
| 53 | + } | ||
| 54 | + | ||
| 55 | + @Override | ||
| 56 | + public void handForPlatform(RequestEvent evt, ParentPlatform parentPlatform, Element rootElement) { | ||
| 57 | + } | ||
| 58 | +} |
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/response/cmd/DeviceControlMessageHandler.java
0 → 100644
| 1 | +package com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.response.cmd; | ||
| 2 | + | ||
| 3 | +import com.alibaba.fastjson.JSONObject; | ||
| 4 | +import com.genersoft.iot.vmp.gb28181.bean.Device; | ||
| 5 | +import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform; | ||
| 6 | +import com.genersoft.iot.vmp.gb28181.transmit.callback.DeferredResultHolder; | ||
| 7 | +import com.genersoft.iot.vmp.gb28181.transmit.callback.RequestMessage; | ||
| 8 | +import com.genersoft.iot.vmp.gb28181.transmit.event.request.SIPRequestProcessorParent; | ||
| 9 | +import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.IMessageHandler; | ||
| 10 | +import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.response.ResponseMessageHandler; | ||
| 11 | +import com.genersoft.iot.vmp.gb28181.utils.XmlUtil; | ||
| 12 | +import org.dom4j.Element; | ||
| 13 | +import org.slf4j.Logger; | ||
| 14 | +import org.slf4j.LoggerFactory; | ||
| 15 | +import org.springframework.beans.factory.InitializingBean; | ||
| 16 | +import org.springframework.beans.factory.annotation.Autowired; | ||
| 17 | +import org.springframework.stereotype.Component; | ||
| 18 | + | ||
| 19 | +import javax.sip.RequestEvent; | ||
| 20 | + | ||
| 21 | +import static com.genersoft.iot.vmp.gb28181.utils.XmlUtil.getText; | ||
| 22 | + | ||
| 23 | +@Component | ||
| 24 | +public class DeviceControlMessageHandler extends SIPRequestProcessorParent implements InitializingBean, IMessageHandler { | ||
| 25 | + | ||
| 26 | + private Logger logger = LoggerFactory.getLogger(DeviceControlMessageHandler.class); | ||
| 27 | + private final String cmdType = "DeviceControl"; | ||
| 28 | + | ||
| 29 | + @Autowired | ||
| 30 | + private ResponseMessageHandler responseMessageHandler; | ||
| 31 | + | ||
| 32 | + @Autowired | ||
| 33 | + private DeferredResultHolder deferredResultHolder; | ||
| 34 | + | ||
| 35 | + @Override | ||
| 36 | + public void afterPropertiesSet() throws Exception { | ||
| 37 | + responseMessageHandler.addHandler(cmdType, this); | ||
| 38 | + } | ||
| 39 | + | ||
| 40 | + @Override | ||
| 41 | + public void handForDevice(RequestEvent evt, Device device, Element element) { | ||
| 42 | + // 此处是对本平台发出DeviceControl指令的应答 | ||
| 43 | + JSONObject json = new JSONObject(); | ||
| 44 | + String channelId = getText(element, "DeviceID"); | ||
| 45 | + XmlUtil.node2Json(element, json); | ||
| 46 | + if (logger.isDebugEnabled()) { | ||
| 47 | + logger.debug(json.toJSONString()); | ||
| 48 | + } | ||
| 49 | + RequestMessage msg = new RequestMessage(); | ||
| 50 | + String key = DeferredResultHolder.CALLBACK_CMD_DEVICECONTROL + device.getDeviceId() + channelId; | ||
| 51 | + msg.setKey(key); | ||
| 52 | + msg.setData(json); | ||
| 53 | + deferredResultHolder.invokeAllResult(msg); | ||
| 54 | + } | ||
| 55 | + | ||
| 56 | + @Override | ||
| 57 | + public void handForPlatform(RequestEvent evt, ParentPlatform parentPlatform, Element rootElement) { | ||
| 58 | + } | ||
| 59 | +} |
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/response/cmd/DeviceInfoMessageHandler.java
0 → 100644
| 1 | +package com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.response.cmd; | ||
| 2 | + | ||
| 3 | +import com.genersoft.iot.vmp.common.VideoManagerConstants; | ||
| 4 | +import com.genersoft.iot.vmp.conf.SipConfig; | ||
| 5 | +import com.genersoft.iot.vmp.gb28181.bean.Device; | ||
| 6 | +import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform; | ||
| 7 | +import com.genersoft.iot.vmp.gb28181.event.DeviceOffLineDetector; | ||
| 8 | +import com.genersoft.iot.vmp.gb28181.event.EventPublisher; | ||
| 9 | +import com.genersoft.iot.vmp.gb28181.transmit.callback.DeferredResultHolder; | ||
| 10 | +import com.genersoft.iot.vmp.gb28181.transmit.callback.RequestMessage; | ||
| 11 | +import com.genersoft.iot.vmp.gb28181.transmit.event.request.SIPRequestProcessorParent; | ||
| 12 | +import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.IMessageHandler; | ||
| 13 | +import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.response.ResponseMessageHandler; | ||
| 14 | +import com.genersoft.iot.vmp.storager.IVideoManagerStorager; | ||
| 15 | +import org.dom4j.DocumentException; | ||
| 16 | +import org.dom4j.Element; | ||
| 17 | +import org.slf4j.Logger; | ||
| 18 | +import org.slf4j.LoggerFactory; | ||
| 19 | +import org.springframework.beans.factory.InitializingBean; | ||
| 20 | +import org.springframework.beans.factory.annotation.Autowired; | ||
| 21 | +import org.springframework.stereotype.Component; | ||
| 22 | +import org.springframework.util.StringUtils; | ||
| 23 | + | ||
| 24 | +import javax.sip.InvalidArgumentException; | ||
| 25 | +import javax.sip.RequestEvent; | ||
| 26 | +import javax.sip.SipException; | ||
| 27 | +import javax.sip.message.Response; | ||
| 28 | +import java.text.ParseException; | ||
| 29 | + | ||
| 30 | +import static com.genersoft.iot.vmp.gb28181.utils.XmlUtil.getText; | ||
| 31 | + | ||
| 32 | +@Component | ||
| 33 | +public class DeviceInfoMessageHandler extends SIPRequestProcessorParent implements InitializingBean, IMessageHandler { | ||
| 34 | + | ||
| 35 | + private Logger logger = LoggerFactory.getLogger(DeviceInfoMessageHandler.class); | ||
| 36 | + private final String cmdType = "DeviceInfo"; | ||
| 37 | + | ||
| 38 | + @Autowired | ||
| 39 | + private ResponseMessageHandler responseMessageHandler; | ||
| 40 | + | ||
| 41 | + @Autowired | ||
| 42 | + private IVideoManagerStorager storager; | ||
| 43 | + | ||
| 44 | + @Autowired | ||
| 45 | + private DeferredResultHolder deferredResultHolder; | ||
| 46 | + | ||
| 47 | + @Autowired | ||
| 48 | + private DeviceOffLineDetector offLineDetector; | ||
| 49 | + | ||
| 50 | + @Autowired | ||
| 51 | + private SipConfig config; | ||
| 52 | + | ||
| 53 | + @Autowired | ||
| 54 | + private EventPublisher publisher; | ||
| 55 | + | ||
| 56 | + @Override | ||
| 57 | + public void afterPropertiesSet() throws Exception { | ||
| 58 | + responseMessageHandler.addHandler(cmdType, this); | ||
| 59 | + } | ||
| 60 | + | ||
| 61 | + @Override | ||
| 62 | + public void handForDevice(RequestEvent evt, Device device, Element rootElement) { | ||
| 63 | + logger.debug("接收到DeviceInfo应答消息"); | ||
| 64 | + try { | ||
| 65 | + rootElement = getRootElement(evt, device.getCharset()); | ||
| 66 | + Element deviceIdElement = rootElement.element("DeviceID"); | ||
| 67 | + String channelId = deviceIdElement.getTextTrim(); | ||
| 68 | + String key = DeferredResultHolder.CALLBACK_CMD_DEVICEINFO + device.getDeviceId() + channelId; | ||
| 69 | + device.setName(getText(rootElement, "DeviceName")); | ||
| 70 | + | ||
| 71 | + device.setManufacturer(getText(rootElement, "Manufacturer")); | ||
| 72 | + device.setModel(getText(rootElement, "Model")); | ||
| 73 | + device.setFirmware(getText(rootElement, "Firmware")); | ||
| 74 | + if (StringUtils.isEmpty(device.getStreamMode())) { | ||
| 75 | + device.setStreamMode("UDP"); | ||
| 76 | + } | ||
| 77 | + storager.updateDevice(device); | ||
| 78 | + | ||
| 79 | + RequestMessage msg = new RequestMessage(); | ||
| 80 | + msg.setKey(key); | ||
| 81 | + msg.setData(device); | ||
| 82 | + deferredResultHolder.invokeAllResult(msg); | ||
| 83 | + // 回复200 OK | ||
| 84 | + responseAck(evt, Response.OK); | ||
| 85 | + if (offLineDetector.isOnline(device.getDeviceId())) { | ||
| 86 | + publisher.onlineEventPublish(device, VideoManagerConstants.EVENT_ONLINE_MESSAGE); | ||
| 87 | + } | ||
| 88 | + } catch (DocumentException e) { | ||
| 89 | + e.printStackTrace(); | ||
| 90 | + } catch (InvalidArgumentException e) { | ||
| 91 | + e.printStackTrace(); | ||
| 92 | + } catch (ParseException e) { | ||
| 93 | + e.printStackTrace(); | ||
| 94 | + } catch (SipException e) { | ||
| 95 | + e.printStackTrace(); | ||
| 96 | + } | ||
| 97 | + } | ||
| 98 | + | ||
| 99 | + @Override | ||
| 100 | + public void handForPlatform(RequestEvent evt, ParentPlatform parentPlatform, Element rootElement) { | ||
| 101 | + | ||
| 102 | + } | ||
| 103 | +} |
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/response/cmd/DeviceStatusMessageHandler.java
0 → 100644
| 1 | +package com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.response.cmd; | ||
| 2 | + | ||
| 3 | +import com.alibaba.fastjson.JSONObject; | ||
| 4 | +import com.genersoft.iot.vmp.common.VideoManagerConstants; | ||
| 5 | +import com.genersoft.iot.vmp.gb28181.bean.Device; | ||
| 6 | +import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform; | ||
| 7 | +import com.genersoft.iot.vmp.gb28181.event.DeviceOffLineDetector; | ||
| 8 | +import com.genersoft.iot.vmp.gb28181.event.EventPublisher; | ||
| 9 | +import com.genersoft.iot.vmp.gb28181.transmit.callback.DeferredResultHolder; | ||
| 10 | +import com.genersoft.iot.vmp.gb28181.transmit.callback.RequestMessage; | ||
| 11 | +import com.genersoft.iot.vmp.gb28181.transmit.event.request.SIPRequestProcessorParent; | ||
| 12 | +import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.IMessageHandler; | ||
| 13 | +import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.response.ResponseMessageHandler; | ||
| 14 | +import com.genersoft.iot.vmp.gb28181.utils.XmlUtil; | ||
| 15 | +import org.dom4j.Element; | ||
| 16 | +import org.slf4j.Logger; | ||
| 17 | +import org.slf4j.LoggerFactory; | ||
| 18 | +import org.springframework.beans.factory.InitializingBean; | ||
| 19 | +import org.springframework.beans.factory.annotation.Autowired; | ||
| 20 | +import org.springframework.stereotype.Component; | ||
| 21 | + | ||
| 22 | +import javax.sip.InvalidArgumentException; | ||
| 23 | +import javax.sip.RequestEvent; | ||
| 24 | +import javax.sip.SipException; | ||
| 25 | +import javax.sip.message.Response; | ||
| 26 | +import java.text.ParseException; | ||
| 27 | + | ||
| 28 | +@Component | ||
| 29 | +public class DeviceStatusMessageHandler extends SIPRequestProcessorParent implements InitializingBean, IMessageHandler { | ||
| 30 | + | ||
| 31 | + private Logger logger = LoggerFactory.getLogger(DeviceStatusMessageHandler.class); | ||
| 32 | + private final String cmdType = "DeviceStatus"; | ||
| 33 | + | ||
| 34 | + @Autowired | ||
| 35 | + private ResponseMessageHandler responseMessageHandler; | ||
| 36 | + | ||
| 37 | + @Autowired | ||
| 38 | + private DeviceOffLineDetector offLineDetector; | ||
| 39 | + | ||
| 40 | + @Autowired | ||
| 41 | + private DeferredResultHolder deferredResultHolder; | ||
| 42 | + | ||
| 43 | + @Autowired | ||
| 44 | + private EventPublisher publisher; | ||
| 45 | + | ||
| 46 | + @Override | ||
| 47 | + public void afterPropertiesSet() throws Exception { | ||
| 48 | + responseMessageHandler.addHandler(cmdType, this); | ||
| 49 | + } | ||
| 50 | + | ||
| 51 | + @Override | ||
| 52 | + public void handForDevice(RequestEvent evt, Device device, Element element) { | ||
| 53 | + logger.info("接收到DeviceStatus应答消息"); | ||
| 54 | + // 检查设备是否存在, 不存在则不回复 | ||
| 55 | + // 回复200 OK | ||
| 56 | + try { | ||
| 57 | + responseAck(evt, Response.OK); | ||
| 58 | + } catch (SipException e) { | ||
| 59 | + e.printStackTrace(); | ||
| 60 | + } catch (InvalidArgumentException e) { | ||
| 61 | + e.printStackTrace(); | ||
| 62 | + } catch (ParseException e) { | ||
| 63 | + e.printStackTrace(); | ||
| 64 | + } | ||
| 65 | + Element deviceIdElement = element.element("DeviceID"); | ||
| 66 | + String channelId = deviceIdElement.getText(); | ||
| 67 | + JSONObject json = new JSONObject(); | ||
| 68 | + XmlUtil.node2Json(element, json); | ||
| 69 | + if (logger.isDebugEnabled()) { | ||
| 70 | + logger.debug(json.toJSONString()); | ||
| 71 | + } | ||
| 72 | + RequestMessage msg = new RequestMessage(); | ||
| 73 | + msg.setKey(DeferredResultHolder.CALLBACK_CMD_DEVICESTATUS + device.getDeviceId() + channelId); | ||
| 74 | + msg.setData(json); | ||
| 75 | + deferredResultHolder.invokeAllResult(msg); | ||
| 76 | + | ||
| 77 | + if (offLineDetector.isOnline(device.getDeviceId())) { | ||
| 78 | + publisher.onlineEventPublish(device, VideoManagerConstants.EVENT_ONLINE_MESSAGE); | ||
| 79 | + } else { | ||
| 80 | + | ||
| 81 | + } | ||
| 82 | + } | ||
| 83 | + | ||
| 84 | + @Override | ||
| 85 | + public void handForPlatform(RequestEvent evt, ParentPlatform parentPlatform, Element rootElement) { | ||
| 86 | + | ||
| 87 | + | ||
| 88 | + } | ||
| 89 | +} |
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/response/cmd/MobilePositionMessageHandler.java
0 → 100644
| 1 | +package com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.response.cmd; | ||
| 2 | + | ||
| 3 | +import com.genersoft.iot.vmp.conf.UserSetup; | ||
| 4 | +import com.genersoft.iot.vmp.gb28181.bean.BaiduPoint; | ||
| 5 | +import com.genersoft.iot.vmp.gb28181.bean.Device; | ||
| 6 | +import com.genersoft.iot.vmp.gb28181.bean.MobilePosition; | ||
| 7 | +import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform; | ||
| 8 | +import com.genersoft.iot.vmp.gb28181.transmit.event.request.SIPRequestProcessorParent; | ||
| 9 | +import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.IMessageHandler; | ||
| 10 | +import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.response.ResponseMessageHandler; | ||
| 11 | +import com.genersoft.iot.vmp.gb28181.utils.NumericUtil; | ||
| 12 | +import com.genersoft.iot.vmp.storager.IVideoManagerStorager; | ||
| 13 | +import com.genersoft.iot.vmp.utils.GpsUtil; | ||
| 14 | +import org.dom4j.DocumentException; | ||
| 15 | +import org.dom4j.Element; | ||
| 16 | +import org.slf4j.Logger; | ||
| 17 | +import org.slf4j.LoggerFactory; | ||
| 18 | +import org.springframework.beans.factory.InitializingBean; | ||
| 19 | +import org.springframework.beans.factory.annotation.Autowired; | ||
| 20 | +import org.springframework.stereotype.Component; | ||
| 21 | +import org.springframework.util.StringUtils; | ||
| 22 | + | ||
| 23 | +import javax.sip.InvalidArgumentException; | ||
| 24 | +import javax.sip.RequestEvent; | ||
| 25 | +import javax.sip.SipException; | ||
| 26 | +import javax.sip.message.Response; | ||
| 27 | +import java.text.ParseException; | ||
| 28 | + | ||
| 29 | +import static com.genersoft.iot.vmp.gb28181.utils.XmlUtil.getText; | ||
| 30 | + | ||
| 31 | +@Component | ||
| 32 | +public class MobilePositionMessageHandler extends SIPRequestProcessorParent implements InitializingBean, IMessageHandler { | ||
| 33 | + | ||
| 34 | + private Logger logger = LoggerFactory.getLogger(MobilePositionMessageHandler.class); | ||
| 35 | + private final String cmdType = "MobilePosition"; | ||
| 36 | + | ||
| 37 | + @Autowired | ||
| 38 | + private ResponseMessageHandler responseMessageHandler; | ||
| 39 | + | ||
| 40 | + @Autowired | ||
| 41 | + private UserSetup userSetup; | ||
| 42 | + | ||
| 43 | + @Autowired | ||
| 44 | + private IVideoManagerStorager storager; | ||
| 45 | + | ||
| 46 | + @Override | ||
| 47 | + public void afterPropertiesSet() throws Exception { | ||
| 48 | + responseMessageHandler.addHandler(cmdType, this); | ||
| 49 | + } | ||
| 50 | + | ||
| 51 | + @Override | ||
| 52 | + public void handForDevice(RequestEvent evt, Device device, Element rootElement) { | ||
| 53 | + | ||
| 54 | + try { | ||
| 55 | + rootElement = getRootElement(evt, device.getCharset()); | ||
| 56 | + | ||
| 57 | + MobilePosition mobilePosition = new MobilePosition(); | ||
| 58 | + if (!StringUtils.isEmpty(device.getName())) { | ||
| 59 | + mobilePosition.setDeviceName(device.getName()); | ||
| 60 | + } | ||
| 61 | + mobilePosition.setDeviceId(device.getDeviceId()); | ||
| 62 | + mobilePosition.setChannelId(getText(rootElement, "DeviceID")); | ||
| 63 | + mobilePosition.setTime(getText(rootElement, "Time")); | ||
| 64 | + mobilePosition.setLongitude(Double.parseDouble(getText(rootElement, "Longitude"))); | ||
| 65 | + mobilePosition.setLatitude(Double.parseDouble(getText(rootElement, "Latitude"))); | ||
| 66 | + if (NumericUtil.isDouble(getText(rootElement, "Speed"))) { | ||
| 67 | + mobilePosition.setSpeed(Double.parseDouble(getText(rootElement, "Speed"))); | ||
| 68 | + } else { | ||
| 69 | + mobilePosition.setSpeed(0.0); | ||
| 70 | + } | ||
| 71 | + if (NumericUtil.isDouble(getText(rootElement, "Direction"))) { | ||
| 72 | + mobilePosition.setDirection(Double.parseDouble(getText(rootElement, "Direction"))); | ||
| 73 | + } else { | ||
| 74 | + mobilePosition.setDirection(0.0); | ||
| 75 | + } | ||
| 76 | + if (NumericUtil.isDouble(getText(rootElement, "Altitude"))) { | ||
| 77 | + mobilePosition.setAltitude(Double.parseDouble(getText(rootElement, "Altitude"))); | ||
| 78 | + } else { | ||
| 79 | + mobilePosition.setAltitude(0.0); | ||
| 80 | + } | ||
| 81 | + mobilePosition.setReportSource("Mobile Position"); | ||
| 82 | + BaiduPoint bp = new BaiduPoint(); | ||
| 83 | + bp = GpsUtil.Wgs84ToBd09(String.valueOf(mobilePosition.getLongitude()), String.valueOf(mobilePosition.getLatitude())); | ||
| 84 | + logger.info("百度坐标:" + bp.getBdLng() + ", " + bp.getBdLat()); | ||
| 85 | + mobilePosition.setGeodeticSystem("BD-09"); | ||
| 86 | + mobilePosition.setCnLng(bp.getBdLng()); | ||
| 87 | + mobilePosition.setCnLat(bp.getBdLat()); | ||
| 88 | + if (!userSetup.getSavePositionHistory()) { | ||
| 89 | + storager.clearMobilePositionsByDeviceId(device.getDeviceId()); | ||
| 90 | + } | ||
| 91 | + storager.insertMobilePosition(mobilePosition); | ||
| 92 | + //回复 200 OK | ||
| 93 | + responseAck(evt, Response.OK); | ||
| 94 | + } catch (DocumentException | SipException | InvalidArgumentException | ParseException e) { | ||
| 95 | + e.printStackTrace(); | ||
| 96 | + } | ||
| 97 | + } | ||
| 98 | + | ||
| 99 | + @Override | ||
| 100 | + public void handForPlatform(RequestEvent evt, ParentPlatform parentPlatform, Element element) { | ||
| 101 | + | ||
| 102 | + } | ||
| 103 | +} |
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/response/cmd/RecordInfoMessageHandler.java
0 → 100644
| 1 | +package com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.response.cmd; | ||
| 2 | + | ||
| 3 | +import com.genersoft.iot.vmp.gb28181.bean.Device; | ||
| 4 | +import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform; | ||
| 5 | +import com.genersoft.iot.vmp.gb28181.bean.RecordInfo; | ||
| 6 | +import com.genersoft.iot.vmp.gb28181.bean.RecordItem; | ||
| 7 | +import com.genersoft.iot.vmp.gb28181.transmit.callback.CheckForAllRecordsThread; | ||
| 8 | +import com.genersoft.iot.vmp.gb28181.transmit.callback.DeferredResultHolder; | ||
| 9 | +import com.genersoft.iot.vmp.gb28181.transmit.callback.RequestMessage; | ||
| 10 | +import com.genersoft.iot.vmp.gb28181.transmit.event.request.SIPRequestProcessorParent; | ||
| 11 | +import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.IMessageHandler; | ||
| 12 | +import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.response.ResponseMessageHandler; | ||
| 13 | +import com.genersoft.iot.vmp.gb28181.utils.DateUtil; | ||
| 14 | +import com.genersoft.iot.vmp.utils.redis.RedisUtil; | ||
| 15 | +import org.dom4j.DocumentException; | ||
| 16 | +import org.dom4j.Element; | ||
| 17 | +import org.slf4j.Logger; | ||
| 18 | +import org.slf4j.LoggerFactory; | ||
| 19 | +import org.springframework.beans.factory.InitializingBean; | ||
| 20 | +import org.springframework.beans.factory.annotation.Autowired; | ||
| 21 | +import org.springframework.stereotype.Component; | ||
| 22 | + | ||
| 23 | +import javax.sip.InvalidArgumentException; | ||
| 24 | +import javax.sip.RequestEvent; | ||
| 25 | +import javax.sip.SipException; | ||
| 26 | +import javax.sip.message.Response; | ||
| 27 | +import java.text.ParseException; | ||
| 28 | +import java.util.ArrayList; | ||
| 29 | +import java.util.Iterator; | ||
| 30 | +import java.util.List; | ||
| 31 | +import java.util.UUID; | ||
| 32 | + | ||
| 33 | +import static com.genersoft.iot.vmp.gb28181.utils.XmlUtil.getText; | ||
| 34 | + | ||
| 35 | +@Component | ||
| 36 | +public class RecordInfoMessageHandler extends SIPRequestProcessorParent implements InitializingBean, IMessageHandler { | ||
| 37 | + | ||
| 38 | + private Logger logger = LoggerFactory.getLogger(RecordInfoMessageHandler.class); | ||
| 39 | + public static volatile List<String> threadNameList = new ArrayList(); | ||
| 40 | + private final String cmdType = "RecordInfo"; | ||
| 41 | + private final static String CACHE_RECORDINFO_KEY = "CACHE_RECORDINFO_"; | ||
| 42 | + | ||
| 43 | + @Autowired | ||
| 44 | + private ResponseMessageHandler responseMessageHandler; | ||
| 45 | + | ||
| 46 | + @Autowired | ||
| 47 | + private RedisUtil redis; | ||
| 48 | + | ||
| 49 | + @Autowired | ||
| 50 | + private DeferredResultHolder deferredResultHolder; | ||
| 51 | + | ||
| 52 | + @Override | ||
| 53 | + public void afterPropertiesSet() throws Exception { | ||
| 54 | + responseMessageHandler.addHandler(cmdType, this); | ||
| 55 | + } | ||
| 56 | + | ||
| 57 | + @Override | ||
| 58 | + public void handForDevice(RequestEvent evt, Device device, Element rootElement) { | ||
| 59 | + | ||
| 60 | + // 回复200 OK | ||
| 61 | + try { | ||
| 62 | + responseAck(evt, Response.OK); | ||
| 63 | + | ||
| 64 | + rootElement = getRootElement(evt, device.getCharset()); | ||
| 65 | + String uuid = UUID.randomUUID().toString().replace("-", ""); | ||
| 66 | + RecordInfo recordInfo = new RecordInfo(); | ||
| 67 | + Element deviceIdElement = rootElement.element("DeviceID"); | ||
| 68 | + String channelId = deviceIdElement.getText(); | ||
| 69 | + String key = DeferredResultHolder.CALLBACK_CMD_RECORDINFO + device.getDeviceId() + channelId; | ||
| 70 | + recordInfo.setDeviceId(device.getDeviceId()); | ||
| 71 | + recordInfo.setChannelId(channelId); | ||
| 72 | + recordInfo.setName(getText(rootElement, "Name")); | ||
| 73 | + if (getText(rootElement, "SumNum") == null || getText(rootElement, "SumNum") == "") { | ||
| 74 | + recordInfo.setSumNum(0); | ||
| 75 | + } else { | ||
| 76 | + recordInfo.setSumNum(Integer.parseInt(getText(rootElement, "SumNum"))); | ||
| 77 | + } | ||
| 78 | + String sn = getText(rootElement, "SN"); | ||
| 79 | + Element recordListElement = rootElement.element("RecordList"); | ||
| 80 | + if (recordListElement == null || recordInfo.getSumNum() == 0) { | ||
| 81 | + logger.info("无录像数据"); | ||
| 82 | + RequestMessage msg = new RequestMessage(); | ||
| 83 | + msg.setKey(key); | ||
| 84 | + msg.setData(recordInfo); | ||
| 85 | + deferredResultHolder.invokeAllResult(msg); | ||
| 86 | + } else { | ||
| 87 | + Iterator<Element> recordListIterator = recordListElement.elementIterator(); | ||
| 88 | + List<RecordItem> recordList = new ArrayList<RecordItem>(); | ||
| 89 | + if (recordListIterator != null) { | ||
| 90 | + RecordItem record = new RecordItem(); | ||
| 91 | + logger.info("处理录像列表数据..."); | ||
| 92 | + // 遍历DeviceList | ||
| 93 | + while (recordListIterator.hasNext()) { | ||
| 94 | + Element itemRecord = recordListIterator.next(); | ||
| 95 | + Element recordElement = itemRecord.element("DeviceID"); | ||
| 96 | + if (recordElement == null) { | ||
| 97 | + logger.info("记录为空,下一个..."); | ||
| 98 | + continue; | ||
| 99 | + } | ||
| 100 | + record = new RecordItem(); | ||
| 101 | + record.setDeviceId(getText(itemRecord, "DeviceID")); | ||
| 102 | + record.setName(getText(itemRecord, "Name")); | ||
| 103 | + record.setFilePath(getText(itemRecord, "FilePath")); | ||
| 104 | + record.setAddress(getText(itemRecord, "Address")); | ||
| 105 | + record.setStartTime( | ||
| 106 | + DateUtil.ISO8601Toyyyy_MM_dd_HH_mm_ss(getText(itemRecord, "StartTime"))); | ||
| 107 | + record.setEndTime( | ||
| 108 | + DateUtil.ISO8601Toyyyy_MM_dd_HH_mm_ss(getText(itemRecord, "EndTime"))); | ||
| 109 | + record.setSecrecy(itemRecord.element("Secrecy") == null ? 0 | ||
| 110 | + : Integer.parseInt(getText(itemRecord, "Secrecy"))); | ||
| 111 | + record.setType(getText(itemRecord, "Type")); | ||
| 112 | + record.setRecorderId(getText(itemRecord, "RecorderID")); | ||
| 113 | + recordList.add(record); | ||
| 114 | + } | ||
| 115 | + recordInfo.setRecordList(recordList); | ||
| 116 | + } | ||
| 117 | + | ||
| 118 | + // 改用单独线程统计已获取录像文件数量,避免多包并行分别统计不完整的问题 | ||
| 119 | + String cacheKey = CACHE_RECORDINFO_KEY + device.getDeviceId() + sn; | ||
| 120 | + redis.set(cacheKey + "_" + uuid, recordList, 90); | ||
| 121 | + if (!threadNameList.contains(cacheKey)) { | ||
| 122 | + threadNameList.add(cacheKey); | ||
| 123 | + CheckForAllRecordsThread chk = new CheckForAllRecordsThread(cacheKey, recordInfo); | ||
| 124 | + chk.setName(cacheKey); | ||
| 125 | + chk.setDeferredResultHolder(deferredResultHolder); | ||
| 126 | + chk.setRedis(redis); | ||
| 127 | + chk.setLogger(logger); | ||
| 128 | + chk.start(); | ||
| 129 | + if (logger.isDebugEnabled()) { | ||
| 130 | + logger.debug("Start Thread " + cacheKey + "."); | ||
| 131 | + } | ||
| 132 | + } else { | ||
| 133 | + if (logger.isDebugEnabled()) { | ||
| 134 | + logger.debug("Thread " + cacheKey + " already started."); | ||
| 135 | + } | ||
| 136 | + } | ||
| 137 | + } | ||
| 138 | + } catch (SipException e) { | ||
| 139 | + e.printStackTrace(); | ||
| 140 | + } catch (InvalidArgumentException e) { | ||
| 141 | + e.printStackTrace(); | ||
| 142 | + } catch (ParseException e) { | ||
| 143 | + e.printStackTrace(); | ||
| 144 | + } catch (DocumentException e) { | ||
| 145 | + e.printStackTrace(); | ||
| 146 | + } | ||
| 147 | + } | ||
| 148 | + | ||
| 149 | + @Override | ||
| 150 | + public void handForPlatform(RequestEvent evt, ParentPlatform parentPlatform, Element element) { | ||
| 151 | + | ||
| 152 | + } | ||
| 153 | +} |
src/main/java/com/genersoft/iot/vmp/storager/IVideoManagerStorager.java
| 1 | package com.genersoft.iot.vmp.storager; | 1 | package com.genersoft.iot.vmp.storager; |
| 2 | 2 | ||
| 3 | -import java.util.List; | ||
| 4 | - | ||
| 5 | import com.genersoft.iot.vmp.gb28181.bean.*; | 3 | import com.genersoft.iot.vmp.gb28181.bean.*; |
| 6 | import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem; | 4 | import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem; |
| 7 | import com.genersoft.iot.vmp.media.zlm.dto.StreamProxyItem; | 5 | import com.genersoft.iot.vmp.media.zlm.dto.StreamProxyItem; |
| @@ -9,6 +7,8 @@ import com.genersoft.iot.vmp.media.zlm.dto.StreamPushItem; | @@ -9,6 +7,8 @@ import com.genersoft.iot.vmp.media.zlm.dto.StreamPushItem; | ||
| 9 | import com.genersoft.iot.vmp.vmanager.gb28181.platform.bean.ChannelReduce; | 7 | import com.genersoft.iot.vmp.vmanager.gb28181.platform.bean.ChannelReduce; |
| 10 | import com.github.pagehelper.PageInfo; | 8 | import com.github.pagehelper.PageInfo; |
| 11 | 9 | ||
| 10 | +import java.util.List; | ||
| 11 | + | ||
| 12 | /** | 12 | /** |
| 13 | * @description:视频设备数据存储接口 | 13 | * @description:视频设备数据存储接口 |
| 14 | * @author: swwheihei | 14 | * @author: swwheihei |
| @@ -373,7 +373,18 @@ public interface IVideoManagerStorager { | @@ -373,7 +373,18 @@ public interface IVideoManagerStorager { | ||
| 373 | */ | 373 | */ |
| 374 | void updateMediaServer(MediaServerItem mediaServerItem); | 374 | void updateMediaServer(MediaServerItem mediaServerItem); |
| 375 | 375 | ||
| 376 | + /** | ||
| 377 | + * 根据媒体ID获取启用/不启用的代理列表 | ||
| 378 | + * @param id 媒体ID | ||
| 379 | + * @param b 启用/不启用 | ||
| 380 | + * @return | ||
| 381 | + */ | ||
| 376 | List<StreamProxyItem> getStreamProxyListForEnableInMediaServer(String id, boolean b); | 382 | List<StreamProxyItem> getStreamProxyListForEnableInMediaServer(String id, boolean b); |
| 377 | 383 | ||
| 378 | - Device queryVideoDeviceByChannelId(String platformGbId); | 384 | + /** |
| 385 | + * 根据通道ID获取其所在设备 | ||
| 386 | + * @param channelId 通道ID | ||
| 387 | + * @return | ||
| 388 | + */ | ||
| 389 | + Device queryVideoDeviceByChannelId(String channelId); | ||
| 379 | } | 390 | } |