📄 cmppapis.java
字号:
package com.ekun.sms.cmpp2;
import java.io.*;
import java.text.*;
import java.util.*;
import com.ekun.sms.common.BuffMemoUtil;
public class CmppApis
{
// boolean bDebug = true;
public CmppApis()
{
SPID = "";
CorpID = "";
SPPassword = "";
hostIp = "";
port = 0;
version = 32;
sversion = 0;
sock = null;
}
/*名称:nCMPP_SendDeliverRep
* 功能:发送CMPP_Deliver_Rep包
* 输入参数:无
*
* 输出参数:无
*
* 返回值:0:成功,-1:失败
*/
public int nCMPP_SendDeliverRep(RecCDeliverRep precDeliverRep)
{
if (precDeliverRep == null)
{
return -1;
}
CmppDeliverRep deliverRep = new CmppDeliverRep(sock);
deliverRep.setSequenceId(precDeliverRep.nSeqId);
deliverRep.setcmppDeliverRep(precDeliverRep.usMsgId,
precDeliverRep.ucResult);
int rescode = deliverRep.sendcmppDeliverRep();
return rescode;
}
/*名称:nCMPP_Connect
* 功能:登陆到ISMG
* 输入参数:无
*
* 输出参数:无
*
* 返回值:0:成功,-1:失败
*/
public int nCMPP_Connect()
{
int i;
int readcode = -1;
SimpleDateFormat formatter = new SimpleDateFormat("MMddHHmmss");
Date currentTime = new Date();
String dateString = formatter.format(currentTime);
if (hostIp == null)
{
return -1;
}
hostIp = hostIp.trim();
if (hostIp.length() == 0)
{
return -1;
}
if (port <= 0)
{
return -1;
}
if (sock != null)
{
sock.closeSock();
}
sock = new CmppSocket(hostIp, port);
int initcode = sock.InitialSock(timeout);
if (initcode < 0)
{
sock.closeSock();
return initcode;
}
CmppConnect connect = new CmppConnect(sock);
synchronized (sock)
{
connect.setSequenceId(sock.seq);
sock.seq++;
}
connect.setcmppConnects(SPID, SPPassword, version, dateString);
int rescode = connect.sendcmppConnect();
//System.out.println("rescode:"+rescode);
if (rescode < 0)
{
sock.closeSock();
return rescode;
}
CmppPacket packet = new CmppPacket(sock);
int CommandID; //包类型
byte bodybytes[];
bodybytes = new byte[18];
//读取CMPP_Connect_Rep包
if(packet.readPacket() < 0)
return -1;
CommandID = packet.getCommandID();
bodybytes = packet.getPacketBody();
int status;
String AuthenticatorISMG;
if (CommandID == CmppPacket.CMPP_Connect_REP)
{
CmppConnectRep connectRep = new CmppConnectRep(bodybytes, 18);
status = connectRep.getStatus();
AuthenticatorISMG = connectRep.getAuthenticatorISMG();
sversion = connectRep.getVersion();
readcode = status;
//System.out.print("connect resp: status=" + status + " serverVersion=" + sversion);
if (status != 0)
{
sock.closeSock();
return readcode;
}
else
{
return 0;
}
}
return readcode;
}
/*名称:nCMPP_Terminate
* 功能:退出
* 输入参数:无
*
* 输出参数:无
*
* 返回值:0:成功,-1:失败
*/
public int nCMPP_Terminate()
{
if (sock == null)
{
return -1;
}
/*
CmppTerminate terminate = new CmppTerminate(sock);
synchronized (sock)
{
terminate.setSequenceId(sock.seq);
if (sock.seq == 2147483647)
{
sock.seq = 2;
}
}
int rescode = terminate.sendTerminate();
if (rescode < 0)
{
return rescode;
}
CmppPacket packet = new CmppPacket(sock);
int CommandID; //包类型
int readcode = packet.readPacket();
CommandID = packet.getCommandID();
*/
int code = sock.closeSock();
return code;
}
public int nCMPP_PrepSubmit
(
RecCSubmit precSubmit,
byte usMsgId[],
int ucPkTotal,
int ucPkNumber,
int ucRegisterDelivery,
int ucMsgLevel,
String sServiceId,
int ucFeeUserType,
String sFeeTerminalId,
int ucTpPid,
int ucTpUdhi,
int ucMsgFmt,
String sMsgSrc,
String sFeeType,
String sFeeCode,
String sAtTime,
String sSrcTerminalId,
String usReserve
)
{
if (precSubmit == null)
{
return -1;
}
precSubmit.usMsgId = usMsgId;
precSubmit.ucPkTotal = ucPkTotal;
precSubmit.ucPkNumber = ucPkNumber;
precSubmit.ucRegister = ucRegisterDelivery;
precSubmit.ucMsgLevel = ucMsgLevel;
precSubmit.sServiceId = sServiceId;
precSubmit.ucFeeUserType = ucFeeUserType;
precSubmit.sFeeTermId = sFeeTerminalId;
precSubmit.ucTpPid = ucTpPid;
precSubmit.ucTpUdhi = ucTpUdhi;
precSubmit.ucMsgFmt = ucMsgFmt;
precSubmit.sMsgSrc = sMsgSrc;
precSubmit.sFeeType = sFeeType;
precSubmit.sFeeCode = sFeeCode;
precSubmit.sAtTime = sAtTime;
precSubmit.sSrcTermId =sSrcTerminalId;
precSubmit.usReserve = usReserve;
return 0;
}
Vector parseAllSubscribers(String sDestTerminalId)
{
if (sDestTerminalId == null)
{
return null;
}
Vector vk = new Vector();
for (; ; )
{
char sign = ',';
int first = sDestTerminalId.indexOf( (int) sign);
if (first == -1)
{
break;
}
String subsId = sDestTerminalId.substring(0, first);
vk.addElement(subsId.trim());
sDestTerminalId = sDestTerminalId.substring(first + 1);
//System.out.println("leave :"+tmo );
}
vk.add(BuffMemoUtil.addMobilePrefix86(sDestTerminalId.trim()));
return vk;
}
static int getSendtimes(int data_coding, int nMessageLen)
{
//System.out.println("len:"+message.length);
int msglength;
if (data_coding == 0)
{
msglength = maxMsgLenAscii;
}
else
{
msglength = maxMsgLenOther;
}
int n = nMessageLen / msglength;
if((nMessageLen % msglength) > 0)
n++;
return n < 30 ? n : 30;
}
/*名称:nCMPP_SendSubmit
* 功能:发送CMPP_Submit包
* 输入参数:precSubmit:参照RecCSubmit的定义
* sValidTime:
* sDestTerminalId
* nMsgLen
* usMsgContent
* 输出参数:precSubmit
*
* 返回值:>0:发送的次数,-1:参数出错 -7:没有连接到ISMG -2:目的手机地址为空
*/
public int nCMPP_SendSubmit
(
RecCSubmit precSubmit,
String sValidTime,
String sDestTerminalId,
int nMsgLen,
byte[] usMsgContent)
{
//参数检查
if ( (precSubmit == null) || (sDestTerminalId == null) || (usMsgContent == null))
{
return -1;
}
if (sDestTerminalId.length() == 0)
{
return -1;
}
//连路检查
if (sock == null)
{
return -7;
}
//消息格式
int msglength;
if (precSubmit.ucMsgFmt == 0)
{
msglength = maxMsgLenAscii;
}
else
{
msglength = maxMsgLenOther;
}
precSubmit.sValidTime = sValidTime;
precSubmit.sDstTermId = BuffMemoUtil.addMobilePrefix86(sDestTerminalId);
precSubmit.ucMsgLen = nMsgLen;
precSubmit.usMsgContent = usMsgContent;
int flag = 0; //设置ucPkTotal和ucPkNumber的标志
switch (precSubmit.ucTpUdhi)
{
case 0:
if ( (precSubmit.ucPkTotal == 0) && (precSubmit.ucPkNumber == 0))
{
flag = 1; //API设置ucPkTotal和ucPkNumber
}
if ( (precSubmit.ucPkTotal > 0) && (precSubmit.ucPkNumber > 0))
{
if (precSubmit.ucPkTotal >= precSubmit.ucPkNumber)
{
flag = 0; //用户设置ucPkTotal和ucPkNumber
}
else
{
return -9; //参数错
}
}
break;
case 1:
if ( (precSubmit.ucPkTotal == 0) && (precSubmit.ucPkNumber == 0))
{
flag = 1; //API设置ucPkTotal和ucPkNumber
}
if ( (precSubmit.ucPkTotal > 0) && (precSubmit.ucPkNumber > 0))
{
if (precSubmit.ucPkTotal >= precSubmit.ucPkNumber)
{
flag = 0; //用户设置ucPkTotal和ucPkNumber
}
else
{
return -9; //参数错
}
}
break;
default:
break;
}
//计算即将发送的手机号码
Vector vSubsId = parseAllSubscribers(sDestTerminalId);
if (vSubsId == null)
{
return -2;
}
//计算即将发送的次数
int send_times = getSendtimes(precSubmit.ucMsgFmt, nMsgLen);
synchronized (sock)
{
precSubmit.nSeqId = sock.seq;
}
int sendtimes = 0;
CmppSubmit submit = new CmppSubmit(sock);
submit.setMsgId(precSubmit.usMsgId);
submit.setPkTotal(precSubmit.ucPkTotal);
submit.setPkNumber(precSubmit.ucPkNumber);
submit.setRegisteredDelivery(precSubmit.ucRegister);
submit.setMsgLevel(precSubmit.ucMsgLevel);
submit.setServiceId(precSubmit.sServiceId);
submit.setFeeUserType(precSubmit.ucFeeUserType);
submit.setFeeterminalid(BuffMemoUtil.addMobilePrefix86(precSubmit.sFeeTermId));
submit.setTppid(precSubmit.ucTpPid);
submit.setTpudhi(precSubmit.ucTpUdhi);
submit.setMsgFmt(precSubmit.ucMsgFmt);
submit.setMsgSrc(precSubmit.sMsgSrc);
submit.setFeeType(precSubmit.sFeeType);
submit.setFeeCode(precSubmit.sFeeCode);
submit.setValidTime(precSubmit.sValidTime);
submit.setAtTime(precSubmit.sAtTime);
submit.setSrcTerminalId(BuffMemoUtil.addMobilePrefix86(precSubmit.sSrcTermId));
submit.setReverse(precSubmit.usReserve);
for (int i = 0; i < vSubsId.size(); i++)
{
String subsId = (String) vSubsId.elementAt(i);
//System.out.println("subsId:"+subsId);
if (subsId == null)
{
continue;
}
else
{
subsId = subsId.trim();
}
byte msg[] = new byte[msglength];
int msg_len = msglength;
int packet_beg = 0; //当msg_format = 15 时,分包应该考虑拆分了一个汉字
int packet_end = 0;
for (int j = 0; j < send_times; j++)
{
synchronized (sock)
{
submit.setSequenceId(sock.seq);
sock.seq++;
if (sock.seq == 2147483647)
{
sock.seq = 2;
}
}
if (flag == 1)
{
precSubmit.ucPkTotal = send_times;
precSubmit.ucPkNumber = j + 1;
submit.setPkTotal(precSubmit.ucPkTotal);
submit.setPkNumber(precSubmit.ucPkNumber);
}
else
{
if (send_times > 1)
{
return -10; //用户拆分的单包长超过140或160
}
}
//拆包处理
if ( (j + 1) == send_times)
{
//System.out.println("*********1*************");
CmppCommon.BytesCopy(usMsgContent, msg, packet_end,
usMsgContent.length - 1, 0);
//System.out.println("2");
msg_len = usMsgContent.length - packet_end;
byte tmp[] = new byte[msg_len];
CmppCommon.BytesCopy(msg, tmp, 0, msg_len - 1, 0);
submit.setRequiredItems(subsId, msg_len, tmp);
//System.out.println("2");
}
else
{
packet_beg = packet_end;
packet_end += msglength;
if (precSubmit.ucMsgFmt == 15)
{
if (CmppCommon.notHalfChar(usMsgContent, packet_beg,
packet_end) == false)
{
packet_end = packet_end - 1;
}
}
CmppCommon.BytesCopy(usMsgContent, msg, packet_beg, packet_end - 1, 0);
submit.setRequiredItems(subsId, msglength, msg);
}
int code = submit.sendCmppSubmit();
if (code == 0)
sendtimes++;
else
return -7;
}
}
//System.out.println("send:"+sendtimes);
return vSubsId.size() * send_times;
}
/*名称:nCMPP_SendActive
* 功能:发送CMPP_Active_Test包
* 输入参数:无
*
* 输出参数:无
*
* 返回值:>0:短消息标示码,-1:失败
*/
public int nCMPP_SendActive()
{
if (sock == null)
{
return -1;
}
CmppActiveTest activeTest = new CmppActiveTest(sock);
synchronized (sock)
{
activeTest.setSequenceId(sock.seq);
sock.seq++;
if (sock.seq == 2147483647)
{
sock.seq = 2;
}
}
int rescode = activeTest.sendActiveTest();
return rescode;
}
/*名称:nCMPP_SendActive
* 功能:发送CMPP_Active_Test_Rep包
* 输入参数:无
*
* 输出参数:无
*
* 返回值:>0:短消息标示码,-1:失败
*/
public int nCMPP_SendActiveRep(RecCActiveTestRep precActiveRep)
{
if (sock == null)
{
return -1;
}
if (precActiveRep == null)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -