⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cmpp_dr.java

📁 使用华为cmpp2.0网关
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
                break;
            case COMMAND_CMPP_SUBMIT_RESP:
                CMPPSubmitMessageResp sResp = new CMPPSubmitMessageResp();
                if(msg!=null){
                    try {
                        sResp.un_count= msg[0];
                        if(sResp.un_count!=0){
                            byte[] count = new byte[msg.length-1];
                            System.arraycopy(msg,1,count,0,msg.length-1);
                            sResp.fail_Index=count;
                        }
                    }
                    catch (Exception ex) {
                        stat=SUBMIT_MSG_FORMAT_ERROR;
                    }
                }
                sResp.stat=stat;
                backMsg=sResp;
                break;
            case COMMAND_CMPP_ACTIVE_TEST:
                CMPPActiveTestMessageResp respMsg=new CMPPActiveTestMessageResp();
                respMsg.nSequenceID=head.nSequenceID;
                respMsg.nMsgSize=16;
                try {
                    sendHead(respMsg);
                }
                catch (IOException ex) {
                    throw ex;
                }
                break;
            case COMMAND_CMPP_ACTIVE_TEST_REP:
                break;
            case COMMAND_CMPP_TERMINATE:
                CMPPHead out= new CMPPHead();
                out.nMsgSize=16;
                out.nCommandID=COMMAND_CMPP_TERMINATE_RESP;
                out.nSequenceID=head.nSequenceID;
                try {
                    sendHead(out);
                }
                catch (IOException ex) {
                    throw ex;
                }
                break;
            case COMMAND_CMPP_TERMINATE_RESP:
                break;
            default:
                stat=CMPP_UNKNOWN_PACKAGE_ERROR;
        }
        backMsg.nCommandID=head.nCommandID;
        backMsg.nMsgSize=head.nMsgSize;
        backMsg.nSequenceID=head.nSequenceID;
        backMsg.stat=stat;
        return backMsg;
    }

    public void deliver()throws IOException{
        try {
            if(!activeTest("auto"))
                throw new IOException();
            CMPPHead back = Deliver();
            if(back.nCommandID==this.COMMAND_CMPP_DELIVER){
                deliverMsgList.addElement(((CMPPDeliverMessage)back).getDeliverMsg());
                return;
            }
            if(back.nCommandID==this.COMMAND_CMPP_TERMINATE){
                close();
                throw new IOException();
            }
        }
        catch (IOException ex) {
            close();
            throw ex;
        }
    }
    //收取网关下发信息
    private CMPPHead Deliver()throws IOException{
        CMPPHead head = new CMPPHead();
        byte[] bMsg=null;
        int i=0;
        while(true){
            try {
                bMsg=read(head);
            }
            catch (InterruptedIOException ex) {
                if(i==2){
                    head.stat=DELIVER_MSG_TIME_OUT;//由于没有消息而退出--stat=1
                    break;
                }else{
                    i++;
                     continue;
                }
            }
            catch (IOException ex) {
                throw ex;
            }
            try {
                head = dealMsg(head,bMsg);
            }
            catch(IOException ex){
                throw ex;
            }
            catch (Exception ex) {
                Log.printError(ex,"",logFile);
            }
            if(head.nCommandID==this.COMMAND_CMPP_ACTIVE_TEST){
                continue;
            }
            break;
        }
        return head;
    }

    //向网关查询信息流量
    public CMPPQueryMessageResp Query(){
        CMPPQueryMessage queryMessage = new CMPPQueryMessage();
        CMPPQueryMessageResp queryResp = new CMPPQueryMessageResp();

        return queryResp;
    }

    //发送测试信息
    private boolean activeTest(String flag)throws IOException{
        boolean testFlag=false;
        if(flag==null||(int)(System.currentTimeMillis()/1000)-checkTime>10)
            testFlag=true;
        if(testFlag){
            CMPPActiveTestMessage test = new CMPPActiveTestMessage();
            sendOut=test.setSequenceID(sendOut);
            test.nMsgSize=16;
            try {
                sendHead(test);
            }
            catch(IOException e){
                sendOut--;
                return false;
            }
            try {
                while(true){
                    CMPPHead back = Deliver();
                    if(back.nCommandID==this.COMMAND_CMPP_DELIVER){
                        deliverMsgList.addElement(((CMPPDeliverMessage)back).getDeliverMsg());
                        continue;
                    }
                    if(back.stat==this.DELIVER_MSG_TIME_OUT){
                        throw new IOException();
                    }
                    if(back.nCommandID==this.COMMAND_CMPP_ACTIVE_TEST_REP){
                        checkTime=(int)(System.currentTimeMillis()/1000);
                        break;
                    }
                }
            }
            catch (IOException ex) {
                return false;
            }
            return true;
        }
        return true;
    }
    public boolean activeTest()throws IOException{
        return activeTest(null);
    }

    private int getDeliverMessage(CMPPDeliverMessage msg,byte[] content)throws Exception{
        if(msg==null)
            return DELIVER_MSG_NULL_ERROR;
        int stat=CMPP_SUCCESS;
        //把content解析成所需信息
        byte sDestTermID[] = new byte[21];
        byte sServiceID[] = new byte[10];
        byte cTpPid=0;
        byte cTpUdhi=0;
        byte nMsgFormat=0;
        byte sSrcTermID[] = new byte[21];
        byte nIsReply=0;
        byte nMsgLen=0;
        byte sMsgContent[]=null;
        try {
            int length = content.length;
            int i=0;
            for(;i<length;i++){
                if(content[i]==0){
                    break;
                }
            }
            System.arraycopy(content,0,sSrcTermID,0,i+1);
            byte[] msgs=new byte[length];
            System.arraycopy(content,i+1,msgs,0,length-i-1);
            content=msgs;

            i=0;
            length=content.length;
            for(;i<length;i++){
                if(content[i]==0){
                    break;
                }
            }
            System.arraycopy(content,0,sDestTermID,0,i+1);
            msgs=new byte[length];
            System.arraycopy(content,i+1,msgs,0,length-i-1);
            content=msgs;

            i=0;
            length=content.length;
            for(;i<length;i++){
                if(content[i]==0){
                    break;
                }
            }
            System.arraycopy(content,0,sServiceID,0,i+1);
            msgs=new byte[length];
            System.arraycopy(content,i+1,msgs,0,length-i-1);
            content=msgs;
            cTpPid=content[0];
            nIsReply=content[1];
            cTpUdhi=content[2];
            nMsgFormat=content[3];
            nMsgLen=content[4];
            if(nMsgLen<0)
                nMsgLen+=256;
            sMsgContent= new byte[nMsgLen];
            System.arraycopy(content,5,sMsgContent,0,nMsgLen);
        }
        catch (Exception ex) {
            return DELIVER_MSG_FORMAT_ERROR;
        }
        /////////////////////////////////////////封装正常消息
        msg.nIsDelivery=nIsReply;
        msg.nMsgFormat=nMsgFormat;
        msg.nMsgLength=nMsgLen;
        msg.nTPpid=cTpPid;//协议标识
        msg.nTPudhi=cTpUdhi;//优先级别
        msg.sDestId = new String(sDestTermID).trim();
        if (msg.sDestId.startsWith(spNum)) {
          msg.sDestId = rpSPNum + msg.sDestId.substring(spNum.length());
          msg.sDestId=msg.sDestId.trim();
        }
        msg.sServiceId=new String(sServiceID).trim();
        msg.sSrcTerminalId=new String(sSrcTermID).trim();
        try {
            if(nIsReply==0){
                if(nMsgFormat == 8){//ucs2编码格式
                    msg.sMsgContent = new String(sMsgContent,"iso-10646-ucs-2");

                }else{
                    msg.sMsgContent=new String(sMsgContent,"gb2312");
                }
            }
        }
        catch (Exception ex) {
            return DELIVER_MSG_FORMAT_DECODE_ERROR;
        }
        /////////////////////////////状态报告中所需字段
        if(nIsReply==1){
            try {
                //byte[] msgID = new byte[8];
                //byte[] sStat = new byte[3];
                //byte[] sSubmitTime = new byte[12];
                //byte[] sDoneTime = new byte[12];

                int length = sMsgContent.length;
                int i=0;
                for(;i<length;i++){
                    if(sMsgContent[i]==9){
                        break;
                    }
                }
                 byte[] msgID = new byte[i];
                System.arraycopy(sMsgContent,0,msgID,0,i);
                byte[] msgs=new byte[length-i-1];
                System.arraycopy(sMsgContent,i+1,msgs,0,length-i-1);
                sMsgContent=msgs;

                i=0;
                length=sMsgContent.length;
                for(;i<length;i++){
                    if(sMsgContent[i]==9){
                        break;
                    }
                }
                byte[] sStat = new byte[i];
                System.arraycopy(sMsgContent,0,sStat,0,i);
                msgs=new byte[length-i-1];
                System.arraycopy(sMsgContent,i+1,msgs,0,length-i-1);
                sMsgContent=msgs;

                i=0;
                length=sMsgContent.length;
                for(;i<length;i++){
                    if(sMsgContent[i]==9){
                        break;
                    }
                }
                byte[] sSubmitTime = new byte[i];
                System.arraycopy(sMsgContent,0,sSubmitTime,0,i);
                msgs=new byte[length-i-1];
                System.arraycopy(sMsgContent,i+1,msgs,0,length-i-1);
                sMsgContent=msgs;

                i=0;
                length=sMsgContent.length;
                for(;i<length;i++){
                    if(sMsgContent[i]==9){
                        break;
                    }
                }
                byte[] sDoneTime = new byte[i];
                System.arraycopy(sMsgContent,0,sDoneTime,0,i);
                msg.setReportMsgId(msgID);
                msg.sStat=new String(sStat).trim();
                msg.sStat=String.valueOf(Integer.parseInt(msg.sStat));
                msg.sSubmitTime=new String(sSubmitTime).trim();
                msg.sDoneTime=new String(sDoneTime).trim();
            }
            catch (Exception ex) {
                stat=DELIVER_MSG_FORMAT_REPORT_ERROR;
            }
        }
        return stat;

    }

    private void sendHead(CMPPHead head)throws IOException{
        byte[] send = new byte[16];
        System.arraycopy(Tools.int2byte(head.nMsgSize),0,send,0,4);
        System.arraycopy(Tools.int2byte(head.nCommandID),0,send,4,4);
        System.arraycopy(Tools.int2byte(head.nSequenceID),0,send,12,4);
        send(send);
    }
    private void sendPacket(CMPPHead head,byte[] msg)throws IOException{
        byte[] send = new byte[16+msg.length];
        head.nMsgSize=16+msg.length;
        System.arraycopy(Tools.int2byte(head.nMsgSize),0,send,0,4);
        System.arraycopy(Tools.int2byte(head.nCommandID),0,send,4,4);
        System.arraycopy(Tools.int2byte(head.nSequenceID),0,send,12,4);
        System.arraycopy(msg,0,send,16,msg.length);
        send(send);
    }
    private void send(byte[] msg)throws IOException{
        DataOutputStream out = creatOutputStream();
        out.write(msg);
        out.flush();
    }

    private byte[] read(CMPPHead head)throws InterruptedIOException,IOException{
        DataInputStream in =creatInputStream();
        head.nMsgSize=in.readInt();
        head.nCommandID=in.readInt();
        head.stat=in.readInt();
        head.nSequenceID=in.readInt();
        byte[] resp = null;
        if(head.nMsgSize<=16){
            return null;
        }else{
            resp=new byte[head.nMsgSize-16];
            in.read(resp,0,head.nMsgSize-16);
        }
        return resp;
    }
    private DataInputStream creatInputStream()throws IOException{
        return new DataInputStream(s.getInputStream());
    }
    private DataOutputStream creatOutputStream()throws IOException{
        return new DataOutputStream(s.getOutputStream());
    }
    private void close(){
        socketManger.freeSocket();
        s=null;
    }

    private static final int CMPP_SUCCESS=0;
    private static final int CMPP_UNKNOWN_PACKAGE_ERROR=-9;
    private static final int CMPP_LOGOUT_HAPPEND=-2;

    private static final int SUBMIT_MSG_NULL_ERROR=-4;
    private static final int SUBMIT_MSG_FORMAT_ERROR=-5;
    private static final int SUBMIT_MSG_TIME_OUT=-6;

    private static final int DELIVER_MSG_FORMAT_REPORT_ERROR=-7;
    private static final int DELIVER_MSG_NULL_ERROR=-8;
    private static final int DELIVER_MSG_TIME_OUT=-9;
    private static final int DELIVER_MSG_FORMAT_ERROR=-10;
    private static final int DELIVER_MSG_FORMAT_DECODE_ERROR=-11;

    private static final int CONNECT_MSG_NULL_ERROR=-12;
    private static final int CONNECT_MSG_RESP_NOT_FOUNT_ERROR=-13;
    private static final int CONNECT_MSG_FORMAT_ERROR=-14;
    private static final int CONNECT_INIT_ERROR=-15;

    private static final int CONNECT_HEAD_LEN = 12;
    private static final int CONNECT_PACKET_LEN = 27;
    private static final int QUERY_PACKET_LEN = 27;
    private static final int COMMAND_CMPP_SUBMIT = 4;
    private static final int COMMAND_CMPP_QUERY = 6;
    private static final int COMMAND_CMPP_TERMINATE = 2;
    private static final int COMMAND_CMPP_TERMINATE_RESP = 0x80000002;
    private static final int COMMAND_CMPP_QUERY_RESP = 0x80000006;
    private static final int COMMAND_CMPP_SUBMIT_RESP = 0x80000004;
    private static final int COMMAND_CMPP_CONNECT = 1;
    private static final int COMMAND_CMPP_CONNECT_RESP = 0x80000001;
    private static final int COMMAND_CMPP_ACTIVE_TEST = 8;
    private static final int COMMAND_CMPP_ACTIVE_TEST_REP = 0x80000008;
    private static final int COMMAND_CMPP_DELIVER = 5;
    private static final int COMMAND_CMPP_NACK_RESP = 0x80000000;
    private static final int COMMAND_CMPP_DELIVER_RESP = 0x80000005;
    private static final int COMMAND_CMPP_SET_KEY = 4098;
    private static final int COMMAND_CMPP_SET_KEY_RESP = 0x80001002;

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -