最近做了一個GPRS模塊的簡單測試,其中短消息方式比較簡單,同時也與其他GPRS模塊通用,現(xiàn)在將我的調(diào)試筆記寫下來。
短消息方式:
一、與短信相關(guān)的 AT 指令
AT+CMGC Send an SMS command(發(fā)出一條短消息命令)
AT+CMGD Delete SMS message(刪除 SIM 卡內(nèi)存的短消息)
AT+CMGF Select SMS message formate (選擇短消息信息收發(fā)格式: 0-PDU;1-文本)
AT+CMGL List SMS message from preferred store(列出 SIM 卡中的短消息
AT+CMGR Read SMS message(讀短消息)
AT+CMGS Send SMS message(發(fā)送短消息)
AT+CMGW Write SMS message to memory(向 SIM 內(nèi)存中寫入待發(fā)的短消息)
AT+CMSS Send SMS message from storage(從 SIN |M 內(nèi)存中發(fā)送短消息)
AT+CNMI New SMS message indications(顯示新收到的短消息)
AT+CPMS Preferred SMS message storage(選擇短消息內(nèi)存)
AT+CSCA SMS service center address(短消息中心地址)
AT+CSCB Select cell broadcast messages(選擇蜂窩廣播消息)
AT+CSMP Set SMS text mode parameters(設(shè)置短消息文本模式參數(shù))
AT+CSMS Select Message Service(選擇短消息服務(wù))
發(fā)送短消息有兩種方式:PDU和TEXT 模式
二、 PDU 模式下發(fā)送中英文短消息
AT+CMGF=0 //首先將短信息格式設(shè)為PDU 模式
AT+CSCS=“UCS2” //設(shè)置字符格式為UCS2 模式
AT+CSCA=”+86138XXXXXXXX”,145 //設(shè)置短消息服務(wù)中心地址
注:對于中國移動的短信服務(wù)中心號是+861380xxxx500,其中xxxx是你所在的長途電話區(qū)號,不足4位就補(bǔ)0,比如我所在的北京是010,補(bǔ)0后是0100,就應(yīng)該+8613800100500。
[PDU]數(shù)據(jù)單元格式定義為:
以下例子發(fā)送“你好”到13912345678
發(fā)送數(shù)據(jù)是:你好
Unicode譯碼為:4F60597D
AT+CMGS=019 //15(PDU 規(guī)約頭固定長度 15 字節(jié))+4(報文長度 4 個字節(jié))
> 0011000D91683119325476F8000801044F60597D [ctrl-Z]
00 //為SCA預(yù)留
11 // FO 設(shè)置PDU 類型
00 // MR 發(fā)送參考號
0D //DA 目的號碼長度
91 //DA 目的號碼類型
68 //DA 中國的區(qū)號
3119325476F8 //DA 目的號碼編碼
00 // PID 發(fā)送方式
08 //DCS 編碼模式
01 //VP 有效期
PDU 中用戶數(shù)據(jù)前的PDU 頭的長度是15 字節(jié)
04 //UDL 數(shù)據(jù)長度
4F60597D //UD 數(shù)據(jù)內(nèi)容Unicode 譯碼
例子中目的號碼是一種內(nèi)存編碼方式,將每兩位數(shù)據(jù)位置互換,余下最后單位的補(bǔ) F ,如13912345678 編碼為3119325476F8。用戶使用PDU 模式發(fā)送中文短消息時只需按照上述例子,改變 TPDU 的十進(jìn)制長度、手機(jī)號碼編碼、報文長度和報文內(nèi)容Unicode 譯碼即可。
設(shè)置DCS 編碼模式改變短消息發(fā)送等級:
按照GSM08.38 協(xié)議約定,PDU 中的DCS 字段(Bit7…0)用于設(shè)置短消息內(nèi)容的編碼方式 和發(fā)送等級, 具體為Bit4 用于決定Bit1 和 Bit0 的設(shè)置是否有效 (1 為有效, 0 為無效) ;Bit1和Bit0 均設(shè)置為0 表示短消息發(fā)送等級為0 等級, 即直接發(fā)送至終端而不存放在SIM卡; Bit3 設(shè)置為 1 且Bit2 設(shè)置為 0 表示短消息內(nèi)容為 UCS2 編碼。上例中 DCS 字段為 08,即表示短消息內(nèi)容為 UCS2 編碼且無發(fā)送等級;若改為 18 則表示短消息內(nèi)容為 UCS2 編碼且按0 等級發(fā)送,即直接發(fā)送至目的終端。
三、TEXT 模式發(fā)送短消息
TEXT模式只支持傳送英文及數(shù)字信息,但它的編碼要比PDU模式簡單很多,所以建議采用TXET模式發(fā)送和接受短消息。
1、TEXT模式下發(fā)送中文短消息
AT+CMGF=1 //首先將短信息格式設(shè)為 TEXT 模式
AT+CSCS=“UCS2” //設(shè)置字符格式為UCS2 模式:
AT+CSCA=”+86138XXXXXXXX”,145 //設(shè)置短消息服務(wù)中心地址
注:對于中國移動的短信服務(wù)中心號是+861380xxxx500,其中xxxx是你所在的長途電話區(qū)號,不足4位就補(bǔ)0,比如我所在的北京是010,補(bǔ)0后是0100,就應(yīng)該+8613800100500。
AT+CSMP=17,167,0,24 //設(shè)置短消息發(fā)送相關(guān)參數(shù):四參數(shù)分別為 FO、VP、PID 和 DCS,代表意義與 PDU 模式中參數(shù)相同,不同的是須以十進(jìn)制表示,24 表示短消息內(nèi)容為 UCS2 編碼且直接發(fā)送至目的終端,如改為 25 則表示短消息內(nèi)容為 UCS2 編碼且發(fā)送至SIM 卡存儲。
發(fā)送:AT+CMGS= 手機(jī)號碼編碼[CR]
收到[>]響應(yīng)后再發(fā)送
[報文內(nèi)容Unicode 譯碼][ctrl-Z]
以下例子發(fā)送“你好”到13912345678
發(fā)送數(shù)據(jù)是:你好
Unicode譯碼為:4F60597D
AT+CMGS=” 00310033003900310032003300340035003600370038” //直接輸入手機(jī)號碼編碼
> 4F60597D [ctrl-Z]
用戶使用TEXT 模式發(fā)送中文短消息時只需按照上述例子,改變手機(jī)號碼編碼和報文內(nèi)容的Unicode 譯碼即可。
2、TEXT模式下發(fā)送英文短消息
AT+CMGF=1 //首先將短信息格式設(shè)為 TEXT 模式
AT+CSCS=“GSM” //設(shè)置字符格式為GSM 模式
AT+CSCA=”+86138XXXXXXXX”,145 //設(shè)置短消息服務(wù)中心地址
注:對于中國移動的短信服務(wù)中心號是+861380xxxx500,其中xxxx是你所在的長途電話區(qū)號,不足4位就補(bǔ)0,比如我所在的北京是010,補(bǔ)0后是0100,就應(yīng)該+8613800100500。
AT+CSMP=17,167,0,240 //設(shè)置短消息發(fā)送相關(guān)參數(shù):四參數(shù)分別為 FO、VP、PID 和DCS,代表意義與PDU 模式中參數(shù)相同,不同的是須以十進(jìn)制表示,240 表示短消息內(nèi)容為默認(rèn) GSM 編碼且直接發(fā)送至目的終端,如改為 241 則表示短消息內(nèi)容為 GSM 編碼且發(fā)送至SIM 卡存儲。
發(fā)送:AT+CMGS= “13XXXXXXXXX” [CR]
收到[>]響應(yīng)后再發(fā)送
[報文內(nèi)容][ctrl-Z]
以下例子發(fā)送“Hello”到13912345678
報文是:Hello
AT+CMGS=” 13912345678” //直接輸入手機(jī)號碼
> Hello [ctrl-Z]
使用TEXT 模式發(fā)送英文短消息時只需按照上述例子,改變手機(jī)號碼和報文內(nèi)容即可。
以上為如何發(fā)送短信的方法,那又如何接受剛收到的短消息呢?接受剛收到的短消息有兩種方法:查詢終端方式和使用事件方式。查詢方式是先不處理網(wǎng)絡(luò)上 發(fā)來的信息,定期使用“AT+CMGL=0”命令讀取未讀取的短信,如果有就讀入,交給上級程序處理。然后將此短消息刪除,該方法簡單,但許多時候都在做 無用功,效率低下。實際中我們使用事件方式,通過AT+CNMI指令設(shè)置接收到的短信息存儲到SIM卡,并返回提示信息。
短消息類(class)的概念:根據(jù)指定儲存的位置,短消息分為class 0 - 3四個類。也可以不指定類(no class),由ME按默認(rèn)設(shè)置進(jìn)行處理,存儲到內(nèi)存或者SIM卡中。在TPDU的TP-DCS字節(jié)中,當(dāng)bit7-bit4為00x1, 01x1, 1111時,bit1-bit0指出消息所屬類:
00 - class 0:只顯示,不儲存
01 - class 1:儲存在ME內(nèi)存中
02 - class 2:儲存在SIM卡中
03 - class 3:直接傳輸?shù)絋E
GSM Modem一般都支持一條“AT+CNMI”指令,可用于設(shè)定當(dāng)有某類短消息到達(dá)時,如何處置它:只儲存在指定的內(nèi)存(易失的/非易失的)中,先儲存后通知TE,還是直接轉(zhuǎn)發(fā)到TE,等等。
"AT+CNMI"指令語法為
AT+CNMI=[<mode>[,<mt>[,<bm>[,<ds>[,<bfr>]]]]]
mode - 通知方式:
0 - 不通知TE。
1 - 只在數(shù)據(jù)線空閑的情況下,通知TE;否則不通知TE。
2 - 通知TE。在數(shù)據(jù)線被占用的情況下,先緩沖起來,待數(shù)據(jù)線空閑,再行通知。
3 - 通知TE。在數(shù)據(jù)線被占用的情況下,通知混合在數(shù)據(jù)中一起傳輸。
mt - 消息儲存或直接轉(zhuǎn)發(fā)到TE:
0 - 儲存到默認(rèn)的內(nèi)存位置(包括class 3)
1 - 儲存到默認(rèn)的內(nèi)存位置,并且向TE發(fā)出通知(包括class 3)
2 - 對于class 2,儲存到SIM卡,并且向TE發(fā)出通知;對于其它class,直接將消息轉(zhuǎn)發(fā)到 TE
3 - 對于class 3,直接將消息轉(zhuǎn)發(fā)到 TE;對于其它class,同mt=1
bm, ds, bfr的含義,請參考相關(guān)標(biāo)準(zhǔn)文檔。一般不需要去關(guān)心它們。
在程序中具體實現(xiàn)時,使用mode=2, mt="1",即AT+CNMI=2,1,0,0,0:比較簡單。對所有類型的短消息,只要在收到ME送來的"+CMTI"通知后,用"AT+CMGR"指令讀取消息內(nèi)容就行了。
舉例如下:
(藍(lán)色表示PC機(jī)發(fā)送的數(shù)據(jù),紅色表示模塊返回的數(shù)據(jù))
AT+CMGF=1 //設(shè)置短消息格式為TEXT格式
OK
AT+CCS=”CSM” //設(shè)置字符格式為GSM模式
OK
AT+CSCA=”+8613800100500”,145 //設(shè)置短消息服務(wù)中心地址
OK
AT+CNMI=2,1,0,0,0 //設(shè)置收到新短信存于SIM卡中并發(fā)CMTI通知
OK
+CMTI:”SM”,1 //收到了短信,自動彈出,其中1表示存在SIM中的序號
AT+CMGR=1 //讀取短信,其中1要與上面序號對應(yīng)
+CMGR:”REC UNREAD”,”8615810533873”,,”09/04/30,10:59:17+32”,145,36,0,0”8613800100500”,145,5
ABCD //收到來自手機(jī)15810533873的短信,內(nèi)容為ABCD
OK
AT+CMGD=1 //刪除短信,其中1為短信序號