2023年7月31日发(作者:)
第一章 概述
1 差异描述
SMProxy30的使用方法与SMProxy基本相同,主要差别:
1、对ISMG主动下发的消息的处理,接收的消息类型使用CMPP30DeliverMessage类来处理。
2、CMPP30DeliverMessage相对CMPPDeliverMessage增加了如下方法:
a) public int getSrcterminalType() //返回源终端号码类型
b) public String getLinkID() //返回LinkID
另外,删除了原public String getReserve()方法。
3、构造下发短信响应消息时,使用CMPP30DeliverRepMessage类,其中result字段的有效取值范围扩展为[0, 2147483647]。
4、构造向SMC提交的短消息包时,使用CMPP30SubmitMessage类。相对于CMPPSubmitMessage,该类的构造方法增加了两个参数:
a) int fee_Terminal_Type //被计费用户的号码类型
b) int dest_Terminal_Type //接收业务的用户号码类型
c) string LinkID //点播业务用的LinkID
另外,删除了原String reserve参数。
5、对提交请求后收到的响应消息进行处理,使用CMPP30SubmitRepMessage类。
2 产品概述
SMProxy30是在原有的SMProxy上增加的符合CMPP3.0协议的接口,可以同时满足Unix和WINDOW NT平台的使用。SMProxy30与ISMG建立TCP连接进行通信,并负责短消息发送和接收、维护与ISMG的握手、断连重连等;SMProxy30提供客户API接口函数,包括登录PROXY、退出PROXY、发送短消息、接受短消息、接受响应信息、查询短消息信息、取消短消息等。SMProxy30支持多线程并发使用发送短消息,SMProxy30和ISMG之间使用的通信协议是CMPP协议。
3 组网结构 SMProxy30就是运行在ICP的WWW Server或者Email Server上,负责和ISMG进行CMPP3.0协议的通讯,要求SP的功能实体向ISMG发CMPP_SUBMIT消息,由ISMG将消息转发到某SMC上。同时,SMC也可向ISMG发送短消息,由ISMG发送给相应的SP。
4 SMProxy30的结构
客户程序调用到SMProxy30提供的接口函数实现收发短消息,SMProxy30实现把客户程序所发出的消息按CMPP3.0协议进行编码后发给数据增值业务中心(infoX),由数据增值业务中心(infoX)发送给SMC,并通过数据增值业务中心(infoX)接收SMC所响应的消息与主动下发的消息并进行解码后,通知客户程序接收SMC主动下发的短消息。
第二章 CMPP3.0协议的封装
CMPP协议封装在e和e包中,主要消息如下
(1)CMPPActiveMessage 心跳消息,对应CMPP3.0文档中的CMPP_Active_Test消息,是SMProxy30与ISMG的心跳消息。
(2)CMPPActiveRepMessage 心跳响应消息,对应CMPP3.0文档中的CMPP_Active_Test_REP,是SMProxy30发送心跳消息后收到的响应消息
(3)CMPPCancelMessage 删除短信消息,对应CMPP3.0文档中的CMPP_Cancel的消息,是SMProxy30向ISMG发送的删除短消息。
(4)CMPPCancelRepMessage 删除短信响应消息,对应CMPP3.0文档中的CMPP_Cancel_REP的消息,是SMProxy30发送删除短信后收到的响应消息。
(5)CMPPConnectMessage 请求连接消息,对应CMPP3.0文档中的CMPP_Connect的消息,是SMProxy30向ISMG发送的建立逻辑请求连接消息。
(6)CMPP30ConnectRepMessage 请求连接应答消息,对应CMPP3.0文档中的CMPP_Connect_REP的消息,是SMProxy30向ISMG发送的建立逻辑请求连接后收到的响应消息。
(7)CMPP30DeliverMessage ISMG下发短信,对应CMPP3.0文档中的 CMPP_Deliver消息,是ISMG下发给SMProxy30的短消息或者状态报告消息。
(8)CMPP30DeliverRepMessage 下发短信响应,对应CMPP3.0文档中的
CMPP_Deliver_REP消息,是SMProxy30收到的下发短信后的响应消息。
(9)CMPPQueryMessage 发送短信状态查询消息,对应CMPP3.0文档中的 CMPP_Query消息,是SMProxy30查询Time属性指定的日期的统计信息。
(10)CMPPQueryRepMessage 发送短信状态查询的响应消息,对应CMPP3.0文档中的
CMPP_Query_REP消息。
(11)CMPP30SubmitMessage 发送短信消息,对应CMPP3.0文档中的 CMPP_Submit消息,是SMProxy30发送短讯的消息。
(12)CMPP30SubmitRepMessage 下发短信的响应,对应CMPP3.0 文档中的
CMPP_Submit_REP消息,是SMProxy30发送短讯的响应消息。
(13)CMPPTerminateMessage 终止连接消息,对应CMPP3.0 文档中的 CMPP_Terminate消息,是ISMG和SMProxy30终止逻辑连接的消息。 (14)CMPPTerminateRepMessage 终止连接的响应消息,对应CMPP3.0 文档中的
CMPP_Terminate_REP消息,是ISMG或SMProxy30收到终止连接后发送的响应消息。
其中的心跳消息(1,2)、建立逻辑连接的消息(5,6)和终止逻辑连接消息(13,14)只是SMProxy30系统内部使用消息,提供给外部的接口中不涉及这六条消息。
第三章 SMProxy30使用说明
1 SMProxy30提供的接口方法描述
1、send
【函数功能】
向ISMG发送CMPP消息,阻塞直到收到响应或超时。
【函数原型】
CMPPMessage send(CMPPMessage message);
【参数说明】
[IN] message - 发送的CMPP消息,包括
(1)CMPP30SubmitMessage 提交短信
(2)CMPPQueryMessage
(3)CMPPCancelMessage
【处理】
调用这个接口方法,向ISMG发送Submit/Query/Cancel等命令消息。
发送短信状态查询
删除短信
如果发送消息超时或通信异常则抛出异常,需要调用者捕获处理。
【返回值】
发送CMPP30SubmitMessage,返回CMPP30SubmitRepMessage;
发送CMPPCancelMessage,返回CMPPCancelRepMessage;
发送CMPPQueryMessage,返回CMPPQueryRepMessage;
2 close
【函数功能】
向ISMG发送终止连接CMPP消息,调用之后连接将永久不可用。
【函数原型】
Void close();
【参数说明】 无
【处理】 调用这个接口方法,SMProxy30向ISMG发送CMPPTerminateMessage消息
如果发送消息超时或通信异常则抛出异常,需要调用者捕获处理。
【返回值】 无
3 getConnState
【函数功能】
获取通讯连接的状态方法。
【函数原型】
String getConnState();
【参数说明】 无
【处理】
调用这个接口方法,获取TCP连接状态的描述。
如果发送消息超时或通信异常则抛出异常,需要调用者捕获处理。
【返回值】
当前错误描述,若连接正常则返回null。
2 封装接口方法的SMProxy30的抽象类
SMProxy30在y的包中,封装了Send、close、getConnState方法。SMProxy30是一个抽象类,需要被继承使用。
SMProxy30抽象类的框架如下:
public class SMProxy30
{
public SMProxy30(Args args)
{
//完成初始化和向ISMG登录等工作
}
public SMProxy30(Map args)
{
//完成初始化和向ISMG登录等工作
}
/**
* 发送消息,阻塞直到收到响应或超时。
* 返回为收到的消息
* @exception PException 超时或通信异常。
*/
public CMPPMessage send(CMPPMessage message)
{
//发送消息 }
/**
* 连接终止的处理,由API使用者实现
* SMC连接终止后,需要执行动作的接口
*/
public void onTerminate()
{
}
/**
* 对收到消息的处理。由API使用者实现。缺省返回成功收到的响应
* @param msg 从短消息中心来的消息。
* @return 应该回的响应,由API使用者生成。
*/
public CMPPMessage onDeliver(CMPP30DeliverMessage msg)
{
}
/**
* 终止连接。调用之后连接将永久不可用。
*/
public void close()
{
}
/**
* 提供给业务层调用的获取连接状态的方法
*/
public String getConnState()
{
//返回连接状态的描述
}
}
3 使用SMProxy30抽象类
可以直接使用SMProxy30类提供的Send、close和getConnState方法
但是如果SP有接收ISMG下发的短信的要求或ISMG断开连接的时候要求得到事件通知的时候,就必须声明一个新的类继承SMProxy30,重载实现onDeliver( )和onTerminate( )。使用例子如下:
//定义MySMProxy30所在的包是demo30
package demo30;
import e.*;
import e.*;
import ;
import y.*;
public class MySMProxy30 extends SMProxy30
{
private Demo30 demo = null; //class Demo30实现一个GUI界面程序 public MySMProxy30(Demo30 demo, Args args)
{
//调用父类的构造函数,完成初始化和登录ISMG的功能,不能省略
super(args);
= demo;
}
public CMPPMessage onDeliver(CMPP30DeliverMessage msg)
{
//添加收到短消息中心下发消息的处理代码
sRecvDeliverMsg(msg);
//实际上是返回响应消息,一定要有
return ver(msg);
}
public void OnTerminate()
{
//可以添加ISMG和SMProxy30断开连接的处理代码
ate();
}
}
实际使用SMProxy30封装的send、close和getConnState的接口方法的时候,只需要生成MySMProxy30的对象,然后调用MySMProxy30的send、close和getConnState方法即可。
4 配置参数使用说明
SMProxy30需要的配置参数如下表
参数名称
host
port
heartbeat-interval
reconnect-interval
heartbeat-noresponseout
transaction-timeout
source-addr
version
shared-secret
debug
参数例值
10.76.148.147
7890
10
10
5
10
d86138
1
pass
true
参数描述
ISMG主机地址的IP地址
ISMG主机开发的端口号
心跳信息发送间隔时间
(单位:秒)
连接中断时重连间隔时间(单位:秒)
需要重连时,连续发出心跳而没有接收到响应的个数(单位:个)
操作超时时间(单位:秒)
SP向ISMG申请的ID(最大为六位字符)
双方协商的版本号(大于0,小于256)
由中国移动与ICP事先商定,SP向ISMG申请的ID所对应的密码
true表示属于调试状态,所有的消息被打印输出到屏幕,false表示不属于调试状态,所有的消息不被输出 配置文件可以采用我们提供的XML格式,也可以采用其他格式,只要构造的时候能通过Map类型或Arg类型的参数传入指定的参数就可以了。例如可以用java的property文件保存参数,或将配置和ICP的应用程序配置放在一起。
下面是以XML格式定义的配置文件
是在的工程目录下,是使用XML写的配置文件,具体内容如下
其中以"
使用的时候可以根据实际情况配置 ISMG主机地址
ISMG主机端口号
心跳信息发送间隔时间(单位:秒)
连接中断时重连间隔时间(单位:秒)
需要重连时,连续发出心跳而没有接收到响应的个数(单位:个)
操作超时时间(单位:秒)
SP向ISMG申请的ID(最大为六位字符)
双方协商的版本号(大于0,小于256)
shared-secret由中国移动与ICP事先商定,SP向ISMG申请的ID所对应的密码
true表示属于调试状态,所有的消息被打印输出到屏幕,false表示不属于调试状态,所有的消息不被输出
举例说明:如果ISMG的IP地址为10.76.148.168,则只需要修改
5 使用SMProxy30收发短信
5.1 直接使用SMProxy30发送短信
当不需要接收ISMG下发的短信和不需要获得ISMG的断连通知的时候,可以直接使用SMProxy30类方法发送/查询/删除短信和退出ISMG
具体使用方法如下
生成SMProxy30的实例
(a)Args args = new Cfg("").getArgs("ismg");
(b)("source-addr",loginName);
(c)("shared-secret",loginPass);
(d)SMProxy30 proxy = new SMProxy30(args); 注释:
(a)类Cfg在的包中,主要负责基于XML格式的配置文件读写类,使用Cfg类解析配置文件,Cfg的构造函数的原形如下
public Cfg(String url),其中参数url表示解析的配置文件。通过调用Cfg对象的getArgs方法获得Args对象。
(b,c)根据配置文件解析生成Args对象,SP还可以修改其中的配置项,b和c就是修改配置参数中的SP登录ISMG的ID和密码,同样也可以修改其他的配置项。
(d)生成SMProxy30对象 proxy
调用(CMPPMessage msg) 完成发送/删除/查询短信。
调用()与ISMG断开连接。
调用nState()获得和ISMG的TCP连接的状态描述。
具体使用情况请参看5.2
5.2 使用SMProxy30收发短信
当需要接收ISMG下发的短信或在ISMG下发断连命令的时候需要得到事件通知的情况需要做如下处理
1:首先需要声明MySMProxy30类,并且从y包中的SMProxy30类继承,根据实际情况处理。
如果SP有接收短信的要求在MySMProxy30的类中重载实现SMProxy30的onDeliver方法,在MySMProxy30类中增加
public CMPPMessage onDeliver(CMPP30DeliverMessage msg)
{
//添加收到短消息中心下发消息的处理代码
。。。
//实际上是返回响应消息,一定要有
return ver(msg);
}
如果SP需要在ISMG 向SMProxy30下发断开连接后收到类似于事件的通知,则需要重载SMProxy30的onTerminate方法,需要在MySMProxy30类中增加
public void OnTerminate()
{
//可以添加ISMG和SMProxy30断开连接的处理代码
}
2:生成MySMProxy30的实例
(a)Args args = new Cfg("").getArgs("ismg");
(b)("source-addr",loginName);
(c)("shared-secret",loginPass); (d)MySMProxy30 myProxy = new MySMProxy30(args);
注释:
(a)类Cfg在的包中,主要负责基于XML格式的配置文件读写类,使用Cfg类解析配置文件,Cfg的构造函数的原形如下
public Cfg(String url),其中参数url表示解析的配置文件。通过调用Cfg对象的getArgs方法获得Args对象。
(b,c)根据配置文件解析生成Args对象,SP还可以修改其中的配置项,b和c就是修改配置参数中的SP登录ISMG的ID和密码,同样也可以修改其他的配置项。
(d)生成MySMProxy30对象 myProxy
3:使用MySMProxy30对象发送短消息
向ISMG下发短信
CMPP30SubmitMessage submitMsg =
new CMPP30SubmitMessage(
int pk_Total,
int pk_Number,
int registered_Delivery,
int msg_Level,
String service_Id,
int fee_UserType,
String fee_Terminal_Id,
int fee_Terminal_Type,
int tp_Pid,
int tp_Udhi,
int msg_Fmt,
String msg_Src,
String fee_Type,
String fee_Code,
Date valid_Time,
Date at_Time,
String src_Terminal_Id,
int src_Terminal_Type,
String[] dest_Terminal_Id,
byte[] msg_Content,
String LinkID
)
调用MySMProxy30对象myProxy的send方法发送,
CMPP30SubmitRepMessage repMsg = (submitMsg);
注释:
/** *
创建一个发送短信消息,传入消息的各字段的值,并对各参数值进行判断,不符合要求则抛出异常
*
按要求把输入的参数转换为一个byte类型的数组
* 1 @pk_Total
相同msg_Id消息总条数
* 2 @pk_Number
相同msg_Id的消息序号
* 3 @registered_Delivery
是否要求返回状态报告
* 4 @msg_Level
信息级别
* 5 @service_Id
业务类型
* 6 @fee_UserType
计费用户类型字段
* 7 @fee_Terminal_Id
被计费用户的号码
* 8 @fee_Terminal_Type
被计费用户的号码类型
* 9 @tp_Pid GSM协议类型
* 10 @tp_Udhi GSM协议类型
* 11 @msg_Fmt
消息格式
* 12 @msg_Src
消息内容来源
* 13 @fee_Type
资费类别
* 14 @fee_Code
资费代码(以分为单位)
* 15 @valid_Time
存活有效期
* 16 @at_Time
定时发送时间
* 17 @src_Terminal_Id
源号码
* 18 @dest_Terminal_Id
接收短信的MSISDN号码
* 19 @dest_Terminal_Type
接收短信的用户号码类型
* 20 @msg_Content
消息内容
* 21 @LinkID
点播业务使用的LinkID
*/
这些消息与CMPP3.0文档中的CMPP_Submit消息的格式相对应。
repMsg提交submit的响应消息,是ISMG返回给SP的消息。
4:使用MySMProxy30对象发送删除短信
CMPPCancelMessage cancelMsg = new CMPPCancelMessage(byte[] msg_Id)
CMPPCancelRepMessage repMsg = (cancelMsg);
注释:
msg_Id
信息标识,CMPP3.0文档中的CMPP_Cancel消息的格式相对应。
repMsg提交cancel的响应消息,是ISMG返回给SP的消息。
5:使用MySMProxy30对象发送查询短信
CMPPQueryMessage queryMsg =
new CMPPQueryMessage(
Date time,
int query_Type,
String query_Code,
String reserve)
CMPPQueryRepMessagemy repMsg = (queryMsg);
注释: /**
*
定义一发送短信查询消息
* @time
时间
* @query_Type
查询类别
* @query_Code
查询码(业务类型)
* @reserve
保留
*/
CMPPQueryMessage与CMPP3.0文档中的CMPP_Query消息一致。
repMsg是查询命令的响应消息。
第四章
使用SMProxy30收发短信的例子
1: 直接使用SMProxy30发送短信的Demo30
当不需要接收ISMG下发的短信和不需要获得ISMG的断连通知的时候,可以直接使用SMProxy30类方法发送/查询/删除短信和退出ISMG
使用MySMProxy30收发短信的Demo30
代码如下
package demo30;
import y.*;
import e.*;
import e.*;
import .*;
public class Demo30
{
private static Args args;
/** 短信收发接口*/
private SMProxy30 myProxy= null;
public Demo30()
{
}
/**
* 程序入口。
*/
public static void main(String[] a) throws Exception
{
try
{
//生成SMProxy30对象,完成向ISMG的登录
args = new Cfg("",false).getArgs("ismg");
("source-addr",t().trim());
("shared-secret",t().trim());
smp = new SMProxy30(this,args);
//发送短信
CMPP30SubmitMessage submitMsg =
new CMPP30SubmitMessage(
int pk_Total,
int pk_Number,
int registered_Delivery,
int msg_Level,
String service_Id,
int fee_UserType,
String fee_Terminal_Id,
int fee_Terminal_Type,
int tp_Pid,
int tp_Udhi,
int msg_Fmt,
String msg_Src,
String fee_Type,
String fee_Code,
Date valid_Time,
Date at_Time,
String src_Terminal_Id,
String[] dest_Terminal_Id,
int dest_Terminal_Type,
byte[] msg_Content,
String LinkID
) ;
CMPP30SubmitRepMessage submitRepMsg = (submitMsg);
// 可以增加处理响应消息submitRepMsg的代码
//删除短信
CMPPCancelMessage cancelMsg = new CMPPCancelMessage(byte[] msg_Id)
CMPPCancelRepMessage cancelRepMsg = (cancelMsg);
// 可以增加处理响应消息cancelRepMsg的代码
//查询短信
CMPPQueryMessage queryMsg =
new CMPPQueryMessage(
Date time,
int query_Type,
String query_Code,
String reserve)
CMPPQueryRepMessagemy queryRepMsg = (queryMsg);
// 可以增加处理响应消息queryRepMsg的代码,获得查询结果
//查询SMProxy30与ISMG的TCP连接状态
String stateDesc = nState();
//退出
()
}
Catch(Exception e)
{
//异常处理
}
}
2 使用SMProxy30收发短信的例子
当SP需要接收ISMG下发的短信或者需要获得ISMG和SMProxy30断连通知的时候,需要如下处理 1:从SMProxy30类继承的MySMProxy30类
具体内容如下
package demo30;
import e.*;
import e.*;
import ;
import y.*;
public class MySMProxy30 extends SMProxy30
{
private Demo30 demo = null;
public MySMProxy30(Demo30 demo,Args args)
{
super(args);
= demo;
}
/**
* 对ISMG主动下发的消息的处理。
* @param msg 收到的消息
* @return 返回的相应消息。
*/
public CMPPMessage onDeliver(CMPP30DeliverMessage msg)
{
/**@todo do some thing to handle this message. then return a response */
sRecvDeliverMsg(msg);
return ver(msg);
}
public void OnTerminate()
{
ate();
}
}
2:使用MySMProxy30收发短信的DEMO
代码如下
package demo30;
import y.*;
import e.*;
import e.*;
import .*;
public class Demo30
{
private static Args args;
/** 短信收发接口*/
private MySMProxy30 myProxy= null;
public Demo30()
{
}
/** * 程序入口。
*/
public static void main(String[] a) throws Exception
{
try
{
//生成MySMProxy30对象,完成向ISMG的登录
args = new Cfg("",false).getArgs("ismg");
("source-addr",t().trim());
("shared-secret",t().trim());
smp = new MySMProxy30(this,args);
//发送短信
CMPP30SubmitMessage submitMsg =
new CMPP30SubmitMessage(
int pk_Total,
int pk_Number,
int registered_Delivery,
int msg_Level,
String service_Id,
int fee_UserType,
String fee_Terminal_Id,
int fee_Terminal_Type,
int tp_Pid,
int tp_Udhi,
int msg_Fmt,
String msg_Src,
String fee_Type,
String fee_Code,
Date valid_Time,
Date at_Time,
String src_Terminal_Id,
int src_Terminal_Type,
String[] dest_Terminal_Id,
byte[] msg_Content,
String LinkID
) ;
CMPP30SubmitRepMessage submitRepMsg = (submitMsg);
// 可以增加处理响应消息submitRepMsg的代码
//删除短信
CMPPCancelMessage cancelMsg = new CMPPCancelMessage(byte[] msg_Id)
CMPPCancelRepMessage cancelRepMsg = (cancelMsg);
// 可以增加处理响应消息cancelRepMsg的代码
//查询短信
CMPPQueryMessage queryMsg =
new CMPPQueryMessage(
Date time,
int query_Type,
String query_Code,
String reserve)
CMPPQueryRepMessagemy queryRepMsg = (queryMsg);
// 可以增加处理响应消息queryRepMsg的代码,获得查询结果
//查询SMProxy30与ISMG的TCP连接状态
String stateDesc = nState();
//退出
()
}
Catch(Exception e)
{
//异常处理
}
}
2023年7月31日发(作者:)
第一章 概述
1 差异描述
SMProxy30的使用方法与SMProxy基本相同,主要差别:
1、对ISMG主动下发的消息的处理,接收的消息类型使用CMPP30DeliverMessage类来处理。
2、CMPP30DeliverMessage相对CMPPDeliverMessage增加了如下方法:
a) public int getSrcterminalType() //返回源终端号码类型
b) public String getLinkID() //返回LinkID
另外,删除了原public String getReserve()方法。
3、构造下发短信响应消息时,使用CMPP30DeliverRepMessage类,其中result字段的有效取值范围扩展为[0, 2147483647]。
4、构造向SMC提交的短消息包时,使用CMPP30SubmitMessage类。相对于CMPPSubmitMessage,该类的构造方法增加了两个参数:
a) int fee_Terminal_Type //被计费用户的号码类型
b) int dest_Terminal_Type //接收业务的用户号码类型
c) string LinkID //点播业务用的LinkID
另外,删除了原String reserve参数。
5、对提交请求后收到的响应消息进行处理,使用CMPP30SubmitRepMessage类。
2 产品概述
SMProxy30是在原有的SMProxy上增加的符合CMPP3.0协议的接口,可以同时满足Unix和WINDOW NT平台的使用。SMProxy30与ISMG建立TCP连接进行通信,并负责短消息发送和接收、维护与ISMG的握手、断连重连等;SMProxy30提供客户API接口函数,包括登录PROXY、退出PROXY、发送短消息、接受短消息、接受响应信息、查询短消息信息、取消短消息等。SMProxy30支持多线程并发使用发送短消息,SMProxy30和ISMG之间使用的通信协议是CMPP协议。
3 组网结构 SMProxy30就是运行在ICP的WWW Server或者Email Server上,负责和ISMG进行CMPP3.0协议的通讯,要求SP的功能实体向ISMG发CMPP_SUBMIT消息,由ISMG将消息转发到某SMC上。同时,SMC也可向ISMG发送短消息,由ISMG发送给相应的SP。
4 SMProxy30的结构
客户程序调用到SMProxy30提供的接口函数实现收发短消息,SMProxy30实现把客户程序所发出的消息按CMPP3.0协议进行编码后发给数据增值业务中心(infoX),由数据增值业务中心(infoX)发送给SMC,并通过数据增值业务中心(infoX)接收SMC所响应的消息与主动下发的消息并进行解码后,通知客户程序接收SMC主动下发的短消息。
第二章 CMPP3.0协议的封装
CMPP协议封装在e和e包中,主要消息如下
(1)CMPPActiveMessage 心跳消息,对应CMPP3.0文档中的CMPP_Active_Test消息,是SMProxy30与ISMG的心跳消息。
(2)CMPPActiveRepMessage 心跳响应消息,对应CMPP3.0文档中的CMPP_Active_Test_REP,是SMProxy30发送心跳消息后收到的响应消息
(3)CMPPCancelMessage 删除短信消息,对应CMPP3.0文档中的CMPP_Cancel的消息,是SMProxy30向ISMG发送的删除短消息。
(4)CMPPCancelRepMessage 删除短信响应消息,对应CMPP3.0文档中的CMPP_Cancel_REP的消息,是SMProxy30发送删除短信后收到的响应消息。
(5)CMPPConnectMessage 请求连接消息,对应CMPP3.0文档中的CMPP_Connect的消息,是SMProxy30向ISMG发送的建立逻辑请求连接消息。
(6)CMPP30ConnectRepMessage 请求连接应答消息,对应CMPP3.0文档中的CMPP_Connect_REP的消息,是SMProxy30向ISMG发送的建立逻辑请求连接后收到的响应消息。
(7)CMPP30DeliverMessage ISMG下发短信,对应CMPP3.0文档中的 CMPP_Deliver消息,是ISMG下发给SMProxy30的短消息或者状态报告消息。
(8)CMPP30DeliverRepMessage 下发短信响应,对应CMPP3.0文档中的
CMPP_Deliver_REP消息,是SMProxy30收到的下发短信后的响应消息。
(9)CMPPQueryMessage 发送短信状态查询消息,对应CMPP3.0文档中的 CMPP_Query消息,是SMProxy30查询Time属性指定的日期的统计信息。
(10)CMPPQueryRepMessage 发送短信状态查询的响应消息,对应CMPP3.0文档中的
CMPP_Query_REP消息。
(11)CMPP30SubmitMessage 发送短信消息,对应CMPP3.0文档中的 CMPP_Submit消息,是SMProxy30发送短讯的消息。
(12)CMPP30SubmitRepMessage 下发短信的响应,对应CMPP3.0 文档中的
CMPP_Submit_REP消息,是SMProxy30发送短讯的响应消息。
(13)CMPPTerminateMessage 终止连接消息,对应CMPP3.0 文档中的 CMPP_Terminate消息,是ISMG和SMProxy30终止逻辑连接的消息。 (14)CMPPTerminateRepMessage 终止连接的响应消息,对应CMPP3.0 文档中的
CMPP_Terminate_REP消息,是ISMG或SMProxy30收到终止连接后发送的响应消息。
其中的心跳消息(1,2)、建立逻辑连接的消息(5,6)和终止逻辑连接消息(13,14)只是SMProxy30系统内部使用消息,提供给外部的接口中不涉及这六条消息。
第三章 SMProxy30使用说明
1 SMProxy30提供的接口方法描述
1、send
【函数功能】
向ISMG发送CMPP消息,阻塞直到收到响应或超时。
【函数原型】
CMPPMessage send(CMPPMessage message);
【参数说明】
[IN] message - 发送的CMPP消息,包括
(1)CMPP30SubmitMessage 提交短信
(2)CMPPQueryMessage
(3)CMPPCancelMessage
【处理】
调用这个接口方法,向ISMG发送Submit/Query/Cancel等命令消息。
发送短信状态查询
删除短信
如果发送消息超时或通信异常则抛出异常,需要调用者捕获处理。
【返回值】
发送CMPP30SubmitMessage,返回CMPP30SubmitRepMessage;
发送CMPPCancelMessage,返回CMPPCancelRepMessage;
发送CMPPQueryMessage,返回CMPPQueryRepMessage;
2 close
【函数功能】
向ISMG发送终止连接CMPP消息,调用之后连接将永久不可用。
【函数原型】
Void close();
【参数说明】 无
【处理】 调用这个接口方法,SMProxy30向ISMG发送CMPPTerminateMessage消息
如果发送消息超时或通信异常则抛出异常,需要调用者捕获处理。
【返回值】 无
3 getConnState
【函数功能】
获取通讯连接的状态方法。
【函数原型】
String getConnState();
【参数说明】 无
【处理】
调用这个接口方法,获取TCP连接状态的描述。
如果发送消息超时或通信异常则抛出异常,需要调用者捕获处理。
【返回值】
当前错误描述,若连接正常则返回null。
2 封装接口方法的SMProxy30的抽象类
SMProxy30在y的包中,封装了Send、close、getConnState方法。SMProxy30是一个抽象类,需要被继承使用。
SMProxy30抽象类的框架如下:
public class SMProxy30
{
public SMProxy30(Args args)
{
//完成初始化和向ISMG登录等工作
}
public SMProxy30(Map args)
{
//完成初始化和向ISMG登录等工作
}
/**
* 发送消息,阻塞直到收到响应或超时。
* 返回为收到的消息
* @exception PException 超时或通信异常。
*/
public CMPPMessage send(CMPPMessage message)
{
//发送消息 }
/**
* 连接终止的处理,由API使用者实现
* SMC连接终止后,需要执行动作的接口
*/
public void onTerminate()
{
}
/**
* 对收到消息的处理。由API使用者实现。缺省返回成功收到的响应
* @param msg 从短消息中心来的消息。
* @return 应该回的响应,由API使用者生成。
*/
public CMPPMessage onDeliver(CMPP30DeliverMessage msg)
{
}
/**
* 终止连接。调用之后连接将永久不可用。
*/
public void close()
{
}
/**
* 提供给业务层调用的获取连接状态的方法
*/
public String getConnState()
{
//返回连接状态的描述
}
}
3 使用SMProxy30抽象类
可以直接使用SMProxy30类提供的Send、close和getConnState方法
但是如果SP有接收ISMG下发的短信的要求或ISMG断开连接的时候要求得到事件通知的时候,就必须声明一个新的类继承SMProxy30,重载实现onDeliver( )和onTerminate( )。使用例子如下:
//定义MySMProxy30所在的包是demo30
package demo30;
import e.*;
import e.*;
import ;
import y.*;
public class MySMProxy30 extends SMProxy30
{
private Demo30 demo = null; //class Demo30实现一个GUI界面程序 public MySMProxy30(Demo30 demo, Args args)
{
//调用父类的构造函数,完成初始化和登录ISMG的功能,不能省略
super(args);
= demo;
}
public CMPPMessage onDeliver(CMPP30DeliverMessage msg)
{
//添加收到短消息中心下发消息的处理代码
sRecvDeliverMsg(msg);
//实际上是返回响应消息,一定要有
return ver(msg);
}
public void OnTerminate()
{
//可以添加ISMG和SMProxy30断开连接的处理代码
ate();
}
}
实际使用SMProxy30封装的send、close和getConnState的接口方法的时候,只需要生成MySMProxy30的对象,然后调用MySMProxy30的send、close和getConnState方法即可。
4 配置参数使用说明
SMProxy30需要的配置参数如下表
参数名称
host
port
heartbeat-interval
reconnect-interval
heartbeat-noresponseout
transaction-timeout
source-addr
version
shared-secret
debug
参数例值
10.76.148.147
7890
10
10
5
10
d86138
1
pass
true
参数描述
ISMG主机地址的IP地址
ISMG主机开发的端口号
心跳信息发送间隔时间
(单位:秒)
连接中断时重连间隔时间(单位:秒)
需要重连时,连续发出心跳而没有接收到响应的个数(单位:个)
操作超时时间(单位:秒)
SP向ISMG申请的ID(最大为六位字符)
双方协商的版本号(大于0,小于256)
由中国移动与ICP事先商定,SP向ISMG申请的ID所对应的密码
true表示属于调试状态,所有的消息被打印输出到屏幕,false表示不属于调试状态,所有的消息不被输出 配置文件可以采用我们提供的XML格式,也可以采用其他格式,只要构造的时候能通过Map类型或Arg类型的参数传入指定的参数就可以了。例如可以用java的property文件保存参数,或将配置和ICP的应用程序配置放在一起。
下面是以XML格式定义的配置文件
是在的工程目录下,是使用XML写的配置文件,具体内容如下
其中以"
使用的时候可以根据实际情况配置 ISMG主机地址
ISMG主机端口号
心跳信息发送间隔时间(单位:秒)
连接中断时重连间隔时间(单位:秒)
需要重连时,连续发出心跳而没有接收到响应的个数(单位:个)
操作超时时间(单位:秒)
SP向ISMG申请的ID(最大为六位字符)
双方协商的版本号(大于0,小于256)
shared-secret由中国移动与ICP事先商定,SP向ISMG申请的ID所对应的密码
true表示属于调试状态,所有的消息被打印输出到屏幕,false表示不属于调试状态,所有的消息不被输出
举例说明:如果ISMG的IP地址为10.76.148.168,则只需要修改
5 使用SMProxy30收发短信
5.1 直接使用SMProxy30发送短信
当不需要接收ISMG下发的短信和不需要获得ISMG的断连通知的时候,可以直接使用SMProxy30类方法发送/查询/删除短信和退出ISMG
具体使用方法如下
生成SMProxy30的实例
(a)Args args = new Cfg("").getArgs("ismg");
(b)("source-addr",loginName);
(c)("shared-secret",loginPass);
(d)SMProxy30 proxy = new SMProxy30(args); 注释:
(a)类Cfg在的包中,主要负责基于XML格式的配置文件读写类,使用Cfg类解析配置文件,Cfg的构造函数的原形如下
public Cfg(String url),其中参数url表示解析的配置文件。通过调用Cfg对象的getArgs方法获得Args对象。
(b,c)根据配置文件解析生成Args对象,SP还可以修改其中的配置项,b和c就是修改配置参数中的SP登录ISMG的ID和密码,同样也可以修改其他的配置项。
(d)生成SMProxy30对象 proxy
调用(CMPPMessage msg) 完成发送/删除/查询短信。
调用()与ISMG断开连接。
调用nState()获得和ISMG的TCP连接的状态描述。
具体使用情况请参看5.2
5.2 使用SMProxy30收发短信
当需要接收ISMG下发的短信或在ISMG下发断连命令的时候需要得到事件通知的情况需要做如下处理
1:首先需要声明MySMProxy30类,并且从y包中的SMProxy30类继承,根据实际情况处理。
如果SP有接收短信的要求在MySMProxy30的类中重载实现SMProxy30的onDeliver方法,在MySMProxy30类中增加
public CMPPMessage onDeliver(CMPP30DeliverMessage msg)
{
//添加收到短消息中心下发消息的处理代码
。。。
//实际上是返回响应消息,一定要有
return ver(msg);
}
如果SP需要在ISMG 向SMProxy30下发断开连接后收到类似于事件的通知,则需要重载SMProxy30的onTerminate方法,需要在MySMProxy30类中增加
public void OnTerminate()
{
//可以添加ISMG和SMProxy30断开连接的处理代码
}
2:生成MySMProxy30的实例
(a)Args args = new Cfg("").getArgs("ismg");
(b)("source-addr",loginName);
(c)("shared-secret",loginPass); (d)MySMProxy30 myProxy = new MySMProxy30(args);
注释:
(a)类Cfg在的包中,主要负责基于XML格式的配置文件读写类,使用Cfg类解析配置文件,Cfg的构造函数的原形如下
public Cfg(String url),其中参数url表示解析的配置文件。通过调用Cfg对象的getArgs方法获得Args对象。
(b,c)根据配置文件解析生成Args对象,SP还可以修改其中的配置项,b和c就是修改配置参数中的SP登录ISMG的ID和密码,同样也可以修改其他的配置项。
(d)生成MySMProxy30对象 myProxy
3:使用MySMProxy30对象发送短消息
向ISMG下发短信
CMPP30SubmitMessage submitMsg =
new CMPP30SubmitMessage(
int pk_Total,
int pk_Number,
int registered_Delivery,
int msg_Level,
String service_Id,
int fee_UserType,
String fee_Terminal_Id,
int fee_Terminal_Type,
int tp_Pid,
int tp_Udhi,
int msg_Fmt,
String msg_Src,
String fee_Type,
String fee_Code,
Date valid_Time,
Date at_Time,
String src_Terminal_Id,
int src_Terminal_Type,
String[] dest_Terminal_Id,
byte[] msg_Content,
String LinkID
)
调用MySMProxy30对象myProxy的send方法发送,
CMPP30SubmitRepMessage repMsg = (submitMsg);
注释:
/** *
创建一个发送短信消息,传入消息的各字段的值,并对各参数值进行判断,不符合要求则抛出异常
*
按要求把输入的参数转换为一个byte类型的数组
* 1 @pk_Total
相同msg_Id消息总条数
* 2 @pk_Number
相同msg_Id的消息序号
* 3 @registered_Delivery
是否要求返回状态报告
* 4 @msg_Level
信息级别
* 5 @service_Id
业务类型
* 6 @fee_UserType
计费用户类型字段
* 7 @fee_Terminal_Id
被计费用户的号码
* 8 @fee_Terminal_Type
被计费用户的号码类型
* 9 @tp_Pid GSM协议类型
* 10 @tp_Udhi GSM协议类型
* 11 @msg_Fmt
消息格式
* 12 @msg_Src
消息内容来源
* 13 @fee_Type
资费类别
* 14 @fee_Code
资费代码(以分为单位)
* 15 @valid_Time
存活有效期
* 16 @at_Time
定时发送时间
* 17 @src_Terminal_Id
源号码
* 18 @dest_Terminal_Id
接收短信的MSISDN号码
* 19 @dest_Terminal_Type
接收短信的用户号码类型
* 20 @msg_Content
消息内容
* 21 @LinkID
点播业务使用的LinkID
*/
这些消息与CMPP3.0文档中的CMPP_Submit消息的格式相对应。
repMsg提交submit的响应消息,是ISMG返回给SP的消息。
4:使用MySMProxy30对象发送删除短信
CMPPCancelMessage cancelMsg = new CMPPCancelMessage(byte[] msg_Id)
CMPPCancelRepMessage repMsg = (cancelMsg);
注释:
msg_Id
信息标识,CMPP3.0文档中的CMPP_Cancel消息的格式相对应。
repMsg提交cancel的响应消息,是ISMG返回给SP的消息。
5:使用MySMProxy30对象发送查询短信
CMPPQueryMessage queryMsg =
new CMPPQueryMessage(
Date time,
int query_Type,
String query_Code,
String reserve)
CMPPQueryRepMessagemy repMsg = (queryMsg);
注释: /**
*
定义一发送短信查询消息
* @time
时间
* @query_Type
查询类别
* @query_Code
查询码(业务类型)
* @reserve
保留
*/
CMPPQueryMessage与CMPP3.0文档中的CMPP_Query消息一致。
repMsg是查询命令的响应消息。
第四章
使用SMProxy30收发短信的例子
1: 直接使用SMProxy30发送短信的Demo30
当不需要接收ISMG下发的短信和不需要获得ISMG的断连通知的时候,可以直接使用SMProxy30类方法发送/查询/删除短信和退出ISMG
使用MySMProxy30收发短信的Demo30
代码如下
package demo30;
import y.*;
import e.*;
import e.*;
import .*;
public class Demo30
{
private static Args args;
/** 短信收发接口*/
private SMProxy30 myProxy= null;
public Demo30()
{
}
/**
* 程序入口。
*/
public static void main(String[] a) throws Exception
{
try
{
//生成SMProxy30对象,完成向ISMG的登录
args = new Cfg("",false).getArgs("ismg");
("source-addr",t().trim());
("shared-secret",t().trim());
smp = new SMProxy30(this,args);
//发送短信
CMPP30SubmitMessage submitMsg =
new CMPP30SubmitMessage(
int pk_Total,
int pk_Number,
int registered_Delivery,
int msg_Level,
String service_Id,
int fee_UserType,
String fee_Terminal_Id,
int fee_Terminal_Type,
int tp_Pid,
int tp_Udhi,
int msg_Fmt,
String msg_Src,
String fee_Type,
String fee_Code,
Date valid_Time,
Date at_Time,
String src_Terminal_Id,
String[] dest_Terminal_Id,
int dest_Terminal_Type,
byte[] msg_Content,
String LinkID
) ;
CMPP30SubmitRepMessage submitRepMsg = (submitMsg);
// 可以增加处理响应消息submitRepMsg的代码
//删除短信
CMPPCancelMessage cancelMsg = new CMPPCancelMessage(byte[] msg_Id)
CMPPCancelRepMessage cancelRepMsg = (cancelMsg);
// 可以增加处理响应消息cancelRepMsg的代码
//查询短信
CMPPQueryMessage queryMsg =
new CMPPQueryMessage(
Date time,
int query_Type,
String query_Code,
String reserve)
CMPPQueryRepMessagemy queryRepMsg = (queryMsg);
// 可以增加处理响应消息queryRepMsg的代码,获得查询结果
//查询SMProxy30与ISMG的TCP连接状态
String stateDesc = nState();
//退出
()
}
Catch(Exception e)
{
//异常处理
}
}
2 使用SMProxy30收发短信的例子
当SP需要接收ISMG下发的短信或者需要获得ISMG和SMProxy30断连通知的时候,需要如下处理 1:从SMProxy30类继承的MySMProxy30类
具体内容如下
package demo30;
import e.*;
import e.*;
import ;
import y.*;
public class MySMProxy30 extends SMProxy30
{
private Demo30 demo = null;
public MySMProxy30(Demo30 demo,Args args)
{
super(args);
= demo;
}
/**
* 对ISMG主动下发的消息的处理。
* @param msg 收到的消息
* @return 返回的相应消息。
*/
public CMPPMessage onDeliver(CMPP30DeliverMessage msg)
{
/**@todo do some thing to handle this message. then return a response */
sRecvDeliverMsg(msg);
return ver(msg);
}
public void OnTerminate()
{
ate();
}
}
2:使用MySMProxy30收发短信的DEMO
代码如下
package demo30;
import y.*;
import e.*;
import e.*;
import .*;
public class Demo30
{
private static Args args;
/** 短信收发接口*/
private MySMProxy30 myProxy= null;
public Demo30()
{
}
/** * 程序入口。
*/
public static void main(String[] a) throws Exception
{
try
{
//生成MySMProxy30对象,完成向ISMG的登录
args = new Cfg("",false).getArgs("ismg");
("source-addr",t().trim());
("shared-secret",t().trim());
smp = new MySMProxy30(this,args);
//发送短信
CMPP30SubmitMessage submitMsg =
new CMPP30SubmitMessage(
int pk_Total,
int pk_Number,
int registered_Delivery,
int msg_Level,
String service_Id,
int fee_UserType,
String fee_Terminal_Id,
int fee_Terminal_Type,
int tp_Pid,
int tp_Udhi,
int msg_Fmt,
String msg_Src,
String fee_Type,
String fee_Code,
Date valid_Time,
Date at_Time,
String src_Terminal_Id,
int src_Terminal_Type,
String[] dest_Terminal_Id,
byte[] msg_Content,
String LinkID
) ;
CMPP30SubmitRepMessage submitRepMsg = (submitMsg);
// 可以增加处理响应消息submitRepMsg的代码
//删除短信
CMPPCancelMessage cancelMsg = new CMPPCancelMessage(byte[] msg_Id)
CMPPCancelRepMessage cancelRepMsg = (cancelMsg);
// 可以增加处理响应消息cancelRepMsg的代码
//查询短信
CMPPQueryMessage queryMsg =
new CMPPQueryMessage(
Date time,
int query_Type,
String query_Code,
String reserve)
CMPPQueryRepMessagemy queryRepMsg = (queryMsg);
// 可以增加处理响应消息queryRepMsg的代码,获得查询结果
//查询SMProxy30与ISMG的TCP连接状态
String stateDesc = nState();
//退出
()
}
Catch(Exception e)
{
//异常处理
}
}
发布评论