Browse Source

Merge pull request #9 from lawrencehj/master

增加了PTZ控制指令码的实现
pull/1/head
swwheihei 4 years ago
committed by GitHub
parent
commit
5c488cd03b
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 14
      src/main/java/com/genersoft/iot/vmp/gb28181/SipLayer.java
  2. 47
      src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java
  3. 8
      src/main/resources/application.yml
  4. BIN
      wikis/images/核心流程.png

14
src/main/java/com/genersoft/iot/vmp/gb28181/SipLayer.java

@ -84,7 +84,7 @@ public class SipLayer implements SipListener, Runnable {
* 0; public static final int TRACE_MESSAGES = 16; public static final int * 0; public static final int TRACE_MESSAGES = 16; public static final int
* TRACE_EXCEPTION = 17; public static final int TRACE_DEBUG = 32; * TRACE_EXCEPTION = 17; public static final int TRACE_DEBUG = 32;
*/ */
properties.setProperty("gov.nist.javax.sip.TRACE_LEVEL", "0"); properties.setProperty("gov.nist.javax.sip.TRACE_LEVEL", "32");
properties.setProperty("gov.nist.javax.sip.SERVER_LOG", "sip_server_log"); properties.setProperty("gov.nist.javax.sip.SERVER_LOG", "sip_server_log");
properties.setProperty("gov.nist.javax.sip.DEBUG_LOG", "sip_debug_log"); properties.setProperty("gov.nist.javax.sip.DEBUG_LOG", "sip_debug_log");
sipStack = (SipStackImpl) sipFactory.createSipStack(properties); sipStack = (SipStackImpl) sipFactory.createSipStack(properties);
@ -99,13 +99,15 @@ public class SipLayer implements SipListener, Runnable {
} }
private void startTcpListener() throws Exception { private void startTcpListener() throws Exception {
ListeningPoint tcpListeningPoint = sipStack.createListeningPoint(sipConfig.getSipIp(), sipConfig.getSipPort(), "TCP"); ListeningPoint tcpListeningPoint = sipStack.createListeningPoint(sipConfig.getSipIp(), sipConfig.getSipPort(),
"TCP");
tcpSipProvider = sipStack.createSipProvider(tcpListeningPoint); tcpSipProvider = sipStack.createSipProvider(tcpListeningPoint);
tcpSipProvider.addSipListener(this); tcpSipProvider.addSipListener(this);
} }
private void startUdpListener() throws Exception { private void startUdpListener() throws Exception {
ListeningPoint udpListeningPoint = sipStack.createListeningPoint(sipConfig.getSipIp(), sipConfig.getSipPort(), "UDP"); ListeningPoint udpListeningPoint = sipStack.createListeningPoint(sipConfig.getSipIp(), sipConfig.getSipPort(),
"UDP");
udpSipProvider = sipStack.createSipProvider(udpListeningPoint); udpSipProvider = sipStack.createSipProvider(udpListeningPoint);
udpSipProvider.addSipListener(this); udpSipProvider.addSipListener(this);
} }
@ -127,13 +129,15 @@ public class SipLayer implements SipListener, Runnable {
if ((status >= 200) && (status < 300)) { // Success! if ((status >= 200) && (status < 300)) { // Success!
ISIPResponseProcessor processor = processorFactory.createResponseProcessor(evt); ISIPResponseProcessor processor = processorFactory.createResponseProcessor(evt);
processor.process(evt, this, sipConfig); processor.process(evt, this, sipConfig);
} else if (status == Response.TRYING) {
// trying不会回复
} else { } else {
logger.warn("接收到失败的response响应!status:" + status + ",message:" + response.getContent().toString()); logger.warn("接收到失败的response响应!status:" + status + ",message:" + response.getContent().toString());
} }
// trying不会回复 // trying不会回复
if (status == Response.TRYING) { // if (status == Response.TRYING) {
} // }
} }
/** /**

47
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java

@ -94,6 +94,49 @@ public class SIPCommander implements ISIPCommander {
return ptzCmd(device, channelId, 0, 0, inOut, 0, zoomSpeed); return ptzCmd(device, channelId, 0, 0, inOut, 0, zoomSpeed);
} }
/**
* 云台指令码计算
*
* @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");
String strTmp;
strTmp = String.format("%02X", cmdCode);
builder.append(strTmp, 0, 2);
strTmp = String.format("%02X", moveSpeed);
builder.append(strTmp, 0, 2);
builder.append(strTmp, 0, 2);
strTmp = String.format("%X", zoomSpeed);
builder.append(strTmp, 0, 1).append("0");
//计算校验码
int checkCode = (0XA5 + 0X0F + 0X01 + cmdCode + moveSpeed + moveSpeed + (zoomSpeed /*<< 4*/ & 0XF0)) % 0X100;
strTmp = String.format("%02X", checkCode);
builder.append(strTmp, 0, 2);
return builder.toString();
}
/** /**
* 云台控制支持方向与缩放控制 * 云台控制支持方向与缩放控制
* *
@ -109,13 +152,14 @@ public class SIPCommander implements ISIPCommander {
public boolean ptzCmd(Device device, String channelId, int leftRight, int upDown, int inOut, int moveSpeed, public boolean ptzCmd(Device device, String channelId, int leftRight, int upDown, int inOut, int moveSpeed,
int zoomSpeed) { int zoomSpeed) {
try { try {
String cmdStr= cmdString(leftRight, upDown, inOut, moveSpeed, zoomSpeed);
StringBuffer ptzXml = new StringBuffer(200); StringBuffer ptzXml = new StringBuffer(200);
ptzXml.append("<?xml version=\"1.0\" ?>"); ptzXml.append("<?xml version=\"1.0\" ?>");
ptzXml.append("<Control>"); ptzXml.append("<Control>");
ptzXml.append("<CmdType>DeviceControl</CmdType>"); ptzXml.append("<CmdType>DeviceControl</CmdType>");
ptzXml.append("<SN>" + (int)((Math.random()*9+1)*100000) + "</SN>"); ptzXml.append("<SN>" + (int)((Math.random()*9+1)*100000) + "</SN>");
ptzXml.append("<DeviceID>" + channelId + "</DeviceID>"); ptzXml.append("<DeviceID>" + channelId + "</DeviceID>");
ptzXml.append("<PTZCmd>" + "</PTZCmd>"); ptzXml.append("<PTZCmd>" + cmdStr + "</PTZCmd>");
ptzXml.append("<Info>"); ptzXml.append("<Info>");
ptzXml.append("</Info>"); ptzXml.append("</Info>");
ptzXml.append("</Control>"); ptzXml.append("</Control>");
@ -123,7 +167,6 @@ public class SIPCommander implements ISIPCommander {
Request request = headerProvider.createMessageRequest(device, ptzXml.toString(), "ViaPtzBranch", "FromPtzTag", "ToPtzTag"); Request request = headerProvider.createMessageRequest(device, ptzXml.toString(), "ViaPtzBranch", "FromPtzTag", "ToPtzTag");
transmitRequest(device, request); transmitRequest(device, request);
return true; return true;
} catch (SipException | ParseException | InvalidArgumentException e) { } catch (SipException | ParseException | InvalidArgumentException e) {
e.printStackTrace(); e.printStackTrace();

8
src/main/resources/application.yml

@ -26,7 +26,8 @@ spring:
server: server:
port: 8080 port: 8080
sip: sip:
ip: 10.200.64.63 # ip: 10.200.64.63
ip: 192.168.0.102
port: 5060 port: 5060
# 根据国标6.1.2中规定,domain宜采用ID统一编码的前十位编码。国标附录D中定义前8位为中心编码(由省级、市级、区级、基层编号组成,参照GB/T 2260-2007) # 根据国标6.1.2中规定,domain宜采用ID统一编码的前十位编码。国标附录D中定义前8位为中心编码(由省级、市级、区级、基层编号组成,参照GB/T 2260-2007)
# 后两位为行业编码,定义参照附录D.3 # 后两位为行业编码,定义参照附录D.3
@ -34,7 +35,8 @@ sip:
domain: 3701020049 domain: 3701020049
id: 37010200492000000001 id: 37010200492000000001
# 默认设备认证密码,后续扩展使用设备单独密码 # 默认设备认证密码,后续扩展使用设备单独密码
password: admin password: admin123
media: media:
ip: 10.200.64.88 # ip: 10.200.64.88
ip: 192.168.0.102
port: 10000 port: 10000

BIN
wikis/images/核心流程.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 33 KiB

After

Width:  |  Height:  |  Size: 169 KiB

Loading…
Cancel
Save