本站文件搜索 :輸入關鍵字,查找本站您所需要的文件! 本網站已經開通手機終端,手機訪問http://www.cpvyin.tw 轉至對應的WebApp域名。
當前位置:首頁 > 電腦設計 > 電腦設計技巧 > 詳細內容
Delphi實現串口編程收發短信
發布時間:2015-2-12  閱讀次數:3317  字體大小: 【】 【】【

Delphi實現串口編程收發短信

 

現在網上有很多軟件可以實現短信息服務,不外乎兩種情況,一種是通過短信網關,比如新浪網,網易都提供這方面的服務,這種方法實現起來比較簡單,所需資源較少的,但是對于網站的依賴性太強,對網絡的依賴同樣無法避免,不適用于項目開發,而對于個人而言,有些短信網站收費不透明,會造成不必要的損失。另外一種就是手機連電腦,通過串口操作手機收發短信。這是目前比較適合于小項目開發的一種方法,所需硬件包括一款手機,以及相應的數據線或是紅外線適配器.該方法編碼簡單,只需對AT指令和串口編程比較熟悉就可以實現,而且對硬件需求不高。      


   本文討論的是后者的方法, 通過這種方法收發短消息又分為三種模式:Block模式、Text模式和PDU模式。使用Block機生產廠家提供驅動支持,這種方法現在很少用了。Text Mode是純文本方式,可使用不同的字符集,從技術上說也可用于發送中文短消息,但國內手機基本上不支持,主要用于歐美地區,也不在本文討論范圍之列。PDU串表面上是一串ASCII碼,由‘0’-‘9’、 ‘A’-‘F’這些數字和字母組成。它們是8位字節的十六進制數,或者BCD碼十進制數。PDU串不僅包含可顯示的消息本身,還包含很多其它信息,如SMS服務中心號碼、目標號碼、回復號碼、編碼方式和服務時間等。


1.PDU編碼解碼


  在PDU Mode中,可以采用三種編碼方式來對發送的內容進行編碼,它們是7-bit、8-bit和UCS2編碼。7-bit編碼用于發送普通的ASCII字符,它將一串7-bit的字符(最高位為0)編碼成8-bit的數據,每8個字符可“壓縮”成7個;8-bit編碼通常用于發送數據消息,比如圖片和鈴聲等;而UCS2編碼用于發送Unicode字符。PDU串的用戶信息(TP-UD)段最大容量是140字節,所以在這三種編碼方式下,可以發送的短消息的最大字符數分別是160、140和70。這里,將一個英文字母、一個漢字和一個數據字節都視為一個字符。


   需要注意的是,PDU串的用戶信息長度(TP-UDL),在各種編碼方式下意義有所不同。7-bit編碼時,指原始短消息的字符個數,而不是編碼后的字節數。8-bit編碼時,就是字節數。UCS2編碼時,也是字節數,等于原始短消息的字符數的兩倍。


   下面介紹的內容,是在PDU Mode下發送和接收短消息的實現方法。發送和接收的PDU串,結構是不完全相同的。我們先用實際的例子說明PDU串的結構和編排方式。


(1) 發送信息的PDU串


中文:向手機13600554267發送中文“歡迎”兩字,格式如下:   0011000B913106504562f7000810046B228FCE英文:向手機13600554267發送英文“hellohello”十字符,格式如下:


0011000B913106504562f70000AA0AE8329BFD4697D9EC37


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


分段

含義

說明

00

SMSC地址信息的長度

8613800250500,補‘F’湊成偶數個

11

基本參數(TP-MTI/VFP)

發送,TP-VP用相對格式

00

消息基準值(TP-MR)

0

0B

目標地址數字個數

13個十進制數(不包括91‘F’)

91

目標地址格式(TON/NPI)

用國際格式號碼(在前面加‘+’)

3106504562f7

目標地址(TP-DA)

8613851872468,補‘F’湊成偶數個

00

協議標識(TP-PID)

是普通GSM類型,點到點方式

08

用戶信息編碼方式(TP-DCS)

UCS2編碼(007-bit編碼)

10

有效期(TP-VP)

短信的有效時間

04

用戶信息長度(TP-UDL)

實際長度4個字節

6B228FCE

用戶信息(TP-UD)

歡迎

以上內容是對中文信息的表示,需要注意的是“歡迎“兩字,在實際長度計算的時候是4,而非2。因為UCS2編碼時計算長度為原始短消息的字符數的兩倍。而發送的”hellohello“英文短信,與其區別在于編碼方式不同,以及長度計算有點差別,請自行分析。


(2)接受信息的PDU串


讀取以上發送出來的短信,可以收到如下信息,接受到來自13600554267的“歡迎“PDU串為:0891683108503705F0040D91683106504562F7000830507001021500046B228FCE 。而接受到的“hellohello“PDU串為:


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


含義

說明

08

SMSC地址信息的長度

8個八位字節(包括91)

91

SMSC地址格式(TON/NPI)

用國際格式號碼(在前面加‘+’)

683108503705F0

SMSC地址

8613800573500,補‘F’湊成偶數個

04

基本參數(TP-MTI/MMS/RP)

接收,無更多消息,有回復地址

0D

回復地址數字個數

13個十進制數(不包括91‘F’)

91

回復地址格式(TON/NPI)

用國際格式號碼(在前面加‘+’)

683106504562F7

回復地址(TP-RA)

8613600554267,補‘F’湊成偶數個

00

協議標識(TP-PID)

是普通GSM類型,點到點方式

08

用戶信息編碼方式(TP-DCS)

UCS2編碼(即中文)

30507001021500

時間戳(TP-SCTS)

2003-3-12 08:36:45  +8時區

04

用戶信息長度(TP-UDL)

實際長度4個字節

6B228FCE

用戶信息(TP-UD)

歡迎!”

2.PDU的編碼與解碼


  (1)英文編碼與解碼


缺省的GSM字符集為7位編碼,ASCII碼為8位編碼,編碼就是將8位ASCII編碼轉換為7位編碼。例如:1234 編碼后得到31D98C06。將“1234”用二進制表示后,轉為7位編碼如下:


8位編碼 00110001 00110010 00110011 00110100


7位編碼 00110001 11011001 10001100 00000110


通過例子可以看出,將ascii8位編碼的Bit8去掉,依次將下7位編碼的后幾位逐次移到前面,形成新的8位編碼。解碼是上面的逆向過程,就是將7位字符編碼轉換為8為字符編碼。


  (2)中文編碼與解碼


中文編碼較為簡單,就是將GB2312的中文編碼轉換為Unicode編碼即可。解碼就是將Unicode編碼轉換為GB2312的中文編碼即可。


在日常短信收發中,中文短信居多,而且,英文短信也可以作為中文短信來收發,如果,程序要求不高,所有短信均可使用中文編碼。


3.常用GSM AT命令


串口連接手機實現短信收發須通過相應的GSM AT命令來實現的,用AT命令可以實現幾乎所有功能,本文只介紹和短信收發相關的幾條AT命令,相關命令如下表:


AT+CMGL

List SMS message from preferred store(列出SIM卡中的短消息PDU/text:   0/REC UNREAD-未讀,1/REC READ-已讀,2/STO UNSENT-待發,3/STO SENT-已發,4/ALL-全部的)

AT+CMGR

Read SMS message(讀短消息)

AT+CMGS

Send SMS message(發送短消息)

AT+CMGD

Delete SMS message(刪除SIM卡內存的短消息)

AT+CPMS

Preferred SMS message storage(選擇短消息內存)

(1)使用方法


AT+CMGL為根據參數列出滿足參數的所有短信,使用方法比較簡單,只須在超級終端里面直接輸入:AT+CMGL=X<ENTER>,X表示0、1、2、3、4等數字。<ENTER>為回車。


AT+CMGR為讀取單條的短信,使用和AT+CMGL差不多,也是AT+CMGL=X<ENTER>,但是后面的X所表示的意義同,這里的X表示你所要讀取的短信的索引號。經過測試,X的值也是有范圍的,即從一開始到當前所選擇的存儲器的最大存儲能力,如作者的西門子6618,在選擇sim卡讀取的時候,范圍是:1-50;在選擇sim卡讀取的時候,范圍是:1-25。如果超出以上范圍,將返回error;如果不超出上面范圍,但是讀取的索引號沒有相應短信,將返回:+CMGR: 0,,0。


AT+CMGS為發送短信的指令,使用方法稍微復雜一些。首先輸入AT+CMGS=X<ENTER>,然后系統出現提示:>,即可輸入你所要發送短信的PDU信息,最后以<CTRL>+Z結束。如向手機13600554267發送中文“歡迎”兩字,格式如下其PDU串是: 0011000B913106504562f7000810046B228FCE,那么AT+CMGS=X處的X為18,計算方法是除掉最前面的“00“,余下的為36個字符,在除以2得18。


AT+CMGD為刪除單條短信的指令,使用方法和AT+CMGR同,其X值也和AT+CMGR同意義。


AT+CPMS為選擇短信存儲位置的指令,AT+CPMS=ME為選擇手機讀取短信,AT+CPMS=SM為選擇SIM卡讀取。


4.串口連接手機測試


以西門子6618加數據線為例,本文所有設計到數據參數,均在西門子6618下測試通過。


