From 25fca14e6224909811d96c348fc2427cf7fe13d1 Mon Sep 17 00:00:00 2001
From: gaofw189 <gaofw189@chinatelecom.cn>
Date: 星期一, 06 二月 2023 10:35:32 +0800
Subject: [PATCH] 修复WVP作为下级平台接受deviceControl指令的问题-修复指令响应
---
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java | 12 ++--
src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/device/DeviceControl.java | 6 +-
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/control/cmd/DeviceControlQueryMessageHandler.java | 27 +++++---
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/SIPSender.java | 104 ++++++++++++++++++----------------
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/ISIPCommander.java | 6 +-
5 files changed, 82 insertions(+), 73 deletions(-)
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/SIPSender.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/SIPSender.java
index 0aff21d..742b8bb 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/SIPSender.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/SIPSender.java
@@ -47,61 +47,65 @@
}
public void transmitRequest(String ip, Message message, SipSubscribe.Event errorEvent, SipSubscribe.Event okEvent) throws SipException, ParseException {
- ViaHeader viaHeader = (ViaHeader)message.getHeader(ViaHeader.NAME);
- String transport = "UDP";
- if (viaHeader == null) {
- logger.warn("[娑堟伅澶寸己澶盷锛� ViaHeader锛� 浣跨敤榛樿鐨刄DP鏂瑰紡澶勭悊鏁版嵁");
- }else {
- transport = viaHeader.getTransport();
- }
- if (message.getHeader(UserAgentHeader.NAME) == null) {
- try {
- message.addHeader(SipUtils.createUserAgentHeader(sipLayer.getSipFactory(), gitUtil));
- } catch (ParseException e) {
- logger.error("娣诲姞UserAgentHeader澶辫触", e);
+ try {
+ ViaHeader viaHeader = (ViaHeader)message.getHeader(ViaHeader.NAME);
+ String transport = "UDP";
+ if (viaHeader == null) {
+ logger.warn("[娑堟伅澶寸己澶盷锛� ViaHeader锛� 浣跨敤榛樿鐨刄DP鏂瑰紡澶勭悊鏁版嵁");
+ }else {
+ transport = viaHeader.getTransport();
}
- }
-
- CallIdHeader callIdHeader = (CallIdHeader) message.getHeader(CallIdHeader.NAME);
- // 娣诲姞閿欒璁㈤槄
- if (errorEvent != null) {
- sipSubscribe.addErrorSubscribe(callIdHeader.getCallId(), (eventResult -> {
- errorEvent.response(eventResult);
- sipSubscribe.removeErrorSubscribe(eventResult.callId);
- sipSubscribe.removeOkSubscribe(eventResult.callId);
- }));
- }
- // 娣诲姞璁㈤槄
- if (okEvent != null) {
- sipSubscribe.addOkSubscribe(callIdHeader.getCallId(), eventResult -> {
- okEvent.response(eventResult);
- sipSubscribe.removeOkSubscribe(eventResult.callId);
- sipSubscribe.removeErrorSubscribe(eventResult.callId);
- });
- }
- if ("TCP".equals(transport)) {
- SipProviderImpl tcpSipProvider = sipLayer.getTcpSipProvider(ip);
- if (tcpSipProvider == null) {
- logger.error("[鍙戦�佷俊鎭け璐 鏈壘鍒皌cp://{}鐨勭洃鍚俊鎭�", ip);
- return;
- }
- if (message instanceof Request) {
- tcpSipProvider.sendRequest((Request)message);
- }else if (message instanceof Response) {
- tcpSipProvider.sendResponse((Response)message);
+ if (message.getHeader(UserAgentHeader.NAME) == null) {
+ try {
+ message.addHeader(SipUtils.createUserAgentHeader(sipLayer.getSipFactory(), gitUtil));
+ } catch (ParseException e) {
+ logger.error("娣诲姞UserAgentHeader澶辫触", e);
+ }
}
- } else if ("UDP".equals(transport)) {
- SipProviderImpl sipProvider = sipLayer.getUdpSipProvider(ip);
- if (sipProvider == null) {
- logger.error("[鍙戦�佷俊鎭け璐 鏈壘鍒皍dp://{}鐨勭洃鍚俊鎭�", ip);
- return;
+ CallIdHeader callIdHeader = (CallIdHeader) message.getHeader(CallIdHeader.NAME);
+ // 娣诲姞閿欒璁㈤槄
+ if (errorEvent != null) {
+ sipSubscribe.addErrorSubscribe(callIdHeader.getCallId(), (eventResult -> {
+ errorEvent.response(eventResult);
+ sipSubscribe.removeErrorSubscribe(eventResult.callId);
+ sipSubscribe.removeOkSubscribe(eventResult.callId);
+ }));
}
- if (message instanceof Request) {
- sipProvider.sendRequest((Request)message);
- }else if (message instanceof Response) {
- sipProvider.sendResponse((Response)message);
+ // 娣诲姞璁㈤槄
+ if (okEvent != null) {
+ sipSubscribe.addOkSubscribe(callIdHeader.getCallId(), eventResult -> {
+ okEvent.response(eventResult);
+ sipSubscribe.removeOkSubscribe(eventResult.callId);
+ sipSubscribe.removeErrorSubscribe(eventResult.callId);
+ });
}
+ if ("TCP".equals(transport)) {
+ SipProviderImpl tcpSipProvider = sipLayer.getTcpSipProvider(ip);
+ if (tcpSipProvider == null) {
+ logger.error("[鍙戦�佷俊鎭け璐 鏈壘鍒皌cp://{}鐨勭洃鍚俊鎭�", ip);
+ return;
+ }
+ if (message instanceof Request) {
+ tcpSipProvider.sendRequest((Request)message);
+ }else if (message instanceof Response) {
+ tcpSipProvider.sendResponse((Response)message);
+ }
+
+ } else if ("UDP".equals(transport)) {
+ SipProviderImpl sipProvider = sipLayer.getUdpSipProvider(ip);
+ if (sipProvider == null) {
+ logger.error("[鍙戦�佷俊鎭け璐 鏈壘鍒皍dp://{}鐨勭洃鍚俊鎭�", ip);
+ return;
+ }
+ if (message instanceof Request) {
+ sipProvider.sendRequest((Request)message);
+ }else if (message instanceof Response) {
+ sipProvider.sendResponse((Response)message);
+ }
+ }
+ } finally {
+ logger.info("[SEND]:SUCCESS:{}", message);
}
}
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 40571fe..e9b2039 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
@@ -183,7 +183,7 @@
* @param channelId 棰勮閫氶亾
* @param recordCmdStr 褰曞儚鍛戒护锛歊ecord / StopRecord
*/
- void recordCmd(Device device, String channelId, String recordCmdStr, SipSubscribe.Event errorEvent) throws InvalidArgumentException, SipException, ParseException;
+ void recordCmd(Device device, String channelId, String recordCmdStr, SipSubscribe.Event errorEvent, SipSubscribe.Event okEvent) throws InvalidArgumentException, SipException, ParseException;
/**
* 杩滅▼鍚姩鎺у埗鍛戒护
@@ -197,7 +197,7 @@
*
* @param device 瑙嗛璁惧
*/
- void guardCmd(Device device, String guardCmdStr, SipSubscribe.Event errorEvent) throws InvalidArgumentException, SipException, ParseException;
+ void guardCmd(Device device, String guardCmdStr, SipSubscribe.Event errorEvent, SipSubscribe.Event okEvent) throws InvalidArgumentException, SipException, ParseException;
/**
* 鎶ヨ澶嶄綅鍛戒护
@@ -206,7 +206,7 @@
* @param alarmMethod 鎶ヨ鏂瑰紡锛堝彲閫夛級
* @param alarmType 鎶ヨ绫诲瀷锛堝彲閫夛級
*/
- void alarmCmd(Device device, String alarmMethod, String alarmType, SipSubscribe.Event errorEvent) throws InvalidArgumentException, SipException, ParseException;
+ void alarmCmd(Device device, String alarmMethod, String alarmType, SipSubscribe.Event errorEvent, SipSubscribe.Event okEvent) throws InvalidArgumentException, SipException, ParseException;
/**
* 寮哄埗鍏抽敭甯у懡浠�,璁惧鏀跺埌姝ゅ懡浠ゅ簲绔嬪埢鍙戦�佷竴涓狪DR甯�
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 47c798f..6937641 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
@@ -664,7 +664,7 @@
* @param recordCmdStr 褰曞儚鍛戒护锛歊ecord / StopRecord
*/
@Override
- public void recordCmd(Device device, String channelId, String recordCmdStr, SipSubscribe.Event errorEvent) throws InvalidArgumentException, SipException, ParseException {
+ public void recordCmd(Device device, String channelId, String recordCmdStr, SipSubscribe.Event errorEvent, SipSubscribe.Event okEvent) throws InvalidArgumentException, SipException, ParseException {
StringBuffer cmdXml = new StringBuffer(200);
String charset = device.getCharset();
cmdXml.append("<?xml version=\"1.0\" encoding=\"" + charset + "\"?>\r\n");
@@ -682,7 +682,7 @@
Request request = headerProvider.createMessageRequest(device, cmdXml.toString(), null, SipUtils.getNewFromTag(), null,sipSender.getNewCallIdHeader(sipLayer.getLocalIp(device.getLocalIp()),device.getTransport()));
- sipSender.transmitRequest(sipLayer.getLocalIp(device.getLocalIp()), request, errorEvent);
+ sipSender.transmitRequest(sipLayer.getLocalIp(device.getLocalIp()), request, errorEvent,okEvent);
}
/**
@@ -716,7 +716,7 @@
* @param guardCmdStr "SetGuard"/"ResetGuard"
*/
@Override
- public void guardCmd(Device device, String guardCmdStr, SipSubscribe.Event errorEvent) throws InvalidArgumentException, SipException, ParseException {
+ public void guardCmd(Device device, String guardCmdStr, SipSubscribe.Event errorEvent, SipSubscribe.Event okEvent) throws InvalidArgumentException, SipException, ParseException {
StringBuffer cmdXml = new StringBuffer(200);
String charset = device.getCharset();
@@ -729,7 +729,7 @@
cmdXml.append("</Control>\r\n");
Request request = headerProvider.createMessageRequest(device, cmdXml.toString(), null, SipUtils.getNewFromTag(), null,sipSender.getNewCallIdHeader(sipLayer.getLocalIp(device.getLocalIp()),device.getTransport()));
- sipSender.transmitRequest(sipLayer.getLocalIp(device.getLocalIp()), request, errorEvent);
+ sipSender.transmitRequest(sipLayer.getLocalIp(device.getLocalIp()), request, errorEvent,okEvent);
}
/**
@@ -738,7 +738,7 @@
* @param device 瑙嗛璁惧
*/
@Override
- public void alarmCmd(Device device, String alarmMethod, String alarmType, SipSubscribe.Event errorEvent) throws InvalidArgumentException, SipException, ParseException {
+ public void alarmCmd(Device device, String alarmMethod, String alarmType, SipSubscribe.Event errorEvent, SipSubscribe.Event okEvent) throws InvalidArgumentException, SipException, ParseException {
StringBuffer cmdXml = new StringBuffer(200);
String charset = device.getCharset();
@@ -765,7 +765,7 @@
Request request = headerProvider.createMessageRequest(device, cmdXml.toString(), null, SipUtils.getNewFromTag(), null,sipSender.getNewCallIdHeader(sipLayer.getLocalIp(device.getLocalIp()),device.getTransport()));
- sipSender.transmitRequest(sipLayer.getLocalIp(device.getLocalIp()), request, errorEvent);
+ sipSender.transmitRequest(sipLayer.getLocalIp(device.getLocalIp()), request, errorEvent,okEvent);
}
/**
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/control/cmd/DeviceControlQueryMessageHandler.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/control/cmd/DeviceControlQueryMessageHandler.java
index 46e8e92..fa54a0f 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/control/cmd/DeviceControlQueryMessageHandler.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/control/cmd/DeviceControlQueryMessageHandler.java
@@ -131,16 +131,16 @@
handleRecordCmd(deviceForPlatform,channelId,rootElement,request,DeviceControlType.RECORD);
break;
case I_FRAME:
- handleIFameCmd(deviceForPlatform,channelId);
+ handleIFameCmd(deviceForPlatform,request,channelId);
break;
case TELE_BOOT:
- handleTeleBootCmd(deviceForPlatform);
+ handleTeleBootCmd(deviceForPlatform,request);
break;
case DRAG_ZOOM_IN:
- handleDragZoom(deviceForPlatform,channelId,rootElement,DeviceControlType.DRAG_ZOOM_IN);
+ handleDragZoom(deviceForPlatform,channelId,rootElement,request,DeviceControlType.DRAG_ZOOM_IN);
break;
case DRAG_ZOOM_OUT:
- handleDragZoom(deviceForPlatform,channelId,rootElement,DeviceControlType.DRAG_ZOOM_OUT);
+ handleDragZoom(deviceForPlatform,channelId,rootElement,request,DeviceControlType.DRAG_ZOOM_OUT);
break;
case HOME_POSITION:
handleHomePositionCmd(deviceForPlatform,channelId,rootElement,request,DeviceControlType.HOME_POSITION);
@@ -167,7 +167,6 @@
} catch (InvalidArgumentException | SipException | ParseException e) {
logger.error("[鍛戒护鍙戦�佸け璐 浜戝彴/鍓嶇: {}", e.getMessage());
}
-
}
/**
@@ -175,9 +174,10 @@
* @param device 璁惧
* @param channelId 閫氶亾id
*/
- private void handleIFameCmd(Device device,String channelId){
+ private void handleIFameCmd(Device device,SIPRequest request,String channelId){
try {
cmder.iFrameCmd(device,channelId);
+ responseAck(request, Response.OK);
} catch (InvalidArgumentException | SipException | ParseException e) {
logger.error("[鍛戒护鍙戦�佸け璐 寮哄埗鍏抽敭甯�: {}", e.getMessage());
}
@@ -187,9 +187,10 @@
* 澶勭悊閲嶅惎鍛戒护
* @param device 璁惧淇℃伅
*/
- private void handleTeleBootCmd(Device device){
+ private void handleTeleBootCmd(Device device,SIPRequest request){
try {
cmder.teleBootCmd(device);
+ responseAck(request, Response.OK);
} catch (InvalidArgumentException | SipException | ParseException e) {
logger.error("[鍛戒护鍙戦�佸け璐 閲嶅惎: {}", e.getMessage());
}
@@ -203,7 +204,7 @@
* @param rootElement 鏍硅妭鐐�
* @param type 娑堟伅绫诲瀷
*/
- private void handleDragZoom(Device device,String channelId,Element rootElement,DeviceControlType type){
+ private void handleDragZoom(Device device,String channelId,Element rootElement,SIPRequest request,DeviceControlType type){
String cmdString = getText(rootElement,type.getVal());
StringBuffer cmdXml = new StringBuffer(200);
cmdXml.append("<" + type.getVal() + ">\r\n");
@@ -211,6 +212,7 @@
cmdXml.append("</" + type.getVal() + ">\r\n");
try {
cmder.dragZoomCmd(device,channelId,cmdXml.toString());
+ responseAck(request, Response.OK);
} catch (InvalidArgumentException | SipException | ParseException e) {
logger.error("[鍛戒护鍙戦�佸け璐 鎷夋鎺у埗: {}", e.getMessage());
}
@@ -255,7 +257,8 @@
}
try {
cmder.alarmCmd(device, alarmMethod,alarmType,
- errorResult -> onError(request,errorResult));
+ errorResult -> onError(request,errorResult),
+ okResult -> onOk(request,okResult));
} catch (InvalidArgumentException | SipException | ParseException e) {
logger.error("[鍛戒护鍙戦�佸け璐 鍛婅娑堟伅: {}", e.getMessage());
}
@@ -274,7 +277,8 @@
String cmdString = getText(rootElement,type.getVal());
try {
cmder.recordCmd(device, channelId,cmdString,
- errorResult -> onError(request,errorResult));
+ errorResult -> onError(request,errorResult),
+ okResult -> onOk(request,okResult));
} catch (InvalidArgumentException | SipException | ParseException e) {
logger.error("[鍛戒护鍙戦�佸け璐 褰曞儚鎺у埗: {}", e.getMessage());
}
@@ -292,7 +296,8 @@
String cmdString = getText(rootElement,type.getVal());
try {
cmder.guardCmd(device, cmdString,
- errorResult -> onError(request,errorResult));
+ errorResult -> onError(request,errorResult),
+ okResult -> onOk(request,okResult));
} catch (InvalidArgumentException | SipException | ParseException e) {
logger.error("[鍛戒护鍙戦�佸け璐 甯冮槻/鎾ら槻鍛戒护: {}", e.getMessage());
}
diff --git a/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/device/DeviceControl.java b/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/device/DeviceControl.java
index 2a44eb5..3e1b423 100644
--- a/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/device/DeviceControl.java
+++ b/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/device/DeviceControl.java
@@ -110,7 +110,7 @@
msg.setKey(key);
msg.setData(String.format("寮�濮�/鍋滄褰曞儚鎿嶄綔澶辫触锛岄敊璇爜锛� %s, %s", event.statusCode, event.msg));
resultHolder.invokeAllResult(msg);
- });
+ },null);
} catch (InvalidArgumentException | SipException | ParseException e) {
logger.error("[鍛戒护鍙戦�佸け璐 寮�濮�/鍋滄褰曞儚: {}", e.getMessage());
throw new ControllerException(ErrorCode.ERROR100.getCode(), "鍛戒护鍙戦�佸け璐�: " + e.getMessage());
@@ -143,7 +143,7 @@
msg.setKey(key);
msg.setData(String.format("甯冮槻/鎾ら槻鎿嶄綔澶辫触锛岄敊璇爜锛� %s, %s", event.statusCode, event.msg));
resultHolder.invokeResult(msg);
- });
+ },null);
} catch (InvalidArgumentException | SipException | ParseException e) {
logger.error("[鍛戒护鍙戦�佸け璐 甯冮槻/鎾ら槻鎿嶄綔: {}", e.getMessage());
throw new ControllerException(ErrorCode.ERROR100.getCode(), "鍛戒护鍙戦��: " + e.getMessage());
@@ -192,7 +192,7 @@
msg.setKey(key);
msg.setData(String.format("鎶ヨ澶嶄綅鎿嶄綔澶辫触锛岄敊璇爜锛� %s, %s", event.statusCode, event.msg));
resultHolder.invokeResult(msg);
- });
+ },null);
} catch (InvalidArgumentException | SipException | ParseException e) {
logger.error("[鍛戒护鍙戦�佸け璐 鎶ヨ澶嶄綅: {}", e.getMessage());
throw new ControllerException(ErrorCode.ERROR100.getCode(), "鍛戒护鍙戦�佸け璐�: " + e.getMessage());
--
Gitblit v1.8.0