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

📄 cmpplinker.java

📁 短信系统SMS:支持普通短信、长短信和wap push短信的发送。
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
        }
        catch (InterruptedException ie)
        {
          logger.error(ie);
        }
        continue ;
      }
      cm.setTimeout(socketTimeOut);
      int nRet = cm.nCMPP_Connect();
      logger.debug("nCMPP_Connect return:" + nRet);
      if (nRet == 0)
      {
        logger.debug("nCMPP_Connect successed!");
        return;
      }
      logger.error("nCMPP_Connect Failed! retry after 3 second!");
      //AlertDAO.addAlert(IntfAlertType.AT_CMPP, "ISMG连接失败!");
      try
      {
        Thread.currentThread().sleep(3000);
      }
      catch (InterruptedException ie)
      {
        logger.error(ie);
      }
    }

  }

  /**
   * send CMPP_Terminate packet
   */
  private int disconnectToISMG()
  {
    int nRet = 0;
    //synchronized(sockSendLock)
    {
      nRet = cm.nCMPP_Terminate();
    }
    return nRet;
  }

  /**
   * send other packet
   * @param rec: a kind of sub packet
   */
  public int sendOtherPacket(Object obj)
  {
    RecCCmppPacket packet = new RecCCmppPacket();
    if (obj instanceof RecCQuery)
    {
      packet.nCmdId = 0x00000006;
      packet.recQuery = (RecCQuery) obj;
    }
    else if (obj instanceof RecCCancel)
    {
      packet.nCmdId = 0x00000007;
      packet.recCancel = (RecCCancel) obj;
    }
    else if (obj instanceof RecCActiveTest)
    {
      packet.nCmdId = 0x00000008;
      packet.recActiveTest = (RecCActiveTest) obj;
    }
    else if (obj instanceof RecCActiveTestRep)
    {
      packet.nCmdId = 0x80000008;
      packet.recActiveTestRep = (RecCActiveTestRep) obj;
    }
    else if (obj instanceof RecCDeliverRep)
    {
      packet.nCmdId = 0x80000005;
      packet.recDeliverRep = (RecCDeliverRep) obj;
    }
    else
    {
      logger.debug("unknowable packet to send!" + obj.toString());
      return -99;
    }
    int nRet = 0;
    synchronized (sockSendLock)
    {
      nRet = cm.nCMPP_SendPacket(packet);
      if (nRet < 0)
        logger.debug("CMPP send packet Error!" + packet.toString() +
                     "\t packetType:" + packet.nCmdId +
                     "\tErrorCode:" + nRet);
    }
    return nRet;
  }

  private String formatFeeType(int feeType)
  {
    String sFeeType = "";
    switch (feeType)
    {
      case 1:
        sFeeType = "01";
        break;
      case 2:
        sFeeType = "02";
        break;
      case 3:
        sFeeType = "03";
        break;
      default:
        sFeeType = "01";
    }
    return sFeeType;
  }

  private int prepSubmit(SmsInfo smsInfo, RecCSubmit sub)
  {
    byte[] tmp = new byte[8];
    for (int i = 0; i < 8; i++)
      tmp[i] = 0;
    tmp[5] = 1;
    int ucRegister;
    ucRegister = smsInfo.DBIsNeedStateReport > 0 ? 1 : 0;
    if (3 == smsInfo.DBfee_type)
      ucRegister = 2; //包月扣费!
    //Fee_UserType:计费用户类型字段:0:对目的终端MSISDN计费;1:对源终端MSISDN计费;2:对SP计费;3:表示本字段无效,对谁计费参见Fee_terminal_Id字段。
    int ucFeeUserType = 0; //这个字段目前数据库中没有,暂不处理!
    String sFeeType = formatFeeType(smsInfo.DBfee_type);
    String sFeeCode = String.valueOf(smsInfo.DBfee_total);
    int msgFmt = 15;
    int tp_Udhi = 0;
    if(smsInfo.smsType == 2)
    {
      msgFmt = 4;   //信息格式 0:ASCII串 3:短信写卡操作 4:二进制信息 8:UCS2编码 15:含GB汉字
      tp_Udhi = 1;
    }
    int nRet = cm.nCMPP_PrepSubmit(sub,
                                   tmp,
                                   1,
                                   1,
                                   ucRegister,
                                   1,
                                   smsInfo.DBServiceType,
                                   ucFeeUserType,
                                   smsInfo.DBfee_number,
                                   0,
                                   tp_Udhi,
                                   msgFmt,
                                   cm.CorpID,
                                   sFeeType,
                                   sFeeCode,
                                   "",
                                   smsInfo.DBMsgFrom,
                                   ""
        );
    return nRet;
  }

  /**
   * 内部短信发送函数!
   * @param smsInfo SmsInfo
   * @return int
   * >0:发送的次数
   * -1:参数出错!
   * -2:经过n次尝试后失败!
   */
  private int internalSubmit(SmsInfo smsInfo, String strError)
  {
    strError = "";
    if (smsInfo == null)
    {
      strError = "内部错误:传入参数为NULL!";
      return -1;
    }
    RecCSubmit sub = new RecCSubmit();
    //预准备!
    int nRet = prepSubmit(smsInfo, sub);
    if (0 != nRet)
    {
      strError = "内部错误:传入参数为NULL!";
      return -1;
    }
    for (int i = 0; i < SUBMIT_RETRY_TIMES; i++)
    {
      synchronized (sockSendLock)
      {
          nRet = cm.nCMPP_SendSubmit(sub, "", smsInfo.DBMsgTo,
                                     smsInfo.DBMsgContent.length,
                                     smsInfo.DBMsgContent);

      }
      if (nRet >= 0)
      {
        //submit成功后,赋值!
        smsInfo.SeqID = sub.nSeqId;
        logger.debug("cmpp成功MT:" + smsInfo.DBMsgID);
        return nRet;
      }
      else if (nRet == -1)
      {
        strError = "参数出错!";
        return nRet;
      }
      else if (nRet == -2)
      {
        strError = "参数出错:目的手机地址为空!";
        return nRet;
      }
      else if (nRet == -7)
      {
        logger.debug("nCMPP_SendSubmit failed! 没有连接到ISMG,等待连接...");
        try
        {
          isWaitForConn = true;
          synchronized (reConnLock)
          {
            isWaitForConn = true;
            reConnLock.wait();
          }
        }
        catch (Exception ex)
        {
          logger.debug(ex);
        }
        isWaitForConn = false;
        logger.debug("重连ISMG成功!");
      }
    }
    strError = "经过" + SUBMIT_RETRY_TIMES + "次尝试Submit后失败!";
    return -2;
  }

  /**
   *
   * @param smsInfo SmsInfo
   * @return int
   */
  public synchronized int sendSubmit(SmsInfo smsInfo)
  {
    if (smsInfo.sendTimes >= SUBMIT_RETRY_TIMES)
    {
      smsInfo.SendResult = -2;
      smsInfo.ErrorDesc = "重发" + SUBMIT_RETRY_TIMES + "次没有得到SubmitResponse!";
      processor.onCmppMT(smsInfo);
      return -2;
    }
    if (isTooFaster)
    {
      try
      {
        Thread.currentThread().sleep(1000);
      }
      catch (Exception ex)
      {}
      ;
      isTooFaster = false;
    }
    smsInfo.sendTimes++;
    String strError = "";
    int n = 0;
    int nRet = 0;
    nRet = internalSubmit(smsInfo, strError);
    //若发送错误,触发MT发送错误事件!,若正确,等待response后再触发事件!
    if (nRet < 0)
    {
      smsInfo.SendResult = nRet;
      smsInfo.ErrorDesc = strError;
      processor.onCmppMT(smsInfo);
    }
    else
    {
      String key = String.valueOf(smsInfo.SeqID);
      //加入滑动窗口控制!
      SmsInfo smsInfoResp = slipCtrl.pushCMDPending(key, smsInfo);
      //如果有消息很快返回!
      if (smsInfoResp != null)
      {
        //触发MT消息!
        if (processor != null)
        {
          smsInfo.SMSMsgID = smsInfoResp.SMSMsgID;
          smsInfo.SendResult = smsInfoResp.SendResult;
          smsInfo.ErrorDesc = "";
          processor.onCmppMT(smsInfo);
        }
      }
    }
    return nRet;
  }

  public int getSocketTimeOut()
  {
    return socketTimeOut;
  }

  public String getIniFileName()
  {
    return iniFileName;
  }

  public void setSocketTimeOut(int timeOut)
  {
    //此时间应该小于滑动窗口过期时间
    if (timeOut > 60 * 1000)
      this.socketTimeOut = 60 * 1000;
    else if (timeOut < 5 * 1000)
      this.socketTimeOut = 5 * 1000;
    else
      this.socketTimeOut = timeOut;
  }

  public void setIniFileName(String iniFileName)
  {
    this.iniFileName = iniFileName;
  }

  public static void main(String[] args)
  {
    CmppLinker linker = CmppLinker.getInstance();
    linker.setIniFileName("E:\\workspace\\JavaSMS\\config\\cmpp.ini");
    DefaultCmppMsgHandler processor = new DefaultCmppMsgHandler();
    linker.setProcessor(processor);
    linker.setSocketTimeOut(15 * 1000);
    linker.reOpen();
    int nSendCount = 2;
    String cmd = "";
    BufferedReader msgStream = new BufferedReader(new InputStreamReader(System.
        in));
    while (!cmd.equalsIgnoreCase("exit"))
    {
      long oldTime = System.currentTimeMillis();
      for (int i = 0; i < nSendCount; i++)
      {
        SmsInfo smsInfo = new SmsInfo();
        smsInfo.DBfee_number = "13521212121";
        smsInfo.DBfee_total = 0;
        smsInfo.DBfee_type = 1;
        smsInfo.DBIsNeedStateReport = 1;
        //smsInfo.DBMsgContent = "中文短信!";
        String Msg = "http://mywap.com";
        WAPPushSmsConstructor wpsc = new WAPPushSmsConstructor(smsInfo.DBMsgTo,
              "我的WAP", Msg);
        smsInfo.DBMsgContent = wpsc.GetSMSBinaryData();
        smsInfo.DBMsgFrom = "092804";
        smsInfo.DBMsgID = String.valueOf(1000 + i);
        smsInfo.DBMsgTo = "13510328056";
        smsInfo.DBServiceType = "GS";
        smsInfo.smsType = 2;
        linker.sendSubmit(smsInfo);
      }
      long nmmSecond = (System.currentTimeMillis() - oldTime);
      System.out.println("共耗时:" + nmmSecond + "毫秒!");
      System.out.println("平均每秒发送" + (nSendCount / (nmmSecond / 1000 + 1)) +
                         "条!");
      System.out.println("输入exit退出,任意键继续发送!");
      try
      {
        cmd = msgStream.readLine();
      }
      catch (Exception ex)
      {}
      ;
    }
    try
    {
      System.out.println("滑动窗口未决队列长度:" + linker.slipCtrl.getPendingSize());
      linker.cleanup();
    }
    catch (Exception ie)
    {}
  }
}

⌨️ 快捷键说明

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