CDMASMSPDU全解析
单条短信内容最⼤的长度是140字节,如果内容能够采⽤7bitASCII编码,那么可以传输的内容长度是140X8/7=160。如果发送的内容
长度超过160,需要将短信拆分成多条短信,那么拆分后的短信需要⼀个header来描述总共有⼏条,这是第⼏条短信等内
容,140X8=160X7=134X8+6X8=153X7+7X7,也就是如果7bit编码,那么这条短信能够存储153个字符。如果发送的字符超过
160,假如是161,那么将会拆分成两条短信,153+8,⼀条发送153个字符,另⼀条只发送8个字符。
假如我们需要发送⼀条短信给某⼀个⼈,基本流程是发送⽅编辑⼀条短信点击发送,这条短信会submit到短信中⼼,短信中⼼会将该条短
信delivery到接收端,接收端收到短信中⼼的短信后,会acknowledge短信中⼼,已经收到这条短信了。这个过程其实发送端并不清楚接收
⽅到底有没有收到短信。如果发送端希望知道短信到底有没有抵达接收端,那么发送的时候可以带⼀个信息给短信中⼼deliveryreport,告
知短信中⼼我希望接收端如果收到短信了,请将这个信息通知我,如果没有收到,也请告诉我原因。那么短信中⼼将短信delivery给接收端
后,接收端acknowledge短信中⼼,短信中⼼这个时候就知道短信已经抵达接收端,再通知发送端短信已经送到了接收端。这基本上就是
短信发送接收的⼀个最简单的抽象了。另外还有⼀种⼩区⼴播短信(cellbroadcast)这种短信在国内应该不⽀持,如果发⽣地震,⽕灾等
灾害的时候,终端会收到这种短信,只是内容上和普通通信有些区别,但是解析过程和普通短信是⼀样。
在正式解析PDU之前,还请了解编码的基本知识,了解8bit,7bit,Unicode,utf-8,DTMF编码和解码。
我先列举出⼏个CDMASMS的PDU(下⾯短信中没有涉及到长短信和Unicode的短信,在解释这⼏个后,会专门对长短信进⾏讲解)
//发送的短信
0702c620468c8e96102c8cbb366f0a0140
//接收到的短信
0702c620468c8e9c0a20229e8c800b108294f8241714
0102
//acknowledge的短信(收到短信后,需要ACK短信中⼼,告知短信中⼼我收到了)
02040702c620468c8e90070198
//cellbroadcast
1300031008d00106102c2870e1420801c00c01c0
当我⾸次看到上⾯四个短信PDU后,⼀脸茫然,不知所措,感觉好难。后⾯随着学习的深⼊,按照3GPP2SMS的spec就能⼀步⼀步的揭
开PDU的⾯纱,看看⾥⾯到底隐藏着什么内容。仔细观察⼀下这四个PDU,开头是不⼀样的,有00,01,02,这就是messagetype,
标明这是⼀条什么类型的短信。不同的短信,内容上就有些差别。但是解析过程是⼀样的。下⾯就是messagetype的定义,短信PDU都是
以messagetype开始的。
⽆论是哪种type的message,format都是⼀样的,
Messagetype之后就是多个固定结构,id,length,data,id描述了数据类型,length描述的是data的长度。我们对发送的短信和cell
Messagetype之后就是多个固定结构,id,length,data,id描述了数据类型,length描述的是data的长度。我们对发送的短信和cell
broadcast进⾏format拆分,拆分之后对每个id,length,data分析就简单了。另外两条⼤家可以做⼀下同步练习。其中data的结构可能
也是按照id,length,data的结构进⾏组合的。也就是说data可能是⼀种复合结构。
三种messagetype包含的内容不同,PointtoPoint最为复杂,⽽broadcast和acknowledgemessage都⾮常简单。
各种ParameterIdentifiers的定义如下,根据parameterid,在spec中找到对应的部分,根据spec就可以解析出data的内容。有些data
内容包含多个信息,并且信息长度不能被4整除,需要将data转换为⼆进制处理就简单了.
先以发送的短信作为例⼦进⾏解析
0702c620468c8e96102c8cbb366f0a0140
我们把这个按照parameterid进⾏拆分成,对每⼀段分别进⾏解析。
00//messagetype(point-to-point)
00021002//把00021002id,length和data标成不同颜⾊00021002,⼀般情况id和length都是8bit,id=00(16进制)=
00000000(⼆进制),在parameteridentifierstable表⾥找到00000000对应的id,也就是TelerviceIdentifier,在spec中可以
继续搜索00000000或者TelerviceIdentifier,找到后有详细的解释TelerviceIdentifier的结构如何。这个结构⽐较简单,就不详细
说了。
040702c620468c8e90//按照上⾯⽅法标成不同的颜⾊040702c620468c8e90,id=04=00000100,在parameter
identifierstable⾥找到00000100是DestinationAddress,在spec⾥⾯搜索00000100或者DestinationAddress,找到的是
AddressParameters,DestinationAddress和OriginatingAddress有同样的结构,如下表,这是⼀个变长的结构,需要读⼀下
spec,每个item代表的含义。040702c620468c8e90//04就是id,07是长度
040702c620468c8e90//接下来就是Digitmode和numbermode,都是⼀个bit,0=0000,所以Digitmode和numbermode都
是0,Digitmode=0说明采⽤DTMF格式编码,如果等于1表⽰的是采⽤8bit编码,numbermode具体表⽰还需要查其他的
spec(email类型的地址会应⽤到),感兴趣的可以⾃⾏查阅。根据spec,Digitmode和numbermode都是0,那么numbertype和
numberplan都不存在。下⼀个是NUM_FIELDS,长度是8bit,由于Digitmode和numbermode已经占⽤了两个bits,这个时候我们将
02c620468c8e90全部转化为⼆进制就容易解析了。
00001011就是NUM_FIELDS,等于11。后⾯就是CHARi,CHARi可能是4bit或者8bit,由于Digitmode=0,采⽤DTMF编码,采⽤
4bit编码,⼀共是11个数字,每个DTMF对应的数字可以参考下表,最终number是,最后留下两个bit是rerved。到
此DestinationAddress就解析完了,是不是很简单。
060100//按照同样的⽅法将不同不同表⽰成不同颜⾊060100,id=06=00000110,parameteridentifierstable⾥找到
00000110,对应的是BearerReplyOption,定义如下,06是id,01是长度,00=00000000,REPLY_SEQ是000000,两个bit
是rerved的。
200106102c8cbb366f0a0140//这部分是重点了,仍然⽤同样⽅法表⽰成不同颜
⾊200106102c8cbb366f0a0140,id=08=00001000,在ParameterIdentifiertable中找到00001000是
BearerData,搜索spec,发现了什么,BearerData是⼀个复合结构,Bearerdata的subdata也是id,length,data的结构,这个bear
data的length=10=16,data就是06102c8cbb366f0a0140。我们先给这个标上颜⾊,可以看到有三个sub
data。Bearerdata的subdata的id有单独的定义,也就是bearerdatasubid的值定义上和parameteridentifiertable是没有任何关系
的,⼀定不要混淆,他们不在同⼀layer上。
06102c8cbb366f0a0140
每种短信的bearerdata的subparameter是有很⼤的区别的,含有的内容有很⼤的差异,在此就不⼀⼀列举每种短信的bearerdata的内
容了,只列出bearerdata的subparametertable,根据这个table和对应的spec就可以解析任意短信的bearerdata了。
我们继续拿06102c8cbb366f0a0140作为例⼦说明
//解析⽅法还是⼀样的,id=00=00000000,在上表中查到是MessageIdentifier,找到对应的spec,如下
ID=00,length=03,messagetype是4个bit就是2=0010,MessageID占⽤了16个bit,就是0002,还剩下最后⼀个
0=0000,Header_IND=0(占⼀个bit),剩下的3个bit是rerved。继续对每个item进⾏解释。Messagetype=0010标明的是
messagetype,每个值的意思见表,0010是submit,MO的,符合我们的期望,因为这就是⼀条发送的短信。MESSAGE_ID=0002这
个⾮常有⽤(后⾯会见识到),messageidentifier。HEADER_IND等于1标明的是urdatasub-parameter(00000001)是有
header的,等于0是urdatasub-parameter没有header。这⾥等于0,就是没有header。对于长短信(>160)都需要urdata
sub-parameter含有header,来说明这是长短息的第⼏条。对于长短信我们会再单独介绍。
MessageIdentifier
0106102c8cbb366f//id=01=00000001,这个就是urdatasub-parameter,找到对应的
spec,length=06,MSG_ENCODING占⽤了5个bit,在此我们将后⾯的数据全部转为2进制。
本文发布于:2022-12-11 01:11:19,感谢您对本站的认可!
本文链接:http://www.wtabcd.cn/fanwen/fan/88/82523.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |