[国标级联] 增加前端控制指令解析
parent
c0aec7562b
commit
c0d043ecd9
|
@ -0,0 +1,184 @@
|
|||
package com.genersoft.iot.vmp.gb28181.bean;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
import javax.validation.constraints.NotNull;
|
||||
|
||||
/**
|
||||
* 解析收到的前端控制指令
|
||||
*/
|
||||
@Data
|
||||
public class FrontEndCode {
|
||||
|
||||
|
||||
public static String encode(IFrontEndControlCode frontEndControlCode){
|
||||
return frontEndControlCode.encode();
|
||||
}
|
||||
|
||||
public static IFrontEndControlCode decode(@NotNull String cmdStr) {
|
||||
if (cmdStr.length() != 16) {
|
||||
return null;
|
||||
}
|
||||
String cmdCodeStr = cmdStr.substring(6, 8);
|
||||
int cmdCode = Integer.parseInt(cmdCodeStr, 16);
|
||||
if (cmdCode < 39) {
|
||||
// PTZ指令
|
||||
FrontEndControlCodeForPTZ codeForPTZ = new FrontEndControlCodeForPTZ();
|
||||
int zoomOut = cmdCode >> 5 & 1;
|
||||
if (zoomOut == 1) {
|
||||
codeForPTZ.setZoom(0);
|
||||
}
|
||||
int zoomIn = cmdCode >> 4 & 1;
|
||||
if (zoomIn == 1) {
|
||||
codeForPTZ.setZoom(1);
|
||||
}
|
||||
int tiltUp = cmdCode >> 3 & 1;
|
||||
if (tiltUp == 1) {
|
||||
codeForPTZ.setTilt(0);
|
||||
}
|
||||
int tiltDown = cmdCode >> 2 & 1;
|
||||
if (tiltDown == 1) {
|
||||
codeForPTZ.setTilt(1);
|
||||
}
|
||||
int panLeft = cmdCode >> 1 & 1;
|
||||
if (panLeft == 1) {
|
||||
codeForPTZ.setPan(0);
|
||||
}
|
||||
int panRight = cmdCode & 1;
|
||||
if (panRight == 1) {
|
||||
codeForPTZ.setPan(1);
|
||||
}
|
||||
String param1Str = cmdStr.substring(8, 10);
|
||||
codeForPTZ.setPanSpeed(Integer.parseInt(param1Str, 16));
|
||||
String param2Str = cmdStr.substring(10, 12);
|
||||
codeForPTZ.setTiltSpeed(Integer.parseInt(param2Str, 16));
|
||||
String param3Str = cmdStr.substring(12, 13);
|
||||
codeForPTZ.setZoomSpeed(Integer.parseInt(param3Str, 16));
|
||||
return codeForPTZ;
|
||||
}else if (cmdCode < 74) {
|
||||
// FI指令
|
||||
FrontEndControlCodeForFI codeForFI = new FrontEndControlCodeForFI();
|
||||
int irisOut = cmdCode >> 3 & 1;
|
||||
if (irisOut == 1) {
|
||||
codeForFI.setIris(0);
|
||||
}
|
||||
int irisIn = cmdCode >> 2 & 1;
|
||||
if (irisIn == 1) {
|
||||
codeForFI.setIris(1);
|
||||
}
|
||||
int focusNear = cmdCode >> 1 & 1;
|
||||
if (focusNear == 1) {
|
||||
codeForFI.setFocus(0);
|
||||
}
|
||||
int focusFar = cmdCode & 1;
|
||||
if (focusFar == 1) {
|
||||
codeForFI.setFocus(1);
|
||||
}
|
||||
|
||||
String param1Str = cmdStr.substring(8, 10);
|
||||
codeForFI.setFocusSpeed(Integer.parseInt(param1Str, 16));
|
||||
String param2Str = cmdStr.substring(10, 12);
|
||||
codeForFI.setIrisSpeed(Integer.parseInt(param2Str, 16));
|
||||
return codeForFI;
|
||||
}else if (cmdCode < 131) {
|
||||
// 预置位指令
|
||||
FrontEndControlCodeForPreset codeForPreset = new FrontEndControlCodeForPreset();
|
||||
switch (cmdCode) {
|
||||
case 0x81: // 设置预置位
|
||||
codeForPreset.setCode(1);
|
||||
break;
|
||||
case 0x82: // 调用预置位
|
||||
codeForPreset.setCode(2);
|
||||
break;
|
||||
case 0x83: // 删除预置位
|
||||
codeForPreset.setCode(3);
|
||||
break;
|
||||
default:
|
||||
return null;
|
||||
}
|
||||
// 预置位编号
|
||||
String param2Str = cmdStr.substring(10, 12);
|
||||
codeForPreset.setPresetId(Integer.parseInt(param2Str, 16));
|
||||
return codeForPreset;
|
||||
}else if (cmdCode < 136) {
|
||||
// 巡航指令
|
||||
FrontEndControlCodeForTour codeForTour = new FrontEndControlCodeForTour();
|
||||
String param3Str = cmdStr.substring(12, 13);
|
||||
switch (cmdCode) {
|
||||
case 0x84: // 加入巡航点
|
||||
codeForTour.setCode(1);
|
||||
break;
|
||||
case 0x85: // 删除一个巡航点
|
||||
codeForTour.setCode(2);
|
||||
break;
|
||||
case 0x86: // 设置巡航速度
|
||||
codeForTour.setCode(3);
|
||||
codeForTour.setTourSpeed(Integer.parseInt(param3Str, 16));
|
||||
break;
|
||||
case 0x87: // 设置巡航停留时间
|
||||
codeForTour.setCode(4);
|
||||
codeForTour.setTourTime(Integer.parseInt(param3Str, 16));
|
||||
break;
|
||||
case 0x88: // 开始巡航
|
||||
codeForTour.setCode(5);
|
||||
break;
|
||||
default:
|
||||
return null;
|
||||
}
|
||||
String param1Str = cmdStr.substring(8, 10);
|
||||
codeForTour.setTourId(Integer.parseInt(param1Str, 16));
|
||||
String param2Str = cmdStr.substring(10, 12);
|
||||
codeForTour.setPresetId(Integer.parseInt(param2Str, 16));
|
||||
return codeForTour;
|
||||
}else if (cmdCode < 138) {
|
||||
// 扫描指令
|
||||
FrontEndControlCodeForScan controlCodeForScan = new FrontEndControlCodeForScan();
|
||||
String param2Str = cmdStr.substring(10, 11);
|
||||
int param2Code = Integer.parseInt(param2Str, 16);
|
||||
switch (cmdCode) {
|
||||
case 0x89:
|
||||
switch (param2Code) {
|
||||
case 0x00: // 开始自动扫描
|
||||
controlCodeForScan.setCode(1);
|
||||
break;
|
||||
case 0x01: // 设置自动扫描左边界
|
||||
controlCodeForScan.setCode(2);
|
||||
break;
|
||||
case 0x02: // 设置自动扫描右边界
|
||||
controlCodeForScan.setCode(3);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case 0x8A: // 删除一个巡航点
|
||||
controlCodeForScan.setCode(4);
|
||||
String param3Str = cmdStr.substring(12, 13);
|
||||
controlCodeForScan.setScanSpeed(Integer.parseInt(param3Str, 16));
|
||||
break;
|
||||
default:
|
||||
return null;
|
||||
}
|
||||
String param1Str = cmdStr.substring(8, 10);
|
||||
controlCodeForScan.setScanId(Integer.parseInt(param1Str, 16));
|
||||
return controlCodeForScan;
|
||||
}else if (cmdCode < 141) {
|
||||
// 辅助开关
|
||||
FrontEndControlCodeForAuxiliary codeForAuxiliary = new FrontEndControlCodeForAuxiliary();
|
||||
switch (cmdCode) {
|
||||
case 0x8C: // 开
|
||||
codeForAuxiliary.setCode(1);
|
||||
break;
|
||||
case 0x8D: // 关
|
||||
codeForAuxiliary.setCode(2);
|
||||
break;
|
||||
default:
|
||||
return null;
|
||||
}
|
||||
// 预置位编号
|
||||
String param2Str = cmdStr.substring(10, 12);
|
||||
codeForAuxiliary.setAuxiliaryId(Integer.parseInt(param2Str, 16));
|
||||
return codeForAuxiliary;
|
||||
}else {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,34 @@
|
|||
package com.genersoft.iot.vmp.gb28181.bean;
|
||||
|
||||
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
|
||||
public class FrontEndControlCodeForAuxiliary implements IFrontEndControlCode {
|
||||
|
||||
private final FrontEndControlType type = FrontEndControlType.AUXILIARY;
|
||||
|
||||
@Override
|
||||
public FrontEndControlType getType() {
|
||||
return type;
|
||||
}
|
||||
|
||||
/**
|
||||
* 辅助开关控制指令: 1为开, 2为关, 3为设置自动扫描右边界, 4为设置自动扫描速度
|
||||
*/
|
||||
@Getter
|
||||
@Setter
|
||||
private Integer code;
|
||||
|
||||
/**
|
||||
* 辅助开关编号
|
||||
*/
|
||||
@Getter
|
||||
@Setter
|
||||
private Integer auxiliaryId;
|
||||
|
||||
@Override
|
||||
public String encode() {
|
||||
return "";
|
||||
}
|
||||
}
|
|
@ -0,0 +1,48 @@
|
|||
package com.genersoft.iot.vmp.gb28181.bean;
|
||||
|
||||
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
|
||||
public class FrontEndControlCodeForFI implements IFrontEndControlCode {
|
||||
|
||||
private final FrontEndControlType type = FrontEndControlType.FI;
|
||||
|
||||
@Override
|
||||
public FrontEndControlType getType() {
|
||||
return type;
|
||||
}
|
||||
|
||||
/**
|
||||
* 光圈,0为缩小 1为放大
|
||||
*/
|
||||
@Getter
|
||||
@Setter
|
||||
private Integer iris;
|
||||
|
||||
/**
|
||||
* 聚焦 0 近, 1远
|
||||
*/
|
||||
@Getter
|
||||
@Setter
|
||||
private Integer focus;
|
||||
|
||||
/**
|
||||
* 聚焦速度
|
||||
*/
|
||||
@Getter
|
||||
@Setter
|
||||
private Integer focusSpeed;
|
||||
|
||||
/**
|
||||
* 光圈速度
|
||||
*/
|
||||
@Getter
|
||||
@Setter
|
||||
private Integer irisSpeed;
|
||||
|
||||
@Override
|
||||
public String encode() {
|
||||
return "";
|
||||
}
|
||||
}
|
|
@ -0,0 +1,62 @@
|
|||
package com.genersoft.iot.vmp.gb28181.bean;
|
||||
|
||||
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
|
||||
public class FrontEndControlCodeForPTZ implements IFrontEndControlCode {
|
||||
|
||||
private final FrontEndControlType type = FrontEndControlType.PTZ;
|
||||
|
||||
@Override
|
||||
public FrontEndControlType getType() {
|
||||
return type;
|
||||
}
|
||||
|
||||
/**
|
||||
* 镜头变倍,0为缩小 1为放大
|
||||
*/
|
||||
@Getter
|
||||
@Setter
|
||||
private Integer zoom;
|
||||
|
||||
/**
|
||||
* 云台垂直方向控制 0 为上, 1为下
|
||||
*/
|
||||
@Getter
|
||||
@Setter
|
||||
private Integer tilt;
|
||||
|
||||
/**
|
||||
* 云台水平方向控制 0 为左, 1为右
|
||||
*/
|
||||
@Getter
|
||||
@Setter
|
||||
private Integer pan;
|
||||
|
||||
/**
|
||||
* 水平控制速度相对值
|
||||
*/
|
||||
@Getter
|
||||
@Setter
|
||||
private Integer panSpeed;
|
||||
|
||||
/**
|
||||
* 垂直控制速度相对值
|
||||
*/
|
||||
@Getter
|
||||
@Setter
|
||||
private Integer tiltSpeed;
|
||||
|
||||
/**
|
||||
* 变倍控制速度相对值
|
||||
*/
|
||||
@Getter
|
||||
@Setter
|
||||
private Integer zoomSpeed;
|
||||
|
||||
@Override
|
||||
public String encode() {
|
||||
return "";
|
||||
}
|
||||
}
|
|
@ -0,0 +1,35 @@
|
|||
package com.genersoft.iot.vmp.gb28181.bean;
|
||||
|
||||
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
|
||||
public class FrontEndControlCodeForPreset implements IFrontEndControlCode {
|
||||
|
||||
private final FrontEndControlType type = FrontEndControlType.PRESET;
|
||||
|
||||
@Override
|
||||
public FrontEndControlType getType() {
|
||||
return type;
|
||||
}
|
||||
|
||||
/**
|
||||
* 预置位指令: 1为设置预置位, 2为调用预置位, 3为删除预置位
|
||||
*/
|
||||
@Getter
|
||||
@Setter
|
||||
private Integer code;
|
||||
|
||||
/**
|
||||
* 预置位编号
|
||||
*/
|
||||
@Getter
|
||||
@Setter
|
||||
private Integer presetId;
|
||||
|
||||
|
||||
@Override
|
||||
public String encode() {
|
||||
return "";
|
||||
}
|
||||
}
|
|
@ -0,0 +1,41 @@
|
|||
package com.genersoft.iot.vmp.gb28181.bean;
|
||||
|
||||
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
|
||||
public class FrontEndControlCodeForScan implements IFrontEndControlCode {
|
||||
|
||||
private final FrontEndControlType type = FrontEndControlType.SCAN;
|
||||
|
||||
@Override
|
||||
public FrontEndControlType getType() {
|
||||
return type;
|
||||
}
|
||||
|
||||
/**
|
||||
* 预置位指令: 1为开始自动扫描, 2为设置自动扫描左边界, 3为设置自动扫描右边界, 4为设置自动扫描速度
|
||||
*/
|
||||
@Getter
|
||||
@Setter
|
||||
private Integer code;
|
||||
|
||||
/**
|
||||
* 自动扫描速度
|
||||
*/
|
||||
@Getter
|
||||
@Setter
|
||||
private Integer scanSpeed;
|
||||
|
||||
/**
|
||||
* 扫描组号
|
||||
*/
|
||||
@Getter
|
||||
@Setter
|
||||
private Integer scanId;
|
||||
|
||||
@Override
|
||||
public String encode() {
|
||||
return "";
|
||||
}
|
||||
}
|
|
@ -0,0 +1,55 @@
|
|||
package com.genersoft.iot.vmp.gb28181.bean;
|
||||
|
||||
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
|
||||
public class FrontEndControlCodeForTour implements IFrontEndControlCode {
|
||||
|
||||
private final FrontEndControlType type = FrontEndControlType.TOUR;
|
||||
|
||||
@Override
|
||||
public FrontEndControlType getType() {
|
||||
return type;
|
||||
}
|
||||
|
||||
/**
|
||||
* 巡航指令: 1为加入巡航点, 2为删除一个巡航点, 3为设置巡航速度, 4为设置巡航停留时间, 5为开始巡航
|
||||
*/
|
||||
@Getter
|
||||
@Setter
|
||||
private Integer code;
|
||||
|
||||
/**
|
||||
* 巡航点
|
||||
*/
|
||||
@Getter
|
||||
@Setter
|
||||
private Integer tourId;
|
||||
|
||||
/**
|
||||
* 巡航停留时间
|
||||
*/
|
||||
@Getter
|
||||
@Setter
|
||||
private Integer tourTime;
|
||||
|
||||
/**
|
||||
* 巡航速度
|
||||
*/
|
||||
@Getter
|
||||
@Setter
|
||||
private Integer tourSpeed;
|
||||
|
||||
/**
|
||||
* 预置位编号
|
||||
*/
|
||||
@Getter
|
||||
@Setter
|
||||
private Integer presetId;
|
||||
|
||||
@Override
|
||||
public String encode() {
|
||||
return "";
|
||||
}
|
||||
}
|
|
@ -0,0 +1,6 @@
|
|||
package com.genersoft.iot.vmp.gb28181.bean;
|
||||
|
||||
public enum FrontEndControlType {
|
||||
|
||||
PTZ,FI,PRESET,TOUR,SCAN,AUXILIARY
|
||||
}
|
|
@ -0,0 +1,7 @@
|
|||
package com.genersoft.iot.vmp.gb28181.bean;
|
||||
|
||||
public interface IFrontEndControlCode {
|
||||
|
||||
FrontEndControlType getType();
|
||||
String encode();
|
||||
}
|
|
@ -42,7 +42,7 @@ public class PtzController {
|
|||
private IDeviceService deviceService;
|
||||
|
||||
@Autowired
|
||||
private IPTZService iptzService;
|
||||
private IPTZService ptzService;
|
||||
|
||||
@Autowired
|
||||
private DeferredResultHolder resultHolder;
|
||||
|
@ -75,7 +75,7 @@ public class PtzController {
|
|||
|
||||
Assert.notNull(device, "设备[" + deviceId + "]不存在");
|
||||
|
||||
iptzService.frontEndCommand(device, channelId, cmdCode, parameter1, parameter2, combindCode2);
|
||||
ptzService.frontEndCommand(device, channelId, cmdCode, parameter1, parameter2, combindCode2);
|
||||
}
|
||||
|
||||
@Operation(summary = "云台控制", security = @SecurityRequirement(name = JwtUtils.HEADER))
|
||||
|
|
|
@ -211,9 +211,6 @@ public class SIPCommander implements ISIPCommander {
|
|||
ptzXml.append("</Info>\r\n");
|
||||
ptzXml.append("</Control>\r\n");
|
||||
|
||||
|
||||
|
||||
|
||||
SIPRequest request = (SIPRequest) headerProvider.createMessageRequest(device, ptzXml.toString(), SipUtils.getNewViaTag(), SipUtils.getNewFromTag(), null,sipSender.getNewCallIdHeader(sipLayer.getLocalIp(device.getLocalIp()),device.getTransport()));
|
||||
sipSender.transmitRequest(sipLayer.getLocalIp(device.getLocalIp()),request);
|
||||
|
||||
|
|
|
@ -144,6 +144,11 @@ public class DeviceControlQueryMessageHandler extends SIPRequestProcessorParent
|
|||
log.error("[命令发送失败] 云台指令: {}", exception.getMessage());
|
||||
}
|
||||
}));
|
||||
// }else if (false){
|
||||
// // 国标
|
||||
// // 解析云台控制参数
|
||||
// String cmdString = getText(rootElement, type.getVal());
|
||||
// FrontEndCode.decode(cmdString);
|
||||
}else {
|
||||
// 只支持国标的云台控制
|
||||
log.warn("[INFO 消息] 只支持国标的云台控制, 通道ID: {}", channel.getGbId());
|
||||
|
|
Loading…
Reference in New Issue