基于WSP/WTP的MMS传输(5)——WSP 协议的实现
WSP协议位于WTP协议层之上,它没有保证数据正确传送的机制(这个部分是由WTP实现的),在WSP层提供会话管理功能,即连接——交互——断开连接这样的流程,WSP协议与HTTP协议实现上有对应的关系,如果熟悉HTTP,则WSP很容易理解。
WSP提供两种事务交互模式,无连接模式和有连接模式。无连接模式用于不可靠的信息交互服务,这和WTP的Class0模式比较相像,它不需要对方的回应,比如说彩信的PUSH通知就使用的这种模型。有连接模式提供可靠的数据传送服务,服务请求方发出一个请求,响应方需要给出一个响应以表示请求的结果,彩信应用的就是这种模式。所有应用层的的服务请求都是通过WSP相应的方法(Method)来实现的,服务数据作为WSP PDU的Data域,一个WSP PDU的结构如图18所示:
图18 WSP PDU结构
TID是事务ID,在无连接模式下,该域必须出现;在有连接的模式下,该域不能出现。WSP的功能分为会话管理能力和方法请求功能,Type指出请求的类型,要么是会话管理的子类型要么是方法请求功能的相应的方法类型。Type-Specific Contents包括的有各PDU类型指定的域和应用层的数据,我们这里的数据就是MMS PDU了。下面仅仅介绍几种与彩信传输相关的PDU 类型及其结构。
Connect
Connect 类型的PDU用于会话开始之前与WAP网关建立连接,同时完成双方的能力协商,即后面会话的一些参数设定。Connect域的结构如表14所示:
表14 Connect域结构
Version 版本号,占用8bit,其编码格式是这样的:高4位放主版本号,低4位放次版本号。WAP-230-WSP-20010705-a.pdf所指的版本号是1.0,编码为0001 0000,即0x10。接着后面的是能力值长度,即Capabilities域的长度,以byte为单位,使用的是大字节序(即高字节放在低地址,低字节放在高地址),这个域的类型是uintvar,前面详细的解释过。
再接在后面的是HeadersLen,指示Headers域占用的字节数,它也是uintvar类型,和上面的编码规则一样。在MMS的传输中,所有WSP PDU中的Header域都可以省略不填,即HeadersLen可设为0。后面紧跟的是Capabilities域,其结构如表15所示:
表15 Capabilities域结构
开始是长度,是Identifier域和Parameters域长度的总和,uintvar类型,实际中占用1个字节就够了,然后是Identifier,Capability共有10中Identifier,它们的名称、编码值和默认值如下表所示:
表16 Capabilitity Identitier域名称及其编码
Name |
Encode Value |
Default Setting |
Client SDU Size |
0x00 |
1400 bytes |
Server SDU size |
0x01 |
1400 bytes |
Protocol Options |
0x02 |
0x00 |
Method MOR |
0x03 |
0 |
Push MOR |
0x04 |
0 |
Extended Methods |
0x05 |
None |
Header Code Pages |
0x06 |
None |
Aliases |
0x07 |
None |
Client Message Size |
0x08 |
1400 bytes |
Server Message Size |
0x09 |
1400 bytes |
实际的WSP PDU 的Encode Value值最高位需要置1。这里和彩信传输相关的有Client SDU Size和Server SDU size两个域,分别用来指定客户端可以接收的最大WSP PDU包的长度和客户端将要发送的最大WSP PDU长度。注意:由于彩信的最大可以有50k,为了一次把彩信数据传送完,这两个值都需设定大于50k。对于其它域的含义和设定值可以参考WSP协议的8.3节。最后面的是Header域,可以不填。
看起来一个完整的Connect PDU如下:
01 10 0b 00 05 80 81 83 e0 00 04 81 86 a0 00
01 //指示是Connect PDU
10 //版本号1.0
0b //CapaliLen 11字节
00 //HeadersLen 0字节
05 //该Capability 域长度为5字节
80 //设定的是Client SDU Size
81 83 e0 00 //60k大小,uintvar编码
04 //该Capability 域长度为4字节
81 //设定的是Server SDU Size
86 a0 00 //100k的uintvar编码
ConnectReply PDU
客户端给服务器发送Connect PDU后,服务端收到以后会返回一个ConnectReply PDU,结构如下:
表17 ConnectReply PDU结构
SenverSessionID 用于后面的Disconnect PDU, 其它域和Connect对应的域一样。注意一点:ConnectReply PDU里面的Capabilities的含义与Connect域里面的不一样,如果服务器接受Connect PDU里面的设定,服务器返回的ConnectReply里面是没有Capabilities的,只有在我们设定的参数服务器有改变是,才在ConnectReply PDU中存在Capabilities域指示,服务器采用的设定值。
DisConnect PDU
DisConnect PDU里面唯一的一个域是ConnectReply里面的SenverSessionID。用于客户端或服务端断开连接。这个PDU可能是客户端发出的,也可能是服务器发出的。
Get PDU
这个PDU用于向服务器请求数据,用来接收彩信,结构如下:
表18 Disconnect PDU结构
里面包含彩信所在服务器的URI地址,URILen指定URI域的长度。URI是在彩信Push通知中取得,一般是一系列的字符串。Header对于接收彩信来说可以省略。
完整的PDU像下面的样子:
0E 00 02 12 40 22 68 74 74 70 3A 2F 2F 32 31 31
2E 31 33 36 2E 32 32 31 2E 37 35 2F 61 52 63 36
78 71 59 66 35 72 72 42
0E 00 02 12 是WTP的Invoke Header部分
40 指定是GetPDU
22 后面的URI域长度是34个字节
68~42 的34个字节是http://211.136.221.75/aRc6xqYf5rr的ASCⅡ编码,彩信的URI地址
POST PDU
结构如下:
表19 POST PDU结构
这些域不多做解释,这里的Uri域不同于Get PDU里面的Uri域,彩信的传送中指的是彩信服务中心的Uri,对于移动用户来说是:http://mmsc.monternet.com,联通用户是:http://mmsc.myuni.com.cn。ContentType固定为application/vnd.wap.mms-message,Data域是MMS PDU内容。
POST PDU 的完整结构像这样子:
60 19 20 68 74 74 70 3A 2F 2F 6D 6D 73 63 2E 6D
6F 6E 74 65 72 6E 65 74 2E 63 6F 6D 61 70 70 6C
69 63 61 74 69 6F 6E 2F 76 6E 64 2E 77 61 70 2E
6D 6D 73 2D 6D 65 73 73 61 67 65 00 80 8C 98 30
………………………..
60 指定是POST PDU
19 URI长度25字节
20 Header和ContentType总长度32字节
68~6D Uri:http://mmsc.monternet.com 的ASCⅡ编码
61~00 ContentType:application/vnd.wap.mms-message的ASCⅡ编码 00为字串结束符
80 8C 98 30 ……是我们熟悉的MMS PDU内容
Reply PDU
这个是我们用POST方法发送彩信或者用GET方法接收彩信时,服务器给我们应答的WSP PDU,结构如表20:
表20 Reply PDU结构
Status指定请求是否执行成功,和HTTP里面的状态码有一一对应关系,如果执行成功则是0x20,否则是其它的状态码,指定出错的类型,其编码可参考WSP说明文档中附录A的Table36.,如果GET方法执行成功的话,Data域是MMS PDU。
完整的Reply看起来像下面的样子:
13 80 02 04 20 33 61 70 70 6c 69 63 61 74 69 6f
6e 2f 76 6e 64 2e 77 61 70 2e 6d 6d 73 2d 6d 65
73 73 61 67 65 00 a6 52 65 73 69 6e 2f 33 2e 30
2e 37 00 92 04 49 a2 79 95 8c 84 98 30 ………
13 80 02 WTP Result PDU Header部分
04 表示该PDU是Reply PDU
20 状态码,请求成功响应
33 ContentType和Header的总长度
a6 0x26的最高位置1,指明是Header的Server域
52~00 Server域值:Resin/3.0.7
92 Header的Data域
04 Data域值的长度
49 a2 79 95 Data域的值,是从1970年1月1号0点0分0秒到现在的秒数
8c 84 98 30 我们熟悉的MMS Header 后面就是整个的MMS PDU数据。
整个WSP/WTP协议就介绍到这里,如果要了解更多的细节,可以参考WAP-230-WSP-20010705-a.pdf和WAP-224-WTP-20010710-a.pdf,这两个文档可以从官方免费下载。
图19所示的是一个完整的MMS传输过程中的MM相关PDU。其中MMBOX是位于MMS中心服务器上的一块空间,类似于一个“邮箱”,功能及操作和电子邮件的IMAP相近。对于MMBOX的支持是可选的,MMBOX用于存储MM。
图 19 相对比较完整的MMS传输的过程
由上图可看出MMS传输MM相关的PDU的整个过程为:
1) MMS客户端发送MM时,MM被封装在称为M-Send.req PDU中,信息以WAP WSP/WTP的协议进行编码,通过无线网络传送到WAP网关,并被转送给MMS Proxy Reply;
2) MMS客户端通过M-Send.conf PDU接收MMS Proxy Reply返回的信息;
3) MMS Proxy Reply通过M-Notification.ind PDU通知MMS客户端有新MM到达,MMS通知是以SMS的方式发送的,通知是以WSP协议进行的编码,这个通知里面包含了多媒体信息在彩信服务中心(MMSC)的地址。在没有确认被叫用户已经接受了信息之前,该信息始终保存在短信存储器中。运营商可以通过软件设定保存的时间长度。MMS客户端通过M-NotifyResp.ind PDU进行回应;
4) MMS客户端从MMS Proxy Reply请求下载MM的操作基于标准的WSP/HTTP GET方法,采用WSP GET.req PDU,MMS Proxy Reply回应下载请求的PDU类型为M-Retrive.conf PDU;
5) MMS客户端可以向MMS Proxy Reply请求M-Forward.req PDU转发位于服务器上的MM,并获取MMS Proxy Reply回应信息M-Forward.conf PDU;
6)当MMS客户端发送或转发的MM被接收方成功接收后,如果发送方请求传达报告、接收方允许该操作,则MMS Proxy Reply会向发送方发送传达报告M-Delivery.ind PDU,指示mm传送状态信息,不需要客户端进行回应或确认;
7)当发送方要求已读报告、接收方允许己读报告时,MMS客户端产生M-read-rec.ind PDU发送给接收方的分发代理,由其转发给原始发送方的分发代理,后者接收到M-read-rec.ind PDU后,产生一个M-read-orig.ind PDU并将其发送到MMS客户端来传送已读报告;
8) MMS客户端通过M-Mbox-Store.req PDU和M-Mbox-Store.conf PDU将新到MM存储到MMBOX,或更新已在MMBOX中的MM的状态和标记;通过M-Mbox-View.req PDU向MMS Proxy Reply请求位于MMBOX中的一个或多个MM的信息用于浏览,也可以获取指定的MM的内容;通过M-Mbox-Upload.req PDU将本地的MM上传存储到MMBOX中;通过M-Mbox-Delete.req PDU请求MMS Proxy Reply删除位于MMBOX中的MM. MMBOX中的MM均有MM标记属性,其由客户端进行维护,主要用于客户端检索、过滤MM之用,这些功能支持是可选的。
下面是MMS客户终端系统需要处理的20种MMS PDU:
1.客户端将MM发送给MMS Proxy Reply (M-Send.req )
2.MMS Proxy Reply中继发送给客户端(M-Send.conf )
3.从MMS Proxy Reply取回消息(WSP/HTTP GET.req )
4.接收MM回复,MMS Proxy Reply发送至客户端(M-Retrieve.conf )
5.新MM到达通知,MMS Proxy Reply发送至客户端(M-Notification.ind )
6.MM通知回复,客户端发送至MMS Proxy Reply (M-NotifyResp.ind )
7.己发送消息的发送报告(M-Delivery.ind )
8.应答发送的消息(M-Acknowledge.ind )
9.已发送消息的阅读报告(M-Read-Rec.ind, M-Read-Orig.ind)
10.转发消息(MMS客户端发送一个请求让MMS Proxy Reply转发消息 M-Forward.req和M-Forward. conf )
11.存储或更新消息(M-Mbox-Store.req, M-Mbox-Store.conf)
12.浏览下载消息(M-Mbox-View.req, M-Mbox-View.conf)
13.MMBOX上传操作(M-Mbox-Upload.req, M-Mbox-Upload.conf)
14.MMBOX删除操作(M-Mbox-Delete.req, M-Mbox-Delete.conf)
MMS服务的实现是通过MMS客户端和MMS Proxy Reply之间相互唤起和响应来传递信息的,这些传输流包括MM信息和相应的响应状态信息等。而这些MM信息被封装在相关的PDU中进行传输。这里再强调一下,实际的数据发送与接收是在客户端与WAP网关之间。MMS客户端和MMS Proxy Reply通过WAP网关传递信息。WAP 1.x网关上,每种MMS PDU有对应的WSP协议实现,MMS与WSP的对应关系可参见OMA-MMS-CTR-V1_2-20031215-C.pdf的第8节Binding to Transport Protocols,里面有详细的说明。
转载请注明出处
基于WSP/WTP的MMS传输(5)——WSP 协议的实现相关推荐
- 基于WSP/WTP的MMS传输(4)——WSP 协议的实现
WSP协议位于WTP协议层之上,它没有保证数据正确传送的机制(这个部分是由WTP实现的),在WSP层提供会话管理功能,即连接--交互--断开连接这样的流程,WSP协议与HTTP协议实现上有对应的关系, ...
- 基于WSP/WTP的MMS传输(6)——WSP 协议的实现
WSP协议位于WTP协议层之上,它没有保证数据正确传送的机制(这个部分是由WTP实现的),在WSP层提供会话管理功能,即连接--交互--断开连接这样的流程,WSP协议与HTTP协议实现上有对应的关系, ...
- Java Socket编程 - 基于TCP方式的二进制文件传输【转】http://blog.csdn.net/jia20003/article/details/8248221...
此人博客挺好的,推荐一个! 一个基于Java Socket协议之上文件传输的完整示例,基于TCP通信完成. 除了基于TCP的二进制文件传输,还演示了JAVA Swing的一些编程技巧,Demo程序 实 ...
- Java Socket编程 - 基于TCP方式的二进制文件传输
一个基于Java Socket协议之上文件传输的完整示例,基于TCP通信完成. 除了基于TCP的二进制文件传输,还演示了JAVA Swing的一些编程技巧,Demo程序 实现主要功能有以下几点: 1. ...
- 基于内容的自适应视频传输算法及其应用
本文内容来自LiveVideoStack线上分享第四季第二期,由湖北经济学院副教授,胡胜红博士为大家介绍如何基于内容分析技术,从用户需求角度标注视频流重要性级别,构建自适应流传输策略,实现语义级QoE ...
- 基于matlab的2ask频带传输系统仿真与性能分析,基于MATLAB的2ASK频带传输系统仿真与性能分析汇总...
基于MATLAB的ASK频带传输统仿真与性能 分析 学生姓名:xxx 指导老师:xx 摘要本课程设计主要运用MATLAB集成环境下的Simulink仿真平台进行ASK频带传输系统仿真,并把运行仿真结果 ...
- 模拟QQ软件的基于多线程的流媒体加密传输软件技术
模拟QQ软件的基于多线程的流媒体加密传输软件技术 模拟QQ软件,基于多线程编程捕捉摄像头及麦克风实时数据,基于socket通信设计发送端.接收端两个部分的,对音频和视频进行采集.加密或加水印.传输.解 ...
- 无线电能传输 wpt 磁耦合谐振 过零检测 基于二极管整流的无线电能传输设计 基于同步整流的无线电能传输设计
无线电能传输 wpt 磁耦合谐振 过零检测 matlab simulink仿真 pwm MOSFET,过零检测模块 基于二极管整流的无线电能传输设计 基于同步整流的无线电能传输设计(含过零比较) 两个 ...
- 无线电能传输 wpt 磁耦合谐振 过零检测 matlab simulink仿真 pwm MOSFET,过零检测模块 基于二极管整流的无线电能传输设计
无线电能传输 wpt 磁耦合谐振 过零检测 matlab simulink仿真 pwm MOSFET,过零检测模块 基于二极管整流的无线电能传输设计 基于同步整流的无线电能传输设计(含过零比较) 两个 ...
最新文章
- Ubuntu的防火墙配置-ufw-iptables(端口的开关)
- openssl 非对称加密 RSA 加密解密以及签名验证签名
- 007-SDK框架之LYWSDKInterfaceProtocol.cpp
- c++提供的可有效分配对象空间的运算符是_Python 为什么不支持 i++ 自增语法,不提供 ++ 操作符?
- MySQL MyISAM和InnoDB存储引擎的比较
- lr_start_timer,lr_get_transaction_duration,lr_get_transaction_wasted_time函数使用总结
- C++设计模式-建造者模式
- 【吐槽】VS2012的安装项目只能用InstallShield Limited Edition
- 9 10次c语言上机作业答案,第十五次上机作业带答案
- 两大方案,只为写出更安全的代码!
- web前端设计与开发作品:旅游酒店网站设计——中国风的温泉酒店预订网站全套html模板(13页) HTML+CSS+JavaScript
- 【原生JS小实例】加减乘除取余计算器
- C++:建立一个被称为sroot()的函数,返回其参数的二次方根。重载sroot()3次,让它返回整数、长整数与双精度的二次方根
- avcap 跨平台摄像头视频捕捉
- 吉首大学校赛 A	SARS病毒 (欧拉降幂)
- 相控阵雷达防治野猪引热议!仅重15kg,可同时监控100个目标,网友:已经这么白菜化了?...
- tar命令下的--exclude
- 【开源编码分享】Python古三式∶太乙神数丶奇门遁甲丶大六壬
- 2021-10-25win10如何禁用自带的键盘和鼠标
- 解决Mygui不支持中文路径
热门文章
- OSChina 周五乱弹 ——麒麟臂极限在哪里
- 一根网线如何接两个水晶头
- 基于Java的中国象棋游戏的设计与实现
- 让整个网站网页变灰的方法
- 你不知道的Python位运算符
- 功能:删除字符串 中的数字字符。 例如:输入字符串:48CTYP9E6,则输出: CTYPE。 林宇 #includestdio.h 22001 #include(6) //包含相应函数库 v...
- 民生银行核心分布式改造实践分享
- 银行数字化转型导师坚鹏:数字化时代普惠金融模式和产品创新
- 计算个人所得税.应交纳税费=应纳税所得金额*适用税率-速算扣除数.应纳税所得金额=个人收入-3500
- 用Windows电脑看epub小说,阅读器软件怎么选