4 基于GSM通信的軟件接口
市場上提供的可供二次開發(fā)的標(biāo)準(zhǔn)的GSM模塊都支持GSM 07.05所定義的AT命令集的指令。因此,MCU通過UART串行接口直接向GSM模塊下發(fā)AT命令,就可以方便簡潔地實(shí)現(xiàn)基于GSM的短信息SMS的收發(fā)、查尋和管理。表1列出了與SMS相關(guān)的一些常用的GSM AT指令。
根據(jù)GSM 07.05的定義,SMS短信息的發(fā)送和接收模式共有三種:Block模式、基于AT命令的Text模式和基于AT命令的PDU模式。使用Block模式需要模塊生產(chǎn)廠家提供驅(qū)動支持;而用于中英文短信息傳送應(yīng)使用PDU模式,只傳送英文短信息(純文本格式)使用Text模式。Text模式的短信息發(fā)送和接收比較簡單,如不需要傳送中文則最好采用Text模式發(fā)送和接收短信息。
采用Text模式發(fā)送接收短信息的步驟分為初始化GSM模塊、發(fā)送文本短信息和接收短信息。下面一段簡單的程序給出一個示例:
PRINT “AT+CSCA=”;Chr(34);“+8613800210500”;Chr(34) ‘設(shè)置短信息中心號碼
PRINT “AT+CMGF=1” ‘設(shè)置為Text模式
PRINT “AT+CMGS=”;Chr(34);“13500123456”;Chr(34) ‘發(fā)送一條短信息
PRINT “This is a test SMS”;Chr(26)
PRINT “AT+CMGR=1” ‘讀取收到的一條‘短信息
該程序使用BASCOM-AVR高級語言編寫,其中PRINT語句的功能是通過URAT串行口發(fā)送字符串,Chr(34)代表ASCII字符(“),Chr(26) 代表ASCII字符(Ctrl-Z)。第一行語句設(shè)置短信息服務(wù)中心號碼,即通過串口發(fā)送以下字符串: AT+CSCA= “+8613800210500”,其中+8613800210500為上海地區(qū)中國移動的短信息服務(wù)中心號碼。第二行語句設(shè)置短信息發(fā)送格式:AT+CMGF=1,其中1表示采用Text模式。第三和第四行語句發(fā)送一條短信息到控制中心,AT命令的格式為:AT+CMGS= “13500123456”This is a test SMS《^Z》,其中控制中心的號碼為13500123456,短信息內(nèi)容為“This is a test SMS”,確認(rèn)控制字符為Ctrl-Z。第五行語句為讀取一條收到的短信息內(nèi)容:AT+CMGR=1,其中1表示收到的(在SIM卡中)第一條短信息。該指令發(fā)出后,如果GSM模塊中有接收到的短信息,則從UART接口返回如下信息(具體AT命令格式請參考GSM 07.05):
+CMGR: “REC UNREAD”,“+8613508485560”,,“02/10/16,15:37:28+32”
5 基于PDU模式的中文短信息接收
發(fā)送和接收中文或中/英文混合的短信息必須采用PDU模式。根據(jù)GSM 07.05的定義,只要控制器通過UART接口向GSM模塊下發(fā)AT命令,就可以直接讀取收到的PDU模式的短信息:
PRINT “AT+CMGF=0” ‘設(shè)置為PDU模式
PRINT “AT+CMGR=1”‘讀取接收的一條短信息
在PDU模式下,GSM通信模塊的回答格式為:
+CMGR: ,,
其中: stat表示該條短信息的狀態(tài),通常為0(未讀過,新的短信息)或1(已讀過);
Length為十進(jìn)制數(shù),表示pdu數(shù)據(jù)長度減去短信息服務(wù)中心地址長度,單位為字節(jié);
為回車換行;
pdu為PDU模式的數(shù)據(jù)包。
然后,要分析PDU數(shù)據(jù)包,根據(jù)PDU的數(shù)據(jù)格式將收到的中文信息和其它相關(guān)信息解析出來。
5.1 PDU數(shù)據(jù)包格式
PDU數(shù)據(jù)包由兩部分構(gòu)成,短信息服務(wù)中心地址(SMSC address)和TPDU,表2為PDU數(shù)據(jù)包的格式,其中一個數(shù)據(jù)單元為一個字節(jié)。
其中短信息服務(wù)中心號碼、發(fā)送源號碼、日期以及時間采用壓縮BCD碼表示,低位在前,高位在后。在本文的網(wǎng)絡(luò)補(bǔ)充版(http://www.dpj.com.cn)中給出了通過讀取短信息的AT命令(AT+CMGR=1)從GSM模塊讀到的一條PDU模式的短信息,并給出常見的數(shù)值與解釋。
5.2 PDU模式的純英文短信息解碼
PDU模式的純英文短信息編碼使用GSM字符集的7位編碼,此時TP-DCS的值為00。如短信息內(nèi)容為英文字符“Hi”,首先將各個字符轉(zhuǎn)換為7位的標(biāo)準(zhǔn)二進(jìn)制ASCII碼,然后要將后面字符的低位逐位調(diào)整到前面,補(bǔ)齊前面的差別。例如:“H”的二進(jìn)制ASCII碼為1001000,“i” 二進(jìn)制ASCII碼為1101001;顯然H的二進(jìn)制編碼不足八位,那么就將后面字符i的最后一位補(bǔ)足到H的前面,就成了11001000(C8),i剩下六位110100,前面再補(bǔ)兩個0,變成00110100(34),于是“Hi”就變成了兩個八進(jìn)制數(shù) C834。由于PDU模式的純英文短信息采用7位編碼,解碼不方便,因此對于只需發(fā)送和接收純英文字符和數(shù)字符號的應(yīng)用,最好采用Text模式發(fā)送和接收短信息。
5.3 中文短信息的解碼
由于中文字的編碼是采用2個字節(jié)的編碼,因此發(fā)送和接收中文或中英文混合的短信息只能采用PDU模式。但在GSM標(biāo)準(zhǔn)中,中文編碼采用UTF-8的編碼,不是目前國內(nèi)常用的GB-2312編碼,故還需要進(jìn)行中文編碼的轉(zhuǎn)換,才能與采用GB-2313漢字庫相配合顯示漢字字型。
由于UTF-8和GB-2312編碼之間不存在一一對應(yīng)的線性關(guān)系,因此只能采用查表的方式進(jìn)行轉(zhuǎn)換。下面給出一個由UTF-8到GB-2312編碼轉(zhuǎn)換的算法。
建立UTF-8和GB-2312兩個中文編碼表,表中數(shù)據(jù)項為2個字節(jié)長度的十六進(jìn)制的數(shù),代表一個中文編碼。兩個表的長度分別為14 890字節(jié)(2×7445)。UTF-8編碼表按數(shù)據(jù)項值從小到大排序,而在GB-2312編碼表中,與UTF-8相同位置處為相同漢字的GB-2312碼字。
軟件解碼過程為:每次從PDU模式SMS數(shù)據(jù)包的TP-UD中取出兩個字節(jié),采用二分法快速數(shù)據(jù)查找算法,在UTF-8編碼表中找到其所在位置,然后在GB-2312表的相同位置處讀取相對應(yīng)的GB-2312編碼。解碼流程如圖5所示。
二分法的最壞查找次數(shù)為lg2(n+1),UTF-8表的長度n為7445,固最壞查找次數(shù)為13次,就是說一個中文編碼由UTF-8到GB-2312的轉(zhuǎn)換最多經(jīng)過13次比較查找就可完成。這比采用簡單的順序查表要快的多,大大減少了查表所花費(fèi)的時間,非常適合在一般的嵌入式系統(tǒng)中使用。
盡管兩個漢字編碼表要占用近30 KB(如還需要GB-2312到UTF-8的轉(zhuǎn)換,則還要增加兩個表,共占60 KB),但由于采用了ATmega128單片機(jī),其片內(nèi)有128KB的程序存儲器,因此可將程序與表格放在一起。去掉60 KB的表格,仍有近70 KB的容量用于系統(tǒng)程序,因此完全不用外部擴(kuò)充存儲器(漢字字庫除外),大大簡化了硬件的結(jié)構(gòu)和設(shè)計。
結(jié) 語
本文的設(shè)計方案已應(yīng)用在我們研發(fā)的產(chǎn)品“車船載GPS-GSM衛(wèi)星定位無線通信移動終端”上,經(jīng)過多年的運(yùn)行和使用,證明系統(tǒng)工作穩(wěn)定可靠。2001年10月,在美國著名計算機(jī)應(yīng)用雜志《CIRCUIT CELLAR》舉辦的世界性電子設(shè)計競賽“Design Logic 2001 Contest”中,該產(chǎn)品獲得三等獎。
評論