MMS实现详细分析

MMS实现的流程分析

转载注明源地址:

http://hi.baidu.com/luv%5Fresplendent/blog/item/2b49fab536468ccb37d3ca41.html
      基于MMS的终端系统中,MMS实现的步骤如下:
      (1)串口初始化和设置模块参数;
      (2)经过处理模块处理过的数据流在控制模块控制下,按照MMS协议封装格式进行MMS信息封装;
      (3)无线模块与GPRS的WAP网关进行连接,向串口发出拨号连接的AT命令,建立发送数据的PPP链路;
      (4)控制模块向串口发送经过发送协议封装的MMS信息;
      (5)将封装好的 MMS信息通过无线模块发送到GPRS的WAP网关,再发送到多媒体信息服务中心MMSC上;
      (6)由MMSC转发MMS到指定号码的用户手机上,实现个人实时化掌握监视环境的图像信息。
    整个系统发送MMS时,由控制模块向无线模块发送AT指令,无线网络连接上
GPRS网络后,再利用无线模块通过GPRS无线网络发送MMS信息到目的用户手机上。

下面我将重点分析MMS协议封装、无线网络连接协议和MMS发送协议。

MMS协议封装格式分析:

SMS只能传输文本信息,每次最多140个字节,而MMS的传输内容要丰富的多,包括视频、图片、声音和文字等信 息。在远程监视终端系统中主要是利用MMS传输文字和图片,图片格式为压缩后的JPEG格式。实现MMS也要比SMS复杂得多,MMS有自己的消息格式, 并且为了减少传输的数据量,克服无线网络带宽窄、高延迟、稳定性差等特点,需要对传输的数据进行压缩。基本的压缩编码机制是由WAP-209- MMSEncapsulation定义的。发送和接收MMS的通信中,被传输的是MMSPDU(协议数据单元)。

下面将对MMS PDU进行分析。

MMS PDU模型
    完整的MMS信息被包含在MMS PDU之中,采用多媒体邮件扩展MIME方式打包。在基于WAP的传输方式中,MMS PDU被封装在WSP PDU之中,作为WSP的消息体传输。WSP PDU的内容类型必须被指定为application/vnd.-wap.mms-message,用以指明客户端应该进行的处理操作,它可以将多媒体部 分的内容与显示控制部分的内容封装成为一个消息体。
    MMS PDU由MMS头和消息体组成。MMS头具体的描述了PDU的特定信息,消息体是可选的。通信的大多数情况是没有消息体的,只有在M-Send.req和 M-Retrieve.conf原语中有消息体。在一个MMS中一次可填充多个消息体,消息体可以是不同类型的,由多个媒体对象组成,每个对象占据一个 part(按照RFC2387标准)。根据消息内容的组装是否有序,消息的组装方式分为:
    .application/vnd.wap.multipart.mixed方式
    所有的消息内容混合在一起,没有时间上的顺序,在终端同一时间一次就把所有的消息内容显示出来。
    .application/vnd.wap.multipart.related方式
    各消息内容之间有一定关系,该关系可能是显示的时间上的先后,显示的位置等。这样在终端显示该消息的时候,就可以以类似“小电影”的方式显示一系列消息,使得该MM的显示更加趣味化。

   在MMS PDU之中,application/vnd.wap.multipart.related含有显示控制语言" presentation ",而application/vnd.wap.multipart.mixed不含有显示控制语言。通过application /vnd.wap.multipart.related内容类型可以将多媒体部分的内容与显示控制部分" presentation”内容封装成为一个消息体。Content-Type为 application/vnd.wap.multipart.related的MMS PDU封装模型参考下图

 

application/vnd.wap.multipart.related MMS PDU封装模型

 


    当存在多媒体对象和显示控制信息时,如果在multipart/related中存在Start参数,"presentation”如果不是消息体的第一个part,则必须用start字段指出其所在位置,上
述各多媒体对象的排列顺序是无关紧要的;当不存在Start参数时,"presentation”部分应该排列在第一位的位置上;当根本不存在“presentation”部分时,如何显示则由客户端的显示策略来决定
    在MMS PDU中,
"presentation”也是MMLanguage)一个消息内容,但是终端显示消息内容
时,并不把这个消息内容显示出来,而仅是根据它获取一些消息,这些消息就决定了其
他的消息内容的显示的大小、先后顺序、位置等。而书写“presentation”这个消息内容
的语言,就是SMIL (Synchronized Multimedia Integration,SMIL是一种简单的标记性语言,内容书写格式和XML一样。消息体中最下层为媒体文件,如音频,视频,文本及图片文件。然后 “presentation”用SMIL来表示这些文件播放的次序,文件名,开始播放时间,结束时间,当然如果是图片,文本则为显示时间,已经在屏幕中显 示的具体位置。最后再用MIME来封装消息体。MMS消息的文本格式采用IETF规定的MIME结构(RFC2045-2049 ),它和OMA制定的Multimedia Messaging ServiceEncapsulation Protocol规定的二进制码格式有一一对应的关系。MIME主要是负责把所有的独立的文本、图像、声音、视频内容以及SMIL文件本身捆绑在一起,这 个规范称为MIME Encapsulation Aggregate Documents,用于告诉接受的终端这个MMS的内容是相互相关并且相互参考的。
MMS PDU分析
    下面是MMS客户终端系统需要处理的20种MMS PDU:
    ★ 客户端将MM发送给发端MMS代理中继(M-Send.req )
    ★发端MMS代理中继发送给客户端(M-Send.conf )
    .★从MMS代理中继取回消息(WSP/HTTP GET.req )
    .★接收MM回复,收端代理中继发送至客户端(M-Retrieve.conf )
    .★新MM到达通知,收端代理中继发送至客户端(M-Notification.ind )
    .★MM通知回复,客户端发送至收端代理中继(M-NotifyResp. ind )
    .★己发送消息的发送报告(M-Delivery.ind )
    .★应答发送的消息(M-Acknowledge.ind )
    .★已发送消息的阅读报告(M-Read-Rec.ind, M-Read-Orig.ind)
    .★转发消息(MMS客户端发送一个请求让MMS代理中继转发消息 M-Forward.req和M-Forward. conf )
    .★存储或更新消息(M-Mbox-Store.req, M-Mbox-Store.conf)
    .★浏览下载消息(M-Mbox-View.req, M-Mbox-View.conf)
    .★MMBOX上传操作(M-Mbox-Upload.req, M-Mbox-Upload.conf)
    .★MMBOX删除操作(M-Mbox-Delete.req, M-Mbox-Delete.conf)
    MMS服务的实现是通过MMS客户端和MMS分发代理之间相互唤起和响应来传递信息的,这些传输流包括MM信息和相应的响应状态信息等。而这些MM信息被封装在相关的PDU中进行传输。

 

图2所示的是一个完整的MMS传输过程中的MM相关PDU。其中MMBOX是位于MMS中心服务器上的一块空间,类似于一个“邮箱”,功能及操作和电子邮件的IMAP相近。对于MMBOX的支持是可选的,MMBOX用于存储MM,本次并没有实现此功能,在此只做简单介绍。

由上图可看出MMS传输MM相关的PDU的整个过程为 :
    1) MMS客户端发送MM时,MM被封装在称为M-Send.req PDU中,并被传送给MMS分发代理;
    2)通过M-Send.conf PDU接收分发代理返回的信息;
    3) MMS分发代理通过M-Notification.ind PDU通知MMS客户端有新MM到达,
MMS客户端通过M-NotifyResp.ind PDU进行回应;
    4) MMS客户端从MMS分发代理请求MM下载的操作基于标准的WSP/HTTPGET方法,本项目中采用WSP GET.req PDU,回应下载的PDU类型为M-Retrive.conf PDU;
    5) MMS客户端可以向MMS分发代理请求M-Forward.req PDU转发位于服务器上的MM,并获取回应信息M-Forward.conf PDU;
    6)当MMS客户端发送或转发的MM被接收方成功接收后,如果发送方请求传达报告、接收方允许该操作,则分发代理会向发送方发送传达报告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分发代理请求位于MMBOX中的一个或多个MM的信息用于浏览,也可以获取指定的MM的内容;通过M-Mbox-Upload.req PDU将本地的MM上传存储到MMBOX中;通过M-Mbox-Delete.req PDU请求MMS分发代理删除位于MMBOX中的MM. MMB OX中的MM均有MM标记属性,其由客户端进行维护,主要用于客户端检索、过滤MM之用,这些功能支持是可选的。
MMS PDU头域分析和头域编码
    每个MMS PDU都是由MMS头域和MMS消息体组成,MMS PDU中的头域由客户端指定,一些头域也可以被分发代理修改或补充,分发代理使用这些头域信息生成MM通知以及构造接收MM的PDU中的相关头域,连同消 息实体一同送往接收方,消息体跟在头域之后。大多数MMS PDU只含有头域,它们起到建立和维持通信的作用,消息体只用在M-Send.req和M-Retrieve.conf PDU中。
    MMS头域根据WAP-209协议和RFC2387的规定,由一系列的域组成,这些域定义了PDU的各种属性,包括PDU类型,接受方,发送方,发送时间 等,头域中的域名分为可选项和必选项。在编码MMS头域时,X-Mms-Message-Type ,X-Mms-Transaction-ID和X-Mms-MMS-Version必须位于MMS头的开始,并且按照前面所列的顺序。Content- Type必须在MMS头域的最后,其后为消息体,其它域的顺序可以随意安排。

为了便于理解,以下以发送请求(M-Send.req) PDU为例,对MMS PDU的头域和二进制编码进行了分析

 

MMS PDU的头域

转载注明源地址:

http://hi.baidu.com/luv%5Fresplendent/blog/item/bf597507bf427fc87a894754.html

具体含义见表

 

 

MMS头:
    8C—表示X-Mms-Message-Type
    80— m-send-req
      98— X-Mms-Transaction-ID
    39 36 30 34 30 35 39-Transaction-ID值:9604059
      8D— X-Mms-Version
    90— MMS Version值1.0
    2B 38 36 3133 39 30 30 30 30 30 30 30 30—具体源地址:+8613900000000
    2B 38 36 3133 35 32 31 30 36 39 35 36 34—目的地址:+8613521069564
    2F 54 59 50 45 3D 50 4C 4D 4E 00— TYPE=PLMN
    96—主题
    7465737400—主题值:test
    32 30 30 36 30 33 33 313138 33 37 00— 200603311837(2006.3.31 18:37)
    85—表示date
    88—表示X-Mms-Expiry
    44 30 FB F3— X-Mms-Expiry时间值
    84—表示:Content-Type
    MMS消息体:
    A3—表示:application/vnd.wap.multipart.mixed
    A1—表示:multipart/form-data
    9E—表示:image/jpeg(表示之后的图片数据属性为JPEG格式)
    FF D8—表示图片的开始
    ······—表示传输的JPEG图片数据(本论文对JPEG图片数据不再作分析)
    FF D9—表示图片的结束
    以上分析的就是一个典型的MMS PDU消息格式,即MMS PDU包含MMS头和MMS消息体。发送的MMS信息只有一张图片,采用JPEG编码格式;目的手机号:13521069564;主题值:test.
    由于只发送单一的图像或文本,Content-Type被设置为applicationJvnd.wap.multipart.related方式。 Content-Type后面是JPEG图像数据:image/jpeg,再不需要加入SMIL描述部分和Start参数设置,这样可以减少传输的字节数 据,优化网络传输。在实现MMS发送时,可以根据MMS的内容选择不同的Content-Type.

 

 

为了节约无线领域的带宽资源,表中分配数值即为每个域名关键字使用预定义的二进制编码,MMS PDU封装的二进制编码的基本编码机制来源于WAP/WSP,最优化在空中传播的数据量。MMS PDU生成及翻译是MMS客户机程序的重要组成部分。其它类型的PDU头域大致和发送请求(M-Send.req)的头域是类似的。


MMS PDU数据分析
    现以MMS发送过程中获取的一段MMS PDU数据流为例进行数据分析(具体的MMS发送数据流和数据流获取过程将在后面分析)。这段MMS PDU数据流是十六进制数据,进行ASCII码转换后(为了与MMS控制字符区别,部分ASCII码做了数据转意),对照前面分析的MMS PDU封装格式和头域编码,根据对解码数据的分析,这段典型的MMS PDU协议封装格式分析如下:
    获取的MMS PDU十六进制数据流:
      8C809820202039363034303539008D90891A802B383631 33 39303030
30303030302F545950453D504C4D4E00972B3836313335323130363935
36342F545950453D504C4D4E0096746573740032303036303333313138
33 37 00 85 04 44 2D 07 73 88 06 80 04 44 30 FB F3 84 A3 0101 A1 9E FF D8......(标准
的JPEG图片数据略)......FF D9
    其中对某些具体数据分析如下:

MMS头:
    8C—表示X-Mms-Message-Type
    80— m-send-req
      98— X-Mms-Transaction-ID
    39 36 30 34 30 35 39-Transaction-ID值:9604059
      8D— X-Mms-Version
    90— MMS Version值1.0
    2B 38 36 3133 39 30 30 30 30 30 30 30 30—具体源地址:+8613900000000
    2B 38 36 3133 35 32 31 30 36 39 35 36 34—目的地址:+8613521069564
    2F 54 59 50 45 3D 50 4C 4D 4E 00— TYPE=PLMN
    96—主题
    7465737400—主题值:test
    32 30 30 36 30 33 33 313138 33 37 00— 200603311837(2006.3.31 18:37)
    85—表示date
    88—表示X-Mms-Expiry
    44 30 FB F3— X-Mms-Expiry时间值
    84—表示:Content-Type
    MMS消息体:
    A3—表示:application/vnd.wap.multipart.mixed
    A1—表示:multipart/form-data
    9E—表示:image/jpeg(表示之后的图片数据属性为JPEG格式)
    FF D8—表示图片的开始
    ······—表示传输的JPEG图片数据(本论文对JPEG图片数据不再作分析)
    FF D9—表示图片的结束
    以上分析的就是一个典型的MMS PDU消息格式,即MMS PDU包含MMS头和
MMS消息体。发送的MMS信息只有一张图片,采用JPEG编码格式;目的手机号13521069564;主题值:test.
    由于本实验中只发送单一的图像或文本,Content-Type被设置为applicationJvnd.wap.multipart.related方式。
Content-Type后面是JPEG图像数据:image/jpeg,再不需要加入SMIL描述部分和Start参数设置,这样可以减少传输的字节数据,优化网络传输。在实现MMS发送时,可以根据MMS的内容选择不同的Content-Type.

 

MMS发送的无线网络连接协议分析

转载注明地址:http://hi.baidu.com/luv%5Fresplendent/blog/item/aa546efc91493987b901a0b3.html
   
MMS在进行发送前,要对无线模块进行无线网络连接,实现GPRS的拨号上网,无线网络连接成 功后,才能利用无线模块基于WAP的方式对MMS进行发送,通过移动交换网络,最终发送到终端用户手机上。本节将对无线模块的拨号上网以及建立PPP连接 链路的流程图和所用到的协议,如AT指令集、PPP连接协议以及本课题中捕获的无线网络连接的数据进行分析。
     无线网络连接的流程图分析
    本课题中,无线网络采用的是中国移动GPRS网络,无线模块选用的BENQ M22的GSM/GPRS模块。无线网络连接的步骤为:控制模块通过串口利用AT指令集向无线模块发送连接命令,无线模块进行拨号连接到中国移动GPRS 的WAP网关,获得临时分配的IP地址、DNS地址和临时端口号,拨号成功,完成无线网络的连接。利用AT命令无线模块拨号上网以及建立PPP连接的流程 图如图4.3所示。
    无线模块的无线网络连接可分为比较明显的两阶段:
    第一阶段,配置无线模块参数,进行一系列初始化,然后发送AT指令拨上中国移
动GPRS的WAP网关;
    第二阶段,同GPRS的WAP网关通过三阶段协商(即LCP连接协商、CHAP密码
认证、NCP网络层协议配置)建立PPP连接链路。
    连接成功后,无线模块就会从GPRS的WAP网关上获得一个动态IP地址,该动态
IP地址一般是10.188.xxx.xxx。接下来,无线模块就可以进行TCP/IP数据包传输,访问
GPRS网内的主机,完成无线网络的连接,发送封装好的MMS信息。

 

AT命令分析
    AT命令集是调制解调器可以识别并执行的命令,专门用于控制GSM Modem,它是由美国Hayes公司所发展的数据传输通信接口。计算机和单片机通过串行端口对Modem发出相应的AT命令,可以调整Modem各种工 作方式。AT命令简单、容易掌握,GSM07.07协议对AT指令做了详细的介绍。GSM07.07中定义的AT Command接口,提供了一种移动平台与数据终端设备之间的通用接口。GSM模块提供的命令接口符合GSM07.07规范,在短消息模块收到网络发来的 短消息时,能够通过串口发送指示消息,数据终端设备可以向GSM模块发送各种命令。AT指令在当代手机通讯中起着重要的作用,用户能够通过AT指令控制手 机的许多行为,包括进行呼叫、拨叫号码、按键控制、短信、电话本、数据业务、补充业务、传真、GPRS等方面的控制。本课题中是控制模块利用AT命令来控 制无线模块拨号连接无线网络。

    AT命令的语法是[[351:在每行命令的开头都必须有“AT”或者“at”作前缀,用输入来结束这个命令。"ATXX”及少量 “AT十XXX”为V.25标准命令集;"AT+CXXX "为GSM标准所扩展的AT命令;"AT+SXXX”为SIEMENS定义扩展的AT命令。
    发送AT指令时,应注意以下几点 :
    (1)每个AT命令字符串的最后面必须加上CR(也就是键盘上的Enter键)字符,否则无线模块将不识别此命令。这个字符就是结束符。
    (2)除了“A/”及“+++”命令外,其它的命令必须加上AT两个字符。
    (3)命令字符串可以合成一个字符串后再一次送给调制解调器,但总的字符串长度
不得超过40个字符,而且所有的字符必须一律大写或小写。
    本课题中,无线模块采用的是BENQ M22的GSM/GPRS模块,因为选用的是专业厂家生产的GPRS模块,设计中可以不再考虑GPRS附着和PDP上下文激活等复杂过程,只需用AT指令 操作专用的GPRS模块上网即可。用AT命令设置无线模块的参数时,必须先要将命令写入串口,读取串口的应答数据来判断是否成功。一般命令发送成功时,模 块会返回数据“OK",表示命令执行成功。如果没有成功,要继续发送命令,
发送3次后还是没有成功,就重新初始化串口
    对无线模块GPRS拨号上网 ,需要用到AT+CGDCONT和ATD这两条指令

    1) AT+CGDCONT=l,"IP”,“CMWAP”
    此命令用于设置GPRS接入网关,其中第二个数表示PDP (Packet Data Protocol)
类型为:IP或PPP,第三个数表示接入网关为移动梦网,APN是CMWAP,表示中国移动网应用接口。目前只有中国移动全球通卡才可以使用CMNET功能,而动感地带只能使用CMWAP功能。
    2) ATD *99***1#
    ATD用于设置拨号方式,进行拨号,并设法进入在线(on-line)状态。与传统的电话线Modem相比较,ATD指令在GPRS中有些变化,采用如下两种格式 :
   格式一 :ATD*99[*[][*[][*[]]]]#
    其中99是个服务码,也可用98的(见格式二),国内一般用99: 是w.x.y.z格式的IP V4地址;是用于TE和ME连接的Layer2协议或用于PPP协议的Layer2协议;是表明PDP上下 文的一个数字编号,用AT +CGDCONT命令创建,一般为1, 20
    格式二 :ATD*98[*]#
    含义同上。
    举例如下:
    ATD*99# //用服务码99建立一个连接
    ATD*99* 123.124.125.126*PPP* 1#//用服务码99建立一个连接
                                  HIP地址123.124.125.124, L2P=PPP
                                    //用CID 1, CID的值由AT十CGDCONT事先
                                      指定
    ATD*99***1# //用服务码99建立连接,CID =1,其它用事先指定的值
    ATD*98*1#//用服务码98建立一个IP连接,CID =1
    国内最常用的是:ATD *99***1#,本设计中就采用了此种格式。
    用ATD指令若能拨号上线则返回“CONNECT",否则返回“NO CARRIER"。
这样,就完成了拨号上GPRS网络的功能,即接收到无线模块返回的“CONNECT",说明无线模块已经连上了移动GPRS的WAP网关,之后即为通过三阶段协商建立PPP链路的过程。
PPP协议格式分析
    利用AT指令无线模块连接上了中国移动的GPRS的WAP网关之后,接着是进行PPP连接。GPRS拨号采用的是点对点协议(Point to Point Protocol, PPP),该协议是是TCP/IP网络协议包的一个成员。其主要作用是无线模块通过拨号连接上终端服务器后,由PPP取得一个临时的IP地址,使该设备成 为网络上的一个节点。只要PPP链路顺利建立成功,获得临时的IP地址,则即可在其上嵌入IP等数据包进行数据传送,完成无线模块的无线网络连接。
    PPP协议(Point-to-Point Protocol点到点协议)是为在同等单元之间传输数据包这样的简单链路设计的链路层协议。这种链路提供全双工操作,并按照顺序传递数据包。其目的主要 是用来通过拨号或专线方式建立点对点连接发送数据,使其成为各种主机、网桥和路由器之间简单连接的一种共通的解决方案。

PPP协议中提供了一整套方案来解决链路建立、维护、拆除、上层协议协商、认证等问题。PPP协议包含了以下几个部分:
    .链路控制协议LCP (Link Control Protocol):LCP负责创建,维护或终止一次物理连接;
    .网络控制协议NCP (Network Control Protocol):NCP是一族协议,负责解决物理连接上运行什么网络协议,以及解决上层网络协议发生的问题;
    .认证协议,PPP协议支持两种验证协议:口令验证协议PAP (PasswordAuthentication Protocol)和挑战握手验证协议CHAP (Challenge-Handshake AuthenticationProtocol)。验证过程在PPP协议中为可选项,在连接建立后进行连接者身份验证的目的是为了防止有人在未经授权的情 况下成功连接,从而导致泄密。PAP是一种简单的明文验证方式,安全性较差。而CHAP是对PAP的改进,是一种加密的验证方式,使用挑战口令以哈希算法 对口令进行加密,用三次握手的方法周期性地检验对端的节点,优点在于密钥不在网络中传送,不会被窃听。本课题中采用的是挑战握手验证协议CHAP.
    PPP连接的建立主要经过三个阶段 ,分别是LCP连接协商、CHAP密码认证以及
NCP网络层协议配置。
    第一阶段:LCP连接协商
    在这个阶段,将对基本的通讯方式进行选择。链路两端设备通过LCP向对方发送LCP数据报配置请求(Configure-Request),对方同意接收 后双方互发LCP数据报配置应答(Configure-Ack )。一旦一个配置成功信息包(Configure-Ack packet)被发送且被接收,就完成了交换,进入LCP开启状态。
    第二阶段:CHAP密码认证
    在这个阶段,客户端会将自己的身份发送给远端的接入服务器。服务器向用户发PPP CHAP安全性认证挑战,接着用户给服务器送PPP CHAP安全性认证响应,服务器再向用户发送 PPP CHAP安全性认证成功。
    该阶段使用一种安全验证方式避免第三方窃取数据或冒充远程客户接管与客户端的连接。在认证完成之前,禁止从认证阶段前进到网络层协议阶段。如果认证失败,认证者应该跃迁到链路终止阶段。
    第三阶段:NCP网络层协议配置
    认证阶段完成之后,PPP将调用在链路创建阶段(阶段一)选定的各种网络控制协议(NCP )。选定的NCP解决PPP链路之上的高层协议问题,例如,在该阶段IP控制协议(IPCP)可以向拨入用户分配动态IP地址。 在这个阶段,先是用户向服务器发送PPP NCP网络控制数据包(网络协议配置,要求服务器提供IP地址和DNS,NBNS信息),接着服务器向用户发送配置请求PPP NCP网络控制数据包(为用户分配IP地址),用户向服务器发送配置应答PPP NCP网络控制数据包(接受所分配的IP地址),最后服务器向用户发送配置应答PPP NCP网络控制数据包(同意用户的IP地址和DNS地址)。
    这样,经过三个阶段以后,一条完整的PPP链路就建立起来了,用户即可向服务器
发送IP数据包。

你可能感兴趣的:(MMS实现详细分析)