中国移动
MM7 API
用户手册
版本
:
V1.5.3
中国移动集团公司
修改记录
文件编号
|
版本号
|
拟制人/
修改人
|
拟制/修改日期
|
更改理由
|
主要更改内容
(写要点即可)
|
|
V1.1
|
胡冬梅
|
2004.03.22
|
修改、整理
|
|
|
V1.2
|
胡冬梅
|
2004.04.14
|
增加内容
|
增加安装说明
|
|
V1.3
|
胡冬梅
|
2004.4.21
|
增加内容
|
增加状态码等说明
|
|
V1.5.1
|
胡冬梅
|
2004.5.12
|
增加内容
|
增加获取API版本信息、API返回码说明等
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
目
录
1.概述
该文档说明了SP如何使用中国移动集团公司的MM7 API程序与彩信中心进行对接,实现MM7接口的通讯,开发增值业务应用。
该MM7 API是使用纯Java开发的,使用的JDK的版本为JDK1.4.0。所以使用该API进行开发时,要求使用的JDK版本必须是JDK1.4.0以上版本。该API所使用的通讯承载协议是HTTP/1.1。
缩略词:
MM
: Multimedia Message (多媒体消息)
MMS
:
Multimedia Message Service(多媒体消息服务)
MMSC
: Multimedia Message Service Center(多媒体消息服务中心)
VAS
: Value Added Service(增值业务)
SP
: Service Provider(业务提供商)
HTTP
: Hypertext Transfer Protocol(超文本传输协议)
2.概念
2.1企业代码
企业代码是企业身份的标识,网络中地址翻译、计费、结算等均以企业代码为依据。企业代码的数据需要在MMSC和BOSS系统中进行配置。企业代码以数字表示,共6位,从“8XY000”至“8XY999”,其中“XY”为各移动分公司代码。
彩信全网业务的SP企业代码为8XY001-8XY999。(目前短信全网业务的企业代码为9XY001-9XY500,WAP全网业务的企业代码为9XY501-9XY999。)彩信地方业务的SP企业代码由各地方移动公司按照业务许可的顺序依次分配制定,“XY”具体分配情况见相关表格。
2.2服务代码
服务代码是:用户使用彩信的发送、上传等上行类业务时,需要输入的接收方号码;或SP在根据用户的点播请求在向用户发送、下载等下行类业务时,用户终端中显示的发送方的号码。服务代码的数据需要在MMSC上进行配置,用于路由的查找和状态报告的返回。服务代码以数字表示。
全国业务的服务代码长度统一为4位,即“1000”-“9999”;本地业务服务代码长度统一为5位,即“01000”-“09999”。
以下号码或号段暂不分配:
13XX
(XX=00-99)、20XX(XX=01-99)、168X(X=0-9)、186X(X=0-9)、1258/1259、172X(X=0-9)、6XXX、7XXX。
上述代码的分配和使用情况均可以在www.monternet.com上查询。
如果SP已经开展了短信等业务,原则上彩信的服务代码依照SP原有的服务代码进行分配,以保证用户的使用习惯。
目前全网业务的服务代码,由集团公司统一分配。
2.3业务代码
业务代码表示业务类别,并且区分不同业务的信息服务费。业务代码的数据需要在MMSC和BOSS系统中进行配置。业务代码用数字表示,并且不能使用000。
为便于进行业务统计和分析,业务代码尽量按照不同的业务分类如下:
互联网点播类: 以1开头
WAP点播类:
以2开头
短信点播类: 以3开头
STK点播类:
以4开头
彩信点播类: 以0开头
业务代码在遵循原则的前提下其余内容由SP自己制定。
2.3.1上行业务的业务代码规范
上行业务的业务代码为三位,其构成如下:
第1位:0、7、9开头的业务代码保留,其他代码由彩信SP自行编排。
第2~3位:由彩信SP自行编排
特例:如果用户直接给四位服务代码发送上行彩信,系统会默认加上业务代码“0”,该业务代码默认开通,仅用于上行彩信到服务代码。
下行业务的业务代码为六位,其构成如下:
第1位:功能标识位,目前有如下两种选择:
l 1,代表一般下行业务
l 7,代表用于“先机时代”项目中手机内置并参与渠道分成的业务
l 6,代表用于集团客户应用的业务(免费)
其他数字目前保留。
第2位:彩信业务一级分类,具体如下面表格:
第3位:彩信业务二级分类,具体如下面表格:
一级分类及标识代码
|
二级分类及标识代码
|
新闻天气(
1
)
|
天气预报(1)
|
|
热点快讯(2)
|
|
社会新闻(3)
|
|
体育新闻(4)
|
|
娱乐新闻(5)
|
|
财经新闻(6)
|
|
综合新闻(0)
|
游戏娱乐(
2
)
|
聊天交友(1)
|
|
笑话幽默(2)
|
|
彩信游戏(3)
|
|
影音视线(4)
|
|
互动有奖(5)
|
|
五花八门(0)
|
时尚生活(
3
)
|
时尚有约(1)
|
|
车迷世界(2)
|
|
文化教育(3)
|
|
情感画廊(4)
|
|
爱情家庭(5)
|
|
两性健康(6)
|
|
证券财经(7)
|
|
位置服务(8)
|
|
五花八门(0)
|
卡通动漫(
4
)
|
欧美(1)
|
|
日本(2)
|
|
韩国(3)
|
|
港台(4)
|
|
本地原创(5)
|
|
五花八门(0)
|
彩信铃声(
5
)
|
明星专辑(1)
|
|
精品影视(2)
|
|
流行音乐(3)
|
|
古典音乐(4)
|
|
卡拉OK(5)
|
|
特殊音效(6)
|
|
五花八门(0)
|
彩图动画(
6
)
|
人物剪影(1)
|
|
动物一族(2)
|
|
美丽心情(3)
|
|
温馨祝福(4)
|
|
电影名画(5)
|
|
体育纵横(6)
|
|
大千世界(7)
|
|
3D动画(8)
|
|
五花八门(0)
|
彩信
DIY
(
7
)
|
贺卡类(1)
|
|
形象类(2)
|
|
文字类(3)
|
|
五花八门(0)
|
特色用途(
0
)
|
免费客服(1)
|
|
优惠套餐(2)
|
第4位:业务模式位,各个模式及其数字标识如下:
l 1:按条点播
l 2:按条定制
l 3:包月定制
l 4:包月点播
第5~6位:由彩信SP自行编排
2.4操作指令码
操作指令码是指用户通过短信点播或定制彩信业务时,在短信的信息体内输入的代码,或用户上行发送彩信时,在彩信消息体内的文本信息中输入的代码。操作指令码用于标识对彩信的处理方式。此代码出现在短信或彩信的消息体内,由SP自行处理,彩信中心不负责处理该代码。
在短信中输入的操作指令码应严格区分用户是点播、定制短信业务还是彩信业务。如果用户通过短信点播或定制彩信业务,操作指令码应以CX开头。
如:用户在短信或彩信文本信息体内输入“CX XW”发送至8888,就是定制新浪提供的彩信图片新闻业务。
2.5下行业务
由SP主动发起的业务。这里主要指SP向MMSC发起的业务。
2.6上行业务
SP被动接收的业务。这里主要指从MMSC那里接收业务。
2.7递送报告
报告是接收方(终端)对接收到消息的处理方式信息。递送报告指MMSC
在获取这个报告后把这个信息发送给发送方(SP
)。接收方对消息的处理可能是接收或者拒绝等。处理流程如下:
l SP
发送消息(通过MMSC
)给终端,并且要求递送报告;
l 终端接收到消息后做相应处理(接收或拒绝);
l MMSC
把终端对消息的处理信息(递送报告)发送给SP
。
3.安装方法
3.1 MM7 API的使用
在VASP
用Java
开发自己程序时,只要将中国移动集团公司提供的mm7api.jar
和lib
下的所有的Jar
文件加入到classpath
中即可。
3.2配置文件的设置
配置文件mm7Config.xml
需要根据SP
情况进行修改。
<?xml version="1.0"?>
<vasp:MM7Config xmlns:vasp="http://mms.chinamobile.com/mm7ConfigSchema">
<AuthenticationMode>1</AuthenticationMode>
<UserName>zxme</UserName>
<Password>zxme</Password>
<MaxMessageSize>100000000</MaxMessageSize>
<LogPath>c:/vas_log</LogPath>
<logLevel>1</logLevel>
<LogNum>100</LogNum>
<LogInterval>120</LogInterval>
<LogSize>200</LogSize>
<Charset>UTF-8</Charset>
<MmscID>1</MmscID>
<mmscURL> /mm7</mmscURL>
<mmscIP>192.120.231.180</mmscIP>
<UseSSL>true</UseSSL>
<ListenIP>192.120.231.228</ListenIP>
<ListenPort>80</ListenPort>
<BackLog>50</BackLog>
<TimeOut>10000</TimeOut>
<ReSendCount>5</ReSendCount>
</vasp:MM7Config>
一些地方需要进行修改,下面一一说明:
<AuthenticationMode>1</AuthenticationMode>
表示VASP
作为服务端接收消息时是否进行鉴权或进行什么样的鉴权,0
表示不鉴权,1
表示进行基本鉴权,2
表示进行摘要鉴权。
<UserName>zxme</UserName>
<Password>zxme</Password>
表示彩信中心对VASP
进行鉴权时的用户名和密码,同时也是VASP
对接入的彩信中心进行鉴权时用户名和密码,是双向的,要VASP
和MMSC
双方进行约定。
<LogPath>c:/vas_log</LogPath>
表示日志存放的路径,在Windows
操作系统下和Linux
下是不一样的,要注意进行修改。
<MmscID>1</MmscID>
表示MMSC
网关的序号,需要从MMSC
处得到。
<mmscURL> /mm7</mmscURL>
<mmscIP>192.120.231.180</mmscIP>
分别表示MMSC
网关的URL
地址和IP
(或主机名),也需要MMSC
处得到。这里也可以填成ip:port
。例如:192.120.231.180:8080,
不填端口号使用默认端口号80
。
<ListenIP>192.120.231.228</ListenIP>
<ListenPort>80</ListenPort>
表示当VASP
用应用程序方式进行接收消息时的监听地址和端口号。
以上为这个配置文件中主要需要注意修改的地方,当然其他的内容也可以进行修改,如<logLevel>1</logLevel>
可以根据需要进行修改,0
表示不产生日志;1
表示
产生错误日志
;
3
表示产生信息日志
;
6
表示产生完整信息日志。
<TimeOut>90000</TimeOut>
表示设置发送的超时时间,若发送超过这个时间,则自动进行重新发送。
<ReSendCount>2</ReSendCount>
表示设置重发的次数,建议在3
次以下,一般用2
次即可。
4.开发方法
这里主要介绍从SP接收MMSC发过来的DeliverReq开始,到SP发送SubmitReq到MMSC的整个流程,SP所需要做的工作。
4.1 VASP接收传送请求(上行业务)
VASP接收可以有两种方式:
l 如果SP的增值应用是一个普通应用程序,可以使用方式1,即接收代理会自动打开一个监听端口,启动一个监听线程来接收来自MMSC的多媒体消息;
l 如果SP的增值应用是一个Web应用,则可以使用方式2,即接收代理作为一个Servlet运行,并自动处理从HttpRequest中搜索数据,并解码成多媒体消息。
4.1.1 方式1:普通应用程序中的用法
public class MyReceiver extends MM7Receiver
{
//定义一个MM7DeliverReq,以便得到
MMSC发过来的Deliver消息。(
必备)
public static MM7DeliverReq deliverReq = new MM7DeliverReq();
//Main方法
public static void main(String[] args)
{
//初始化VASP
MM7Config mm7Config = new MM7Config(“./config/mm7Config.xml”);
//设置ConnConfig.xml文件的路径
mm7Config.setConnConfigName(“./config/ConnConfig.xml”);
//
必备
//构造MyReceiver
MyReciever receiver = new MyReceiver();
myReceiver.setConfig(mm7Config);
//
必备
//创建MM7消息发送接口
MM7Sender mm7Sender = new MM7Sender(mm7Config);
//启动接收器
receiver.start();
for(;;);
}
public MM7VASPRes doDeliver(MM7DeliverReq request)
{
/*接收从
MMSC发过来的传送消息,以便取出其中的部分值构造提交消息或得到一些有用
信息,如MMSC的标识符等
*/
deliverReq = request;
System.out.println(“收到手机
”+request.getSender()
+“提交的消息,标题为:
”+request.getSubject());
System.out.println("MMSC的标识符为:"+request. GetMMSRelayServerID()) ;
//SP需要进行一些处理,例如构建MM7DeliverRes消息,设置ServiceCode或StatusCode
MM7DeliverRes mm7DeliverRes = new MM7DeliverRes();
mm7DeliverRes.setServiceCode("服务代码"); //设置ServiceCode,可选
mm7DeliverRes.setStatusCode(MMConstants.RequestStatus.SUCCESS) ;/*设置请求完成状
态,
必备,以便表明SP已经接收到传送消息。一般设
1000。*/
mm7DeliverRes.setStatusText("所用状态文本说明
"); /*设置所用状态的文本说明,
应限定请求状态,可选
*/
//返回给
MM7 API,以便API将MM7DeliverRes返回给MMSC。
return(MM7VASPRes)mm7DeliverRes;
}
}
4.1.2 方式2:Web应用程序中的用法
public class MyReceiver extends MM7RecieveServlet
{
public MM7VASPRes doDeliver(MM7DeliverReq request)
{
System.out.println(“收到手机
”+request.getSender()
+“提交的消息,标题为:
”+request.getSubject());
System.out.println("MMSC的标识符为:"+request. GetMMSRelayServerID()) ;
//SP需要进行一些处理,例如构建MM7DeliverRes消息,设置ServiceCode或StatusCode
MM7DeliverRes mm7DeliverRes = new MM7DeliverRes();
mm7DeliverRes.setServiceCode("服务代码"); //设置ServiceCode,可选
mm7DeliverRes.setStatusCode(MMConstants.RequestStatus.SUCCESS) ;/*设置请求完成状
态,
必备,以便表明SP已经接收到传送消息。一般设
1000。*/
mm7DeliverRes.setStatusText("所用状态文本说明
"); /*设置所用状态的文本说明,
应限定请求状态,可选
*/
//返回给
MM7 API,以便API将MM7DeliverRes返回给MMSC。
return(MM7VASPRes)mm7DeliverRes;
}
}
4.2发送多媒体消息的过程(下行业务)
发送多媒体消息的过程就是使用MM7 API组织消息,并通过MM7Sender发送给MMSC的过程。主要步骤如下:
4.2.1准备
1.
初始化VASP
初始化VASP使用的是MM7Config类,该类定义了有关本
VASP和对应的MMSC的配置信息。系统在初始化时,必须对该对象进行定义,它将用于通信类的控制。
MM7Config mm7Config = new MM7Config("./config/mm7Config.xml ");
其中mm7Config.xml为配置文件,其格式如下:
<?xml version="1.0"?>
<vasp:MM7Config xmlns:vasp="http://mms.chinamobile.com/mm7ConfigSchema">
<!--鉴权方式,
1为基本鉴权,2为摘要鉴权,0为不使用鉴权-->
<AuthenticationMode>0</AuthenticationMode>
<!--设置用户名
, 必须为被授权的用户(4位)-->
<UserName>1111</UserName>
<!--设置VASP的密码(6位)
-->
<Password>11111111</Password>
<!—设置允许的最大消息的大小(以字节为单位),目前最大支持
128K-->
<MaxMessageSize>100000</MaxMessageSize>
<!--设置日志路径
-->
<LogPath>c:/vas_log</LogPath>
<!--设置日志级别,8 个级别(0)No log(1)Severe, (2)Warning, (3)Info, (4)Config, (5)Fine, (6)Finer, (7)Finest-->
<logLevel>1</logLevel>
<!--设置指定用于对消息编码的字符集(缺省值为UTF-8)
-->
<Charset>UTF-8</Charset>
<!--MMSC网关的URL地址
-->
<mmscURL>/mm7</mmscURL>
<!-- MMSC网关的IP或主机名列表-->
<mmscIP>202.202.202.202</mmscIP>
<!—MMSC网关的序号
à
<MmscID>910010</MmscID>
<!--是否启用SSL加密,false:不加密,true:SSL加密
-->
<UseSSL>true</UseSSL>
<!--应用程序方式的监听
IP地址
-->
<ListenIP>102.102.102.102</ListenIP>
<!--应用程序方式的监听端口-->
<ListenPort>80</ListenPort>
<!--日志文件的最大产生数量,单位为个,缺省值为
100,取值范围为:1至9999。-->
<LogNum>100</LogNum>
<!--日志记录的产生时间间隔,单位为分,缺省值为
60,取值范围为:1至1440-->
<LogInterval>10</LogInterval>
<!--日志文件大小的最大限制,单位为
K,缺省值为500K,最大值为10000K。-->
<LogSize>1000</LogSize>
</vasp:MM7Config>
2.
创建MM7
消息发送接口:
创建发送接口使用的是MM7Sender类,其中已经封装了和MMSC连接的通讯机制,使用时只要创建它的一个带MM7Config参数的实例即可。
MM7Sender mm7Sender = new MM7Sender(mm7Config);
4.2.2创建待发送消息
创建待发送消息使用的类均是由MM7Message继承得到的。主要有MM7SubmitReq、MM7CancelReq、MM7ReplaceReq等类,具体设置方法将分别进行介绍。
4.2.2.1 创建提交增值业务的多媒体消息(MM7SubmitReq)
1.
创建消息对象
MM7SubmitReq submitReq = new MM7SubmitReq();
2.
设置消息属性
submitReq.setTransactionID("关联标识");
/*设置MM7_submit.REQ/MM7_submit.RES对的标识,
必备*/
submitReq.setVASPID("SP代码") ; //设置
SP代码,
必备
submitReq.setVASID("服务代码") ; //设置服务代码,
必备
submitReq.setServiceCode("业务代码"); //设置业务代码,
必备
submitReq.setSenderAddress("MM始发方的地址");设置MM始发方的地址(填写SP的服务代码,或者填写让用户回复SP的长号码,长号码构成:SP的服务代码+业务代码+操作码),
必备
submitReq.setChargedPartyID(“付费方手机号码”); //设置付费方的手机号码,
必备
submitReq.setTo("接收方地址"); //设置接收方MM的地址
submitReq.addTo("单个接受方地址"); //增加单个接受方地址
submitReq.setCc("抄送方地址"); //设置抄送方MM的地址
submitReq.addCc("单个抄送方地址"); //增加单个抄送方地址
submitReq.setBcc("密送方地址"); //设置密送方MM的地址
submitReq.addBcc("单个密送方地址"); //增加单个密送方地址
注:在设置或增加To,Cc和Bcc时,
至少需要设置其中一个,这些地址可能存在多
个地址或使用指示使用分发表的别名。可以标记仅供参考的地址。
submitReq.setLinkedID("链接标识"); /*设置链接标识,标识传送至VASP的上一
个有效消息的对应关系;可选*/
submitReq.setMessageClass("MM的类别"); /*设置MM的类别(例如,广告、
信息服务和计费),可选,具体有:Auto、Personal、Advertisement、Informational*/
submitReq.setTimeStamp("提交MM的日期和时间"); /*提交MM的时间和日期
(时间戳),格式如2004-02-09T10:21:07,可选*/
submitReq.setExpiryDate("指定超时时间"); /*设置MM指定的超时时间(绝对
或相对时间),可选*/
submitReq.setEarliestDeliveryTime("最早理想时间"); /*设置将MM传送给接收
方的最早理想时间(绝对或相对时间),可选*/
submitReq.setDeliveryReport("发送报告的请求"); /*设置是否需要发送报告的请
求(boolean值),可选*/
submitReq.setReadReply("需要读取报告的请求"); /*设置通过请求传送一个读
取报告进行确认,可选*/
submitReq.setReplyCharging("应答计费的请求"); /*设置应答计费的请求
(boolean值),可选*/
submitReq.setReplyDeadline("提交应答的最迟时间"); /*设置在应答计费的情况
下,向接收方提交应答的最迟时间(绝对或相对时间),可选*/
submitReq.setReplyChargingSize("应答MM的最大大小"); /*设置在应答计费的情况下,提供给接收方的应答MM的最大大小,可选*/
submitReq.setPriority("消息的优先级"); /*消息的优先级(重要性)(0=最低优先级,1=正常,2=紧急),byte类型的值,可选*/
submitReq.setSubject("多媒体消息的标题"); /*设置多媒体消息的标题,可选*/
submitReq.setAllowAdaptations("VASP是否允许修改内容"); /*设置VASP是否允许修改内容(boolean值,默认为真),可选*/
submitReq.setChargedParty("VASP所提交MM的付费方"); /*设置VASP所提交MM的付费方,例如,发送方、接收方、发送方和接收方或两方均不付费,可选,0:Sender、1:Recipients、2:Both、3:Neither、4:ThirdParty*/
submitReq.setContent("多媒体消息的内容"); /*设置多媒体消息的内容,可选,注意当要设置时,一定要设置其ContentType。*/
submitReq.setDistributionIndicator("是否可重新分发"); /*设置VASP是否可重新分发MM的内容(boolean值,true为可以,false为不可以),可选*/
4.2.2.2 创建取消多媒体消息(MM7CancelReq)
1.
创建消息对象
MM7CancelReq cancelReq = new MM7CancelReq();
2.
设置消息属性
cancelReq.setTransactionID("关联标识");
/*MM7_cancel.REQ/MM7_cancel.RES
对的标识,
必备*/
cancelReq.setVASPID("SP代码"); /*设置SP代码,可选*/
cancelReq.setVASID("服务代码"); /*设置服务代码,可选*/
cancelReq.setSenderAddress("MM始发方地址"); /*设置MM始发方地址,可选*/
cancelReq.setMessageID("待取消的消息的标识符"); /*设置待取消的消息的标识符,
必备*/
4.2.2.3 创建替换多媒体消息(MM7ReplaceReq)
1.
创建消息对象
MM7ReplaceReq replaceReq = new MM7ReplaceReq();
2.
设置消息属性
replaceReq.setTransactionID("关联标识");
/*设置MM7_replace.REQ/MM7_replace.RES对的标识,
必备*/
replaceReq.setVASPID("SP代码"); /*设置SP代码,可选*/
replaceReq.setVASID("服务代码"); /*设置服务代码,可选*/
replaceReq.setMessageID("被当前消息所替换的消息的标识符"); /*被当前消息
所替换的消息的标识符,
必备*/
replaceReq.setServiceCode("业务代码"); /*设置业务代码,可选*/
replaceReq.setTimeStamp("提交MM的日期和时间"); /*设置提交MM的时间和
日期(时间戳),格式如2004-02-09T10:21:07,可选*/
replaceReq.setEarliestDeliveryTime("最早理想时间"); /*设置将MM传送给接收
方的最早理想时间(绝对或相对时间),可选*/
replaceReq.setReadReply("需要读取报告的请求"); /*设置通过请求传送一个读
取报告进行确认(boolean值,true为需要,false为不需要),可
选*/
replaceReq.setAllowAdaptations("VASP是否允许修改内容"); /*设置VASP是否允许
修改内容(boolean值,默认为真),可选*/
replaceReq.setContent("多媒体消息内容"); /*设置多媒体消息的内容,可选,注意当要
设置时,一定要设置其ContentType。*/
replaceReq.setDistributionIndicator("是否可重新分发"); /*设置VASP是否可重新分发
MM的内容(boolean值,true为可以,false为不可以),可选*/
4.2.3 创建消息内容体
每个消息内容体就是一个MMContent实例,可以添加多个消息内容体,但是所有消息内容体大小之和不能超过MMSC允许大小(目前最大支持128K)。
MMContent content = new MMContent();
/**设置附件的类型,若不包含SMIL格式的文件,则设置类型为MMConstants.ContentType. MULTIPART_MIXED,若包含SMIL格式的文件,则设置类型为MMConstants.ContentType. MULTIPART_RELATED*/
content.setContentType(MMConstants.ContentType. MULTIPART_MIXED);
/**添加类型为Gif的附件一 */
MMContent sub1 = MMContent.createFromFile("f://yellow.gif");
sub1.setContentID("1.gif");
//可以不设
/**设置子附件的类型,有两种设置方式:一种是在setContentType里面填写MMConstants.ContentType里面定义的常量,另一种是在setContentType里面填写一个String的类型,如text/plain等。*/
sub1.setContentType(MMConstants.ContentType.GIF); //
一定要设置
content.addSubContent(sub1);
/**添加类型为Txt的附件二*/
MMContent sub2 = MMContent.createFromString("This is a Test2!");
sub2.setContentType(MMConstants.ContentType. TEXT); //一定要设置
sub2.setContentID("2.txt");
content.addSubContent(sub2);
/**将附件进行设置,设需发送消息为MM7SubmitReq*/
submitReq.setContent(content);
4.2.4 发送多媒体消息
调用MM7Sender的send方法发送多媒体消息,返回MM7RSRes类型的消息。举例,发送MM7SubmitReq类型的消息:
MM7RSRes res = mm7Sender.send(submitReq); //其它消息与此类似
package com.cmcc.mm7.vasp.conf;
import com.cmcc.mm7.vasp.message.*;
import com.cmcc.mm7.vasp.service.MM7Sender;
import com.cmcc.mm7.vasp.common.*;
import java.io.*;
public class VaspSendTest {
public static void main(String[] args) {
MM7Config mm7Config = new MM7Config("./config/mm7Config.xml");
mm7Config. setConnConfigName("./config/ConnConfig.xml");
MM7Sender mm7Sender = new MM7Sender(mm7Config);
MM7SubmitReq submit = new MM7SubmitReq();
submit.setTransactionID("11111111");
submit.addTo("13915002000");
submit.setVASID("1234");
submit.setServiceCode("123");
submit.setSubject("测试");
MMContent content = new MMContent();
content.setContentType(MMConstants.ContentType. MULTIPART_MIXED);
MMContent sub1 = MMContent.createFromFile("f://yellow.gif");
sub1.setContentID("1.gif");
sub1.setContentType(MMConstants.ContentType.GIF);
content.addSubContent(sub1);
MMContent sub2 = MMContent.createFromString("This is a Test2!");
sub2.setContentID("2.txt");
sub2.setContentType(MMConstants.ContentType. TEXT);
content.addSubContent(sub2);
submit.setContent(content);
MM7RSRes res = mm7Sender.send(submit);
System.out.println("res.statuscode=" + res.getStatusCode() +
";res.statusText=" + res.getStatusText());
}
}
4.3 VASP接收传送消息以及发送提交消息实例
举一个实例说明VASP构建MM7SubmitReq,发送给MMSC,并得到返回消息,通过StatusCode判断,本次发送是否成功,若成功,得到MessageID,以便以后希望取消或替换该消息时用。
public class MyReceiver extends MM7Receiver
{
//定义一个MM7DeliverReq,以便得到
MMSC发过来的Deliver消息。(
必备)
public static MM7DeliverReq deliverReq = new MM7DeliverReq();
//Main方法
public static void main(String[]args)
{
//初始化VASP
MM7Config mm7Config = new MM7Config(“../config/mm7Config.xml”);
//设置ConnConfig.xml文件的路径
mm7Config.setConnConfigName(“../config/ConnConfig.xml”); //
必备
//构造MyReceiver
MyReciever receiver = new MyReceiver();
receiver.setConfig(mm7Config); //
必备
//创建MM7消息发送接口
MM7Sender mm7Sender = new MM7Sender(mm7Config);
//启动接收器
receiver.start();
//接收MM7DeliverReq完毕,开始构造MM7SubmitReq
//有两种可能,一种是MM7SubmitReq完全由
SP构造,另一种是SP用接收到的
//MM7DeliverReq的部分内容进行填充。
MM7SubmitReq submitReq = new MM7SubmitReq();
submitReq.setVASPID("SP代码") ; //
必备
submitReq.setVASID("服务代码") ; //
必备
submitReq.setServiceCode("业务代码"); //
必备
submitReq.setSenderAddress("MM始发方的地址"); /*
必备,若想从MM7DeliverReq中获得,
则应按下面的方式设:
submitReq.setSenderAddress(deliverReq.getSender());*/
submitReq.setTo("接收方地址"); /*若想从MM7DeliverReq中获得,则应按下面的方式设:
submitReq.setTo(deliverReq.getTo());*/
submitReq.addTo("单个接受方地址"); //增加单个接受方地址
submitReq.setCc("抄送方地址"); /*若想从MM7DeliverReq中获得,则应按下面的方式设:
submitReq.setCc(deliverReq.getCc()) ;*/
submitReq.addCc("单个抄送方地址"); //增加单个抄送方地址
submitReq.setBcc("密送方地址"); /*若想从MM7DeliverReq中获得,则应按下面的方式设:
submitReq.setBcc(deliverReq.getBcc()) ;*/
submitReq.addBcc("单个密送方地址"); //增加单个密送方地址
submitReq.setLinkedID("链接标识"); /*可选,若想从MM7DeliverReq中获得,则应按
下面的方式设:submitReq.setLinkedID(deliverReq.getLinkedID()) ;*/
submitReq.setMessageClass("MM的类别"); /*可选*/
submitReq.setTimeStamp("提交MM的日期和时间"); /*格式如2004-02-09T10:21:07,
可选*/
submitReq.setExpiryDate("指定超时时间"); /*可选*/
submitReq.setEarliestDeliveryTime("最早理想时间"); /*可选*/
submitReq.setDeliveryReport("发送报告的请求"); /* boolean值,可选*/
submitReq.setReadReply("需要读取报告的请求"); /*可选*/
submitReq.setReplyCharging("应答计费的请求"); /*boolean值,可选*/
submitReq.setReplyDeadline("提交应答的最迟时间"); /*可选*/
submitReq.setReplyChargingSize("应答MM的最大大小"); /*可选*/
submitReq.setPriority("消息的优先级"); /* 0=最低优先级,1=正常,2=紧急,byte类型的值,可选,若想从MM7DeliverReq中获得,则应按下面的方式设:
submitReq.setPriority(deliverReq.getPriority());*/
submitReq.setSubject("多媒体消息的标题"); /*可选,若想从MM7DeliverReq中获得,则
应按下面的方式设:SubmitReq.setSubject(deliverReq.getSubject());*/
submitReq.setAllowAdaptations("VASP是否允许修改内容"); // boolean值,默认为真,可选
submitReq.setChargedParty("VASP所提交MM的付费方"); /*可选*/
submitReq.setChargedPartyID("chargedPartyID"); /*
必备*/
submitReq.setDistributionIndicator("是否可重新分发"); /*boolean值,true为可以,false为不
可以,可选*/
//开始创建多媒体消息的内容
/*每个消息内容体就是一个MMContent实例,可以添加多个消息内容体,但是所有消息内容体大小之和不能超过MMSC允许大小(目前最大支持128K)。*/
MMContent content = new MMContent();
content.setContentType(MMConstants.ContentType.MULTIPART_RELATED);
/**添加类型为Gif的附件一 */
MMContent sub1 = MMContent.createFromFile("f://yellow.gif");
sub1.setContentID("1.gif");
//可以不设
sub1.setContentType(MMConstants.ContentType.GIF); /*可以不设,但这个不设的话,
ContentID必须设*/
content.addSubContent(sub1);
/**添加类型为Txt的附件二*/
MMContent sub2 = MMContent.createFromString("This is a Test2!");
sub2.setContentID("2.txt");
sub2.setContentType(MMConstants.ContentType. TEXT);
content.addSubContent(sub2);
/**将附件进行设置*/
submitReq.setContent("多媒体消息的内容"); /*可选,也可以从MM7DeliverReq中获得多
媒体消息的内容,submitReq.setContent(deliverReq.getContent());*/
/*发送MM7SubmitReq消息,正确返回MM7SubmitRes消息,错误返回MM7RSError消息,
其它消息与此类似*/
MM7RSRes res = mm7Sender.send(submitReq);
/*可以根据StatusCode来判断本次发送是否成功,若成功能得到MessageID等信息。
StatusCode可能得到的值,具体可见本文中的请求状态码说明。*/
if(res instanceof MM7SubmitRes)
{
MM7SubmitRes submitRes = (MM7SubmitRes)res;
System.out.println(“StatusCode=”+ submitRes.getStatusCode());
System.out.println(“StatusText=”+ submitRes.getStatusText());
System.out.println(“MessageID=”+ submitRes .getMessageID());
}
}
public MM7VASPRes doDeliver(MM7DeliverReq request)
{
/*接收从
MMSC发过来的传送消息,以便取出其中的部分值构造提交消息或得到一些有用
信息,如MMSC的标识符等
*/
deliverReq = request;
System.out.println(“收到手机
”+request.getSender()
+“提交的消息,标题为:
”+request.getSubject());
System.out.println("MMSC的标识符为:"+request. GetMMSRelayServerID()) ;
//SP需要进行一些处理,例如构建MM7DeliverRes消息,设置ServiceCode或StatusCode
MM7DeliverRes mm7DeliverRes = new MM7DeliverRes();
mm7DeliverRes.setServiceCode("服务代码"); //可选
mm7DeliverRes.setStatusCode(MMConstants.RequestStatus.SUCCESS); /*
必备,以便表明
SP已经接收到传送消息。成功可设1000。*/
mm7DeliverRes.setStatusText("所用状态文本说明"); /*可选*/
//返回给MM7 API,以便API将MM7DeliverRes返回给MMSC。
return(MM7VASPRes)mm7DeliverRes;
}
}
4.4 VASP接收状态报告(上行业务)
当VASP在发送MM7SubmitReq给MMSC时设置需要发送状态报告的请求为true时,MMSC在收到MM7SubmitReq后,会发送状态报告给VASP,此时VASP可以进行接收。接收方式和接收传送消息一样,也有两种方式:
4.4.1方式1:普通应用程序中的用法
public class MyReceiver extends MM7Receiver
{
public MM7DeliveryReportReq deliveryReportReq;
//Main方法
public static void main(String[]args)
{
//初始化VASP
MM7Config mm7Config = new MM7Config(“./config/mm7Config.xml”);
//设置ConnConfig.xml文件的路径
mm7Config.setConnConfigName(“../config/ConnConfig.xml”); //
必备
//构造MyReceiver
MyReciever receiver = new MyReceiver();
receiver.setConfig(mm7Config); //
必备
//启动接收器
receiver.start();
for(;;);
}
public MM7VASPRes doDeliveryReport(MM7DeliveryReportReq request)
{
/*接收从
MMSC发过来的状态报告,以便得到一些有用信息,如MMSC的标识符等
*/
deliveryReportReq = request;
System.out.println(“收到发送方
”+request.getSender()
+“提交的消息,其
MessageID为:”+request.getMessageID());
System.out.println("MMSC的标识符为:"+request. getMMSRelayServerID()) ;
//SP需要进行一些处理,例如构建MM7DeliveryReportRes消息,返回给
MM7 API
MM7DeliveryReportRes mm7DeliveryReportRes = new MM7DeliveryReportRes ();
mm7DeliveryReportRes.setStatusCode(MMConstants.RequestStatus.SUCCESS) ;/*设置请
求完成状态,
必备,以便表明SP已经接收到状态报告。一般设
1000。*/
mm7DeliveryReportRes.setStatusText("所用状态文本说明
"); /*设置所用状态的文本说
明,应限定请求状态,可选
*/
//返回给
MM7 API,以便API将MM7DeliveryReportRes返回给
MMSC。
return(MM7VASPRes) mm7DeliveryReportRes;
}
}
4.4.2方式2:Web应用程序中的用法
public class MyReceiver extends MM7RecieveServlet
{
public MM7VASPRes doDelivery(MM7DeliveryReportReq request)
{
/*接收从
MMSC发过来的状态报告,以便得到一些有用信息,如MMSC的标识符等
*/
deliveryReportReq = request;
System.out.println(“收到发送方
”+request.getSender()
+“提交的消息,其
MessageID为:”+request.getMessageID());
System.out.println("MMSC的标识符为:"+request. getMMSRelayServerID()) ;
//SP需要进行一些处理,例如构建MM7DeliverReportRes消息,返回给
MM7 API
MM7DeliveryReportRes mm7DeliveryReportRes = new MM7DeliveryReportRes ();
mm7DeliveryreportRes.setStatusCode(MMConstants.RequestStatus.SUCCESS) ;/*设置请求
完成状态,
必备,以便表明SP已经接收到状态报告。一般设
1000。*/
mm7DeliveryReportRes.setStatusText("所用状态文本说明
"); /*设置所用状态的文本说
明,应限定请求状态,可选
*/
//返回给
MM7 API,以便API将MM7DeliveryReportRes返回给
MMSC。
return(MM7VASPRes) mm7DeliveryReportRes;
}
}
4.5 VASP接收读后回复报告(上行业务)
当VASP在发送MM7SubmitReq给MMSC时设置需要读后回复报告的请求为true时,MMSC在收到MM7SubmitReq后,会发送读后回复报告给VASP,此时VASP可以进行接收。接收方式和接收传送消息以及状态报告一样,也有两种方式:
4.5.1方式1:普通应用程序中的用法
public class MyReceiver extends MM7Receiver
{
public MM7ReadReplyReq readReplyReq;
//Main方法
public static void main(String[]args)
{
//初始化VASP
MM7Config mm7Config = new MM7Config(“./conf/vasp.xml”);
//设置ConnConfig.xml文件的路径
mm7Config.setConnConfigName(“./config/ConnConfig.xml”); //
必备
//构造MyReceiver
MyReciever receiver = new MyReceiver();
receiver.setConfig(mm7Config); //
必备
//启动接收器
receiver.start();
for(;;);
}
public MM7VASPRes doReadReply(MM7ReadReplyReq request)
{
/*接收从
MMSC发过来的读后回复报告,以便得到一些有用信息,如MMSC的标识符等
*/
readReplyReq = request;
System.out.println(“收到手机
”+request.getSender()
+“的已读消息,其
MessageID为:”+request.getMessageID());
System.out.println("MMSC的标识符为:"+request. getMMSRelayServerID()) ;
//SP需要进行一些处理,例如构建MM7ReadReplyRes消息,返回给
MM7 API
MM7ReadReplyRes readReplyRes = new MM7ReadReplyRes ();
readReplyRes.setStatusCode(MMConstants.RequestStatus.SUCCESS) ;/*设置请求完成状
态,
必备,以便表明SP已经接收到读后回复报告。成功设
1000。*/
readReplyRes.setStatusText("所用状态文本说明
"); /*设置所用状态的文本说明,应限
定请求状态,可选
*/
//返回给
MM7 API,以便API将MM7ReadReplyRes返回给
MMSC。
return(MM7VASPRes) readReplyRes;
}
}
4.5.2方式2:Web应用程序中的用法
public class MyReceiver extends MM7RecieveServlet
{
public MM7VASPRes doReadReply (MM7ReadReplyReq request)
{
/*接收从
MMSC发过来的读后回复报告,以便得到一些有用信息,如MMSC的标识符等
*/
readReplyReq = request;
System.out.println(“收到手机
”+request.getSender()
+“的已读消息,其
MessageID为:”+request.getMessageID());
System.out.println("MMSC的标识符为:"+request. getMMSRelayServerID()) ;
//SP需要进行一些处理,例如构建MM7ReadReplyRes消息,返回给
MM7 API
MM7ReadReplyRes readReplyRes = new MM7ReadReplyRes ();
readReplyRes.setStatusCode(MMConstants.RequestStatus.SUCCESS) ;/*设置请求完成状
态,
必备,以便表明SP已经接收到读后回复报告。成功设
1000。*/
readReplyRes.setStatusText("所用状态文本说明
"); /*设置所用状态的文本说明,应限
定请求状态,可选
*/
//返回给
MM7 API,以便API将MM7ReadReplyRes返回给
MMSC。
return(MM7VASPRes) readReplyRes;
}
}
4.6 发送取消消息(下行业务)
当VASP发送MM7SubmitReq消息给MMSC成功后,VASP可以发送取消消息,以取消之前所发送给MMSC的消息。具体构建取消消息见4.2.2.2。
package com.cmcc.mm7.vasp.conf;
import com.cmcc.mm7.vasp.message.*;
import com.cmcc.mm7.vasp.service.MM7Sender;
import com.cmcc.mm7.vasp.common.*;
import java.io.*;
public class VaspSendTest {
public static void main(String[] args) {
MM7Config mm7Config = new MM7Config("../config/mm7Config.xml");
//设置ConnConfig.xml文件的路径
mm7Config.setConnConfigName(“../config/ConnConfig.xml”);
MM7Sender mm7Sender = new MM7Sender(mm7Config);
MM7CancelReq cancelReq = new MM7CancelReq();
cancel.setTransactionID("关联标识");
//从MM7SubmitRes中获得MessageID
cancelReq.setMesageID(“待取消的消息的标识符”);
MM7RSRes res = mm7Sender.send(cancelReq);
System.out.println("res.statuscode=" + res.getStatusCode() +
";res.statusText=" + res.getStatusText());
}
}
4.7 发送替换消息(下行业务)
当VASP发送MM7SubmitReq消息给MMSC成功后,VASP可以发送替换消息,以替换之前所发送给MMSC的消息。具体构建替换消息见4.2.2.3。
package com.cmcc.mm7.vasp.conf;
import com.cmcc.mm7.vasp.message.*;
import com.cmcc.mm7.vasp.service.MM7Sender;
import com.cmcc.mm7.vasp.common.*;
import java.io.*;
public class VaspSendTest {
public static void main(String[] args) {
MM7Config mm7Config = new MM7Config("./config/mm7Config.xml");
//设置ConnConfig.xml文件的路径
mm7Config.setConnConfigName(“./config/ConnConfig.xml”);
MM7Sender mm7Sender = new MM7Sender(mm7Config);
MM7ReplaceReq replace = new MM7ReplaceReq();
replace.setTransactionID("关联标识");
//从MM7SubmitRes中获得MessageID
replace.setMessageID("被当前消息所替换的消息的标识符");
//创建消息内容体
MMContent content = new MMContent();
content.setContentType(MMConstants.ContentType.MULTIPART_MIXED);
MMContent sub1 = MMContent.createFromString("This is a test11");
sub1.setContentID("1.txt");
content.addSubContent(sub1);
MMContent sub2 = MMContent.createFromString("This is a Test22");
sub2.setContentID("2.txt");
content.addSubContent(sub2);
replace.setContent(content);
MM7RSRes res = mm7Sender.send(replace);
System.out.println("res.statuscode=" + res.getStatusCode() +
";res.statusText=" + res.getStatusText());
}
}
5.开发过程中需用的一些Status解释
5.1 关于StatusCode和StatusText的解释
当VASP收到MMSC发送过来的DeliverReq、DeliverReportReq、ReadReplyReq时,可以经过判断后,返回给MMSC一个状态码和状态描述,可以返回的StatusCode和StatusText分别如下,同样当VASP收到MMSC返回的SubmitRes、CancelRes、ReplaceRes、RSErrorRes时,可能得到的StatusCode和StatusText分别如下:
1000 :
成功;
1001 :
部分成功;
2000 :
客户机错误;
2001 :
操作受限;
2002 :
地址错误;
2003 :
找不到地址;
2004 :
多媒体内容被拒绝;
2005 :
找不到消息ID;
2006 :
找不到链接ID;
2007 :
消息格式破坏;
3000 :
服务器错误;
3001 :
不可接受;
3002 :
消息被拒绝;
3003 :
不支持多个地址;
4000 :
一般服务错误;
4001 :
标识不正确;
4002 :
版本不支持;
4003 :
操作不支持;
4004 :
验证错误;
4005 :
服务错误;
4006 :
无法提供服务;
4007 :
服务被拒绝;
5.2关于VASP收到DeliveryReportreq中MMStatus的解释
VASP收到DeliveryReportReq消息后,其中有个MMStatus字段值,是个byte型,因此说明一下具体数字所表示的含义:
0
:过期;
1
:接收;
2
:系统拒绝;
3
:用户拒绝;
4
:未知;
5
:转发;
5.3 关于VASP收到ReadReplyReq中ReadStatus的解释
VASP收到ReadReplyReq消息后,其中有个ReadStatus字段值,是个byte型,因此说明一下具体数字所表示的含义:
0
:已读取;
1
:未读被删;
2
:未知;
6.获取MM7 API版本信息的方法
VASP要想获得自己当前使用的API的版本号,首先在环境变量中设置mm7api.jar包存放的路径,然后点击开始菜单的运行,输入cmd进入Dos 窗口,敲命令:
E:/> java com.cmcc.mm7.vasp.common.RetriveApiVersion 回车
可以看到打印信息如下:
当前使用的MM7 API
的版本为:V1.5.1_20040512
7. MM7 API返回StatusCode说明
-100
:系统错误;
-101
:超时发送失败;
-102
:接收失败;
-103
:没有返回正确的消息;
-104
:Socket
不通;
-105
:待发送的消息为空;
-106
:发送消息不正确;
-107
:接收消息为空;
-108
:Bad Request
;
-109
:XML
解析错误;
-110
:Server Could not fulfill the request
-113
:消息内容的尺寸超出允许发送的大小