支持国标级联云台控制

结构优化
648540858 2024-01-29 17:19:38 +08:00
parent 565acaefb5
commit b17eea547a
4 changed files with 32 additions and 250 deletions

View File

@ -22,57 +22,6 @@ import java.text.ParseException;
*/ */
public interface ISIPCommander { public interface ISIPCommander {
/**
* 使
*
* @param device
* @param channelId
* @param leftRight 0: 1: 2:
* @param upDown 0: 1: 2:
*/
void ptzdirectCmd(Device device,String channelId,int leftRight, int upDown) throws InvalidArgumentException, ParseException, SipException;
/**
*
*
* @param device
* @param channelId
* @param leftRight 0: 1: 2:
* @param upDown 0: 1: 2:
* @param moveSpeed
*/
void ptzdirectCmd(Device device,String channelId,int leftRight, int upDown, int moveSpeed) throws InvalidArgumentException, ParseException, SipException;
/**
* 使
*
* @param device
* @param channelId
* @param inOut 0: 1: 2:
*/
void ptzZoomCmd(Device device,String channelId,int inOut) throws InvalidArgumentException, ParseException, SipException;
/**
*
*
* @param device
* @param channelId
* @param inOut 0: 1: 2:
*/
void ptzZoomCmd(Device device,String channelId,int inOut, int moveSpeed) throws InvalidArgumentException, ParseException, SipException;
/**
*
*
* @param device
* @param channelId
* @param leftRight 0: 1: 2:
* @param upDown 0: 1: 2:
* @param inOut 0: 1: 2:
* @param moveSpeed
* @param zoomSpeed
*/
void ptzCmd(Device device,String channelId,int leftRight, int upDown, int inOut, int moveSpeed, int zoomSpeed) throws InvalidArgumentException, SipException, ParseException;
void ptzCmd(Device device, String channelId, PTZCommand ptzCommand) throws InvalidArgumentException, SipException, ParseException; void ptzCmd(Device device, String channelId, PTZCommand ptzCommand) throws InvalidArgumentException, SipException, ParseException;
/** /**
@ -87,14 +36,6 @@ public interface ISIPCommander {
*/ */
void frontEndCmd(Device device, String channelId, int cmdCode, int parameter1, int parameter2, int combineCode2) throws SipException, InvalidArgumentException, ParseException; void frontEndCmd(Device device, String channelId, int cmdCode, int parameter1, int parameter2, int combineCode2) throws SipException, InvalidArgumentException, ParseException;
/**
*
* @param device
* @param channelId
* @param cmdString
*/
void fronEndCmd(Device device, String channelId, String cmdString, SipSubscribe.Event errorEvent, SipSubscribe.Event okEvent) throws InvalidArgumentException, SipException, ParseException;
/** /**
* *
* @param device * @param device

View File

@ -34,10 +34,7 @@ import org.springframework.context.annotation.DependsOn;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.springframework.util.ObjectUtils; import org.springframework.util.ObjectUtils;
import javax.sip.InvalidArgumentException; import javax.sip.*;
import javax.sip.ResponseEvent;
import javax.sip.SipException;
import javax.sip.SipFactory;
import javax.sip.header.CallIdHeader; import javax.sip.header.CallIdHeader;
import javax.sip.message.Request; import javax.sip.message.Request;
import java.text.ParseException; import java.text.ParseException;
@ -81,120 +78,10 @@ public class SIPCommander implements ISIPCommander {
private IMediaServerService mediaServerService; private IMediaServerService mediaServerService;
/**
* 使
*
* @param device
* @param channelId
* @param leftRight 0: 1: 2:
* @param upDown 0: 1: 2:
*/
@Override @Override
public void ptzdirectCmd(Device device, String channelId, int leftRight, int upDown) throws InvalidArgumentException, ParseException, SipException { public void ptzCmd(Device device, String channelId, PTZCommand ptzCommand) throws InvalidArgumentException, SipException, ParseException {
ptzCmd(device, channelId, leftRight, upDown, 0, sipConfig.getPtzSpeed(), 0); String cmdStr = SipUtils.cmdString(ptzCommand);
} frontEndCmd(device, channelId, cmdStr);
/**
*
*
* @param device
* @param channelId
* @param leftRight 0: 1: 2:
* @param upDown 0: 1: 2:
* @param moveSpeed
*/
@Override
public void ptzdirectCmd(Device device, String channelId, int leftRight, int upDown, int moveSpeed) throws InvalidArgumentException, ParseException, SipException {
ptzCmd(device, channelId, leftRight, upDown, 0, moveSpeed, 0);
}
/**
* 使
*
* @param device
* @param channelId
* @param inOut 0: 1: 2:
*/
@Override
public void ptzZoomCmd(Device device, String channelId, int inOut) throws InvalidArgumentException, ParseException, SipException {
ptzCmd(device, channelId, 0, 0, inOut, 0, sipConfig.getPtzSpeed());
}
/**
*
*
* @param device
* @param channelId
* @param inOut 0: 1: 2:
* @param zoomSpeed
*/
@Override
public void ptzZoomCmd(Device device, String channelId, int inOut, int zoomSpeed) throws InvalidArgumentException, ParseException, SipException {
ptzCmd(device, channelId, 0, 0, inOut, 0, zoomSpeed);
}
/**
*
*
* @param cmdCode
* @param parameter1 1
* @param parameter2 2
* @param combineCode2 2
*/
public static String frontEndCmdString(int cmdCode, int parameter1, int parameter2, int combineCode2) {
StringBuilder builder = new StringBuilder("A50F01");
String strTmp;
strTmp = String.format("%02X", cmdCode);
builder.append(strTmp, 0, 2);
strTmp = String.format("%02X", parameter1);
builder.append(strTmp, 0, 2);
strTmp = String.format("%02X", parameter2);
builder.append(strTmp, 0, 2);
//优化zoom变倍速率
if ((combineCode2 > 0) && (combineCode2 <16))
{
combineCode2 = 16;
}
strTmp = String.format("%X", combineCode2);
builder.append(strTmp, 0, 1).append("0");
//计算校验码
int checkCode = (0XA5 + 0X0F + 0X01 + cmdCode + parameter1 + parameter2 + (combineCode2 & 0XF0)) % 0X100;
strTmp = String.format("%02X", checkCode);
builder.append(strTmp, 0, 2);
return builder.toString();
}
/**
*
*
* @param device
* @param channelId
* @param leftRight 0: 1: 2:
* @param upDown 0: 1: 2:
* @param inOut 0: 1: 2:
* @param moveSpeed
* @param zoomSpeed
*/
@Override
public void ptzCmd(Device device, String channelId, int leftRight, int upDown, int inOut, int moveSpeed,
int zoomSpeed) throws InvalidArgumentException, SipException, ParseException {
String cmdStr = SipUtils.cmdString(leftRight, upDown, inOut, moveSpeed, zoomSpeed);
StringBuilder ptzXml = new StringBuilder(200);
String charset = device.getCharset();
ptzXml.append("<?xml version=\"1.0\" encoding=\"" + charset + "\"?>\r\n");
ptzXml.append("<Control>\r\n");
ptzXml.append("<CmdType>DeviceControl</CmdType>\r\n");
ptzXml.append("<SN>" + SipUtils.getNewSn() + "</SN>\r\n");
ptzXml.append("<DeviceID>" + channelId + "</DeviceID>\r\n");
ptzXml.append("<PTZCmd>" + cmdStr + "</PTZCmd>\r\n");
ptzXml.append("<Info>\r\n");
ptzXml.append("<ControlPriority>5</ControlPriority>\r\n");
ptzXml.append("</Info>\r\n");
ptzXml.append("</Control>\r\n");
Request request = 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);
} }
/** /**
@ -208,9 +95,14 @@ public class SIPCommander implements ISIPCommander {
* @param combineCode2 2 * @param combineCode2 2
*/ */
@Override @Override
public void frontEndCmd(Device device, String channelId, int cmdCode, int parameter1, int parameter2, int combineCode2) throws SipException, InvalidArgumentException, ParseException { public void frontEndCmd(Device device, String channelId, int cmdCode, int parameter1, int parameter2, int combineCode2)
throws SipException, InvalidArgumentException, ParseException {
String cmdStr = SipUtils.frontEndCmdString(cmdCode, parameter1, parameter2, combineCode2);
frontEndCmd(device, channelId, cmdStr);
}
private void frontEndCmd(Device device, String channelId, String cmdStr)
throws SipException, InvalidArgumentException, ParseException {
String cmdStr = frontEndCmdString(cmdCode, parameter1, parameter2, combineCode2);
StringBuffer ptzXml = new StringBuffer(200); StringBuffer ptzXml = new StringBuffer(200);
String charset = device.getCharset(); String charset = device.getCharset();
ptzXml.append("<?xml version=\"1.0\" encoding=\"" + charset + "\"?>\r\n"); ptzXml.append("<?xml version=\"1.0\" encoding=\"" + charset + "\"?>\r\n");
@ -224,43 +116,11 @@ public class SIPCommander implements ISIPCommander {
ptzXml.append("</Info>\r\n"); ptzXml.append("</Info>\r\n");
ptzXml.append("</Control>\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())); 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); sipSender.transmitRequest(sipLayer.getLocalIp(device.getLocalIp()),request);
} }
/**
*
*
* @param device
* @param channelId
* @param cmdString
*/
@Override
public void fronEndCmd(Device device, String channelId, String cmdString, SipSubscribe.Event errorEvent, SipSubscribe.Event okEvent) throws InvalidArgumentException, SipException, ParseException {
StringBuffer ptzXml = new StringBuffer(200);
String charset = device.getCharset();
ptzXml.append("<?xml version=\"1.0\" encoding=\"" + charset + "\"?>\r\n");
ptzXml.append("<Control>\r\n");
ptzXml.append("<CmdType>DeviceControl</CmdType>\r\n");
ptzXml.append("<SN>" + SipUtils.getNewSn() + "</SN>\r\n");
ptzXml.append("<DeviceID>" + channelId + "</DeviceID>\r\n");
ptzXml.append("<PTZCmd>" + cmdString + "</PTZCmd>\r\n");
ptzXml.append("<Info>\r\n");
ptzXml.append("<ControlPriority>5</ControlPriority>\r\n");
ptzXml.append("</Info>\r\n");
ptzXml.append("</Control>\r\n");
Request request = 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, errorEvent, okEvent);
}
/** /**
* *
* *

View File

@ -156,9 +156,11 @@ public class DeviceControlQueryMessageHandler extends SIPRequestProcessorParent
return; return;
} }
PTZCommand ptzCommand = (PTZCommand)commandInfo; PTZCommand ptzCommand = (PTZCommand)commandInfo;
logger.info("\r\n[云台控制]: \r\n镜头变倍: 放大: {},缩小: {} " + logger.info("\r\n[云台控制]: 命令: {}" +
" \r\n垂直方向控制 上: {} 下: {} 左: {},右: {}" + " \r\n镜头变倍: 放大: {},缩小: {} " +
" \r\n方向控制 上: {} 下: {} 左: {},右: {}" +
" \r\n平控制速度相对值: {}, 垂直控制速度相对值: {}, 变倍控制速度相对值: {}", " \r\n平控制速度相对值: {}, 垂直控制速度相对值: {}, 变倍控制速度相对值: {}",
cmdString,
ptzCommand.isIn(), ptzCommand.isOut(), ptzCommand.isIn(), ptzCommand.isOut(),
ptzCommand.isUp(), ptzCommand.isDown(), ptzCommand.isLeft(), ptzCommand.isRight(), ptzCommand.isUp(), ptzCommand.isDown(), ptzCommand.isLeft(), ptzCommand.isRight(),
ptzCommand.getxSpeed(), ptzCommand.getySpeed(), ptzCommand.getzSpeed()); ptzCommand.getxSpeed(), ptzCommand.getySpeed(), ptzCommand.getzSpeed());

View File

@ -96,49 +96,24 @@ public class SipUtils {
} }
/** public static String frontEndCmdString(int cmdCode, int parameter1, int parameter2, int combineCode2) {
*
*
* @param leftRight 0: 1: 2:
* @param upDown 0: 1: 2:
* @param inOut 0: 1: 2:
* @param moveSpeed 0XFF (0-255)
* @param zoomSpeed 0X1 (0-255)
*/
public static String cmdString(int leftRight, int upDown, int inOut, int moveSpeed, int zoomSpeed) {
int cmdCode = 0;
if (leftRight == 2) {
cmdCode|=0x01; // 右移
} else if(leftRight == 1) {
cmdCode|=0x02; // 左移
}
if (upDown == 2) {
cmdCode|=0x04; // 下移
} else if(upDown == 1) {
cmdCode|=0x08; // 上移
}
if (inOut == 2) {
cmdCode |= 0x10; // 放大
} else if(inOut == 1) {
cmdCode |= 0x20; // 缩小
}
StringBuilder builder = new StringBuilder("A50F01"); StringBuilder builder = new StringBuilder("A50F01");
String strTmp; String strTmp;
strTmp = String.format("%02X", cmdCode); strTmp = String.format("%02X", cmdCode);
builder.append(strTmp, 0, 2); builder.append(strTmp, 0, 2);
strTmp = String.format("%02X", moveSpeed); strTmp = String.format("%02X", parameter1);
builder.append(strTmp, 0, 2); builder.append(strTmp, 0, 2);
strTmp = String.format("%02X", parameter2);
builder.append(strTmp, 0, 2); builder.append(strTmp, 0, 2);
//优化zoom变倍速率
//优化zoom低倍速下的变倍速率 if ((combineCode2 > 0) && (combineCode2 <16))
if ((zoomSpeed > 0) && (zoomSpeed <16))
{ {
zoomSpeed = 16; combineCode2 = 16;
} }
strTmp = String.format("%X", zoomSpeed); strTmp = String.format("%X", combineCode2);
builder.append(strTmp, 0, 1).append("0"); builder.append(strTmp, 0, 1).append("0");
//计算校验码 //计算校验码
int checkCode = (0XA5 + 0X0F + 0X01 + cmdCode + moveSpeed + moveSpeed + (zoomSpeed /*<< 4*/ & 0XF0)) % 0X100; int checkCode = (0XA5 + 0X0F + 0X01 + cmdCode + parameter1 + parameter2 + (combineCode2 & 0XF0)) % 0X100;
strTmp = String.format("%02X", checkCode); strTmp = String.format("%02X", checkCode);
builder.append(strTmp, 0, 2); builder.append(strTmp, 0, 2);
return builder.toString(); return builder.toString();
@ -164,15 +139,19 @@ public class SipUtils {
if (command.isOut()) { if (command.isOut()) {
byte4Int += 32; byte4Int += 32;
} }
if (command.getzSpeed() < 0 || command.getzSpeed() > 15) {
command.setzSpeed(15);
}
StringBuilder builder = new StringBuilder("A50F01"); StringBuilder builder = new StringBuilder("A50F01");
builder.append(Integer.toHexString(byte4Int), 0, 2);
builder.append(Integer.toHexString(command.getxSpeed()), 0, 2);
builder.append(Integer.toHexString(command.getySpeed()), 0, 2);
builder.append(Integer.toHexString(command.getzSpeed()), 0, 1);
builder.append(String.format("%02X", byte4Int))
.append(String.format("%02X", command.getxSpeed()))
.append(String.format("%02X", command.getySpeed()))
.append(String.format("%X", command.getzSpeed()))
.append("0");
//计算校验码 //计算校验码
int checkCode = (0XA5 + 0X0F + 0X01 + byte4Int + command.getxSpeed() + command.getySpeed() + (command.getzSpeed() /*<< 4*/ & 0XF0)) % 0X100; int checkCode = (0XA5 + 0X0F + 0X01 + byte4Int + command.getxSpeed() + command.getySpeed() + (command.getzSpeed() /*<< 4*/ & 0XF0)) % 0X100;
builder.append(String.format("%02X", checkCode), 0, 2); builder.append(String.format("%02X", checkCode));
return builder.toString(); return builder.toString();
} }