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