CMPP3.0短信接口开发

背景: 原来接触的短信接口一般都是提供WebService协议或者http请求。前段时间紧急长线的过程中,一个同事负责的CMPP3.0协议联调不通,拿过来看了下,

总结了几个关键点:

 

1、CMPP主要是通过往服务器发送socket请求。发送请求前要建立连接,其中包括长连接和短连接,长连接需要用定时任务做心跳来保持。

2、短信厂家要提供几个关键参数:如

#网关IP地址
ismgIp=1.1.1.1
#访问短信网关需要的密码
sharedSecret=222222
#由短信网关分配的SPID等同于登录账号
spId=928***
#短信网关端口,根据使用的CMPP协议不同而不同,如cmpp3.0长链接的端口为8666
ismgPort=7***
#由短信网关分配的SPCODE,即用户接受到的短信显示的主叫号码,短号码段spChannel
spCode=1065****
#企业代码
serviceId=****
#SOCKET超时链接时间,可根据需求自由修改,建议6000,单位为毫秒
timeOut=60000
#SOCKET链接失败重试次数,及短信发送失败重新发送的次数
connectCount=3

3、开发代码网上都可以下载到,但是其中有几个点需要注意,由于是通过socket发送信息,短信内容的判断,

submit.setTotalLength(12+8+1+1+1+1+10+1+32+1+1+1+1+6+2+6+17+17+21+1+32+1+1+ getWordCount(msg) +20);对中文内容要*2

public static int getWordCount(String s)
{

s = s.replaceAll("[^\\x00-\\xff]", "**");
int length = s.length();
return length;
}

4、短信每个属性长度需要与服务器一致

public byte[] toByteArry(){
ByteArrayOutputStream bous=new ByteArrayOutputStream();
DataOutputStream dous=new DataOutputStream(bous);
try {
dous.writeInt(this.getTotalLength());
dous.writeInt(this.getCommandId());
dous.writeInt(this.getSequenceId());

dous.writeLong(this.msgId);//Msg_Id 信息标识,由SP接入的短信网关本身产生,本处填空
dous.writeByte(this.pkTotal);//Pk_total 相同Msg_Id的信息总条数
dous.writeByte(this.pkNumber);//Pk_number 相同Msg_Id的信息序号,从1开始
dous.writeByte(this.registeredDelivery);//Registered_Delivery 是否要求返回状态确认报告
dous.writeByte(this.msgLevel);//Msg_level 信息级别
MsgUtils.writeString(dous,this.serviceId,10);//Service_Id 业务标识,是数字、字母和符号的组合。
dous.writeByte(this.feeUserType);//Fee_UserType 计费用户类型字段 0:对目的终端MSISDN计费;1:对源终端MSISDN计费;2:对SP计费;3:表示本字段无效,对谁计费参见Fee_terminal_Id字段。
MsgUtils.writeString(dous,this.feeTerminalId,32);//Fee_terminal_Id 被计费用户的号码
dous.writeByte(this.feeTerminalType);//Fee_terminal_type 被计费用户的号码类型,0:真实号码;1:伪码
dous.writeByte(this.tpPId);//TP_pId
dous.writeByte(this.tpUdhi);//TP_udhi
dous.writeByte(this.msgFmt);//Msg_Fmt
MsgUtils.writeString(dous,this.msgSrc,6);//Msg_src 信息内容来源(SP_Id)
MsgUtils.writeString(dous,this.feeType,2);//FeeType 资费类别
MsgUtils.writeString(dous,this.feeCode,6);//FeeCode
MsgUtils.writeString(dous,this.valIdTime,17);//存活有效期
MsgUtils.writeString(dous,this.atTime,17);//定时发送时间
MsgUtils.writeString(dous,this.srcId,21);//Src_Id spCode
dous.writeByte(this.destUsrTl);//DestUsr_tl
MsgUtils.writeString(dous,this.destTerminalId,32);//Dest_terminal_Id
dous.writeByte(this.destTerminalType);//Dest_terminal_type 接收短信的用户的号码类型,0:真实号码;1:伪码
dous.writeByte(this.msgLength);//Msg_Length
dous.write(this.msgContent);//信息内容
MsgUtils.writeString(dous,this.linkID,20);//点播业务使用的LinkID
dous.close();
} catch (IOException e) {
logger.error("封装短信发送二进制数组失败。");
}

 

posted @ 2017-07-04 09:16  滚雪球俱乐部  阅读(10708)  评论(1编辑  收藏  举报