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

news/2024/2/27 18:31:22

二:本次介绍彩信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;不能有其他线程访问&…

python---js逆向------再接再励------案例

作者前言 这是我的gitee仓库:https://gitee.com/qin-laoda/python-exercises 有兴趣的小可爱们可以点进去看看, 目录 常见的js加密算法 微信公众号的简单案例 ________________________________ 鉴于有一些小可爱对于js逆向的理解还有一些不解,下面我会再进一步的介绍js…

C++访问std::variant类型数据的几种方式

文章目录 前言variant的简单使用variant相关函数和类访问std::variant数据std::get搭配index函数使用std::get搭配std::holds_alternative函数使用std::get_if函数std::visit函数自定义访问结构的写法定义lambda函数组重载 overloaded是什么std::visit的第一个参数lambda 是什么…

【软件设计师暴击考点】下午题高频考点暴击系列

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;软件…

海尔集团洗衣机用多米诺骨牌串联展示科技高度

从立起25CM硬币塔的海尔洗衣机开始&#xff0c;一路经过摆着13层香槟塔的卡萨帝洗衣机和45度斜立可乐罐的统帅洗衣机……65000枚多米诺骨牌依次倒下&#xff0c;但是运行中的洗衣机丝毫没有影响到上面危如累卵的摆放物。日前&#xff0c;海尔发布一支“多米诺骨牌”视频&#x…

海尔洗衣机发布行业首个RFID衣物识别标准

5月31日&#xff0c;海尔洗衣机最佳合作伙伴暨RFID标准研讨会在青岛举行。海尔洗衣机与洗护行业相关的服装、家纺等各品类知名企业&#xff0c;就RFID衣物识别技术展开标准研讨&#xff0c;并现场发布1.0版本的联盟标准&#xff0c;将在各自的品牌领域协同推广。 活动现场&…

海尔洗衣机的自信,为何能成世界趋势的“中国自信”?

如果细细回顾中国家电产业的发展历史&#xff0c;不难发现这是一段不断推进的“进化史”。 所幸在经过数十年的发展历程之后&#xff0c;“中国制造”开始成为新的主流标签并在国际地位上取得显著地位&#xff0c;这期间崛起的大多数民族品牌&#xff0c;也逐渐成为行业发展的标…

REGEXP基础语法

个人使用https://regex101.com/这个比较多一些&#xff0c;大家可以使用。 #限定符&#xff08;Quantlfier&#xff09; a* a出现0次或者多次 a a出现1次或者多次 a? a出现0次或者1次 a{6} a出现6次 a{2,6} a出现2-6次 a{2,} a出现2次以上 #或运算符 &#xff…

程序员+本硕博——一站式导航——收集+转载+讲解

程序员本硕博——一站式导航——收集转载讲解 程序员开发机器学习发论文的期刊Github——黄海广&#xff0c;温州大学教授MoMeeDo咪豆圈&#xff0c;机器学习廖雪峰——git廖雪峰——pythonpandas_IllustratedNumPy_Illustrated web前端 : vue3 vitevue3vitets的【可视化】在线…

Redis在项目中的地位及使用场景剖析

Redis在项目中的地位及使用场景剖析 一、 redis 特点 所有数据存储在内存中&#xff0c;高速读写 提供丰富多样的数据类型&#xff1a;string、 hash、 set、 sorted set、bitmap、hyperloglog 提供了 AOF 和 RDB 两种数据的持久化保存方式&#xff0c;保证了 Redis 重启后数…

前后端通吃,vue大全Mark一下

阅读文本大概需要15分钟。 仓库地址&#xff1a;https://github.com/opendigg/awesome-github-vue awesome-github-vue 是由OpenDigg整理并维护的Vue相关开源项目库集合。我们会定期同步OpenDigg上的项目到这里&#xff0c;也欢迎各位提交项目给我们。 如果收录的项目有错…

Vue经典开源项目汇总

Vue.js(读音 /vjuː/, 类似于 view)是一套用于构建用户界面的渐进式框架,主要用于快速的构建前端界面,与其它大型的前端框架不同,Vue被设计为可以自底向上逐层应用。 相比Angular.js来说,Vue的核心库只关注视图层,不仅易于上手,还便于与第三方库或既有项目整合,是初创…
最新文章