From 2a273acd09cc5e9656a5cf2673c98d7b5e8453df Mon Sep 17 00:00:00 2001
From: lawrencehj <1934378145@qq.com>
Date: 星期二, 16 三月 2021 11:47:45 +0800
Subject: [PATCH] 增加上级平台云台控制功能

---
 src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java                |   30 ++++++++++
 src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/MessageRequestProcessor.java |   75 +++++++++++++++----------
 src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/ISIPCommander.java                    |    8 ++
 README.md                                                                                      |   11 ++-
 4 files changed, 90 insertions(+), 34 deletions(-)

diff --git a/README.md b/README.md
index 8912045..26d0728 100644
--- a/README.md
+++ b/README.md
@@ -60,21 +60,24 @@
 15. 鏀寔璁㈤槄涓庨�氱煡鏂规硶
    -  [X] 绉诲姩浣嶇疆璁㈤槄
    -  [X] 绉诲姩浣嶇疆閫氱煡澶勭悊
-   -  [ ] 鎶ヨ浜嬩欢璁㈤槄
+   -  [X] 鎶ヨ浜嬩欢璁㈤槄
    -  [X] 鎶ヨ浜嬩欢閫氱煡澶勭悊
    -  [ ] 璁惧鐩綍璁㈤槄
    -  [X] 璁惧鐩綍閫氱煡澶勭悊
 16. 绉诲姩浣嶇疆鏌ヨ鍜屾樉绀猴紝鍙�氳繃閰嶇疆鏂囦欢璁剧疆绉诲姩浣嶇疆鍘嗗彶鏄惁瀛樺偍
 
 # 2.0 鏀寔鐗规��
-- [ ] 鍥芥爣閫氶亾鍚戜笂绾ц仈
+- [X] 鍥芥爣閫氶亾鍚戜笂绾ц仈
     - [X] WEB娣诲姞涓婄骇骞冲彴
     - [X] 娉ㄥ唽
     - [X] 蹇冭烦淇濇椿
     - [X] 閫氶亾閫夋嫨
     - [X] 閫氶亾鎺ㄩ��
