.NET(C#)下的移动彩信MM7协议研究之路(二)

来源:互联网 发布:led编辑软件下载 编辑:程序博客网 时间:2024/06/04 19:38

二:本次介绍彩信POST信息构成分析。SOAPDecode类构造与Envolope信息留至下篇吧。

首先,我们来看一个彩信包包头的示例:

包头部分:

POST /MMS/Receiver HTTP/1.1content-type: multipart/related; boundary="--NextPart_0_6192_87016";type="text/xml";start="</tnn-200102/mm7-vasp>"content-length: 41184soapaction: ""x-mms-huawei-mm7-rcptto: 10658000cache-control: no-cachepragma: no-cacheuser-agent: Java/1.5.0_16host: 192.168.1.10:8080accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2connection: keep-alive

包头部分可以使用以下C#代码输出:

StringBuilder strHeader = new StringBuilder();strHeader.AppendLine(string.Format("{0} {1} {2}",Request.HttpMethod, Request.FilePath, "HTTP/1.1"));  //这个HTTP/1.1用什么办法获取,谁知道指教下?foreach (var item in Request.Headers){    strHeader.AppendLine(string.Format("{0}:{1}", item, Request.Headers[item.ToString()]));}

彩信包头中,重要的是Content-Type与Content-Length这两部分。

Content-Type:multipart/related表明这次请求分多部分,boundary="--NextPart_0_6192_87016"表示各部分的分隔符是"--NextPart_0_6192_87016",start="</tnn-200102/mm7-vasp>"表示开始部分的Content-ID为"</tnn-200102/mm7-vasp>"。

Content-Length表示这次请求内容的主体长度。请求的主体可以用Request.InputStream来获取(在java中需要根据主体长度循环读取InputStream,C#中暂未实验,等实验后再更新)。


好了。彩信包头的信息就介绍到这。至于好多规范中说的可能还有MIME-Version: 1.0的字段,这个我抓包时发现移动的没传,解析中也没有用到这字段的地方,忽略吧。


下面看看彩信包主体示例:(主体较长,有41KB,除了标记,内容部分用......省略了)

----NextPart_0_6192_87016Content-Type: text/xml;charset="UTF-8"Content-Transfer-Encoding: 8bitContent-ID: </tnn-200102/mm7-vasp><?xml version="1.0" encoding="UTF-8"?><env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/"><env:Header><mm7:TransactionID xmlns:mm7="http://www.3gpp.org/ftp/Specs/archive/23_series/23.140/schema/REL-6-MM7-1-0" env:mustUnderstand="1">0730000009740120813230806001</mm7:TransactionID></env:Header><env:Body><DeliverReq xmlns="http://www.3gpp.org/ftp/Specs/archive/23_series/23.140/schema/REL-6-MM7-1-0"><MM7Version>6.3.0</MM7Version><Sender>+8613900000000</Sender><Recipients><To><Number>10658000</Number></To></Recipients><TimeStamp>2012-08-13T23:08:06+08:00</TimeStamp><Priority>Normal</Priority><Subject>转发:中国移动信息</Subject><MMSRelayServerID>900000</MMSRelayServerID><ReplyChargingID></ReplyChargingID><Content href="cid:defaultID"/></DeliverReq></env:Body></env:Envelope>----NextPart_0_6192_87016Content-Type:multipart/related;start="<smil-part>";type="application/smil";boundary="SubPart_1_2339_28544"Content-ID:defaultID--SubPart_1_2339_28544Content-Type:application/smil;name="SMIL.smil"Content-ID:<smil-part>Content-Location:SMIL.smilContent-Transfer-Encoding: 8bit......--SubPart_1_2339_28544Content-Type:text/plain;charset="UTF-8";name="3067296.txt"Content-ID:<2733504>Content-Location:3067296.txtContent-Transfer-Encoding: 8bit......--SubPart_1_2339_28544Content-Type:image/jpeg;name="cover.jpg"Content-ID:<2733600>Content-Location:cover.jpgContent-Transfer-Encoding: 8bit......--SubPart_1_2339_28544Content-Type:text/plain;charset="UTF-8";name="2973696.txt"Content-ID:<2735504>Content-Location:2973696.txtContent-Transfer-Encoding: 8bit......--SubPart_1_2339_28544------NextPart_0_6192_87016--

彩信包中,用包头是提到的分隔符"--NextPart_0_6192_87016"做分割,可以得到两部分内容:第一部分为Content-ID为包头中start指定的,即Envelop的xml文件,第二部分为主体文件列表,又以以下部分开头:

Content-Type:multipart/related;start="<smil-part>";type="application/smil";boundary="SubPart_1_2339_28544"Content-ID:defaultID
从这部分信息中,可以看出:接下来的第二部分内容,是以"SubPart_1_2339_28544"作分割的子内容。


再看看子内容部分:

--SubPart_1_2339_28544Content-Type:text/plain;charset="UTF-8";name="2973696.txt"Content-ID:<2735504>Content-Location:2973696.txtContent-Transfer-Encoding: 8bit......
子内容部分又分为信息头与主体部分,以两个\r\n\r\n分割。说明了此部分文件类型、文件名、ID、编码方式等信息。


今天先到这吧。接下来的事情就是将这些各部分文件分割,得到具体文件内容,并解析Envelop信息。

原创粉丝点击