Commit 5ed44c3e0934bdef4b6547d3a101e934ac9c2637

Authored by 648540858
1 parent 2659f105

支持级联云台控制

src/main/java/com/genersoft/iot/vmp/gb28181/transmit/SIPProcessorObserver.java
@@ -4,7 +4,6 @@ import com.genersoft.iot.vmp.gb28181.event.SipSubscribe; @@ -4,7 +4,6 @@ import com.genersoft.iot.vmp.gb28181.event.SipSubscribe;
4 import com.genersoft.iot.vmp.gb28181.transmit.event.request.ISIPRequestProcessor; 4 import com.genersoft.iot.vmp.gb28181.transmit.event.request.ISIPRequestProcessor;
5 import com.genersoft.iot.vmp.gb28181.transmit.event.response.ISIPResponseProcessor; 5 import com.genersoft.iot.vmp.gb28181.transmit.event.response.ISIPResponseProcessor;
6 import com.genersoft.iot.vmp.gb28181.transmit.event.timeout.ITimeoutProcessor; 6 import com.genersoft.iot.vmp.gb28181.transmit.event.timeout.ITimeoutProcessor;
7 -import gov.nist.javax.sip.message.SIPRequest;  
8 import org.slf4j.Logger; 7 import org.slf4j.Logger;
9 import org.slf4j.LoggerFactory; 8 import org.slf4j.LoggerFactory;
10 import org.springframework.beans.factory.annotation.Autowired; 9 import org.springframework.beans.factory.annotation.Autowired;
@@ -14,7 +13,6 @@ import org.springframework.stereotype.Component; @@ -14,7 +13,6 @@ import org.springframework.stereotype.Component;
14 import javax.sip.*; 13 import javax.sip.*;
15 import javax.sip.header.CSeqHeader; 14 import javax.sip.header.CSeqHeader;
16 import javax.sip.header.CallIdHeader; 15 import javax.sip.header.CallIdHeader;
17 -import javax.sip.header.Header;  
18 import javax.sip.message.Response; 16 import javax.sip.message.Response;
19 import java.util.Map; 17 import java.util.Map;
20 import java.util.concurrent.ConcurrentHashMap; 18 import java.util.concurrent.ConcurrentHashMap;
@@ -36,6 +34,7 @@ public class SIPProcessorObserver implements ISIPProcessorObserver { @@ -36,6 +34,7 @@ public class SIPProcessorObserver implements ISIPProcessorObserver {
36 @Autowired 34 @Autowired
37 private SipSubscribe sipSubscribe; 35 private SipSubscribe sipSubscribe;
38 36
  37 +
39 // @Autowired 38 // @Autowired
40 // @Qualifier(value = "taskExecutor") 39 // @Qualifier(value = "taskExecutor")
41 // private ThreadPoolTaskExecutor poolTaskExecutor; 40 // private ThreadPoolTaskExecutor poolTaskExecutor;
@@ -73,7 +72,7 @@ public class SIPProcessorObserver implements ISIPProcessorObserver { @@ -73,7 +72,7 @@ public class SIPProcessorObserver implements ISIPProcessorObserver {
73 @Override 72 @Override
74 @Async 73 @Async
75 public void processRequest(RequestEvent requestEvent) { 74 public void processRequest(RequestEvent requestEvent) {
76 - logger.debug("\n收到请求:\n{}", requestEvent.getRequest()); 75 + logger.info("\n收到请求:\n{}", requestEvent.getRequest());
77 String method = requestEvent.getRequest().getMethod(); 76 String method = requestEvent.getRequest().getMethod();
78 ISIPRequestProcessor sipRequestProcessor = requestProcessorMap.get(method); 77 ISIPRequestProcessor sipRequestProcessor = requestProcessorMap.get(method);
79 if (sipRequestProcessor == null) { 78 if (sipRequestProcessor == null) {
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/ISIPCommander.java
@@ -22,7 +22,6 @@ public interface ISIPCommander { @@ -22,7 +22,6 @@ public interface ISIPCommander {
22 * @param channelId 预览通道 22 * @param channelId 预览通道
23 * @param leftRight 镜头左移右移 0:停止 1:左移 2:右移 23 * @param leftRight 镜头左移右移 0:停止 1:左移 2:右移
24 * @param upDown 镜头上移下移 0:停止 1:上移 2:下移 24 * @param upDown 镜头上移下移 0:停止 1:上移 2:下移
25 - * @param moveSpeed 镜头移动速度  
26 */ 25 */
27 boolean ptzdirectCmd(Device device,String channelId,int leftRight, int upDown); 26 boolean ptzdirectCmd(Device device,String channelId,int leftRight, int upDown);
28 27
@@ -52,7 +51,6 @@ public interface ISIPCommander { @@ -52,7 +51,6 @@ public interface ISIPCommander {
52 * @param device 控制设备 51 * @param device 控制设备
53 * @param channelId 预览通道 52 * @param channelId 预览通道
54 * @param inOut 镜头放大缩小 0:停止 1:缩小 2:放大 53 * @param inOut 镜头放大缩小 0:停止 1:缩小 2:放大
55 - * @param zoomSpeed 镜头缩放速度  
56 */ 54 */
57 boolean ptzZoomCmd(Device device,String channelId,int inOut, int moveSpeed); 55 boolean ptzZoomCmd(Device device,String channelId,int inOut, int moveSpeed);
58 56
@@ -87,7 +85,7 @@ public interface ISIPCommander { @@ -87,7 +85,7 @@ public interface ISIPCommander {
87 * @param channelId 预览通道 85 * @param channelId 预览通道
88 * @param cmdString 前端控制指令串 86 * @param cmdString 前端控制指令串
89 */ 87 */
90 - boolean fronEndCmd(Device device, String channelId, String cmdString); 88 + boolean fronEndCmd(Device device, String channelId, String cmdString, SipSubscribe.Event errorEvent, SipSubscribe.Event okEvent);
91 89
92 /** 90 /**
93 * 请求预览视频流 91 * 请求预览视频流
@@ -181,7 +179,6 @@ public interface ISIPCommander { @@ -181,7 +179,6 @@ public interface ISIPCommander {
181 * 报警布防/撤防命令 179 * 报警布防/撤防命令
182 * 180 *
183 * @param device 视频设备 181 * @param device 视频设备
184 - * @param setGuard true: SetGuard, false: ResetGuard  
185 */ 182 */
186 boolean guardCmd(Device device, String guardCmdStr, SipSubscribe.Event errorEvent); 183 boolean guardCmd(Device device, String guardCmdStr, SipSubscribe.Event errorEvent);
187 184
@@ -315,7 +312,6 @@ public interface ISIPCommander { @@ -315,7 +312,6 @@ public interface ISIPCommander {
315 * @param expires 订阅过期时间(0 = 取消订阅) 312 * @param expires 订阅过期时间(0 = 取消订阅)
316 * @param startPriority 报警起始级别(可选) 313 * @param startPriority 报警起始级别(可选)
317 * @param endPriority 报警终止级别(可选) 314 * @param endPriority 报警终止级别(可选)
318 - * @param alarmMethods 报警方式条件(可选)  
319 * @param alarmType 报警类型 315 * @param alarmType 报警类型
320 * @param startTime 报警发生起始时间(可选) 316 * @param startTime 报警发生起始时间(可选)
321 * @param endTime 报警发生终止时间(可选) 317 * @param endTime 报警发生终止时间(可选)
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java
@@ -303,7 +303,7 @@ public class SIPCommander implements ISIPCommander { @@ -303,7 +303,7 @@ public class SIPCommander implements ISIPCommander {
303 * @param cmdString 前端控制指令串 303 * @param cmdString 前端控制指令串
304 */ 304 */
305 @Override 305 @Override
306 - public boolean fronEndCmd(Device device, String channelId, String cmdString) { 306 + public boolean fronEndCmd(Device device, String channelId, String cmdString, SipSubscribe.Event errorEvent, SipSubscribe.Event okEvent) {
307 try { 307 try {
308 StringBuffer ptzXml = new StringBuffer(200); 308 StringBuffer ptzXml = new StringBuffer(200);
309 ptzXml.append("<?xml version=\"1.0\" ?>\r\n"); 309 ptzXml.append("<?xml version=\"1.0\" ?>\r\n");
@@ -323,7 +323,7 @@ public class SIPCommander implements ISIPCommander { @@ -323,7 +323,7 @@ public class SIPCommander implements ISIPCommander {
323 : udpSipProvider.getNewCallId(); 323 : udpSipProvider.getNewCallId();
324 324
325 Request request = headerProvider.createMessageRequest(device, ptzXml.toString(), "z9hG4bK-ViaPtz-" + tm, "FromPtz" + tm, null, callIdHeader); 325 Request request = headerProvider.createMessageRequest(device, ptzXml.toString(), "z9hG4bK-ViaPtz-" + tm, "FromPtz" + tm, null, callIdHeader);
326 - transmitRequest(device, request); 326 + transmitRequest(device, request, errorEvent, okEvent);
327 return true; 327 return true;
328 } catch (SipException | ParseException | InvalidArgumentException e) { 328 } catch (SipException | ParseException | InvalidArgumentException e) {
329 e.printStackTrace(); 329 e.printStackTrace();
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/SubscribeRequestProcessor.java
@@ -70,7 +70,6 @@ public class SubscribeRequestProcessor extends SIPRequestProcessorParent impleme @@ -70,7 +70,6 @@ public class SubscribeRequestProcessor extends SIPRequestProcessorParent impleme
70 @Autowired 70 @Autowired
71 private UserSetting userSetting; 71 private UserSetting userSetting;
72 72
73 -  
74 @Autowired 73 @Autowired
75 private SubscribeHolder subscribeHolder; 74 private SubscribeHolder subscribeHolder;
76 75
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/control/cmd/DeviceControlQueryMessageHandler.java
@@ -19,13 +19,11 @@ import org.springframework.beans.factory.annotation.Autowired; @@ -19,13 +19,11 @@ import org.springframework.beans.factory.annotation.Autowired;
19 import org.springframework.stereotype.Component; 19 import org.springframework.stereotype.Component;
20 import org.springframework.util.StringUtils; 20 import org.springframework.util.StringUtils;
21 21
22 -import javax.sip.ListeningPoint;  
23 -import javax.sip.ObjectInUseException;  
24 -import javax.sip.RequestEvent;  
25 -import javax.sip.SipProvider; 22 +import javax.sip.*;
26 import javax.sip.address.SipURI; 23 import javax.sip.address.SipURI;
27 import javax.sip.header.HeaderAddress; 24 import javax.sip.header.HeaderAddress;
28 import javax.sip.header.ToHeader; 25 import javax.sip.header.ToHeader;
  26 +import java.text.ParseException;
29 import java.util.Iterator; 27 import java.util.Iterator;
30 28
31 import static com.genersoft.iot.vmp.gb28181.utils.XmlUtil.getText; 29 import static com.genersoft.iot.vmp.gb28181.utils.XmlUtil.getText;
@@ -105,7 +103,29 @@ public class DeviceControlQueryMessageHandler extends SIPRequestProcessorParent @@ -105,7 +103,29 @@ public class DeviceControlQueryMessageHandler extends SIPRequestProcessorParent
105 if (!StringUtils.isEmpty(getText(rootElement,"PTZCmd")) && !parentPlatform.getServerGBId().equals(targetGBId)) { 103 if (!StringUtils.isEmpty(getText(rootElement,"PTZCmd")) && !parentPlatform.getServerGBId().equals(targetGBId)) {
106 String cmdString = getText(rootElement,"PTZCmd"); 104 String cmdString = getText(rootElement,"PTZCmd");
107 Device deviceForPlatform = storager.queryVideoDeviceByPlatformIdAndChannelId(parentPlatform.getServerGBId(), channelId); 105 Device deviceForPlatform = storager.queryVideoDeviceByPlatformIdAndChannelId(parentPlatform.getServerGBId(), channelId);
108 - cmder.fronEndCmd(deviceForPlatform, channelId, cmdString); 106 + cmder.fronEndCmd(deviceForPlatform, channelId, cmdString, eventResult -> {
  107 + // 失败的回复
  108 + try {
  109 + responseAck(evt, eventResult.statusCode, eventResult.msg);
  110 + } catch (SipException e) {
  111 + e.printStackTrace();
  112 + } catch (InvalidArgumentException e) {
  113 + e.printStackTrace();
  114 + } catch (ParseException e) {
  115 + e.printStackTrace();
  116 + }
  117 + }, eventResult -> {
  118 + // 成功的回复
  119 + try {
  120 + responseAck(evt, eventResult.statusCode);
  121 + } catch (SipException e) {
  122 + e.printStackTrace();
  123 + } catch (InvalidArgumentException e) {
  124 + e.printStackTrace();
  125 + } catch (ParseException e) {
  126 + e.printStackTrace();
  127 + }
  128 + });
109 } 129 }
110 } 130 }
111 } 131 }
src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRTPServerFactory.java
@@ -244,7 +244,7 @@ public class ZLMRTPServerFactory { @@ -244,7 +244,7 @@ public class ZLMRTPServerFactory {
244 logger.error("RTP推流失败: 请检查ZLM服务"); 244 logger.error("RTP推流失败: 请检查ZLM服务");
245 } else if (jsonObject.getInteger("code") == 0) { 245 } else if (jsonObject.getInteger("code") == 0) {
246 result= true; 246 result= true;
247 - logger.info("RTP推流成功[ {}/{} ],本地推流端口:{}" ,param.get("app"), param.get("stream"), jsonObject.getString("local_port")); 247 + logger.info("RTP推流成功[ {}/{} ],{}->{}:{}, " ,param.get("app"), param.get("stream"), jsonObject.getString("local_port"), param.get("dst_url"), param.get("dst_port"));
248 } else { 248 } else {
249 logger.error("RTP推流失败: {}, 参数:{}",jsonObject.getString("msg"),JSONObject.toJSON(param)); 249 logger.error("RTP推流失败: {}, 参数:{}",jsonObject.getString("msg"),JSONObject.toJSON(param));
250 } 250 }