-    - [ ] 鐐规挱
-    - [ ] 浜戝彴鎺у埗
+    - [X] 鐐规挱
+    - [X] 浜戝彴鎺у埗
+    - [X] 骞冲彴鐘舵�佹煡璇�
+    - [X] 骞冲彴淇℃伅鏌ヨ
+    - [X] 骞冲彴杩滅▼鍚姩
 - [ ] 娣诲姞RTSP瑙嗛
 - [ ] 娣诲姞ONVIF鎺㈡祴灞�鍩熺綉鍐呯殑璁惧
 - [ ] 娣诲姞RTMP瑙嗛
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/ISIPCommander.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/ISIPCommander.java
index 6fa4eca..27000bb 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/ISIPCommander.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/ISIPCommander.java
@@ -78,6 +78,14 @@
 	boolean frontEndCmd(Device device, String channelId, int cmdCode, int parameter1, int parameter2, int combineCode2);
 	
 	/**
+	 * 鍓嶇鎺у埗鎸囦护锛堢敤浜庤浆鍙戜笂绾ф寚浠わ級
+	 * @param device		鎺у埗璁惧
+	 * @param channelId		棰勮閫氶亾
+	 * @param cmdString		鍓嶇鎺у埗鎸囦护涓�
+	 */
+	boolean fronEndCmd(Device device, String channelId, String cmdString);
+
+	/**
 	 * 璇锋眰棰勮瑙嗛娴�
 	 * 
 	 * @param device  瑙嗛璁惧
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java
index a9ace7b..e941a8b 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java
@@ -282,6 +282,36 @@
 	}
 
 	/**
+	 * 鍓嶇鎺у埗鎸囦护锛堢敤浜庤浆鍙戜笂绾ф寚浠わ級
+	 * @param device		鎺у埗璁惧
+	 * @param channelId		棰勮閫氶亾
+	 * @param cmdString		鍓嶇鎺у埗鎸囦护涓�
+	 */
+	@Override
+	public boolean fronEndCmd(Device device, String channelId, String cmdString) {
+		try {
+			StringBuffer ptzXml = new StringBuffer(200);
+			ptzXml.append("<?xml version=\"1.0\" ?>\r\n");
+			ptzXml.append("<Control>\r\n");
+			ptzXml.append("<CmdType>DeviceControl</CmdType>\r\n");
+			ptzXml.append("<SN>" + (int)((Math.random()*9+1)*100000) + "</SN>\r\n");
+			ptzXml.append("<DeviceID>" + channelId + "</DeviceID>\r\n");
+			ptzXml.append("<PTZCmd>" + cmdString + "</PTZCmd>\r\n");
+			ptzXml.append("<Info>\r\n");
+			ptzXml.append("</Info>\r\n");
+			ptzXml.append("</Control>\r\n");
+			
+			String tm = Long.toString(System.currentTimeMillis());
+			Request request = headerProvider.createMessageRequest(device, ptzXml.toString(), "z9hG4bK-ViaPtz-" + tm, "FromPtz" + tm, null);
+			transmitRequest(device, request);
+			return true;
+		} catch (SipException | ParseException | InvalidArgumentException e) {
+			e.printStackTrace();
+		} 
+		return false;
+	}
+	
+	 /**
 	 * 	璇锋眰棰勮瑙嗛娴�
 	 * @param device  瑙嗛璁惧
 	 * @param channelId  棰勮閫氶亾
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/MessageRequestProcessor.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/MessageRequestProcessor.java
index 92835e5..e97629b 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/MessageRequestProcessor.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/MessageRequestProcessor.java
@@ -4,8 +4,11 @@
 import java.text.ParseException;
 import java.util.*;
 
+import javax.sip.address.SipURI;
+
 import javax.sip.header.FromHeader;
 import javax.sip.header.HeaderAddress;
+import javax.sip.header.ToHeader;
 import javax.sip.InvalidArgumentException;
 import javax.sip.ListeningPoint;
 import javax.sip.ObjectInUseException;
@@ -290,38 +293,50 @@
 				deferredResultHolder.invokeResult(msg);
 			} else {
 				// 姝ゅ鏄笂绾у彂鍑虹殑DeviceControl鎸囦护
-				if (XmlUtil.getText(rootElement, "TeleBoot").equals("Boot") ) {	// 杩滅▼鍚姩鍔熻兘锛氶渶瑕佸湪閲嶆柊鍚姩绋嬪簭鍚庡厛瀵筍ipStack瑙g粦
-					String platformId = ((SipUri) ((HeaderAddress) evt.getRequest().getHeader(FromHeader.NAME)).getAddress().getURI()).getUser();
-					logger.info("鎵ц杩滅▼鍚姩鍛戒护");
-					ParentPlatform parentPlatform = storager.queryParentPlatById(platformId);
-					cmderFroPlatform.unregister(parentPlatform, null, null);
-
-					Thread restartThread = new Thread(new Runnable() {
-						@Override
-						public void run() {
-							try {
-								Thread.sleep(3000);
-								SipProvider up = (SipProvider) SpringBeanFactory.getBean("udpSipProvider");
-								SipStackImpl stack = (SipStackImpl)up.getSipStack();
-								stack.stop();
-								Iterator listener = stack.getListeningPoints();
-								while (listener.hasNext()) {
-									stack.deleteListeningPoint((ListeningPoint) listener.next());
+				String platformId = ((SipURI) ((HeaderAddress) evt.getRequest().getHeader(FromHeader.NAME)).getAddress().getURI()).getUser();
+				String targetGBId = ((SipURI) ((HeaderAddress) evt.getRequest().getHeader(ToHeader.NAME)).getAddress().getURI()).getUser();
+				// 杩滅▼鍚姩鍔熻兘
+				if (!XmlUtil.isEmpty(XmlUtil.getText(rootElement, "TeleBoot"))) {
+					if (deviceId.equals(targetGBId)) {
+						// 杩滅▼鍚姩鍔熻兘锛氶渶瑕佸湪閲嶆柊鍚姩绋嬪簭鍚庡厛瀵筍ipStack瑙g粦
+						logger.info("鎵ц杩滅▼鍚姩鏈钩鍙板懡浠�");
+						ParentPlatform parentPlatform = storager.queryParentPlatById(platformId);
+						cmderFroPlatform.unregister(parentPlatform, null, null);
+	
+						Thread restartThread = new Thread(new Runnable() {
+							@Override
+							public void run() {
+								try {
+									Thread.sleep(3000);
+									SipProvider up = (SipProvider) SpringBeanFactory.getBean("udpSipProvider");
+									SipStackImpl stack = (SipStackImpl)up.getSipStack();
+									stack.stop();
+									Iterator listener = stack.getListeningPoints();
+									while (listener.hasNext()) {
+										stack.deleteListeningPoint((ListeningPoint) listener.next());
+									}
+									Iterator providers = stack.getSipProviders();
+									while (providers.hasNext()) {
+										stack.deleteSipProvider((SipProvider) providers.next());
+									}
+									VManageBootstrap.restart();
+								} catch (InterruptedException ignored) {
+								} catch (ObjectInUseException e) {
+									e.printStackTrace();
 								}
-								Iterator providers = stack.getSipProviders();
-								while (providers.hasNext()) {
-									stack.deleteSipProvider((SipProvider) providers.next());
-								}
-								VManageBootstrap.restart();
-							} catch (InterruptedException ignored) {
-							} catch (ObjectInUseException e) {
-								e.printStackTrace();
 							}
-						}
-					});
-		
-					restartThread.setDaemon(false);
-					restartThread.start();
+						});
+			
+						restartThread.setDaemon(false);
+						restartThread.start();
+					} else {
+						// 杩滅▼鍚姩鎸囧畾璁惧
+					}
+				}
+				if (!XmlUtil.isEmpty(XmlUtil.getText(rootElement,"PTZCmd")) && !deviceId.equals(targetGBId)) {
+					String cmdString = XmlUtil.getText(rootElement,"PTZCmd");
+					Device device = storager.queryVideoDeviceByPlatformIdAndChannelId(platformId, deviceId);
+					cmder.fronEndCmd(device, deviceId, cmdString);
 				}
 			}
 		} catch (ParseException | SipException | InvalidArgumentException | DocumentException e) {

--
Gitblit v1.8.0