`
xidajiancun
  • 浏览: 449524 次
文章分类
社区版块
存档分类
最新评论

基于华为CMPP2.0 API开发短信平台

 
阅读更多

短信平台快完工了,晚上把开发中遇到的一些问题整理了出来便于以后的参考和开发

短信下行(发送短信)

SMProxy myProxy= new SMProxy(this,args);

Args args = new Cfg("SMProxy.xml",false).getArgs("ismg");

args.set("source-addr",loginName.getText().trim());

args.set("shared-secret",loginPass.getText().trim());

args.set("shared-secret",loginPass.getText().trim());

CMPPSubmitMessage submitMsg =

new CMPPSubmitMessage(

int pk_Total, //

int pk_Number, // pk_Number 相同msg_Id的消息序号

int registered_Delivery, // registered_Delivery 是否要求返回状态报告

int msg_Level, // msg_Level 信息级别

String service_Id, // service_Id 业务类型

int fee_UserType, // fee_UserType 计费用户类型字段

String fee_Terminal_Id, // fee_Terminal_Id 被计费用户的号码

int tp_Pid, // tp_Pid GSM协议类型

int tp_Udhi, // tp_Udhi GSM协议类型

int msg_Fmt, // msg_Fmt 消息格式

String msg_Src, // msg_Src 消息内容来源

String fee_Type, // fee_Type 资费类别

String fee_Code, // fee_Code 资费代码(以分为单位)

Date valid_Time, // valid_Time 存活有效期

Date at_Time, // at_Time 定时发送时间

String src_Terminal_Id, // src_Terminal_Id 源号码

String[] dest_Terminal_Id, // dest_Terminal_Id 接收短信的MSISDN号码

byte[] msg_Content, // msg_Content 消息内容

String reserve // LinkID 点播业务使用的LinkID

) ;

System.out.println("Send Msg=["+ submitMsg.toString()+"]/n");

CMPPSubmitRepMessage submitRepMsg = myProxy.send(submitMsg);

//查询SMProxy与ISMG的TCP连接状态

String stateDesc = myProxy.getConnState();

System.out.println("Rep Msg= ["+stateDesc.toString()+"]/n");

//退出

myProxy.close()

短信上行(接收短信)

//extends SMProxy 继承com.huawei.smproxy.SMProxy类 覆盖onDeliver方法

public CMPPMessage onDeliver(CMPPDeliverMessage msg) {

byte msgId[] = msg.getMsgId();

String revertMessage=null;

try {

System.out.println("msg is " + new String(msg.getMsgContent(), "ISO-10646-UCS-2"));

} catch (UnsupportedEncodingException e) {

e.printStackTrace();

}

//来源手机号

msg.getSrcterminalId();

……

}

注意事项

CMPP2.0协议规定ICP与网关之间保持长连接,并且API可自动提供重连机制,所以在对接口函数的调用时应注意只需在程序启动时调用InitInterface()、及Login_R();无需在自己程序的其它线程中再次调用,而导致登陆多个接口。

CMPP协议中的目的地址最多可输入100个,在调用SubmitAExEx 时应注意sDestAddrs的定义为21*100字节的数组,每个号码固定的长度21个字节,不足21位的应赋空(十六进制0)。没有特殊情况,请尽量不要使用多目的地址发送。

短信长度应填写短信的实际字节长度,不应每次都填写短信的最大字节长度140。

调用SubmitAExEx后API会自动等待应答消息,并将应答消息的MsgID通过指针回传。MsgID应注意是一个22位的字符串。10位时间戳+7位的网关代码+5位的序列号。

通过调用GetDeliverExExEx可以将状态报告的MsgID解析出来,可通过此MsgID与调用SubmitAExEx得到的MsgID进行匹配。此API可同时支持SMPP协议、CMPP协议、SGMP协议、应注意其端口号的区别:这些端口号是在登录infoX信息平台的时的端口号。 登录短消息中心时端口号不同。

协议类型 dwCodeProtocol 端口号
SMPP 3 5018
CMPP 5 7890
SMGP 6 7118

如果利用华为的API,SP可以自动配置握手间隔时间,SP和infoX相连应采用长连接,但是infoX信息平台一般在50秒如果没有收到握手消息时就会断掉和SP的接口。建议SP在程序中对接口的断连写详细的日志,以便查看。

关于重发机制。如果SP开发的程序使用重发机制,建议重发的间隔最好设为5分钟之后,

重发次数不要超过5次。具体需要重发的消息也要根据错误码来决定,对于特定的错误码

(比如接口断连,应答超时,SCP应答超时)才采用重发机制,而对于一些错误码(如

SCP鉴权失败,用户不存在)则不要重发,以免造成不必要的网络负担。

SMProxy.xml

<?xml version="1.0" encoding="GB2312"?>

<!-- SM Proxy 配置文件-->

<config>

<!--与ISMG(Internet Short Message Gateway)建立连接所需参数-->

<ismg>

<!-- ISMG主机地址 -->

<host>10.76.148.147</host>

<!-- ISMG主机端口号 -->

<port>7890</port>

<!-- 心跳信息发送间隔时间(单位:秒) -->

<heartbeat-interval>60</heartbeat-interval>

<!-- 连接中断时重连间隔时间(单位:秒)-->

<reconnect-interval>60</reconnect-interval>

<!-- 需要重连时,连续发出心跳而没有接收到响应的个数(单位:个)-->

<heartbeat-noresponseout>5</heartbeat-noresponseout>

<!-- 操作超时时间(单位:秒) -->

<transaction-timeout>10</transaction-timeout>

<!--SP…ID(最大为六位字符)-->

<source-addr></source-addr>

<!--双方协商的版本号(大于0,小于256)-->

<version>33</version>

<!--shared-secret由中国移动与ICP事先商定-->

<shared-secret></shared-secret>

<!--是否属于调试状态,true表示属于调试状态,所有的消息被打印输出到屏幕,false表示不属于调试状态,所有的消息不被输出-->

<debug>true</debug>

</ismg>

</config>

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics