Home / Wissensdatenbank / Wiki / 短信格式(sms)以及編碼總結(jié)

短信格式(sms)以及編碼總結(jié)

短信開發(fā)指通過串口 at 命令驅(qū)動短信貓進行短信發(fā)送和接收操作。

 

 

AT 命令 :AT命令是驅(qū)動短信設(shè)備的標準工業(yè)命令,除了業(yè)界的標準之外,每個廠商可能會對其進行擴展,不過一般來說,標準命令應(yīng)該夠用,我在這里用的是西門子 MC39i ,有專門的 AT 命令文檔。

 

一、短信貓操作分為三種模式: Block、Pdu 和 Text

1、Block 模式基本已經(jīng)被 Pdu 模式取代,沒有具體研究。

2、Text 模式比較簡單,但是支持的設(shè)備不是很全,而且不能實現(xiàn)中文。

AT + CGMF=1<CR>

AT + CGMS= “ 13612344321 ” ,129<CR> >Hello World!<^Z>

 

3、Pdu 模式

Pdu 編碼主要包括兩個主要的部分,一是 pdu 串的整體數(shù)據(jù)格式,分別因為發(fā)送信息串和接收信息串而有區(qū)別,二是 pdu 中文本部分的編碼,分別因為字符集而不同。

我們也可以這樣來理解這個 pdu 編碼的格式, sms 相當于一個協(xié)議棧,最簡單的協(xié)議棧:

 

根據(jù) gsm03.40 規(guī)范, sms 協(xié)議包括以下幾層:

1、 SM-AL :應(yīng)用層。這個部分就是數(shù)據(jù)部分。

2、 SM-TL :傳輸層。我們可以清楚的看到這里描述了主要的短信內(nèi)容,包括發(fā)送號碼,接收號碼,信息類型,編碼,數(shù)據(jù)報長度等等,這也是我們編程主要要面對的問題。

3、 SM-RL :中繼層。這個指的是短信在網(wǎng)關(guān)之間中繼需要的協(xié)議。

4、 SM-LL:鏈路層。

從上述描述中我們可以清楚的看到,我們編程主要集中于傳輸層。

 

 

 

二、短信傳送有三種編碼: 7 位, 8 位, UniCode

 

1、英文 7 位編碼

這是 gsm 的默認編碼方式

由于這樣的移位,我們可以看到我們能發(fā)的最多英文字符等于: 140*8/7 = 160 。

2、數(shù)據(jù) 8 位編碼

8-bit 編碼通常用于發(fā)送數(shù)據(jù)消息,比如圖片和鈴聲等;

3、中文 pdu 編碼

發(fā)送中文時,必須用 UCS2 ( utf-16 )進行編碼,最多可以發(fā) 140/2 = 70 個漢字。

UniCode 編碼轉(zhuǎn)換也比較簡單,以中文為例,一個中文字符是兩個字節(jié),直接對高位字節(jié)和低位字節(jié)進行十六進制轉(zhuǎn)換就可以了。如“歡迎”, UniCode 編碼是 6B22 8FCE ,這同時也就是轉(zhuǎn)換的結(jié)果,如果發(fā)送的串中有英文字符,那么在前面補全 00 ,以保證一個字符對應(yīng)兩個字節(jié)。

 

4、PDU 串的用戶信息 (TP-UD) 段最大容量是 140 字節(jié),所以在這三種編碼方式下,可以發(fā)送的短消息的最大字符數(shù)分別是 160 、 140 和 70 。這里,將一個英文字母、一個漢字和一個數(shù)據(jù)字節(jié)都視為一個字符。

 

三、地址編碼

短信發(fā)送中都會涉及到短信地址的問題,他們的編碼規(guī)則是一致的 , 簡單來說就是 BCD8421碼編碼。

如: 08 91  6808501505F0 ,

08 :地址長度,(號碼類型 + 號碼長度) /2 的十六進制表示

91 :號碼類型

