咱们都知道短信其实也是经过网络传输的,不过走的是核心网,那既然一样走的是网络,那这些数据不外乎01010...,那手机是怎么把这串01010...翻译成咱们看到的文字短信的呢?git
其实短信协议(gsm)和咱们HTTP很类似,是基于TCP/IP的协议,短信协议也包含信息头和信息体,其每一个部分都有规定的含义github
接下来经过白话的方式向你解释这个协议,在这以前,有两个概念先介绍一下segmentfault
PDU(Protocol Data Unit): 表明咱们一条短信的整个数据,也叫一个包网络
UDH(User Data Header): 数据头编码
UD(User Data): 数据体spa
一个PDU包含一个UDH以及一个UD,那一个PDU就是这个样子:翻译
那接下来咱们用个最多见的例子,也就是咱们平时看到最多的普通文本短信为例子,挨个解释一下每一个部分具体包含了哪些内容3d
这儿也先介绍两个概念code
IE(Information Element): 表示一个UDH单元orm
IED(IE Data): 包含一个IE的内容
IEL(Length of IE): 表示一个IED所占用的字节长度
IEI(IE Identifier): 表示一个IE具体表明的是什么含义
UDHL(Length 0f UDH): 表示整个UDH所占用的字节长度
一个IE包含一个IEI以及一个IED数据,那一个IE就是这个样子:
IEI上面解释了,表示这个IE表明的是什么,IEI有许多,咱们这里就不展开说了,一个IEI占用一个字节,普通短信的IEI=0x00
是最最经常使用的,表示是一条拼接短信(CONCATENATED),后面咱们再解释什么是拼接短信
那IED里面有些什么东西呢,当IEI=0x00
时,IED包含3个字节,分别是refNr,totalNumberOfSms,seqNr各一个字节,这里先不用管具体的值是多少,咱们只关心它们共占用了3个字节
最后咱们来看IEDL的值,IEDL一样占用一个字节,咱们之因此须要IEDL的值,是由于不一样的IE,IED是不同的,因此须要指定IED的长度才能正确的读出数据,那当IEI=0x00
时,咱们知道IED占用了3个字节,因此IEDL=3
若是咱们假设refNr,totalNumberOfSms,seqNr为0x01 0x01 0x01
,最后咱们获得的一个IE的值就为:0x00 0x03 0x01 0x01 0x01
同IEDL同样,也须要UDHL的是来指定整个UDH的长度,UDHL占用1个字节,因此UDH就是这个样子:
那假如咱们只有一个IE,那么咱们的的UDH值就为:0x05 0x00 0x03 0x01 0x01 0x01
这儿也先介绍个概念
UDL(Length of UD): 表示一个PDU数据的所占用的字节长度
那一个完整的PDU就是这个样子:
UD其实就是咱们的短信内容了,也就是多个字节,这里一样先不用管内容具体是什么,一样若是咱们假设短信内容为4个字节0xfe 0xff 0x00 0x61
,那咱们加上上面的UDH,其一共所占字节长度为6,UDL占用1个字节,因此UDL=10
最后获得的PDU值就为:0x10 0x05 0x00 0x03 0x01 0x01 0x01 0xfe 0xff 0x00 0x61
上面简单通俗的介绍了一下整个短信数据是怎么组成的,以及每一个部分表明的含义,以及以普通文本短信为例子,大概说明了一下每一个部分所包含的内容,那接下来咱们继续介绍一下UD的内容是如何与文本相互转化的
在这以前,老规矩,咱们再介绍一个概念
DCS(Data Coding Scheme): 表示应该以什么方式处理UD的数据
关于DCS,上面说了,表示怎么处理UD的数据,也就是包含了UD怎么转化成文本的信息,其占用一个字节,能够说其中每一位(bit)不一样,都有着不一样的处理方式,虽然没有2^8这么多,但也很多
一个DCS主要包含2个信息,UD编码方式(Character Set),以及短信类别(Message Class)
编码方式有4种(GSM 7 bit,ISO 8859-1,UCS2,reserved)
短信类别有4种(Class 0,Class 1,Class 2,Class 3)
以咱们国内运营商为例,咱们普通短信所使用的编码方式为UCS2,短信类别为Class 1,那dcs的值为0x19
,固然关于这个值确定不是仅仅靠编码方式和短信类别得来的,咱们前面说到,DCS每一位的值都会影响到UD的处理,编码方式和短信类别只占用了其中4位,还有剩余的4位有其它含义,这里就不展开说了
有了DCS,即有了编码方式,咱们就可以将UD的字节和文本进行相互转化了,其实上面例子中UD的值就是英文字母a
通过UCS2编码获得的字节
接下来咱们说一说长文本的问题,咱们都知道一条短信长度是有限制的,通常来讲是140个字节,由于汉字通常使用UCS2编码,UCS2一个字符占用2个字节,因此一条短信用UCS2编码的短信,若是超过70个字符,是须要拆分红多条短信的,但咱们手机上却能显示超长的短信,那咱们的手机又是如何处理的呢?
还记得咱们前面介绍UDH的时候举的例子吗,当UDH中IEI=0x00
,表示是一条拼接短信(CONCATENATED),这个IED有3个值分别是refNr,totalNumberOfSms,seqNr,长文本就是经过这个IE来识别多个短信是不是同一个短信的
解释一下这三个值的含义
refNr: 若是值相同的,则标识为同一条短信
totalNumberOfSms: 由多少条短信拼接
seqNr: 拼接短信的顺序
因此上面例子中,这三个值都为1,就表示的是该条短信是由1条短信构成
这篇咱们以白话的方式介绍了短信协议中的一些基本概念,短信协议的组成,以及一些经常使用的值,咱们国内运营商所使用的协议也是基于上面所介绍的协议加入了一些各自特有的内容而造成
smsj是个短彩信协议项目、有完整丰富的doc,smsj能方便的生成短彩信协议内容,具体使用方式能够查看项目地址