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

4 篇文章 0 订阅
2 篇文章 0 订阅

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

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

包头部分:

POST /MMS/Receiver HTTP/1.1
content-type: multipart/related; boundary="--NextPart_0_6192_87016";type="text/xml";start="</tnn-200102/mm7-vasp>"
content-length: 41184
soapaction: ""
x-mms-huawei-mm7-rcptto: 10658000
cache-control: no-cache
pragma: no-cache
user-agent: Java/1.5.0_16
host: 192.168.1.10:8080
accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2
connection: 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_87016
Content-Type: text/xml;charset="UTF-8"
Content-Transfer-Encoding: 8bit
Content-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_87016
Content-Type:multipart/related;start="<smil-part>";type="application/smil";boundary="SubPart_1_2339_28544"
Content-ID:defaultID

--SubPart_1_2339_28544
Content-Type:application/smil;name="SMIL.smil"
Content-ID:<smil-part>
Content-Location:SMIL.smil
Content-Transfer-Encoding: 8bit
......

--SubPart_1_2339_28544
Content-Type:text/plain;charset="UTF-8";name="3067296.txt"
Content-ID:<2733504>
Content-Location:3067296.txt
Content-Transfer-Encoding: 8bit
......

--SubPart_1_2339_28544
Content-Type:image/jpeg;name="cover.jpg"
Content-ID:<2733600>
Content-Location:cover.jpg
Content-Transfer-Encoding: 8bit
......

--SubPart_1_2339_28544
Content-Type:text/plain;charset="UTF-8";name="2973696.txt"
Content-ID:<2735504>
Content-Location:2973696.txt
Content-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_28544
Content-Type:text/plain;charset="UTF-8";name="2973696.txt"
Content-ID:<2735504>
Content-Location:2973696.txt
Content-Transfer-Encoding: 8bit

......
子内容部分又分为信息头与主体部分,以两个\r\n\r\n分割。说明了此部分文件类型、文件名、ID、编码方式等信息。


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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值