收發超長短信的資料匯編


因為要發送和解析長短信,在網上浸淫許久,終於解惑,因此記錄下我認為有用的資料。

一、所謂超長短信就是:當短信內容超過70個漢字或140個字符,發送的時候需要分成多條,但是用戶手機接收時候是一條。

二、在說長短信之前必須先熟悉一下PDU的格式說明:

一般的PDU編碼由A B C D E F G H I J K L M十三項組成。
    A:短信息中心地址長度,2位十六進制數(1字節)。
    B:短信息中心號碼類型,2位十六進制數。
    C:短信息中心號碼,B+C的長度將由A中的數據決定。
    D:文件頭字節,2位十六進制數。
    E:信息類型,2位十六進制數。
    F:被叫號碼長度,2位十六進制數。
    G:被叫號碼類型,2位十六進制數,取值同B。
    H:被叫號碼,長度由F中的數據決定。
    I:協議標識,2位十六進制數。
    J:數據編碼方案,2位十六進制數。
    K:有效期,2位十六進制數。
    L:用戶數據長度,2位十六進制數。
    M:用戶數據,其長度由L中的數據決定。J中設定采用UCS2編碼,這里是中英文的Unicode字符。

PDU編碼協議簡單說明:

例1 發送:SMSC號碼是+8613800250500,對方號碼是13693092030,消息內容是“Hello!”。從手機發出的PDU串可以是
    08 91 68 31 08 20 05 05 F0 11 00 0D 91 68 31 96 03 29 30 F0 00 00 00 06 C8 32 9B FD 0E 01
    對照規范,具體分析:
    分段 含義 說明
    08 SMSC地址信息的長度 共8個八位字節(包括91)
    91 SMSC地址格式(TON/NPI) 用國際格式號碼(在前面加‘+’)
    68 31 08 20 05 05 F0 SMSC地址 8613800250500,補‘F’湊成偶數個
    11 基本參數(TP-MTI/VFP) 發送,TP-VP用相對格式
    00 消息基准值(TP-MR) 0
    0D 目標地址數字個數 共13個十進制數(不包括91和‘F’)
    91 目標地址格式(TON/NPI) 用國際格式號碼(在前面加‘+’)
    68 31 96 03 29 30 F0 目標地址(TP-DA) 8613693092030,補‘F’湊成偶數個
    00 協議標識(TP-PID) 是普通GSM類型,點到點方式
    00 用戶信息編碼方式(TP-DCS) 7-bit編碼
    00 有效期(TP-VP) 5分鍾
    06 用戶信息長度(TP-UDL) 實際長度6個字節
    C8 32 9B FD 0E 01 用戶信息(TP-UD) “Hello!”


    例2:例2 接收:SMSC號碼是+8613800250500,對方號碼是13693092030,消息內容是“你好!”。手機接收到的PDU串可以是
    08 91 68 31 08 20 05 05 F0 84 0D 91 68 31 96 03 29 30 F0 00 08 30 30 21 80 63 54 80 06 4F 60 59 7D 00 21
    對照規范,具體分析:
    分段 含義 說明
    08 地址信息的長度 個八位字節(包括91)
    91 SMSC地址格式(TON/NPI) 用國際格式號碼(在前面加‘+’)
    68 31 08 20 05 05 F0 SMSC地址 8613800250500,補‘F’湊成偶數個
    84 基本參數(TP-MTI/MMS/RP) 接收,無更多消息,有回復地址
    0D 回復地址數字個數 共13個十進制數(不包括91和‘F’)
    91 回復地址格式(TON/NPI) 用國際格式號碼(在前面加‘+’)
    68 31 96 03 29 30 F0 回復地址(TP-RA) 8613693092030,補‘F’湊成偶數個
    00 協議標識(TP-PID) 是普通GSM類型,點到點方式
    08 用戶信息編碼方式(TP-DCS) UCS2編碼
    30 30 21 80 63 54 80 時間戳(TP-SCTS) 2003-3-12 08:36:45  +8時區
    06 用戶信息長度(TP-UDL) 實際長度6個字節
    4F 60 59 7D 00 21 用戶信息(TP-UD) “你好!”

沒錯,長短信的關鍵之一就在於pdu的D項目(也就是”文件頭字節“/TP-MTI)的取值。這個數值的獲得是通過二進制數獲得的,例如

例子一中的11轉為二進制是0001 0001,例子二中的84轉為二進制是1000 0100

