短信平台快完工了,晚上把开发中遇到的一些问题整理了出来便于以后的参考和开发
短信下行(发送短信):
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>
分享到:
相关推荐
本人亲测可用采用华为包开发的JAVA移动短信CMPP2.0/CMPP3.0程序,希望能够帮到你
cmpp2.0网关短信发送DEMO(smproxy.jar) 使用华为jar包实现,只吃cmoo2.0 和 3.0。参考 博客 https://blog.csdn.net/leiliz/article/details/73810598
cmpp2.0模拟短信网关 支持上行与下行的模拟,可结合代码进行测试 结合软包为华为。
CMPP模拟网关,用于CMPP2.0;CMPP3.0开发调试,同时提供相关java代码,供大家参数,若开发有困难的,大家可以借用华为的短信代理包 smproxy.jar
采用华为包开发的JAVA移动短信CMPP2.0/CMPP3.0程序,亲测可用
短消息信息服务技术协议CMPP2.0--移动标准短信接口(我已和华为短信平台对接过)
华为cmpp短信API,包含windows,java,unix说明文档,很详细。其中unix的本人亲测可以使用,不过要先仔细阅读说明文档。需要帮忙的话可以留言联系我。
api-hw华为CMPP3.0短信网关API api-hw华为CMPP3.0短信网关API
NULL 博文链接:https://endeavor416.iteye.com/blog/327935
华为cmpp协议短信网关Delphi源码
CMPP 3.0JAVA开发包,华为提供,做短信必需
java实现的cmpp2.0 cmpp3.0短信网关协议,测试通过,有demo,包括协议规范,包含华为实现的cmpp短信网关源码包
华为提供的中国移动短信网关cmpp 3.0java api, 含java doc和代码样例, 代码样例修改配置参数, 可直接连接短信网关发送和接收短信.
中国移动短信协议JAVA API 支持cmpp 2.0和cmpp3.0,支持亚信网关和华为网关。 包含示例代码。
cmpp2.0协议,短信网关协议Java版,在idea中可直接调试使用,无须开发。配置好文件即可。
华为最新短信API(综合网关) 支持 CMPP2.0 CMPP3.0 CNGP SGIP SMGP SMPP 含详细开发接口文档
华为cmpp协议短信网关程序,Delphi源代码。代码编译时需要一些控件,如果忽略控件的话,可以正常编译,但某些功能可能无法使用。
网关完全符合CMPP2.0协议标准。支持各省和全网的所有移动网关,同时兼容亚信,华为,东软,清华深讯,思特奇等所有网关厂商平台。 高度封装,开发效率高。二次开发人员只需要很少的开发工作就可以实现短信网关应用...