Commit 3745c80567cfdbd02cb60b2351d048f63eb6c1a2

Authored by 648540858
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 }