第一章 SMGP协议的封装.docx
《第一章 SMGP协议的封装.docx》由会员分享,可在线阅读,更多相关《第一章 SMGP协议的封装.docx(19页珍藏版)》请在冰豆网上搜索。
第一章SMGP协议的封装
第一章SMGP协议的封装
SMGP协议封装在m.smgp.message包中,主要消息如下
(1)SMGPActiveTestMessage心跳消息,对应SMGP文档中的active_test消息,是SMGPSMProxy与网关的心跳消息。
(2)SMGPActiveTestRespMessage心跳响应消息,对应SMGP文档中的active_test_resp,是SMGPSMProxy发送心跳消息后收到的响应消息
(3)SMGPDeliverMessage网关下发短信,对应SMGP文档中的deliver消息,是网关下发给SMGPSMProxy的短消息或者状态报告消息。
(4)SMGPDeliverRespMessage下发短信响应,对应SMGP文档中的deliver_resp消息,是SMGPSMProxy收到的下发短信后的响应消息。
(5)SMGPExitMessage终止连接消息,对应SMGP文档中的exit消息,是网关和SMGPSMProxy终止逻辑连接的消息。
(6)SMGPExitRespMessage终止连接的响应消息,对应SMGP文档中的exit_resp消息,是网关或SMGPSMProxy收到终止连接后发送的响应消息。
(7)SMGPForwardMessage消息,对应SMGP文档中的forward消息。
(8)SMGPForwardRespMessage消息,对应SMGP文档中的forward_resp消息。
(9)SMGPLoginMessage请求连接消息,对应SMGP文档中的login消息,是SMGPSMProxy向网关发送的建立逻辑请求连接消息。
(10)SMGPLoginRespMessage请求连接应答消息,对应SMGP文档中的login_resp消息,是SMGPSMProxy向网关发送的建立逻辑请求连接后收到的响应消息。
(11)SMGPMoRouteUpdateMessage消息,对应SMGP文档中的mo_route_update消息。
(12)SMGPMoRouteUpdateRespMessage消息,对应SMGP文档中的mo_route_update_resp消息。
(13)SMGPMtRouteUpdateMessage消息,对应SMGP文档中的mt_route_update消息。
(14)SMGPMtRouteUpdateRespMessage消息,对应SMGP文档中的mt_route_update_resp消息。
(15)SMGPQueryMessage发送短信流量查询消息,对应SMGP文档中的query消息。
(16)SMGPQueryRespMessage发送短信流量查询的响应消息,对应SMGP文档中的query_resp消息。
(17)SMGPSubmitMessage发送短信消息,对应SMGP文档中的submit消息,是SMGPSMProxy发送短讯的消息。
(18)SMGPSubmitRespMessage下发短信的响应,对应SMGP文档中的submit_resp消息,是SMGPSMProxy发送短讯的响应消息。
其中的心跳消息(1,2)、建立逻辑连接的消息(9,10)和终止逻辑连接消息(5,6)只是SMGPSMProxy系统内部使用消息,提供给外部的接口中不涉及这六条消息。
第二章SMGPSMProxy使用说明
1SMGPSMProxy提供的接口方法描述
1、send
【函数功能】
向网关发送SMGP消息,阻塞直到收到响应或超时。
【函数原型】
SMGPMessagesend(SMGPMessagemessage);
【参数说明】
[IN]message-发送的SMGP消息,包括
(1)SMGPSubmitMessage提交短信
(2)SMGPQueryMessage发送短信流量查询
(3)SMGPForwardMessage删除短信
【处理】
调用这个接口方法,向网关发送Submit/Query/Forward等命令消息。
如果发送消息超时或通信异常则抛出异常,需要调用者捕获处理。
【返回值】
发送SMGPSubmitMessage,返回SMGPSubmitRespMessage;
发送SMGPForwardMessage,返回SMGPForwardRespMessage;
发送SMGPQueryMessage,返回SMGPQueryRespMessage;
2close
【函数功能】
向网关发送终止连接SMGP消息,调用之后连接将永久不可用。
【函数原型】
Voidclose();
【参数说明】无
【处理】
调用这个接口方法,SMGPSMProxy向网关发送SMGPExitMessage消息
如果发送消息超时或通信异常则抛出异常,需要调用者捕获处理。
【返回值】无
3getConnState
【函数功能】
获取通讯连接的状态方法。
【函数原型】
StringgetConnState();
【参数说明】无
【处理】
调用这个接口方法,获取TCP连接状态的描述。
如果发送消息超时或通信异常则抛出异常,需要调用者捕获处理。
【返回值】
当前错误描述,若连接正常则返回null。
2封装接口方法的SMGPSMProxy的抽象类
SMGPSMProxy在com.huawei.SMProxy的包中,封装了Send、close、getConnState方法。
SMGPSMProxy是一个抽象类,需要被继承使用。
SMGPSMProxy抽象类的框架如下:
publicclassSMGPSMProxy
{
publicSMGPSMProxy(Argsargs)
{
//完成初始化和向网关登录等工作
}
publicSMGPSMProxy(Mapargs)
{
//完成初始化和向网关登录等工作
}
/**
*发送消息,阻塞直到收到响应或超时。
*返回为收到的消息
*@exceptionPException超时或通信异常。
*/
publicSMGPMessagesend(SMGPMessagemessage)
{
//发送消息
}
/**
*连接终止的处理,由API使用者实现
*SMC连接终止后,需要执行动作的接口
*/
publicvoidonTerminate()
{
}
/**
*对收到消息的处理。
由API使用者实现。
缺省返回成功收到的响应
*@parammsg从短消息中心来的消息。
*@return应该回的响应,由API使用者生成。
*/
publicSMGPMessageonDeliver(SMGPDeliverMessagemsg)
{
}
/**
*终止连接。
调用之后连接将永久不可用。
*/
publicvoidclose()
{
}
/**
*提供给业务层调用的获取连接状态的方法
*/
publicStringgetConnState()
{
//返回连接状态的描述
}
}
3使用SMGPSMProxy抽象类
可以直接使用SMGPSMProxy类提供的Send、close和getConnState方法
但是如果SP有接收网关下发的短信的要求或网关断开连接的时候要求得到事件通知的时候,就必须声明一个新的类继承SMGPSMProxy,重载实现onDeliver()和onTerminate()。
使用例子如下:
//定义MySMGPSMProxy所在的包是demo
packagedemo;
importm.smgp.message.*;
importm.smgp.message.*;
importcom.huawei.insa2.util.*;
importcom.huawei.smproxy.*;
publicclassMySMGPSMProxyextendsSMGPSMProxy
{
publicMySMGPSMProxy(Demodemo,Argsargs)
{
//调用父类的构造函数,完成初始化和登录网关的功能,不能省略
super(args);
}
publicSMGPMessageonDeliver(SMGPDeliverMessagemsg)
{
byte[]msgId=msg.getMsgId();
//添加收到短消息中心下发消息的处理代码
intresult=0;
//实际上是返回响应消息,一定要有
returnnewSMGPDeliverRespMessage(msgId,result);
}
publicvoidOnTerminate()
{
//可以添加网关和SMGPSMProxy断开连接的处理代码,如:
System.out.println("Connectionhavebeenbreaked!
");
}
}
实际使用SMGPSMProxy封装的send、close和getConnState的接口方法的时候,只需要生成MySMGPSMProxy的对象,然后调用MySMGPSMProxy的send、close和getConnState方法即可。
4配置参数使用说明
SMGPSMProxy需要的配置参数如下表
参数名称
参数例值
参数描述
host
10.76.148.147
网关主机地址的IP地址
port
7890
网关主机开发的端口号
clientid
sp
CP编号或者SWGW编号
shared-secret
pass
CP向网关申请的ID所对应的密码
heartbeat-interval
10
心跳信息发送间隔时间
(单位:
秒)
reconnect-interval
10
连接中断时重连间隔时间(单位:
秒)
heartbeat-noresponseout
5
需要重连时,连续发出心跳而没有接收到响应的个数(单位:
个)
transaction-timeout
10
操作超时时间(单位:
秒)
version
1
双方协商的版本号(大于0,小于256)
debug
true
true表示属于调试状态,所有的消息被打印输出到屏幕,false表示不属于调试状态,所有的消息不被输出
配置文件可以采用我们提供的XML格式,也可以采用其他格式,只要构造的时候能通过Map类型或Arg类型的参数传入指定的参数就可以了。
例如可以用java的property文件保存参数,或将配置和ICP的应用程序配置放在一起。
下面是以XML格式定义的配置文件
app.xml是在SMProxy.jpx的工程目录下,是使用XML写的配置文件,具体内容如下
其中以"
--"开头的语句是注释部分
xmlversion="1.0"encoding="GB2312"?
>
--SMProxy配置文件-->
--与Infox建立连接所需参数-->
--InfoX主机地址-->
10.76.175.218
--InfoX主机端口号-->
8890
--CP编号或者SWGW编号-->
sp
--登录密码-->
new
--心跳信息发送间隔时间(单位:
秒)-->
30
--连接中断时重连间隔时间(单位:
秒)-->
30
--需要重连时,连续发出心跳而没有接收到响应的个数(单位:
个)-->
5
--操作超时时间(单位:
秒)-->
10
--双方协商的版本号(大于0,小于256)-->
19
--是否属于调试状态,true表示属于调试状态,所有的消息被打印输出到屏幕,false表示不属于调试状态,所有的消息不被输出-->
false
使用的时候可以根据实际情况配置
举例说明:
如果Infox的IP地址为10.76.148.168,则只需要修改
10.76.175.218为10.76.148.168即可,同样可以根据实际情况修改其他的配置项。
5使用SMGPSMProxy收发短信
5.1直接使用SMGPSMProxy发送短信
当不需要接收网关下发的短信和不需要获得网关的断连通知的时候,可以直接使用SMGPSMProxy类方法发送/查询/删除短信和退出网关
具体使用方法如下
生成SMGPSMProxy的实例
(a)ArgscfgArgs=newCfg("app.xml").getArgs("SMGPConnect");
(b)cfgArgs.set("clientid","sp");
(c)cfgArgs.set("shared-secret","new");
(d)SMGPSMProxyproxy=newSMGPSMProxy(args);
注释:
(a)类Cfg在com.huawei.insa2.util的包中,主要负责基于XML格式的配置文件读写类,使用Cfg类解析app.xml配置文件,Cfg的构造函数的原形如下
publicCfg(Stringurl),其中参数url表示解析的配置文件。
通过调用Cfg对象的getArgs方法获得Args对象。
(b,c)根据配置文件解析生成Args对象,SP还可以修改其中的配置项,b和c就是修改配置参数中的SP登录网关的ID和密码,同样也可以修改其他的配置项。
(d)生成SMGPSMProxy对象proxy
调用proxy.send(SMGPMessagemsg)完成发送短信。
调用proxy.close()与Infox断开连接。
调用proxy.getConnState()获得和Infox的TCP连接的状态描述。
具体使用情况请参看5.2
5.2使用SMGPSMProxy收发短信
当需要接收Infox下发的短信或在Infox下发断连命令的时候需要得到事件通知的情况需要做如下处理
1:
首先需要声明MySMGPSMProxy类,并且从com.huawei.SMProxy包中的SMGPSMProxy类继承,根据实际情况处理。
如果SP有接收短信的要求在MySMGPSMProxy的类中重载实现SMGPSMProxy的onDeliver方法,在MySMGPSMProxy类中增加
publicSMGPMessageonDeliver(SMGPDeliverMessagemsg)
{
//添加收到短消息中心下发消息的处理代码
。
。
。
//实际上是返回响应消息,一定要有
returnsuper.onDeliver(msg);
}
如果SP需要在网关向SMGPSMProxy下发断开连接后收到类似于事件的通知,则需要重载SMGPSMProxy的onTerminate方法,需要在MySMGPSMProxy类中增加
publicvoidOnTerminate()
{
//可以添加网关和SMGPSMProxy断开连接的处理代码
}
2:
生成MySMGPSMProxy的实例
(a)ArgscfgArgs=newCfg("app.xml").getArgs("SMGPConnect");
(b)cfgArgs.set("clientid","sp");
(c)cfgArgs.set("shared-secret","new");
(d)SMGPSMProxyproxy=newSMGPSMProxy(args);
注释:
(a)类Cfg在com.huawei.insa2.util的包中,主要负责基于XML格式的配置文件读写类,使用Cfg类解析app.xml配置文件,Cfg的构造函数的原形如下
publicCfg(Stringurl),其中参数url表示解析的配置文件。
通过调用Cfg对象的getArgs方法获得Args对象。
(b,c)根据配置文件解析生成Args对象,SP还可以修改其中的配置项,b和c就是修改配置参数中的SP登录网关的ID和密码,同样也可以修改其他的配置项。
(d)生成MySMGPSMProxy对象myProxy
3:
使用MySMGPSMProxy对象发送短消息
向网关下发短信
SMGPSubmitMessagesubmitMsg=
newSMGPSubmitMessage(
intmsgType,
intneedReport,
intpriority,
StringserviceId,
StringfeeType,
StringfeeCode,
StringfixedFee,
intmsgFormat,
DatevalidTime,
DateatTime,
StringsrcTermId,
StringchargeTermId,
String[]destTermId,
StringmsgContent,
Stringreserve
)
调用MySMGPSMProxy对象myProxy的send方法发送,
SMGPSubmitRepMessagerepMsg=myProxy.send(submitMsg);
注释:
/**
*创建一个发送短信消息,传入消息的各字段的值,并对各参数值进行判断,不符合要求则抛出异常
*按要求把输入的参数转换为一个byte类型的数组
*@parammsgType短消息类型
*@paramneedReport是否要求返回状态报告
*@parampriority发送的优先级
*@paramserviceId业务类型
*@paramfeeType资费类型
*@paramfeeCode资费代码
*@paramfixedFee
*@parammsgFormat短消息格式
*@paramvalidTime有效时间
*@paramatTime发送时间
*@paramsrcTermId短消息发送用户号码
*@paramchargeTermId计费用户号码
*@paramdestTermId短消息接收号码
*@parammsgCount短消息内容
*@paramreserve保留字段
*/
这些消息与SMGP文档中的SMGP_Submit消息的格式相对应。
repMsg提交submit的响应消息,是网关返回给SP的消息。
第三章使用SMGPSMProxy收发短信的例子
1:
直接使用SMGPSMProxy发送短信的Demo
当不需要接收网关下发的短信和不需要获得网关的断连通知的时候,可以直接使用SMGPSMProxy类方法发送/查询/删除短信和退出网关
使用MySMGPSMProxy收发短信的Demo
demo.java代码如下
packagedemo;
importcom.huawei.SMProxy.*;
importm.smgp.message.*;
importm.smgp.message.*;
importcom.huawei.insa2.util.*;
publicclassDemo
{
privatestaticArgsargs;
/**短信收发接口*/
privateSMGPSMProxymyProxy=null;
publicDemo()
{
}
/**
*程序入口。
*/
publicstaticvoidmain(String[]a)throwsException
{
try
{
//生成SMGPSMProxy对象,完成向网关的登录
args=newCfg("app.xml",false).getArgs("SMGPConnect");
args.set("clientid",loginName.getText().trim());
args.set("shared-secret",loginPass.getText().trim());
smp=newSMGPSMProxy(args);
//发送短信
SMGPSubmitMessagesubmitMsg=
newSMGPSubmitMessage(
intmsgType,
intneedReport,
intpriority,
StringserviceId,
StringfeeType,
StringfeeCode,
StringfixedFee,
intmsgFormat,
DatevalidTime,
DateatTime,
StringsrcTermId,
StringchargeTermId,
String[]destTermId,
StringmsgContent,
Stringreserve
);
SMGPSubmitRepMessagesubmitRepMsg=myProxy.send(submitMsg);
//可以增加处理响应消息submitRepMsg的代码
//查询SMGPSMProxy与网关的TCP连接状态
StringstateDesc=myProxy.getConnState();
//退出
myProxy.close()
}
Catch(Exceptione)
{
//异常处理
}
}
2使用SMGPSMProxy收发短信的例子