其實二進制中的每一位都有自己的意義,我們來具體看看(這里說明時定義左邊為第一位):

      第一位:應答路徑—TP-RP(TP-Reply-Path):0—不設置; 1—設置

  第二位:用戶數據頭標識—TP-UDHI(TP-User-Data-Header-Indicator):0—不含任何頭信息; 1—含頭信息(本短信是沒有頭信息的,下文中會有包含頭信息的短信,到時再具體解析頭信息UDH)

  第三位:狀態報告要求—TP-SPR(TP-Status-Report-Request):0—需要報告; 1—不需要報告

  第四、五位:有效期格式—TP-VPF(TP-Validity-Period-Format):00—不提供(Not present); 10—整型(標准);01—預留; 11—提供8位字節的一半(Semi-Octet Represented)

  第六位:拒絕復制—TP-RD(TP-Reject-Duplicates):0—接受復制; 1—拒絕復制

  第七、八位:信息類型提示—TP-MTI(TP-Message-Type-Indicator):00—接收(Deliver); 01—發送(Submit)

TP_udhi :0代表內容體里不含有協議頭信息 1代表內容含有協議頭信息(長短信的協議頭,也就是說把基本參數(TP-MTI/VFP)值設置成0X51)

當設置內 容體包含協議頭后,你就可以在用戶數據部分的前面加上協議頭了

三、長短信的協議頭:

長短信協議頭有兩種】:

(一)、6位協議頭格式:05 00 03 XX MM NN
                     byte 1 : 05, 表示剩余協議頭的長度
                     byte 2 : 00, 這個值在GSM 03.40規范9.2.3.24.1中規定,表示隨后的這批超長短信的標識位長度為1(格式中的X值)。
                     byte 3 : 03, 這個值表示剩下短信標識的長度
                     byte 4 : XX,這批短信的唯一標志(被拆分的多條短信,此值必需一致),事實上,SME(手機或者SP)把消息合並完之后,就重新記錄,所以這個標志是否唯一並不是很 重要。
                     byte 5 : MM, 這批短信的數量。如果一個超長短信總共5條,這里的值就是5。
                     byte 6 : NN, 這批短信的數量。如果當前短信是這批短信中的第一條的值是1,第二條的值是2。
                     例如:05 00 03 39 02 01

包頭一共6個字節,如下:
1、字節一:包頭長度,固定填寫0x05;
2、字節二:包頭類型標識,固定填寫0x00,表示長短信;
3、字節三:子包長度,固定填寫0x03,表示后面三個字節的長度;
4、字節四到字節六:包內容:
  1)字節四:長消息參考號,每個SP給每個用戶發送的每條參考號都應該不同,可以從0開始,每次加1,最大255,便於同一個終端對同一個SP的消息的不同的長短信進行識別;
  2)字節五:本條長消息的的總消息數,從1到255,一般取值應該大於2;
  3)字節六:本條消息在長消息中的位置或序號,從1到255,第一條為1,第二條為2,最后一條等於字節五的值。
              

(二)、7位的協議頭格式:06 08 04 XX XX MM NN
                     byte 1 : 06, 表示剩余協議頭的長度
                     byte 2 : 08, 這個值在GSM 03.40規范9.2.3.24.1中規定,表示隨后的這批超長短信的標識位長度為2(格式中的XX值)。
                     byte 3 : 04, 這個值表示剩下短信標識的長度
                     byte 4-5 : XX XX,這批短信的唯一標志,事實上,SME(手機或者SP)把消息合並完之后,就重新記錄,所以這個標志是否唯一並不是很重要。
                     byte 6 : MM, 這批短信的數量。如果一個超長短信總共5條,這里的值就是5。
                     byte 7 : NN, 這批短信的數量。如果當前短信是這批短信中的第一條的值是1,第二條的值是2。
                     例如:06 08 04 00 39 02 01       

你可以任選一種協議頭,但是要注意的是:協議里短信標志這個字段在一條長短信中必須要一樣,不然手機會解析成三條, 並三條都 是錯誤短信。 

還有就是,加了協議頭之后,用戶數據部分的長度也要相應的減少,例如采用6字節的協議頭,則把短信內容按134字節來分割,在頭部添加6字節udhi,剛好 140字節。

四、總結:

  至此,總結超長短息的關鍵地方:

1、是超長短信,pdu的D項目要設置為51,否則11

2、用戶數據拆分長度要去掉用戶協議頭的長度,我用6位的協議頭,所以按照134的最大長度(67個漢字或字符)來拆分信息。

3、協議頭的短信ID,在一條長短息拆分成的短信中應該保持一致,不同長短息的ID應該不同。另外,這里的ID和總數以及索引數字都要格式化為16進制

4、拆分后的信息作為單獨的短信發送即可,接收方的手機(多數)會自動拼接成一條長短信。

5、自己解析長短息首先要根據PDU頭信息的D項看看左邊第二位是否為1,然后根據兩種協議的前三位來判斷具體是那種協議頭。解析數據應該去掉協議頭的幾個字節。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM