diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/SipLayer.java b/src/main/java/com/genersoft/iot/vmp/gb28181/SipLayer.java index cfea0262..b70c5eb6 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/SipLayer.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/SipLayer.java @@ -59,10 +59,10 @@ public class SipLayer implements SipListener, Runnable { @PostConstruct private void initSipServer() { - Thread thread=new Thread(this); - thread.setDaemon(true); - thread.setName("sip server thread start"); - thread.start(); + Thread thread = new Thread(this); + thread.setDaemon(true); + thread.setName("sip server thread start"); + thread.start(); } @Override @@ -84,7 +84,7 @@ public class SipLayer implements SipListener, Runnable { * 0; public static final int TRACE_MESSAGES = 16; public static final int * 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.DEBUG_LOG", "sip_debug_log"); sipStack = (SipStackImpl) sipFactory.createSipStack(properties); @@ -99,13 +99,15 @@ public class SipLayer implements SipListener, Runnable { } 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.addSipListener(this); } 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.addSipListener(this); } @@ -127,13 +129,15 @@ public class SipLayer implements SipListener, Runnable { if ((status >= 200) && (status < 300)) { // Success! ISIPResponseProcessor processor = processorFactory.createResponseProcessor(evt); processor.process(evt, this, sipConfig); + } else if (status == Response.TRYING) { + // trying不会回复 } else { logger.warn("接收到失败的response响应!status:" + status + ",message:" + response.getContent().toString()); } // trying不会回复 - if (status == Response.TRYING) { + // if (status == Response.TRYING) { - } + // } } /** 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 9a664fc2..b70f353e 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 @@ -94,6 +94,49 @@ public class SIPCommander implements ISIPCommander { 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, int zoomSpeed) { try { + String cmdStr= cmdString(leftRight, upDown, inOut, moveSpeed, zoomSpeed); StringBuffer ptzXml = new StringBuffer(200); ptzXml.append(""); ptzXml.append(""); ptzXml.append("DeviceControl"); ptzXml.append("" + (int)((Math.random()*9+1)*100000) + ""); ptzXml.append("" + channelId + ""); - ptzXml.append("" + ""); + ptzXml.append("" + cmdStr + ""); ptzXml.append(""); ptzXml.append(""); ptzXml.append(""); @@ -123,7 +167,6 @@ public class SIPCommander implements ISIPCommander { Request request = headerProvider.createMessageRequest(device, ptzXml.toString(), "ViaPtzBranch", "FromPtzTag", "ToPtzTag"); transmitRequest(device, request); - return true; } catch (SipException | ParseException | InvalidArgumentException e) { e.printStackTrace(); diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index bec0e008..7e6bc405 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -26,7 +26,8 @@ spring: server: port: 8080 sip: - ip: 10.200.64.63 +# ip: 10.200.64.63 + ip: 192.168.0.102 port: 5060 # 根据国标6.1.2中规定,domain宜采用ID统一编码的前十位编码。国标附录D中定义前8位为中心编码(由省级、市级、区级、基层编号组成,参照GB/T 2260-2007) # 后两位为行业编码,定义参照附录D.3 @@ -34,7 +35,8 @@ sip: domain: 3701020049 id: 37010200492000000001 # 默认设备认证密码,后续扩展使用设备单独密码 - password: admin + password: admin123 media: - ip: 10.200.64.88 +# ip: 10.200.64.88 + ip: 192.168.0.102 port: 10000 \ No newline at end of file diff --git a/wikis/images/核心流程.png b/wikis/images/核心流程.png index 34eeeeec..3d9f207b 100644 Binary files a/wikis/images/核心流程.png and b/wikis/images/核心流程.png differ