轉一個手機開發的文章(來自開發人員俱樂部)

來源:互聯網
上載者:User
代碼:--------------------------------------------------------------------------------
目前手機簡訊息的應用越來越廣泛,互連網上提供簡訊息發送的網站也越來越多,但一些網站的服務並不盡如人意,往往發出去的簡訊息石沉大海。最可靠的發送方法當然是用手中的手機了,如果設定了狀態報表,更能確切知道對方是否收到了此條資訊。手機發送儘管比較可靠, 但也存在輸入麻煩、效率低的問題。本文介紹一種方法,只要手機能夠與電腦相連(通過紅外線連接埠或用行動數據線串連串列口,同時手機支援GSM AT指令集),就可以通過自行編製的簡訊息發送軟體,實現簡訊息的發送。
現在市場上的大多數手機均支援類似於Modem控制的GSM AT指令集,該指令集是由諾基亞、愛立信、摩托羅拉和HP等廠家共同為GSM系統研製的,其中包含了對SMS(Short Message Service)的控制。
GSM AT相關指令的介紹
與SMS有關的GSM AT指令如表1所示:

表1 相關的GSM AT指令
對SMS的控制共有三種實現途徑:
Block Mode;
基於AT命令的Text Mode;
基於AT命令的PDU Mode。
Text Mode比較簡單,多款諾基亞手機均支援該模式。西門子的手機大多隻支援PDU模式,PDU模式是發送或接收手機SMS資訊的一種方法,簡訊息本文經過十六進位編碼後被傳送。目前,PDU已取代Block Mode,因此本文主要探討PDU模式的發送。
電腦和手機的通訊
本文以西門子 S3568i為例,介紹如何?簡訊息的發送。
資料線串連
首先,通過S35/25資料線將手機與電腦串列口相連。然後,開啟超級終端,選擇直接串列口串連,連接埠參數設為19200速率、無校正、資料位元8、停止位1。
紅外線串連
如果使用帶紅外線連接埠的電腦,可以設定與手機的無線串連。首先確認電腦紅外線連接埠已開啟,並將手機的紅外線和收傳真/資料功能開啟,對接紅外線連接埠,電腦系統托盤上應當出現一個紅外線裝置西門子S35(如果沒有安裝紅外監視器,則不顯示)。然後,開啟超級終端,選擇IrDa上的串列口。
串連測試
點擊超級終端工具條上的呼叫按鈕,輸入AT並斷行符號,螢幕上如果出現OK則表明電腦與手機的串連成功,這時就可以輸入各類GSM AT指令了。
如:查詢手機廠家,輸入AT+CGMI=<CR>,螢幕顯示Siemens。
通常情況下,執行測試命令AT+CMGS=?<CR>,如果返回OK,表明手機支援此指令。該指令的完整文法格式如下:
If PDU mode (+CMGF=0)+CMGS=<length><CR>PDU is given <ctrl-Z/ESC>
如果簡訊息格式指令AT+CMGF返回的是0,則SMS格式為PDU模式,再執行AT+CMGS=<資料長度>命令後,手機返回“>”符號並等待輸入,輸入PDU資料並以^Z或Esc鍵結束。
如果資訊發送成功,則返回OK,並顯示資訊號:
+CMGS: <mr>
如果發送失敗,則返回如下資訊:
+CMS ERROR: <err>
PDU資料格式的分析
下面通過對儲存在手機中的待發資訊的分析,來介紹SMS PDU的資料格式。首先,用手機寫一條簡訊息,發送手機號碼為13605696031,資訊內容為“Hello World!”。通過執行AT+CMGL=2可以讀出此條資訊。
操作過程如下(斜體字元為響應資訊,{}內為注釋):
AT
OK
AT+CMGL=2 {讀未發簡訊息}
+CMGL: 1,2,,24 {1表示資訊個數,2表示未發資訊,24表示資訊總容量}
08 91 683108501505F0 11 00 0B 81 3106656930F1 0000A7 0B E8329BFD06DDDF723619
OK 
下面分析這條資訊:
08:簡訊息中心地址長度。
91:簡訊息中心號碼類型,91是TON/NPI。TON/NPI遵守International/E.164標準,指在號碼前需加‘+’號;此外還可有其他數值,但91最常用。
683108501505F0:簡訊息號碼,是所使用的服務中心地址。由於位置上略有處理,實際號碼應為:8613805515500(字母F意指長度減1),這是作者所在地GSM簡訊息中心的號碼。
11:檔案頭位元組(header byte,是一種bitmask)。這裡11指正常地傳送簡訊息。
00:資訊類型。
0B:被叫號碼長度。
81:被叫號碼類型。
3106656930F1:被叫號碼,也經過了移位處理,實際號碼為13605696031。
0000A7:簡訊息編碼類別型GSM Default Alphabet,如為中文則是000010。
0B:簡訊息長度。
E8329BFD06DDDF723619:簡訊息內容“Hello World!”。
簡訊息的編碼方法及編程實現
下面我們介紹純英文和純中文的資訊編碼方法。通過測試我們發現,每條發送的簡訊息前面部分均相同,只是被叫號碼和簡訊息內容有變化。
1.英文編碼
參見表2,設簡訊息內容為“Hello World!”。預設的GSM 字元集為7位編碼,可以簡單地理解為ASCII碼(ASCII值小於80Hex,因此,Bit8被忽略),依次將下一7位編碼的後幾位逐次移至前面,形成新的8位編碼,參見表2箭頭指示。需要注意的是第9行,移位計數已達7位,則直接將本編碼前加0。GSM並非支援所有的ASCII字元顯示。
表2 英文編碼的實現過程

