白話短信協議

白話短信協議

咱們都知道短信其實也是經過網絡傳輸的,不過走的是核心網,那既然一樣走的是網絡,那這些數據不外乎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就是這個樣子:翻譯

PDU.png

那接下來咱們用個最多見的例子,也就是咱們平時看到最多的普通文本短信爲例子,挨個解釋一下每一個部分具體包含了哪些內容3d

UDH(User Data Header)

這兒也先介紹兩個概念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就是這個樣子:

ie.png

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就是這個樣子:

UDH.png

那假如咱們只有一個IE,那麼咱們的的UDH值就爲:0x05 0x00 0x03 0x01 0x01 0x01

UD(User Data)

這兒也先介紹個概念

UDL(Length of UD): 表示一個PDU數據的所佔用的字節長度

那一個完整的PDU就是這個樣子:

PDU-complete.png

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編碼獲得的字節

CONCATENATED

接下來咱們說一說長文本的問題,咱們都知道一條短信長度是有限制的,通常來講是140個字節,由於漢字通常使用UCS2編碼,UCS2一個字符佔用2個字節,因此一條短信用UCS2編碼的短信,若是超過70個字符,是須要拆分紅多條短信的,但咱們手機上卻能顯示超長的短信,那咱們的手機又是如何處理的呢?

還記得咱們前面介紹UDH的時候舉的例子嗎,當UDH中IEI=0x00,表示是一條拼接短信(CONCATENATED),這個IED有3個值分別是refNr,totalNumberOfSms,seqNr,長文本就是經過這個IE來識別多個短信是不是同一個短信的

解釋一下這三個值的含義

refNr: 若是值相同的,則標識爲同一條短信

totalNumberOfSms: 由多少條短信拼接

seqNr: 拼接短信的順序

因此上面例子中,這三個值都爲1,就表示的是該條短信是由1條短信構成

這篇咱們以白話的方式介紹了短信協議中的一些基本概念,短信協議的組成,以及一些經常使用的值,咱們國內運營商所使用的協議也是基於上面所介紹的協議加入了一些各自特有的內容而造成

SMSJ

smsj是個短彩信協議項目、有完整豐富的doc,smsj能方便的生成短彩信協議內容,具體使用方式能夠查看項目地址

下一篇 白話彩信協議
相關文章
相關標籤/搜索