683108501505F0 :號碼,實際號碼應(yīng)為: +8613805515500 ,號碼處理方法為 , 如果為 +86 開始 , 將 + 號去掉 , 然后判斷是否為偶數(shù) , 不是在末尾補 F, 然后將奇數(shù)位和偶數(shù)位互換

 

四、編碼示例

1、發(fā)送信息的 PDU 串:

用手機寫一條短信息,發(fā)送手機號碼為 13605696031 ,信息內(nèi)容為“ Hello World! ”。通過執(zhí)行 AT + CMGL=2 可以讀出此條信息。

 

AT+CMGL=2 {讀未發(fā)短信息} +CMGL: 1,2,,24 {1表示信息個數(shù),2表示未發(fā)信息,24表示信息總?cè)萘縸 08 91 683108501505F0 11 00 0B 81 3106656930F1 0000FF 0B E8329BFD06DDDF723619 OK

 

下面分析這條信息:

08 短信息中心地址長度。(短信息中心號碼類型 + 短信息中心號碼長度 /2 的十六進制表示)
91 短信息中心號碼類型, 91 是 TON/NPI 。 TON/NPI 遵守 International/E.164 標準,指在號碼前需加‘+’號 ; 此外還可有其他數(shù)值,但 91 最常用。
683108501505F0 短信息中心號碼,是所使用的服務(wù)中心地址。由于位置上略有處理,實際號碼應(yīng)為: 8613805515500( 字母 F 意指長度減 1), 這是作者所在地 GSM 短信息中心的號碼。 ( 號碼處理方法為 , 如果為 +86 開始 , 將 + 號去掉 , 然后判斷是否為偶數(shù) ,不是在末尾補F, 然后將奇數(shù)位和偶數(shù)位互換 )
11 文件頭字節(jié) (header byte, 是一種 bitmask) 。這里 11 指正常地發(fā)送短信息。
00 信息參考號。( TP-MR )
0D 被叫號碼長度。被叫號碼長度的十六進制表示。
81 被叫號碼類型。
3106656930F1 被叫號碼,也經(jīng)過了移位處理,實際號碼為 13605696031 。
00 協(xié)議標識 (TP-PID),是普通 GSM 類型,點到點方式
00 用戶信息編碼方式 (TP-DCS), 7-bit 編碼( 08 : UCS2 編碼)
FF 有效期 (TP-VP),短信的有效時間
0B 短信息長度
E8329BFD06DDDF723619 短信息內(nèi)容“ Hello World! ”。

 

2、接收信息的 PDU 串

讀取以上發(fā)送出來的短信,可以收到如下信息 ,

接受到來自 13600554267 的“歡迎”PDU 串為: 08 91 683108503705F0 04 0D 91 683106504562F7 00 08 30507080635400 046B228FCE。

對以上的 PDU 串分析如下表:

 

含義 說明
08 SMSC 地址信息的長度 共 8 個八位字節(jié) ( 包括 91)
91 SMSC 地址格式 (TON/NPI) 用國際格式號碼 ( 在前面加 ‘+’)
683108503705F 0 SMSC 地址 8613800573500 ,補 ‘F’ 湊成偶數(shù)個
04 基本參數(shù) (TP-MTI/MMS/RP) 接收,無更多消息,有回復地址,如果為 00 ,就沒有以下關(guān)于回復地址的三個段
0D 回復地址數(shù)字個數(shù) 共 13 個十進制數(shù) ( 不包括 91 和 ‘F’)
91 回復地址格式 (TON/NPI) 用國際格式號碼 ( 在前面加 ‘+’)
683106504562F 7 回復地址 (TP-RA) 8613600554267 ,補 ‘F’ 湊成偶數(shù)個
00 協(xié)議標識 (TP-PID) 是普通 GSM 類型,點到點方式
08 用戶信息編碼方式 (TP-DCS) UCS2 編碼(即中文)
30507080635400 時間戳 (TP-SCTS) 2003-5-7 08:36:45 +8 時區(qū)
04 用戶信息長度 (TP-UDL) 實際長度 4 個字節(jié)
6B228FCE 用戶信息 (TP-UD) “ 歡迎 !”

 

五、接收短消息

一般有兩種接收模式

1 .AT+CNMI=2,1,0,0,0 接受并存到 SIM 串口接收到以下信息: +CMTI:"SM",X AT+CMGR=X回車   (從X存儲區(qū)讀短消息) AT+CMGD=X回車   (從X存儲區(qū)刪除短消息) PDU狀態(tài): at+cmgf=0 OK +CMTI: "SM",1 at+cmgr=1 +CMGR: 0,,24 0891683108501705 F0240D91683157805300F50000502082000281000462F11804 OK 文本狀態(tài): +CMGR: "REC READ","+86 13750835005",,"05/02/28,0:20:18+00" bbc    OK 2 .AT+CNMI=2,2,0,0,0 接受并直接到串口 串口接受到以下信息: +CMT: "+8613501154105",,"01/09/13,11:04:09+32" AAA   

 

 

附錄:關(guān)于PDU模式發(fā)送短信:

 

      第一,對模塊寫入 AT+CMGF=0<回車>   的AT命令(<回車> 要用 /r 來實現(xiàn)),之后應(yīng)該得到一個 OK 響應(yīng),才能繼續(xù)進行下一步;

      第二,對模塊寫入 AT+CMGS=<length><回車>   的AT命令(其中 <length> 是一個數(shù)字,該數(shù)字是代表了PDU串中某一部分的長度,這一部分就是指除了SMSC地址之外的那一部分),之后應(yīng)該得到一個 /r/n> /r/n   響應(yīng)(特別要注意:/r是回車,/n是換行,>是一個大于號,>后面還有一個空格?。拍芾^續(xù)進行下一步;

      第三,可以開始寫入要發(fā)送的內(nèi)容了。這一部分只是PDU串中的一部分,并不是完整的PDU串(如前所述,去掉了SMSC地址那一部分),這一部分要以 Ctrl+Z 結(jié)尾,但是我們要知道,在字符串中要帶上 Ctrl+Z 的話,必須是用ACSII碼。Ctrl+Z的ASCII碼是16進制的 1A ,所以你可以在你的字符串后面用strcat函數(shù)附加上 "/x1A " 來實現(xiàn)。

這樣之后,如果發(fā)送成功,你就會收到GSM模塊的一個發(fā)送成功的響應(yīng),形如:

          +CMGS: 246

 

          OK

      如果只有一個“OK”響應(yīng),沒有類似于“+CMGS: 246”的部分,則并不能發(fā)送成功!所以,當你只收到一個 OK 響應(yīng)的時候,那肯定是哪里出錯了。

依依成人精品视频在线观看| 国产精品亚洲精品| 亚州丝袜精品熟女| 亚洲成AV人片在线观看ww| 在线一在线二| 午夜精品一区二区三区在线观看 | 91福利看线看视频| 粉嫩久久久久久久极品| 人妻色呦呦| 无码高清人妻| 男女超碰啪| 四虎2021新入囗| 国产精品一区二区三区妓女| 偷窃自拍9999| 国产老妇性一交一乱| 日韩aⅤ天堂| 国产性爱av| 九九热高清无码破解| 美女久久久久| 高清综合AV| 国产片肛交| 无码人妻一区二区中文| a 天堂无码| 亚洲AV无码专区亚洲AV桃| 亚洲第一线上天堂AV| 亚洲理论精品午夜电影 | 免费国产乱理伦片在线观看| 日韩中个人字幕在浅| 被男狂揉吃奶胸高潮视频在线观看| 91久久91| 日韩人妻无码精品久久免费| 玖玖xxxx| 熟女终合| 女人扒开屁股爽桶30分钟| 国产精品毛片A久| 欧美日韩亚洲自拍偷拍| 日韩欧美激情小说| 色欲直射一区二区三区| 小少妇BBBBBBBBBBBB| 五月天丁香久久婷婷| 亚洲第一二三四区|