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写的配置文件,具体内容如下

其中以"

10.76.148.147

7890

10

10

5

10

d86138

0

true

使用的时候可以根据实际情况配置 ISMG主机地址

10.76.148.147

ISMG主机端口号

7890

心跳信息发送间隔时间(单位:秒)

10

连接中断时重连间隔时间(单位:秒)

10

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

操作超时时间(单位:秒)

10

SP向ISMG申请的ID(最大为六位字符)

d86138

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

0

shared-secret由中国移动与ICP事先商定,SP向ISMG申请的ID所对应的密码

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

true

举例说明:如果ISMG的IP地址为10.76.148.168,则只需要修改

10.76.148.14710.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写的配置文件,具体内容如下

其中以"

10.76.148.147

7890

10

10

5

10

d86138

0

true

使用的时候可以根据实际情况配置 ISMG主机地址

10.76.148.147

ISMG主机端口号

7890

心跳信息发送间隔时间(单位:秒)

10

连接中断时重连间隔时间(单位:秒)

10

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

操作超时时间(单位:秒)

10

SP向ISMG申请的ID(最大为六位字符)

d86138

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

0

shared-secret由中国移动与ICP事先商定,SP向ISMG申请的ID所对应的密码

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

true

举例说明:如果ISMG的IP地址为10.76.148.168,则只需要修改

10.76.148.14710.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)

{

//异常处理

}

}