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