彩信MMS PDU 的解码

      前一时间折腾了一下手机方面的开发,用的是NOKIA智能手机,NOKIA网站有一个很方便的开发包Nokia_PC_Connectivity_API_3.2。

这个开发包带有VB.NET,C#,VC的文件系统,设备管理,内容存取的开发例子。试了试可以正常收发短信,但彩信只可以看到条目标题,时间,看不了内容,了解一下,在Content Access API 3.2里的CA_MMS_DATA。这个结构体中,重要的BYTE* pbData 没有相关说明,例子里也没有解析。

      这几天把手机的pbData数据异了一些出来,网上查了一下,发现是彩信的PDU编码格式就到网上找了一下,相关开发入门的例子和协议,竟发现不好找。乱七八糟的。说什么的都有。因为自已的手机码是使用移动的就找了一下关于移动的相关文件,很快就找到《中国移动多媒体消息系统(MMS)接口规范》。了解一下整个MMS流程。

 

多媒体消息业务涉及的系统接口

整个MMS业务环境通过WAP网关与移动网相连,各接口协议都是HTTP或SMTP等通用的Internet协议。其中: 
   MM1:MMS用户代理(MMS手机上的应用程序,如浏览器)和MMS代理/服务器(MMSC)之间的参考点,基于WAP和HTTP实现;
   MM2:MMS中继和MMS服务器之间的参考点,一般是MMSC内部的接口;
   MM3:MMS服务中心和外部消息系统间的参考点,基于IP实现,如与Email服务器相连,则采用SMTP协议;
   MM4:MMS服务中心和另一个MMSE中的MMS服务中心间的参考点,基于SMTP实现;
   MM5:MMS服务中心和HLR间的参考点,非必须;
   MM6:MMS服务中心和MMS用户数据库间的参考点,可以是内部接口或外部接口;
   MM7:MMS服务中心和MMS增值业务应用之间的参考点,基于IP实现;
   MM8:MMS服务中心和计费系统间的参考点。

 

看了一下,再加之前面找的一些乱七八糟的资料,了解到开发彩信有两个种要的开发接口,一个是MM1接口,和MM7接口。

MM1是以终端设备方式(手机终端、GPRS modem),MM7是以SP增值业务方式接入.

说明自已手机异出的数据是MM1接口的协议上的mms pdu数据。

 

MMS PDU 的解码

 

    MMS PDU 的具体编码规则在:WAP-209-MMSEncapsulation-20020105-a.pdf或在OMA-MMS-ENC-V1_2-20050301-A.pdf上有介绍。

   MMS PDU被封装在WSP/PDU之中 作为WSP的消息体进行传输,并采用WAP/WSP协议作为传输内容的二进制编码(binary encoding)机制,进行消息的封装(Encapsulation)。
在OMA-TS-MMS-ENC-V1_3-20080128-C.pdf文档所在规范中,详细定义了每个PDU所涉及的Header域和值,以及为它们分配的二进制码的一一对应关系。采用此二进制编码规范,节约了无线领域的带宽资源,并最优化其在空中传播的数据量。
具体对应关系请参阅相关文档。
MMS 编码必须遵循无线会话协议( Wireless Session Protocol,以下简称 WSP)。
WSP使用一种与 HTTP/1.1相同的语法描述数据的组织结构,具体可参考 RFC[2068]。
HTTP/1.1使用 ASCII字符编码来传输数据,而 WSP为降低传输带宽,将 HTTP/1.1中的一些著名域对应的字符串定义为一个字节,并在对这些紧凑格式编码时加上 0x80,使著名域的编码大于 127(扩展 ASCII字符),从而将它们与普通 ASCII字符区别开。因此 MMS信息头的基本编码格式为:“域编码”+“内容”,详情请参考表 1。编码顺序如下:消息类型、事务 ID、版本号必须依次排在最前面,而 MMS信息体内容类型则应该排在 MMS信息头的最后。

 

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头域的最后,其后为消息体,其它域的顺序可以随意安排。

 

参考表 1

Name Assigned Number 
Bcc 0x01 
Cc 0x02 
X-Mms-Content-Location 0x03 
Content-Type 0x04 
Date 0x05 
X-Mms-Delivery-Report 0x06 
X-Mms-Delivery-Time 0x07 
X-Mms-Expiry 0x08 
From 0x09 
X-Mms-Message-Class 0x0A 
Message-ID 0x0B 
X-Mms-Message-Type 0x0C 
X-Mms-MMS-Version 0x0D 
X-Mms-Message-Size 0x0E 
X-Mms-Priority 0x0F 
X-Mms-Read-Report 0x10 
X-Mms-Report-Allowed 0x11 
X-Mms-Response-Status 0x12 
X-Mms-Response-Text 0x13 
X-Mms-Sender-Visibility 0x14 
X-Mms-Status 0x15 
Subject 0x16 
To 0x17 
X-Mms-Transaction-Id 0x18 
X-Mms-Retrieve-Status 0x19 
X-Mms-Retrieve-Text 0x1A 
X-Mms-Read-Status 0x1B 
X-Mms-Reply-Charging 0x1C 
X-Mms-Reply-Charging-Deadline 0x1D 
X-Mms-Reply-Charging-ID 0x1E 
X-Mms-Reply-Charging-Size 0x1F 
X-Mms-Previously-Sent-By 0x20 
X-Mms-Previously-Sent-Date 0x21 
X-Mms-Store 0x22 
X-Mms-MM-State 0x23 
X-Mms-MM-Flags 0x24 
X-Mms-Store-Status 0x25 
X-Mms-Store-Status-Text 0x26 
X-Mms-Stored 0x27 
X-Mms-Attributes 0x28 
X-Mms-Totals 0x29 
X-Mms-Mbox-Totals 0x2A 
X-Mms-Quotas 0x2B 
X-Mms-Mbox-Quotas 0x2C 
X-Mms-Message-Count 0x2D 
Content 0x2E 
X-Mms-Start 0x2F 
Additional-headers 0x30 
X-Mms-Distribution-Indicator 0x31 
X-Mms-Element-Descriptor 0x32 
X-Mms-Limit 0x33 

 

 

如HEX数据:8C 80 8D 90 85 04 4CA72474
8C—表示X-Mms-Message-Type
80— m-send-req
8D— X-Mms-Version
90— MMS Version值1.0
85— 表示date
04— 表示date的数据长度
4CA72474 -表示date的数据Little-endian,从1970年开始到现在的秒数
96—subject主题
89— 表示From
97— 表示From
From=0x89+长度+ 0x80+地址+0x00(收到时解码用) 还有发送时用的格式:0x89, 0x01, 0x81 以0x81为标记的占位符,发送时自动插入发送号码From=0x97+内容+0x00
CC =0x82+号码+0x00
subject=0x98+长度+字符集+字符串+0x00;//(常为用Utf8长度+2)+0xEA+内容+0x00
...
以上分析的就是一个典型的MMS PDU消息格式,按上面参考表 1配合WAP-209文档说明,很轻松的就解码了

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Java PDU(Protocol Data Unit)解码是指将PDU数据转换成人类可读的文本信息。PDU是在计算机网络中传输的数据单元,它可以是报文、数据或控制信息。在Java开发中,PDU解码通常用于解析和处理短信、邮件、电话等通信信息。 在Java中,实现PDU解码的一种常见方式是使用第三方库或工具,如SMPP(Short Message Peer to Peer)协议库或jsmpp库。这些库提供了一组API(Application Programming Interface),可以使用Java代码解码PDU数据。通过读取和解析PDU的各个字段,可以从二进制数据中提取出发送者、接收者、时间戳、正文等信息,并将其转换为可读的文本。 解码PDU的过程一般包括以下步骤: 1. 读取PDU的二进制数据,并将其转换为可操作的字节数组。 2. 根据PDU的协议规范,确定各个字段的起始位置和长度。 3. 通过字节数组的索引和长度信息,逐个字段地读取PDU数据,并将其转换为可读的文本。 4. 解析PDU的各个字段,如发送者的号码、接收者的号码、时间戳等。 5. 将解析后的字段拼接成人类可读的文本信息,如短信正文。 PDU解码在移动通信、网络通信等领域有广泛的应用。在Java开发中,通过使用第三方库可以简化PDU解码的过程,快速获取PDU中的各个字段信息,并进行相应的处理和分析。这些库提供了丰富的功能和API,可以帮助我们更高效地解码和处理PDU数据。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值