程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> 使用Delphi發送手機短信息(SMS)

使用Delphi發送手機短信息(SMS)

編輯:Delphi

分  類:硬件

  語  種:簡體中文

  編輯器:Delphi5

  平  台:Win9x,Win2k/NT

  作品源代碼: -

  軟件或演示: -

  代碼大小: -

  軟件大小: -

  目前手機短信息的應用越來越廣泛,互聯網上提供短信息發送的站點也越來越多,但一些站點的服務並不盡如人意,往往發出去的短信息石沉大海。最可靠的發送方法當然是用手中的手機了,如果設置了狀態報告,更能確切知道對方是否收到了此條信息。手機發送盡管比較可靠, 但也存在輸入麻煩、效率低的問題。本文介紹一種方法,只要手機能夠與電腦相連(通過紅外端口或用手機數據線連接串行口,同時手機支持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為例,介紹如何實現短信息的發送。

  數據線連接

  首先,通過S3525數據線將手機與電腦串行口相連。然後,打開超級終端,選擇直接串行口連接,端口參數設為19200速率、無校驗、數據位8、停止位1。

紅外線連接

  如果使用帶紅外端口的計算機,可以設置與手機的無線連接。首先確認計算機紅外端口已打開,並將手機的紅外線和收傳真數據功能打開,對接紅外端口,計算機系統托盤上應當出現一個紅外設備西門子S35(如果沒有安裝紅外監視器,則不顯示)。然後,打開超級終端,選擇IrDa上的串行口。

  連接測試

  點擊超級終端工具條上的呼叫按鈕,輸入AT並回車,屏幕上如果出現OK則表明計算機與手機的連接成功,這時就可以輸入各類GSM AT指令了。

  如:查詢手機廠家,輸入AT+CGMI=,屏幕顯示SIEmens。

  通常情況下,執行測試命令AT+CMGS=?,如果返回OK,表明手機支持此指令。該指令的完整語法格式如下:

  If PDU mode (+CMGF=0)+CMGS=PDU is given

  如果短信息格式指令AT+CMGF返回的是0,則SMS格式為PDU模式,再執行AT+CMGS=<數據長度>命令後,手機返回“>”符號並等待輸入,輸入PDU數據並以^Z或Esc鍵結束。

  如果信息發送成功,則返回OK,並顯示信息號:

  +CMGS:

  如果發送失敗,則返回如下信息:

  +CMS ERROR:

  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是TONNPI。TONNPI遵守InternationalE.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//數據變換
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,設短信息內容為“中文短信息”。中文短信息的實現較簡單,只需將GB2312的中文編碼轉換為代碼頁為CP936的Unicode編碼即可。

  表3 中文編碼的實現過程

  通過Delphi的WideString類型轉換,可以巧妙地實現GB2312到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=1AT+CGMS=“13650246680”,129

  >Hello World!<^Z>




  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved