分享

请问 彩信push消息是一个怎么样的信令流程呢

 红黑单 2012-03-15


  本文记录了彩信的发送流程的一些细节及其所需要使用到的参考规范。

(1) 彩信的发送流程

1)首先,当彩信中心需要向手机发送彩信时,会将彩信内容保存到自己的存储器中,并且准备一个URI,通过这个URI,手机能够读取到存储器中的彩信的内容;

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./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./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.ua0x04表示mms.ua,这个值在http://www./wina/push-app-id.htmhttp://www./Tech/omna/omna-push-app-id.aspx中都有定义,而在WAP MMS Encapsulation Protocol中也指示,Application-Id必须填。)

3) Push-Flag -- 这个头域是可选的,不是必须填的,如果要填应该填(0x07,实际写入0x87)。
Push-Flag的值的定义在另一个规范(
WAP Push OTA Protocol)中有相关的描述:
6.4.1.3. Push Flag
Push-Flag = "Push-Flag" ":" 1*7BIT
; bit mask flags to indicate the following:
; 1: initiator URI is authenticated.
; 10: content is trusted.
; 100: last push message.
; other: reserved for future use.


·   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-ind0x82);
  -- 这表示这是彩信通知消息,手机收到此消息表示彩信中心有该手机的彩信,手机应该去获取此彩信
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-conf0x84)。

(3)
相关信息

普通WAP Push的content type:

0x2e -- application/vnd.wap.sic


彩信通知的content type:

0x3e -- application/vnd.wap.mms-message

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多