swwheihei
2020-06-11 5c488cd03ba911224bca3a341b00455fbce2df09
Merge pull request #9 from lawrencehj/master

增加了PTZ控制指令码的实现
4个文件已修改
69 ■■■■ 已修改文件
src/main/java/com/genersoft/iot/vmp/gb28181/SipLayer.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java 47 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application.yml 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
wikis/images/核心流程.png 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/gb28181/SipLayer.java
@@ -84,7 +84,7 @@
             * 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 @@
    }
    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 @@
        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) {
        }
        // }
    }
    /**
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java
@@ -95,6 +95,49 @@
    }
  
    /**
    * äº‘台指令码计算
    *
    * @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();
}
    /**
     * äº‘台控制,支持方向与缩放控制
     * 
     * @param device  æŽ§åˆ¶è®¾å¤‡
@@ -109,13 +152,14 @@
    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("<?xml version=\"1.0\" ?>");
            ptzXml.append("<Control>");
            ptzXml.append("<CmdType>DeviceControl</CmdType>");
            ptzXml.append("<SN>" + (int)((Math.random()*9+1)*100000) + "</SN>");
            ptzXml.append("<DeviceID>" + channelId + "</DeviceID>");
            ptzXml.append("<PTZCmd>" + "</PTZCmd>");
            ptzXml.append("<PTZCmd>" + cmdStr + "</PTZCmd>");
            ptzXml.append("<Info>");
            ptzXml.append("</Info>");
            ptzXml.append("</Control>");
@@ -123,7 +167,6 @@
            Request request = headerProvider.createMessageRequest(device, ptzXml.toString(), "ViaPtzBranch", "FromPtzTag", "ToPtzTag");
            
            transmitRequest(device, request);
            return true;
        } catch (SipException | ParseException | InvalidArgumentException e) {
            e.printStackTrace();
src/main/resources/application.yml
@@ -26,7 +26,8 @@
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 @@
    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
wikis/images/ºËÐÄÁ÷³Ì.png