(1)串口連接:用串口線連接手機與電腦串口,打開超級終端,選擇相應的串口,將端口參數設置為:每秒位數(B)115200;數據位(D)8;奇偶校驗(P)無;停止位(S)8;  數據流控制(F)硬件。


(2)連接測試


輸入“AT”然后回車,屏幕上返回“OK”表明計算機與西門子6618已連接成功,西門子6618能夠正常工作。這時就可以測試各類AT命令(如本文提到的各AT命令)。


5.程序實現


(1)啟動delphi5,安裝串口操作控件SPCOMM(具體下載以及安裝此處不再詳述,具體請查閱大富翁論壇http://www.delphibbs.com),添加相關控件如下圖:



程序界面分為三大部分,最上面為連接手機時的參數設置;中間為at命令測試以及返回結果的顯示,所有用到的at命令記錄都存放于“歷史記錄”;下面為手機短信的收發與操作。


(2)代碼


spcomm的操作,添加的spcomm的name屬性設置為mycomm。mycomm的啟動停止為:mycomm.StopComm,mycomm.StartComm。mycomm的啟動代碼如下:


try


   mycomm.StopComm;


   mycomm.StartComm;


 except


   Showmessage('串口打開失敗!');


   Exit;


end;    


讀寫串口程序實現不難,無非是先向串口寫入一串數據,然后根據串口返回的數據得到相應內容。寫串口的指令可以用以下方式完成


sendstring:=AT指令+chr($0d)+chr($0a) ;


mycomm.WriteCommData(pchar(sendstring),Length(sendstring));


對于象發送短信AT+CMGS這樣的特殊指令,完成一個完整指令,需要兩次操作。


s:= 'at+cmgs='+長度+chr($0d)+chr($0a);


mycomm.WriteCommData(pchar(s),Length(s));


sleep(100);


s:=PDU信息+chr($1A);


mycomm.WriteCommData(pchar(s),Length(s));


具體短信內容轉到PDU信息用到的編碼函數chinese_code見下:(英文解碼函數請自行分析編寫)


function chinese_code(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;


讀串口為在寫入串口一定數據后,根據串口的數據返回讀取。故我們可以在mycomm的onReceiveData事件時讀取內容,代碼如下:


f:=Tfilestream.Create(extractfilepath(application.exename)+'log.txt',fmopenwrite);


f.Seek(0,sofromend);


f.Write(buffer^,bufferlength);


f.Free;//將所有串口的數據寫入log.txt作為歷史記錄


SetLength(S, BufferLength);


move(buffer^,pchar(s)^,bufferlength)  ;


result_memo.Lines.Add(s);


此處可以根據相應條件對串口返回的數據寫入MEMO后做相應處理,AT+CMGL返回的數據可以用下面的DecodeChinese函數處理即可得到短信內容。DecodeChinese函數代碼如下:(英文解碼函數請自行分析編寫)


function DecodeChinese(Inputstr:String):String;


var Buf:array[0..300] of widechar;


   i: Integer;


begin


 for i:= 0 to (Length(InputStr) div 4) - 1 do


 Buf[i] := WideChar(StrToInt('$'+Copy(InputStr,i*4+1,4)));


 Buf[i] := #0;


 Result := WideCharToString(Buf);


end;


6.廣泛的應用


GSM在短信息方面的應用最具優勢,具有永遠在線、不需撥號、價格便宜、覆蓋范圍廣等特點,特別適用于需頻繁傳送小流量數據的應用,如車輛調度、安全、導航、監控、監測等領域。對于一些企業來說,用來作為信息發布平臺也是一種捷徑。



 

 

 


我要評論
  • 匿名發表
  • [添加到收藏夾]
  • 發表評論:(匿名發表無需登錄,已登錄用戶可直接發表。) 登錄狀態:未登錄
最新評論
所有評論[1]
    暫無已審核評論!


電腦技巧學習網站版權所有  地址:廣州市海珠區
       本站部分有關軟件和系統的內容和觀點來自網絡,不代表本站觀點!特此公告!電腦技巧學習論壇,真誠歡迎熱愛探討電腦技巧的朋友加入電腦技巧學習論壇,將你的觀點、見解和作品分享給網友們!電腦技巧網,提供計算機知識,電腦使用技巧,電腦基礎知識,讓電腦愛好者可以快速學到電腦知識!
 注意事項:電腦不要24小時通電,偶爾會遭遇雷雨天氣。會損壞電腦。 


站內所有資源僅供學習與參考,請勿用于商業用途,否則產生的一切后果將由您自己承擔!

 copyright 2000-2109  ( dnjqxx.com ) All rights reserved   粵ICP備18150927號
廣告聯系|版權聲明|下載幫助|軟件發布| 網站地圖|

企業簡介 |總裁致辭|成長歷程|聯系我們|組織機構|企業文化

網站統計

广东26选5开奖号码