📄 cmpplinker.java
字号:
}
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 + -