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

news/2024/11/14 0:23:44/

二:本次介绍彩信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信息。


http://www.ppmy.cn/news/537668.html

相关文章

只要你足够好

原文地址&#xff1a;只要你足够好 作者&#xff1a;意林杂志 只要你足够好 □ 桑葚和覆盆子 意林2012年06期“蓝血训练营” &#xff08;图片来自网络&#xff09; 2012年春晚以后&#xff0c;网络上到处可见对杨丽萍的溢美之词。在王利芬的微博上&#xff0c;我看到这样一段…

管理学书籍,待看

最基本的管理类书籍就是管理学&#xff0c;普遍用的是罗宾斯管理学和周三多的管理学&#xff1b;除了专门讲管理理论的书还有《从优秀到卓越》、《第五项修炼》、《德鲁克管理思想精要》、《基业长青》、《竞争优势》、《竞争战略》、《个性与组织》、《新定位》、《彼得原理》…

Hypertable运维中遇到的问题

1.failed expectation: insert_result.second 版本&#xff1a;0.9.7.5之前 问题描述&#xff1a; 在自动failover进行的过程中&#xff0c;手动将之前出问题的机器带回集群&#xff0c;Master日志中出现了如下类似错误&#xff1a; (/root/src/hypertable/src/cc/Hypertab…

python实现命令行解析的argparse的使用

参考https://docs.python.org/3.6/library/argparse.html argparse模块使编写用户友好的命令行界面变得很容易。程序定义了它需要什么参数&#xff0c;argparse将找出如何从sys.argv中解析这些参数。argparse模块还自动生成帮助和使用消息&#xff0c;并在用户给程序提供无效参…

骗子怎样拿到了你的USIM卡?技术还原最新通信网络诈骗案

技术还原最新通信网络诈骗案 文 | 宁宇 从4月11日开始&#xff0c;一篇名为《实录亲历网络诈骗&#xff0c;互联网是如何让我身无分文&#xff1f;》的文章刷爆了网络。 作者"趣火星"&#xff08;以下我称其为受害者&#xff09;称&#xff0c;由于一条短信&#xff…

【开源与项目实战:开源实战】76 | 开源实战一(上):通过剖析Java JDK源码学习灵活应用设计模式

从今天开始&#xff0c;我们就正式地进入到实战环节。实战环节包括两部分&#xff0c;一部分是开源项目实战&#xff0c;另一部分是项目实战。 在开源项目实战部分&#xff0c;我会带你剖析几个经典的开源项目中用到的设计原则、思想和模式&#xff0c;这其中就包括对 Java JD…

VMware Ubuntu忘记密码修改密码

目录 一、重启 二、重置密码 三、补充 一觉醒来&#xff0c;刚想去虚拟机爽一下Linux却发现忘记了密码&#xff1f; 没关系&#xff0c;这里有详细的步骤帮你修改密码&#xff01; 一、重启 重启虚拟机&#xff0c;在进度条未读完前&#xff0c;长按shift进入GRUB系统引导…

C++11 线程库—互斥锁

前言 多线程因其调度的随机性和时间片分配&#xff0c;如果没有限制的访问临界资源&#xff0c;会导致出现无法预测的结果&#xff0c;也无法达到预期。 所以&#xff0c;访问临界区&#xff0c;需要是原子性的&#xff0c;在一个线程完成之前&#xff0c;不能有其他线程访问&…