From 8402edaf01f227bb2fdc8cfab8397a9c61b1743b Mon Sep 17 00:00:00 2001 From: 648540858 <648540858@qq.com> Date: Mon, 29 Jan 2024 23:37:47 +0800 Subject: [PATCH] =?UTF-8?q?=E6=94=AF=E6=8C=81=E5=9B=BD=E6=A0=87=E7=BA=A7?= =?UTF-8?q?=E8=81=94=E6=8A=A5=E8=AD=A6=E5=A4=8D=E4=BD=8D=EF=BC=8C=20?= =?UTF-8?q?=E5=B8=83=E9=98=B2=E6=92=A4=E9=98=B2=EF=BC=8C=E5=BD=95=E5=83=8F?= =?UTF-8?q?=E6=8E=A7=E5=88=B6=EF=BC=8C=E5=BC=BA=E5=88=B6=E5=85=B3=E9=94=AE?= =?UTF-8?q?=E5=B8=A7=EF=BC=8C=E8=AE=BE=E5=A4=87=E9=87=8D=E5=90=AF=EF=BC=8C?= =?UTF-8?q?=E6=8B=89=E6=A1=86=E6=94=BE=E5=A4=A7=E7=BC=A9=E5=B0=8F=EF=BC=8C?= =?UTF-8?q?=20=E7=9C=8B=E5=AE=88=E4=BD=8D=E6=8E=A7=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gb28181/GB28181ResourceServiceImpl.java | 137 ++++++++- .../iot/vmp/gb28181/bean/DragZoomRequest.java | 12 + .../cmd/DeviceControlQueryMessageHandler.java | 283 +++++++----------- .../iot/vmp/service/IResourceService.java | 31 ++ 4 files changed, 290 insertions(+), 173 deletions(-) diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/GB28181ResourceServiceImpl.java b/src/main/java/com/genersoft/iot/vmp/gb28181/GB28181ResourceServiceImpl.java index 013af5a7..c6821a8e 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/GB28181ResourceServiceImpl.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/GB28181ResourceServiceImpl.java @@ -2,9 +2,11 @@ package com.genersoft.iot.vmp.gb28181; import com.genersoft.iot.vmp.common.CommonGbChannel; import com.genersoft.iot.vmp.common.StreamInfo; +import com.genersoft.iot.vmp.common.enums.DeviceControlType; import com.genersoft.iot.vmp.conf.exception.ControllerException; import com.genersoft.iot.vmp.gb28181.bean.Device; import com.genersoft.iot.vmp.gb28181.bean.DeviceChannel; +import com.genersoft.iot.vmp.gb28181.bean.DragZoomRequest; import com.genersoft.iot.vmp.gb28181.bean.command.PTZCommand; import com.genersoft.iot.vmp.gb28181.transmit.cmd.ISIPCommander; import com.genersoft.iot.vmp.gb28181.utils.SipUtils; @@ -25,6 +27,7 @@ import org.springframework.stereotype.Service; import javax.sip.InvalidArgumentException; import javax.sip.SipException; +import javax.sip.message.Response; import java.text.ParseException; @@ -136,14 +139,142 @@ public class GB28181ResourceServiceImpl implements IResourceService { return; } try { - commander.alarmCmd(checkResult.device, alarmMethod, alarmType, - errorResult -> onError(request, errorResult), - okResult -> onOk(request, okResult)); + commander.alarmCmd(checkResult.device, alarmMethod, alarmType,null, null); } catch (InvalidArgumentException | SipException | ParseException e) { logger.error("[命令发送失败]: ", e); } } + @Override + public void setGuard(CommonGbChannel commonGbChannel, boolean setGuard) { + CheckCommonGbChannelResult checkResult = checkCommonGbChannel(commonGbChannel); + + if (checkResult.errorMsg != null) { + logger.warn("[资源类-国标28181] 布防/撤防失败: {}", checkResult.errorMsg); + return; + } + if (checkResult.device == null || checkResult.channel == null) { + logger.warn("[资源类-国标28181] 布防/撤防失败: 设备获取失败"); + return; + } + + try { + commander.guardCmd(checkResult.device, setGuard,null, null); + } catch (InvalidArgumentException | SipException | ParseException e) { + logger.error("[命令发送失败] 布防/撤防命令: {}", e.getMessage()); + } + } + + @Override + public void setRecord(CommonGbChannel commonGbChannel, Boolean isRecord) { + CheckCommonGbChannelResult checkResult = checkCommonGbChannel(commonGbChannel); + + if (checkResult.errorMsg != null) { + logger.warn("[资源类-国标28181] 录像控制失败: {}", checkResult.errorMsg); + return; + } + if (checkResult.device == null || checkResult.channel == null) { + logger.warn("[资源类-国标28181] 录像控制失败: 设备获取失败"); + return; + } + + try { + commander.recordCmd(checkResult.device, checkResult.channel.getChannelId(), isRecord,null, null); + } catch (InvalidArgumentException | SipException | ParseException e) { + logger.error("[命令发送失败] 录像控制命令: {}", e.getMessage()); + } + } + + @Override + public void setIFame(CommonGbChannel commonGbChannel) { + CheckCommonGbChannelResult checkResult = checkCommonGbChannel(commonGbChannel); + + if (checkResult.errorMsg != null) { + logger.warn("[资源类-国标28181] 强制关键帧失败: {}", checkResult.errorMsg); + return; + } + if (checkResult.device == null || checkResult.channel == null) { + logger.warn("[资源类-国标28181] 强制关键帧失败: 设备获取失败"); + return; + } + + try { + commander.iFrameCmd(checkResult.device, checkResult.channel.getChannelId()); + } catch (InvalidArgumentException | SipException | ParseException e) { + logger.error("[命令发送失败] 强制关键帧: {}", e.getMessage()); + } + } + + @Override + public void setTeleBoot(CommonGbChannel commonGbChannel) { + CheckCommonGbChannelResult checkResult = checkCommonGbChannel(commonGbChannel); + + if (checkResult.errorMsg != null) { + logger.warn("[资源类-国标28181] 重启设备失败: {}", checkResult.errorMsg); + return; + } + if (checkResult.device == null || checkResult.channel == null) { + logger.warn("[资源类-国标28181] 重启设备失败: 设备获取失败"); + return; + } + + try { + commander.teleBootCmd(checkResult.device); + } catch (InvalidArgumentException | SipException | ParseException e) { + logger.error("[命令发送失败] 重启设备: {}", e.getMessage()); + } + } + + @Override + public void dragZoom(CommonGbChannel commonGbChannel, DragZoomRequest.DragZoom dragZoom, boolean isIn) { + CheckCommonGbChannelResult checkResult = checkCommonGbChannel(commonGbChannel); + + if (checkResult.errorMsg != null) { + logger.warn("[资源类-国标28181] 拉框放大/缩小失败: {}", checkResult.errorMsg); + return; + } + if (checkResult.device == null || checkResult.channel == null) { + logger.warn("[资源类-国标28181] 拉框放大/缩小失败: 设备获取失败"); + return; + } + StringBuffer cmdXml = new StringBuffer(200); + String type = isIn? DeviceControlType.DRAG_ZOOM_IN.getVal(): DeviceControlType.DRAG_ZOOM_OUT.getVal(); + cmdXml.append("<" + type + ">\r\n"); + cmdXml.append("" + dragZoom.getLength() + "\r\n"); + cmdXml.append("" + dragZoom.getWidth() + "\r\n"); + cmdXml.append("" + dragZoom.getMidPointX() + "\r\n"); + cmdXml.append("" + dragZoom.getMidPointY() + "\r\n"); + cmdXml.append("" + dragZoom.getLengthX() + "\r\n"); + cmdXml.append("" + dragZoom.getLengthY() + "\r\n"); + cmdXml.append("\r\n"); + try { + commander.dragZoomCmd(checkResult.device, checkResult.channel.getChannelId(), cmdXml.toString()); + } catch (InvalidArgumentException | SipException | ParseException e) { + logger.error("[命令发送失败] 拉框放大/缩小: {}", e.getMessage()); + } + } + + @Override + public void setHomePosition(CommonGbChannel commonGbChannel, boolean enabled, Integer resetTime, Integer presetIndex) { + CheckCommonGbChannelResult checkResult = checkCommonGbChannel(commonGbChannel); + + if (checkResult.errorMsg != null) { + logger.warn("[资源类-国标28181] 看守位控制失败: {}", checkResult.errorMsg); + return; + } + if (checkResult.device == null || checkResult.channel == null) { + logger.warn("[资源类-国标28181] 看守位控制失败: 设备获取失败"); + return; + } + try { + commander.homePositionCmd(checkResult.device, checkResult.channel.getChannelId(), + enabled, resetTime, presetIndex, null, null); + } catch (InvalidArgumentException | SipException | ParseException e) { + logger.error("[命令发送失败] 看守位控制: {}", e.getMessage()); + } + + } + @Override public void streamOffline(String app, String streamId) { // TODO diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/bean/DragZoomRequest.java b/src/main/java/com/genersoft/iot/vmp/gb28181/bean/DragZoomRequest.java index 86fdb4d2..d1515730 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/bean/DragZoomRequest.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/bean/DragZoomRequest.java @@ -107,6 +107,18 @@ public class DragZoomRequest { public void setLengthY(Integer lengthY) { this.lengthY = lengthY; } + + @Override + public String toString() { + return "DragZoom{" + + "length=" + length + + ", width=" + width + + ", midPointX=" + midPointX + + ", midPointY=" + midPointY + + ", lengthX=" + lengthX + + ", lengthY=" + lengthY + + '}'; + } } public String getSn() { 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 2cb3c9b7..f4b086de 100755 --- 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 @@ -6,16 +6,13 @@ import com.genersoft.iot.vmp.gb28181.bean.*; import com.genersoft.iot.vmp.gb28181.bean.command.CommandType; import com.genersoft.iot.vmp.gb28181.bean.command.ICommandInfo; import com.genersoft.iot.vmp.gb28181.bean.command.PTZCommand; -import com.genersoft.iot.vmp.gb28181.event.SipSubscribe; import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommander; -import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommanderFroPlatform; import com.genersoft.iot.vmp.gb28181.transmit.event.request.SIPRequestProcessorParent; import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.IMessageHandler; import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.control.ControlMessageHandler; -import com.genersoft.iot.vmp.service.IDeviceChannelService; +import com.genersoft.iot.vmp.gb28181.utils.XmlUtil; import com.genersoft.iot.vmp.service.IPlatformChannelService; import com.genersoft.iot.vmp.service.IResourceService; -import com.genersoft.iot.vmp.storager.IVideoManagerStorage; import gov.nist.javax.sip.message.SIPRequest; import org.dom4j.Element; import org.slf4j.Logger; @@ -34,7 +31,6 @@ import java.text.ParseException; import java.util.List; import java.util.Map; -import static com.genersoft.iot.vmp.gb28181.utils.XmlUtil.*; @Component public class DeviceControlQueryMessageHandler extends SIPRequestProcessorParent implements InitializingBean, IMessageHandler { @@ -45,20 +41,12 @@ public class DeviceControlQueryMessageHandler extends SIPRequestProcessorParent @Autowired private ControlMessageHandler controlMessageHandler; - - @Autowired - private SIPCommander cmder; - @Autowired private IPlatformChannelService platformChannelService; @Autowired private Map resourceServiceMap; - @Qualifier("taskExecutor") - @Autowired - private ThreadPoolTaskExecutor taskExecutor; - @Override public void afterPropertiesSet() throws Exception { controlMessageHandler.addHandler(cmdType, this); @@ -76,9 +64,9 @@ public class DeviceControlQueryMessageHandler extends SIPRequestProcessorParent // 此处是上级发出的DeviceControl指令 String targetGBId = ((SipURI) request.getToHeader().getAddress().getURI()).getUser(); - String channelId = getText(rootElement, "DeviceID"); + String channelId = XmlUtil.getText(rootElement, "DeviceID"); // 远程启动功能 - if (!ObjectUtils.isEmpty(getText(rootElement, "TeleBoot"))) { + if (!ObjectUtils.isEmpty(XmlUtil.getText(rootElement, "TeleBoot"))) { // TODO 拒绝远程启动命令 logger.warn("[国标级联]收到平台的远程启动命令, 不处理"); } @@ -95,35 +83,43 @@ public class DeviceControlQueryMessageHandler extends SIPRequestProcessorParent } return; } - + IResourceService resourceService = resourceServiceMap.get(commonGbChannel.getType()); + if (resourceService == null) { + try { + responseAck(request, Response.FORBIDDEN); + } catch (SipException | InvalidArgumentException | ParseException e) { + logger.error("[命令发送失败] 错误信息: {}", e.getMessage()); + } + return; + } switch (deviceControlType) { case PTZ: - handlePtzCmd(commonGbChannel, rootElement, request); + handlePtzCmd(commonGbChannel, resourceService, rootElement, request); break; case ALARM: - handleAlarmCmd(commonGbChannel, rootElement, request); + handleAlarmCmd(commonGbChannel, resourceService, rootElement, request); + break; + case GUARD: + handleGuardCmd(commonGbChannel, resourceService, rootElement, request); + break; + case RECORD: + handleRecordCmd(commonGbChannel, resourceService, rootElement, request); + break; + case I_FRAME: + handleIFameCmd(commonGbChannel, resourceService, request); + break; + case TELE_BOOT: + handleTeleBootCmd(commonGbChannel, resourceService, request); + break; + case DRAG_ZOOM_IN: + handleDragZoom(commonGbChannel, resourceService, rootElement, request, true); + break; + case DRAG_ZOOM_OUT: + handleDragZoom(commonGbChannel, resourceService, rootElement, request, false); + break; + case HOME_POSITION: + handleHomePositionCmd(commonGbChannel, resourceService, rootElement, request); break; -// case GUARD: -// handleGuardCmd(deviceForPlatform, rootElement, request, DeviceControlType.GUARD); -// break; -// case RECORD: -// handleRecordCmd(deviceForPlatform, channelId, rootElement, request, DeviceControlType.RECORD); -// break; -// case I_FRAME: -// handleIFameCmd(deviceForPlatform, request, channelId); -// break; -// case TELE_BOOT: -// handleTeleBootCmd(deviceForPlatform, request); -// break; -// case DRAG_ZOOM_IN: -// handleDragZoom(deviceForPlatform, channelId, rootElement, request, DeviceControlType.DRAG_ZOOM_IN); -// break; -// case DRAG_ZOOM_OUT: -// handleDragZoom(deviceForPlatform, channelId, rootElement, request, DeviceControlType.DRAG_ZOOM_OUT); -// break; -// case HOME_POSITION: -// handleHomePositionCmd(deviceForPlatform, channelId, rootElement, request, DeviceControlType.HOME_POSITION); -// break; default: break; } @@ -133,26 +129,16 @@ public class DeviceControlQueryMessageHandler extends SIPRequestProcessorParent /** * 处理云台指令 */ - private void handlePtzCmd(CommonGbChannel commonGbChannel, Element rootElement, SIPRequest request) { - IResourceService resourceService = resourceServiceMap.get(commonGbChannel.getType()); - if (resourceService == null) { - try { - responseAck(request, Response.FORBIDDEN); - } catch (SipException | InvalidArgumentException | ParseException e) { - logger.error("[命令发送失败] 错误信息: {}", e.getMessage()); - } - return; + private void handlePtzCmd(CommonGbChannel commonGbChannel, IResourceService resourceService, Element rootElement, SIPRequest request) { + try { + responseAck(request, Response.OK); + } catch (SipException | InvalidArgumentException | ParseException e) { + logger.error("[命令发送失败] 错误信息: {}", e.getMessage()); } - - String cmdString = getText(rootElement, DeviceControlType.PTZ.getVal()); + String cmdString = XmlUtil.getText(rootElement, DeviceControlType.PTZ.getVal()); // 解析云台控制参数 ICommandInfo commandInfo = ControlCommand.analysisCommand(cmdString); if (commandInfo == null || !commandInfo.getType().equals(CommandType.PTZ)) { - try { - responseAck(request, Response.OK); - } catch (SipException | InvalidArgumentException | ParseException e) { - logger.error("[命令发送失败] 错误信息: {}", e.getMessage()); - } return; } PTZCommand ptzCommand = (PTZCommand)commandInfo; @@ -170,60 +156,56 @@ public class DeviceControlQueryMessageHandler extends SIPRequestProcessorParent /** * 处理强制关键帧 - * - * @param device 设备 - * @param channelId 通道id */ - private void handleIFameCmd(Device device, SIPRequest request, String channelId) { + private void handleIFameCmd(CommonGbChannel commonGbChannel, IResourceService resourceService, SIPRequest request) { + logger.info("\r\n[强制关键帧] channelID: {} ", commonGbChannel.getCommonGbDeviceID()); try { - cmder.iFrameCmd(device, channelId); responseAck(request, Response.OK); - } catch (InvalidArgumentException | SipException | ParseException e) { - logger.error("[命令发送失败] 强制关键帧: {}", e.getMessage()); + } catch (SipException | InvalidArgumentException | ParseException e) { + logger.error("[命令发送失败] 错误信息: {}", e.getMessage()); } + resourceService.setIFame(commonGbChannel); } + + /** * 处理重启命令 * - * @param device 设备信息 */ - private void handleTeleBootCmd(Device device, SIPRequest request) { + private void handleTeleBootCmd(CommonGbChannel commonGbChannel, IResourceService resourceService, SIPRequest request) { + logger.info("\r\n[重启设备] channelID: {} ", commonGbChannel.getCommonGbDeviceID()); try { - cmder.teleBootCmd(device); responseAck(request, Response.OK); - } catch (InvalidArgumentException | SipException | ParseException e) { - logger.error("[命令发送失败] 重启: {}", e.getMessage()); + } catch (SipException | InvalidArgumentException | ParseException e) { + logger.error("[重启设备] 错误信息: {}", e.getMessage()); } - + resourceService.setTeleBoot(commonGbChannel); } /** - * 处理拉框控制*** - * - * @param device 设备信息 - * @param channelId 通道id - * @param rootElement 根节点 - * @param type 消息类型 + * 处理拉框控制 */ - private void handleDragZoom(Device device, String channelId, Element rootElement, SIPRequest request, DeviceControlType type) { + private void handleDragZoom(CommonGbChannel commonGbChannel, IResourceService resourceService, Element rootElement, SIPRequest request, boolean isIn) { try { - DragZoomRequest dragZoomRequest = loadElement(rootElement, DragZoomRequest.class); - DragZoomRequest.DragZoom dragZoom = dragZoomRequest.getDragZoomIn(); - if (dragZoom == null) { + responseAck(request, Response.OK); + } catch (SipException | InvalidArgumentException | ParseException e) { + logger.error("[拉框控制] 错误信息: {}", e.getMessage()); + } + + try { + DragZoomRequest dragZoomRequest = XmlUtil.loadElement(rootElement, DragZoomRequest.class); + DragZoomRequest.DragZoom dragZoom; + if (isIn) { + logger.info("\r\n[拉框放大] channelID: {}; 参数: {}", commonGbChannel.getCommonGbDeviceID(), + dragZoomRequest.getDragZoomIn().toString()); + dragZoom = dragZoomRequest.getDragZoomIn(); + }else { + logger.info("\r\n[拉框缩小] channelID: {}; 参数: {} ", commonGbChannel.getCommonGbDeviceID(), + dragZoomRequest.getDragZoomIn().toString()); dragZoom = dragZoomRequest.getDragZoomOut(); } - StringBuffer cmdXml = new StringBuffer(200); - cmdXml.append("<" + type.getVal() + ">\r\n"); - cmdXml.append("" + dragZoom.getLength() + "\r\n"); - cmdXml.append("" + dragZoom.getWidth() + "\r\n"); - cmdXml.append("" + dragZoom.getMidPointX() + "\r\n"); - cmdXml.append("" + dragZoom.getMidPointY() + "\r\n"); - cmdXml.append("" + dragZoom.getLengthX() + "\r\n"); - cmdXml.append("" + dragZoom.getLengthY() + "\r\n"); - cmdXml.append("\r\n"); - cmder.dragZoomCmd(device, channelId, cmdXml.toString()); - responseAck(request, Response.OK); + resourceService.dragZoom(commonGbChannel, dragZoom, isIn); } catch (Exception e) { logger.error("[命令发送失败] 拉框控制: {}", e.getMessage()); } @@ -231,27 +213,26 @@ public class DeviceControlQueryMessageHandler extends SIPRequestProcessorParent } /** - * 处理看守位命令*** - * - * @param device 设备信息 - * @param channelId 通道id - * @param rootElement 根节点 - * @param request 请求信息 - * @param type 消息类型 + * 处理看守位命令 */ - private void handleHomePositionCmd(Device device, String channelId, Element rootElement, SIPRequest request, DeviceControlType type) { + private void handleHomePositionCmd(CommonGbChannel commonGbChannel, IResourceService resourceService, Element rootElement, SIPRequest request) { try { - HomePositionRequest homePosition = loadElement(rootElement, HomePositionRequest.class); + responseAck(request, Response.OK); + } catch (SipException | InvalidArgumentException | ParseException e) { + logger.error("[拉框控制] 错误信息: {}", e.getMessage()); + } + + try { + HomePositionRequest homePosition = XmlUtil.loadElement(rootElement, HomePositionRequest.class); //获取整个消息主体,我们只需要修改请求头即可 HomePositionRequest.HomePosition info = homePosition.getHomePosition(); if (info.getEnabled() == null) { return; } - cmder.homePositionCmd(device, channelId, info.getEnabled().equals("1"), + resourceService.setHomePosition(commonGbChannel, info.getEnabled().equals("1"), info.getResetTime() != null ? Integer.parseInt(info.getResetTime()): null, - info.getPresetIndex() != null ? Integer.parseInt(info.getPresetIndex()): null, - errorResult -> onError(request, errorResult), - okResult -> onOk(request, okResult)); + info.getPresetIndex() != null ? Integer.parseInt(info.getPresetIndex()): null); + } catch (Exception e) { logger.error("[命令发送失败] 看守位设置: {}", e.getMessage()); } @@ -260,15 +241,11 @@ public class DeviceControlQueryMessageHandler extends SIPRequestProcessorParent /** * 处理告警消息 */ - private void handleAlarmCmd(CommonGbChannel commonGbChannel, Element rootElement, SIPRequest request) { - IResourceService resourceService = resourceServiceMap.get(commonGbChannel.getType()); - if (resourceService == null) { - try { - responseAck(request, Response.FORBIDDEN); - } catch (SipException | InvalidArgumentException | ParseException e) { - logger.error("[命令发送失败] 错误信息: {}", e.getMessage()); - } - return; + private void handleAlarmCmd(CommonGbChannel commonGbChannel, IResourceService resourceService, Element rootElement, SIPRequest request) { + try { + responseAck(request, Response.OK); + } catch (SipException | InvalidArgumentException | ParseException e) { + logger.error("[命令发送失败] 回复: {}", e.getMessage()); } //告警方法 @@ -278,11 +255,11 @@ public class DeviceControlQueryMessageHandler extends SIPRequestProcessorParent List info = rootElement.elements("Info"); if (info != null) { for (Element element : info) { - String alarmMethodStr = getText(element, "AlarmMethod"); + String alarmMethodStr = XmlUtil.getText(element, "AlarmMethod"); if (alarmMethodStr != null) { alarmMethod = Integer.parseInt(alarmMethodStr); } - String alarmTypeStr = getText(element, "AlarmType"); + String alarmTypeStr = XmlUtil.getText(element, "AlarmType"); if (alarmTypeStr != null) { alarmType = Integer.parseInt(alarmTypeStr); } @@ -296,44 +273,41 @@ public class DeviceControlQueryMessageHandler extends SIPRequestProcessorParent /** * 处理录像控制 - * - * @param device 设备信息 - * @param channelId 通道id - * @param rootElement 根节点 - * @param request 请求信息 - * @param type 消息类型 */ - private void handleRecordCmd(Device device, String channelId, Element rootElement, SIPRequest request, DeviceControlType type) { + private void handleRecordCmd(CommonGbChannel commonGbChannel, IResourceService resourceService, Element rootElement, SIPRequest request) { //获取整个消息主体,我们只需要修改请求头即可 - String cmdString = getText(rootElement, type.getVal()); + String cmdString = XmlUtil.getText(rootElement, DeviceControlType.RECORD.getVal()); Boolean isRecord = null; if (cmdString.equalsIgnoreCase("Record")) { isRecord = true; }else if (cmdString.equalsIgnoreCase("StopRecord")) { isRecord = false; }else { + logger.info("\r\n[录像控制] 解析失败: {} ", commonGbChannel.getCommonGbDeviceID()); return; } - try { - cmder.recordCmd(device, channelId, isRecord, - errorResult -> onError(request, errorResult), - okResult -> onOk(request, okResult)); - } catch (InvalidArgumentException | SipException | ParseException e) { - logger.error("[命令发送失败] 录像控制: {}", e.getMessage()); + if (isRecord) { + logger.info("\r\n[录像控制] 开始录像: channelId: {} ", commonGbChannel.getCommonGbDeviceID()); + }else { + logger.info("\r\n[录像控制] 停止录像: {} ", commonGbChannel.getCommonGbDeviceID()); } + + resourceService.setRecord(commonGbChannel, isRecord); } + + /** * 处理报警布防/撤防命令 - * - * @param device 设备信息 - * @param rootElement 根节点 - * @param request 请求信息 - * @param type 消息类型 */ - private void handleGuardCmd(Device device, Element rootElement, SIPRequest request, DeviceControlType type) { + private void handleGuardCmd(CommonGbChannel commonGbChannel, IResourceService resourceService, Element rootElement, SIPRequest request) { + try { + responseAck(request, Response.OK); + } catch (SipException | InvalidArgumentException | ParseException e) { + logger.error("[命令发送失败] 错误信息: {}", e.getMessage()); + } //获取整个消息主体,我们只需要修改请求头即可 - String cmdString = getText(rootElement, type.getVal()); + String cmdString = XmlUtil.getText(rootElement, DeviceControlType.GUARD.getVal()); boolean setGuard; if (cmdString.equalsIgnoreCase("Record")) { setGuard = true; @@ -342,43 +316,12 @@ public class DeviceControlQueryMessageHandler extends SIPRequestProcessorParent }else { return; } - try { - cmder.guardCmd(device, setGuard, - errorResult -> onError(request, errorResult), - okResult -> onOk(request, okResult)); - } catch (InvalidArgumentException | SipException | ParseException e) { - logger.error("[命令发送失败] 布防/撤防命令: {}", e.getMessage()); + if (setGuard) { + logger.info("\r\n[报警布防]: channelId: {} ", commonGbChannel.getCommonGbDeviceID()); + }else { + logger.info("\r\n[报警撤防]: channelId: {} ", commonGbChannel.getCommonGbDeviceID()); } - } - - /** - * 错误响应处理 - * - * @param request 请求 - * @param eventResult 响应结构 - */ - private void onError(SIPRequest request, SipSubscribe.EventResult eventResult) { - // 失败的回复 - try { - responseAck(request, eventResult.statusCode, eventResult.msg); - } catch (SipException | InvalidArgumentException | ParseException e) { - logger.error("[命令发送失败] 回复: {}", e.getMessage()); - } - } - - /** - * 成功响应处理 - * - * @param request 请求 - * @param eventResult 响应结构 - */ - private void onOk(SIPRequest request, SipSubscribe.EventResult eventResult) { - // 成功的回复 - try { - responseAck(request, eventResult.statusCode); - } catch (SipException | InvalidArgumentException | ParseException e) { - logger.error("[命令发送失败] 回复: {}", e.getMessage()); - } + resourceService.setGuard(commonGbChannel, setGuard); } } diff --git a/src/main/java/com/genersoft/iot/vmp/service/IResourceService.java b/src/main/java/com/genersoft/iot/vmp/service/IResourceService.java index 7ea10305..cd6bdde7 100644 --- a/src/main/java/com/genersoft/iot/vmp/service/IResourceService.java +++ b/src/main/java/com/genersoft/iot/vmp/service/IResourceService.java @@ -2,6 +2,7 @@ package com.genersoft.iot.vmp.service; import com.genersoft.iot.vmp.common.CommonGbChannel; import com.genersoft.iot.vmp.common.StreamInfo; +import com.genersoft.iot.vmp.gb28181.bean.DragZoomRequest; import com.genersoft.iot.vmp.gb28181.bean.command.PTZCommand; /** @@ -51,4 +52,34 @@ public interface IResourceService { * 报警复位 */ void resetAlarm(CommonGbChannel commonGbChannel, Integer alarmMethod, Integer alarmType); + + /** + * 布防/撤防 + */ + void setGuard(CommonGbChannel commonGbChannel, boolean setGuard); + + /** + * 录像控制 + */ + void setRecord(CommonGbChannel commonGbChannel, Boolean isRecord); + + /** + * 强制关键帧 + */ + void setIFame(CommonGbChannel commonGbChannel); + + /** + * 重启 + */ + void setTeleBoot(CommonGbChannel commonGbChannel); + + /** + * 拉框放大/缩小 + */ + void dragZoom(CommonGbChannel commonGbChannel, DragZoomRequest.DragZoom dragZoom, boolean isIn); + + /** + * 看守位控制 + */ + void setHomePosition(CommonGbChannel commonGbChannel, boolean enabled, Integer resetTime, Integer presetIndex); }