下面是實現英文編碼的部分Delphi 5代碼:
//英文格式編碼,s為String
function Encode1(var s:String):String;
var
i,j,len:Integer;
cur:Integer;
t:String;
begin
Result:=‘’;
len:=Length(s);
//j 用於移位計數
i:=1;j:=0;
while i<=len do
begin
if i<len then
//資料變換
cur:=(ord(s[i]) shr j) or ((ord(s[i+1]) shl (7-j)) and $ff)
else
cur:=(ord(s[i]) shr j) and $7f;
FmtStr(t,‘%2.2X’,[cur]);
Result:=Result+t;
inc(i);
//移位計數達到7位的特別處理
j:=(j+1) mod 7;if j=0 then inc(i);
end;
end;  
2.中文編碼
參見表3,設簡訊息內容為“中文簡訊息”。中文簡訊息的實現較簡單,只需將??????的中文編碼轉換為字碼頁為CP936的Unicode編碼即可。
表3 中文編碼的實現過程

通過Delphi的WideString類型轉換,可以巧妙地實現??????到Unicode的編碼轉換(注意字碼頁和作業系統相關聯)。下面是實現中文編碼的部分Delphi 5代碼:
// 中文格式編碼,s為Unicode String
function Encode2(var s:WideString):String;
var
i,len:Integer;
cur:Integer;
t:String;
begin
Result:=‘’;
len:=Length(s);
i:=1;
while i<=len do
begin
cur:=ord(s[i]);
//BCD轉換
FmtStr(t,‘%4.4X’,[cur]);
Result:=Result+t;
inc(i);
end;
end;
小 結
以上介紹了PDU格式的簡訊息編碼。建議英文資訊長度不超過140個字元,中文資訊不要超過54個漢字。如果使用能夠支援文本方式的手機進行發送,實現起來更簡單。如發送“Hello World!”,用如下的AT指令即可:
AT+CGMF=1<CR>AT+CGMS=“13605696031”,129<CR>
>Hello World!<^Z>


相關文章

Cloud Intelligence Leading the Digital Future

Alibaba Cloud ACtivate Online Conference, Nov. 20th & 21st, 2019 (UTC+08)

Register Now >

Starter Package

SSD Cloud server and data transfer for only $2.50 a month

Get Started >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。