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

📄 cmpp_yx.java

📁 使用华为cmpp2.0网关
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
      Exception {
    CMPPHead backMsg = new CMPPHead();
    int stat = head.stat;
    switch (head.nCommandID) {
      case COMMAND_CMPP_NACK_RESP:
        break;
      case COMMAND_CMPP_CONNECT_RESP:
        CMPPConnectMessageResp cResp = new CMPPConnectMessageResp();
        if (msg == null) {
          stat = CONNECT_MSG_NULL_ERROR;
        }
        else {
          cResp.nStatus = msg[0];
          try {
            stat = msg[0];
            if (stat != 3) {
              cResp.sISMG = new String(msg, 1, 16);
            }
            cResp.nVersion = msg[msg.length - 1];
          }
          catch (Exception ex) {
            stat = CONNECT_MSG_FORMAT_ERROR;
          }
        }
        cResp.nStatus = stat;
        backMsg = cResp;
        break;
      case COMMAND_CMPP_DELIVER:
        CMPPDeliverMessage back = new CMPPDeliverMessage();
        stat = getDeliverMessage(back, msg);
        CMPPDeliverMessageResp resp = new CMPPDeliverMessageResp();
        resp.nMsgId = back.msgID;
        resp.nSequenceID = head.nSequenceID;
        resp.nMsgSize = 21;
        resp.nResult = stat;
        byte[] send = new byte[9];
        System.arraycopy(Tools.long2byte(resp.nMsgId), 0, send, 0, 8);
        send[8] = (byte) resp.nResult;
        try {
          sendPacket(resp, send);
        }
        catch (IOException ex) {
          throw ex;
        }
        back.stat = stat;
        backMsg = back;
        break;
      case COMMAND_CMPP_SUBMIT_RESP:
        CMPPSubmitMessageResp sResp = new CMPPSubmitMessageResp();
        if (msg == null) {
          stat = SUBMIT_MSG_NULL_ERROR;
        }
        else {
          try {
            byte id[] = new byte[8];
            System.arraycopy(msg, 0, id, 0, 8);
            sResp.setMsgID(id);
            sResp.nResult = msg[8];
            stat = msg[8];
          }
          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;
        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 = 12;
        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 == 3) {
          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.printBytes(bMsg, logFile);
        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 = 12;
      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 msgID[] = new byte[8];
    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 {
      System.arraycopy(content, 0, msgID, 0, 8);
      System.arraycopy(content, 8, sDestTermID, 0, 21);
      System.arraycopy(content, 29, sServiceID, 0, 10);
      cTpPid = content[39];
      cTpUdhi = content[40];
      nMsgFormat = content[41];
      System.arraycopy(content, 42, sSrcTermID, 0, 21);
      nIsReply = content[63];
      nMsgLen = content[64];
      if (nMsgLen < 0) {
        nMsgLen += 256;
      }
      sMsgContent = new byte[nMsgLen];
      System.arraycopy(content, 65, sMsgContent, 0, nMsgLen);
    }
    catch (Exception ex) {
      return DELIVER_MSG_FORMAT_ERROR;
    }
    /////////////////////////////////////////封装正常消息
    msg.setMsgID(msgID);
    msg.msgID = Tools.byte2long(msgID);
    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 msgReportID[] = new byte[8];
        System.arraycopy(sMsgContent, 0, msgReportID, 0, 8);
        msg.setReportMsgId(msgReportID);
        //msg.nReportMsgId=Tools.byte2long(sMsgContent,0);
        msg.sStat = new String(sMsgContent, 8, 7).trim();
        msg.sSubmitTime = new String(sMsgContent, 15, 10).trim();
        msg.sDoneTime = new String(sMsgContent, 25, 10).trim();
        msg.sDestTerminalId = new String(sMsgContent, 35, 21).trim();
        msg.nSMSCSequence = Tools.byte2int(sMsgContent, 56);
      }
      catch (Exception ex) {
        stat = DELIVER_MSG_FORMAT_REPORT_ERROR;
      }
    }
    return stat;
  }

  private void sendHead(CMPPHead head) throws IOException {
    byte[] send = new byte[12];
    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, 8, 4);
    send(send);
  }

  private void sendPacket(CMPPHead head, byte[] msg) throws IOException {
    byte[] send = new byte[12 + msg.length];
    head.nMsgSize = 12 + 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, 8, 4);
    System.arraycopy(msg, 0, send, 12, 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.nSequenceID = in.readInt();
    byte[] resp = null;
    if (head.nMsgSize <= 12) {
      return null;
    }
    else {
      resp = new byte[head.nMsgSize - 12];
      in.read(resp, 0, head.nMsgSize - 12);
    }
    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 + -