1.1. 基本知識短信開發(fā)指通過串口 at 命令驅(qū)動短信進行短信發(fā)送和接收操作。 在 java 中 主要使用 javax.comm 包進行開發(fā), sun 公司網(wǎng)上地址 : http://java./products/javacomm/ 使用工具 : windows 自帶超級終端
短信操作分為三種模式: block,pdu 和 Text 短信傳送有三種編碼: 7 位, 8 位, UniCode at 命令 ,at 命令是驅(qū)動短信設(shè)備的標準工業(yè)命令,除了業(yè)界的標準之外,每個廠商可能會對其進行擴展,不過一般來說,標準命令應(yīng)該夠用,這次用的是西門子 tc35i ,有專門的 at 命令文檔。
1.1.1. 相關(guān)文檔Gsm03.38 規(guī)范: Alphabets and language-specific information 著重介紹短信發(fā)送中對字符集的控制部分 Gsm03.40 規(guī)范: Technical realization of the Short Message Service (SMS) Point-to-Point (PP) 詳細介紹各種不同短信的不同實現(xiàn) Gsm07.05 規(guī)范: Use of Data Terminal Equipment - Data Circuit terminating;Equipment (DTE - DCE) interface for Short Message Service (SMS) and Cell Broadcast Service (CBS) ,介紹 at 的一些控制命令。 Gsm07.07 規(guī)范:著重介紹 at 的短信相關(guān)命令,可以說是 at 的 sms 規(guī)范。 1.1.2. Block 模式Block 模式基本已經(jīng)被 pdu 模式取代,沒有具體研究 1.1.3. Text 模式Text 模式比較簡單,但是支持的設(shè)備不是很全,而且對于中文似乎有些問題,在金笛的網(wǎng)站技術(shù)資料中似乎提到了一句不能實現(xiàn)中文。 AT + CGMF=1<CR> AT + CGMS= “ 13605696031 ” ,129<CR> 1.1.4. 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: 鏈路層。 從上述描述中我們可以清楚的看到,我們編程主要集中于傳輸層。
PDU 串的用戶信息 (TP-UD) 段最大容量是 140 字節(jié),所以在這三種編碼方式下,可以發(fā)送的短消息的最大字符數(shù)分別是 160 、 140 和 70 。這里,將一個英文字母、一個漢字和一個數(shù)據(jù)字節(jié)都視為一個字符。
1.2. SMS 用戶數(shù)據(jù)的編碼方法1.2.1. 英文 7 位編碼
圖片不能正確顯示 由于這樣的移位,我們可以看到我們能發(fā)的最多英文字符等于: 140*8/7 = 160 。 1.2.2. 數(shù)據(jù) 8 位編碼8-bit 編碼通常用于發(fā)送數(shù)據(jù)消息,比如圖片和鈴聲等; 1.2.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é)。 1.2.4. Wap-push 中的中文編碼做 wap-push 短信的時候有些問題了,開始的時候也按照 Unicode 編碼處理,總是失敗,后來才發(fā)現(xiàn),有個編碼字段設(shè)為了 uft-8 ,所以在這種情況下,還是可以出現(xiàn)其他編碼方式的。
1.3. 短信報頭分析1.3.1. 短信類型詳細請參考 gsm 0438 規(guī)范和 gsm0440 規(guī)范,里面有詳細的關(guān)于各種短消息類型的描述。 在 sms 中到底支持多少種類型的短信,短信類型由什么進行控制,這是我們在這里需要著重介紹的問題。 在傳輸層來分,一共有六大短信類型: SMS-DELIVER , SMS-DELIVER-REPORT , SMS-SUBMIT , SMS-SUBMIT-REPORT , SMS-STATUS-REPORT , SMS-COMMAND ,這六種短信類型,由短信中心地址后的第一個字節(jié)的最低兩位控制。
也就是說,每個短信在短信中心地址之后的第一個字節(jié)的最低兩位是至關(guān)重要的。他決定了如何讀這條短信(結(jié)合是發(fā)送的,還是接收的) 1.3.2. 地址編碼短信發(fā)送中都會涉及到短信地址的問題,他們的編碼規(guī)則是一致的 , 簡單來說就是 BCD8421碼編碼。 如: 08 91 683108501505F 0 , 08 :地址長度,(號碼類型 + 號碼長度) /2 的十六進制表示 91 :號碼類型 683108501505F 0 :號碼,實際號碼應(yīng)為: 8613805515500 ,號碼處理方法為 , 如果為 +86 開始 , 將 + 號去掉 ,然后判斷是否為偶數(shù) , 不是在末尾補 F, 然后將奇數(shù)位和偶數(shù)位互換 1.3.3. TP-DCS( 數(shù)據(jù)編碼格式 )這個字節(jié)比較特殊,表明整個短信的字符編碼,數(shù)據(jù)內(nèi)容等信息。詳細說明參考 gsm03.38 規(guī)范。 1.3.4. 第一個字節(jié)Pdu 編碼的第一個字節(jié)比較有意思,這個字節(jié)會根據(jù)六種不同的短信按位有不同的意思,拿句專業(yè)一點的話來說,叫bitmask. 用圖來大概描述一下,詳細參考 gsm0340 的 9.2.3 段。
1.3.5. TP-PID (協(xié)議標識)在這個里面還有一個字節(jié)比較特殊,就是協(xié)議標識。 一般都是 00 ,表示點到點的標準短信。 1.3.6. 超長短信參考 gsm0340 的 9.2.3 .24TP_UD 部分,這個部分中間的一種情況就是描述超長短信的處理。 長短信關(guān)鍵涉及一個數(shù)據(jù)報頭的問題,數(shù)據(jù)報頭由“長度”和多個“數(shù)據(jù)元素”組成。 1.3.7. Wap-push 短信WAP 的推送協(xié)議中定義了服務(wù)指示( SI : Service Indication )和服務(wù)加載( SL : Service Load )兩項服務(wù),以給用戶和網(wǎng)絡(luò)運營者更多的選擇。服務(wù)指示是將新信息的指示和相關(guān)的通用資源標識符( URI )推送給用戶,由用戶選擇是立即處理信息還是以后處理。服務(wù)加載是將一項服務(wù)的 URI 推送給用戶,然后客戶端自動地使用 PULL 技術(shù)根據(jù)該 URI 啟動服務(wù)。兩種服務(wù)的區(qū)別在于用戶是否介入推送信息的處理過程。 SL 對推送信息的處理對用戶來說是透明的,而 SI 則在指示用戶的同時,請用戶對隨后的處理做出選擇。 Wap-push 短信的核心不同之處就在于: 1、 含有數(shù)據(jù)報頭,也就是 TP_UDHI 位為 1 ,一般來說 pdu 的第一個字節(jié)發(fā)送時為 51 ,接收時為 44 。 2、 TP_DSC 字節(jié)不同,一般為 F5 ,表明字符集為 8 位,短信類型為 Class 1; 詳細解釋參看 gsm03.38 的第四章。 1.4. 編碼示例1.4.1. 發(fā)送信息的 PDU 串:用手機寫一條短信息,發(fā)送手機號碼為 13605696031 ,信息內(nèi)容為“ Hello World! ”。通過執(zhí)行 AT + CMGL=2 可以讀出此條信息。
AT + CMGL=2 { 讀未發(fā)短信息 }
下面分析這條信息:
1.4.2. 接受信息的 PDU 串讀取以上發(fā)送出來的 短信貓發(fā)WAPpush短信: http://xjbclz./article/xjbclz-9-943385.html點到點短信WAPPUSH研究總結(jié) 1、 2、 圖一 點擊確定,選擇連接群發(fā)器的串口,如圖二所示 點擊確定,在彈出的對話框中選擇每秒位數(shù)9600(這個值因不同的群發(fā)器而有所不同,可以在4800,9600,19200這幾個值中試試看那個是對的),其他不要動,。如圖三 點擊確定。在超級終端的窗口中輸入at,如果出現(xiàn)OK說明連接成功。 3、 at+cmgf=0回車 at+cmgs=99回車 0051000BA13119907311F000 如圖四所示: 圖四 這時13910937110的手機就會收到一條短信,標題為“點擊進入樂視移動傳媒3G門戶”,內(nèi)容是一個鏈接,連接地址是http://3g./ 4、 at+cmgf=0的意思是設(shè)置短信發(fā)送格式為pdu格式。 at+cmgs=99的意思是發(fā)送一條短信,短信的總的長度(包括頭部和內(nèi)容)是99+1個字節(jié)(為什么是99+1個字節(jié),而不是99個字節(jié)我也不清楚)。 下面的 0051000BA13119907311F000 就是短信的內(nèi)容的,他是十六進制的編碼,一個字節(jié)用兩個十六進制字符表示。我們可以把它分成兩部分,一部分是短信頭部,他們是前面的30個字節(jié),即 0051000BA13119907311F000F5A755 我們把它分成幾段來解析 0051000BA1這一段是死的,我們不用管它。 3119907311F0這一段是手機號碼,它的編碼是這樣的,在手機號碼后面加一個F,然后兩位兩位倒過來寫,例如3119907311F0表示的手機號碼是13910937110 00F5A7這一段是死的,我們不用管它。 55 表示短信內(nèi)容部分的字節(jié)數(shù)。用十六進制表示,例如55表示內(nèi)容部分為85個字節(jié)。 至此,短信頭部結(jié)束,后面是短信的內(nèi)容部分 0B05040B8423F00003030101 我們也把它分成幾段來解析 0B05040B8423F00003030101 33672E6C6574762E636E2F表示的是鏈接的地址的http://后面的部分,這里實際上是“3g./”他是UTF-8編碼。 E782B9E587BBE8BF9BE585A5 000101這一段是死的,我們不用管它 注:獲得一個字符串的UTF-8編碼的十六進制表示的方法很簡單,在記事本里面編輯,保存的時候選擇編碼方式為utf-8,然后用hexedit打開,去掉前面三個字節(jié),將后面的字節(jié)的十六進制拷出來就行了。 5、附錄,下面對上面說的那幾個死的段落進行一些解析: a、 00 SMSC地址信息的長度,00表示不用設(shè)置SMSC地址,即用手機上設(shè)置短信中心號碼。 51 基本參數(shù)(TP-MTI/VFP) 不要求發(fā)送回復(fù) 00 消息基準值(TP-MR) 0B 對方電話的長度(即11位電話,一般的手機都是11位) A1 目標地址格式 A1表示為國內(nèi)格式 b、 00 協(xié)議標識(TP-PID) 是普通GSM 類型,點到點方式 F5 用戶信息編碼方式 (TP-DCS) A7 有效期(TP-VP) c、 0B WAP PUSH頭部的總長度 05040B8423F0表示接下來是一個WAP PUSH 00 表示是Concatenated Short Messages 03 長度 03 reference number 01 表示分成1個短信發(fā)送 01 當前包的序號 29060603AE81EA8DCA WSP 02 標記位 05 -//WAPFORUM//DTD SI 1.0//EN 6A UTF-8 00 標記開始 45 C6 08 0C href="http:// 03 字符串開始 d、內(nèi)容部分000103這一段的解析 00 URL 字符串結(jié)束 01 > 03 標題字符串開始 e、內(nèi)容部分000101這一段的解析 00 內(nèi)容描述字符串結(jié)束 01 01 6、編碼工具的使用 WAPPUSH編碼.html是我寫的一個編碼工具,雙擊以后,輸入手機號碼,地址內(nèi)容,標題內(nèi)容,點擊編碼,自動獲得編碼內(nèi)容,將編碼內(nèi)容拷貝到超級終端運行即可。如圖: |
|
來自: hh3755 > 《手機協(xié)議》