本文记录了cmpp,sgip,smgp协议 如何开发视频短信,彩信的流程。
一、例子解析:
0605040B8423F0C506246170706C69636174696F6E2F766E642E7761702E6D6D732D6D65737361676500B487AF848C8298485247314A545365592B5343008D9083687474703A2F2F3231312E3133362E3131322E38342F485247314A545365592B534300880481020DFB891A802B383631353830303438333434372F545950453D504C4D4E008A808E01DB
TP-UD 7位
06 --UDHL(user header length)
05 --端口地址
04 --长度
0B84 --客户端端口
23F0 --服务器端口
WSPPDU
C5 --id
06 --Push
24 --长度
6170706C69636174696F6E2F766E642E7761702E6D6D732D6D65737361676500 --application/vnd.wap.mms-message
B487 –
AF84 --X-Wap-Application-Id: 84
MMS_Header
8C82 --X-Mms-Message-Type: m-notification-ind 编码为 8C,表示彩信, 84 表示是收到的 如果是发出的是80
98485247314A545365592B5343 00 --tansatcionId 唯一标识该彩信,很长的一串数字
8D90 --X-Mms-MMS-Version
83 --url
687474703A2F2F3231312E3133362E3131322E38342F485247314A545365592B5343
00
88–过期时间
04–长度
81 --开始
02–时间长度
0DFB–秒 0DFB 16进制 过期时长
89 --终端显示的发送号码
1A --长度
80 --开始
2B38363135383030343833343437 --号码
2F545950453D504C4D4E --/TYPE=PLMN
00 --结束
8A80 --Msg-Class: Info 表示MMS_CLASS 为’Personal’
8E01DB --实际长度值
二、流程介绍
(1) 彩信的发送流程
1) 首先,当彩信中心需要向手机发送彩信时,会将彩信内容保存到自己的存储器中,并且准备一个URL,通过这个URL,手机能够读取到存储器中的彩信的内容;
2) 彩信中心会向手机发起一个m-notification-ind指示消息;
3) 手机收到这个指示消息后,便会向根据m-notification-ind指示消息中的URI(在Content-Location参数中指示),向彩信发服务器发起一个HTTP GET(或WSP GET,从跟踪到的消息来看,就是HTTP GET的格式)请求,来获取彩信的内容;
4) 彩信服务器会应答HTTP/WSP GET请求,返回内容,内容的格式是:application/vnd.wap.mms-message,X-Mms-Message-Type头域的值是m-retrieve-conf,以通知手机,这是彩信的内容。
(2) 消息的封装与规范
涉及到的规范可能有:
3GPP TS 23.140 Multimedia Messaging Service (MMS)
--这个规范定义了收发彩信的流程,但对具体的消息格式则没有定义;
3GPP TS 23.040 Technical realization of the Short Message Service (SMS)
--这个规范定义了短消息协议的详细的编码格式。
WAP Wireless Session Protocol Specification (WAP-230-WSP-20010705-a, Approved Version 5 July 2001)
WAP Wireless Datagram Protocol (WAP-259-WDP-20010614-a, Version 14-Jun-2001)
(--这个文档还介绍了WDP协议是如何封装在各消息中传输的,包括:GSM SMS, CDMA SMS,ANSI-136等)
WAP MMS Encapsulation Protocol (WAP-209-MMSEncapsulation-20020105-a, Version 05-Jan-2002)
各协议间的关系是:
WDP是WAP的数据报协议(就是TCP/IP中的UDP协议)--通过GSM SMS只能承载WDP消息;
WTP是WAP的事务传服协议(是有连接的,类似于TCP/IP中的TCP协议)(WTP协议在彩信收发的过程中没有使用,所以这个笔记就没有记录了);
WSP是WAP的应用基础,定义了WAP的一些基本操作,这些操作是建立在WDP和WTP之上的。如:WSP的S-Unit-Push消息映射到WDP中,其实就是一条单向的WDP消息--T-DUnitdata.req。
当这条WDP承载于GSM短信中,就是一条GSM短信;
而WAP MMS Encapsulation Protocol则定义了,MMS如何通过WAP消息来进行收发。如,之前提到的“m-notification-ind”就是WAP MMS Encapsulation规范中定义的消息类型。
信令流程各阶段的相关规范的详细描述:
a) 彩信中心向手机发起的通知指示消息(m-notification-ind),通常是通过短信下发的(也即:WAP over SMS方式)。也就是说,下发的短信,不是普通的文字短信,而是一个WAP消息,具体的说是一条S-Unit-Push消息(在WSP规范中定义)。
b) 这条m-notification-ind短信是一条怎样的短信呢?
首先,短信类型是SMS_Deliver;
TP-UDHI为1,即:数据区前面有一个Header;
TP-DCS应该为0x04,即8-bit编码,这样数据区就是140个字节,通常Header是6个字节,所以可用的数据区是134个字节。这134个字节就可以保存WDP的内容。
因为TP-UDHI为1,所以数据区(TP-UD)的前段有一个Header,所以TP-UDL字段指示的长度是Header + TP-UD长度之和。而Header的格式在3GPP TS 23.040规范中有描述,即:
由Header的长度,外加若干个“IEI(信息标识)+IEIDL(信息内容的长度)+ IED(信息数据内容)”组成。
对于WDP消息,必须包含IEI=0x05的信息。根据3GPP TS 23.040,IEI为0x05是指“Application port addressing scheme, 16 bit address”,即:信息要指示两个端口号--源端口号和目标端口号。
源端口和目标端口号将告诉手机,这条短消息应该发给哪个协议栈来处理。
对于m-notification-ind消息,源端口号必须为:9200(0x23F0) – WAP connectionless session service, 目标端口号则必须是:2948 (0x0B84) – WAP PUSH。这样的端口信息向手机指示了:这是一条WAP无连接会话消息(即基于WDP的WSP消息),发给手机的WAP PUSH应用协议栈来处理。
对于端口号的定义,可以参考iana的端口号分配表:http://www.iana.org/assignments/port-numbers
如果一段数据区保存不了所有的WDP消息,则需要两条(或更多)短信的数据区来存储,这时就需要使用长短信分块技术,这就需要用到IEI=0x00的信息数据了。但是这是普通的WAP PUSH才可能用到,彩信的notification一般不会有这么长的内容。
好了,下面说说短信数据区(TP-UD)的内容。因为根据Header的端口指示,手机已经知道这是基于WDP的WSP消息了,所以数据区就直接按WSP的规范来解码(WDP层的参数只有源地址和目标地址,而这在短信协议的Header区已经指示了,所以没有需要编码的字段了,所以数据区的一开始就是WSP的内容)。
根据WSP规范,WSP的内容每一个字节是TID。这是一个ID,在不同的消息中有不同的作用,在Push消息中,这表示Push-ID,标识一次Push请求);当然,某些消息可能没有这个ID;
第二个字节为PDU Type,用于告诉WSP协议栈,这个WSP消息是什么消息。在彩信通知消息,这个值应该是:0x06 -- Push。也就是说,这个就告诉WSP协议栈,这是S-Unit-Push消息了(因为这是在WDP中封装的,相当于是WDP层通过T-DUnitdata.ind发给WSP层的,所以WSP层知道,这是Unit消息);
第三个字节是S-Unit-Push头域的长度,后面就是S-Unit-Push消息的头域的内容了,使用二进制或ASCII的方式保存了一些头域的值,需要使用到的头域包括:
1) Content-Type -- 此值必须填“application/vnd.wap.mms-message”(代码:0x3e,在http://www.wapforum.org/wina/wsp-content-type.htm中有定义,而在“WAP MMS Encapsulation Protocol”中也指示这个值必须填“Application/vnd.wap.mms-message”)。当Content-Type填这个值时,这就表示S-Unit-Push的内容是彩信消息;
2) X-Wap-Application-Id -- 此值必须填编码0x04(实际填的值是0x84,具体要参考WSP的变长数据值保存格式),表示“mms.ua”(0x04表示mms.ua,这个值在http://www.wapforum.org/wina/push-app-id.htm和http://www.openmobilealliance.org/Tech/omna/omna-push-app-id.aspx中都有定义,而在“WAP MMS Encapsulation Protocol”中也指示,Application-Id必须填“4”。)
3) Push-Flag -- 这个头域是可选的,不是必须填的,如果要填应该填(0x07,实际写入0x87)。
S-Unit-Push头域的后面就是S-Unit-Push的内容了。而内容的格式(类型)是根据“Content-Type”来确定的。而前面已经说了,Content-Type的值是“application/vnd.wap.mms-message”,所以WSP的应用层知道这是彩信(MMS)消息,于是就根据规范“WAP MMS Encapsulation Protocol”的要求来进行解码。
“application/vnd.wap.mms-message”数据的格式是:
头域 + 内容。(某些操作可能没有“内容”,那就只有头域了。至于有头域和内容的消息,头域何时结束、内容从哪里开妈, 目前还没有详细的去研究!)
对于彩信通知消息,头域需要包含这些内容,详见规范“WAP MMS Encapsulation Protocol”中的“6.2. Multimedia Message Notification”节)。下面说说这些头域中,最重要的几个:
1) X-Mms-Message-Type: 其值必须是“m-notification-ind”(0x82);
-- 这表示这是彩信通知消息,手机收到此消息表示彩信中心有该手机的彩信,手机应该去获取此彩信
2) X-MMS-Content-Location:其值是一个URI地址,告诉手机应该到哪里去获取彩信的内容;
彩信的“m-notification-ind”消息只有头域没有内容。
当手机收到“m-notification-ind”消息后,就可以通过HTTP GET向URI所指示的彩信中心服务器,请求获取彩信内容。
而彩信中心服务器在返回HTTP GET的请求时,Content-Type也应该是“application/vnd.wap.mms-message”,并且内容中“Message Type”的值应该填“m-retrieve-conf”(0x84)。
(3) 相关信息
普通WAP Push的content type:
0x2e – application/vnd.wap.sic
彩信通知的content type:
0x3e – application/vnd.wap.mms-message
学习更深层次技术请关注: