術語:字體
MS:Mobile Stationspa
SC:Service Centre (used for SMS)指針
SMS:Short Message Service圖片
SMSC:Short Message Service - Service Centre內存
SR:Status Report Message storage字符串
SMS做爲一種信息載體,不單單能夠用來傳輸文本信息,還有不少別的用法,例如使用8位元傳輸push、鈴聲、乃至圖片,甚至能夠於其上構建專屬TCP/IP及WAP協議棧(事實上不多有人這麼去作)。按照ETSI GSM 03.40規範規定,SMS具備下面幾種類型:get
<!--[if!supportLists]-->1) <!--[endif]-->SMS-DELIVERit
<!--[if!supportLists]-->2) <!--[endif]-->SMS-DELIVER-REPORTio
<!--[if!supportLists]-->3) <!--[endif]-->SMS-SUBMITsed
<!--[if!supportLists]-->4) <!--[endif]-->SMS-SUBMIT-REPORT,
<!--[if!supportLists]-->5) <!--[endif]-->SMS-STATUS-REPORT
<!--[if!supportLists]-->6) <!--[endif]-->SMS-COMMAND
能夠看出,短信的發送狀態報告(SMS-STATUSREPORT)是一種特定格式的短信,被用來從SC到MS傳送狀態報告。下面咱們以一條中國移動實際的狀態報告得到過程爲例分析其組成元素。
第一步:發送短信前的準備工做
執行下列AT指令進行發送準備
<!--[if!supportLists]-->1) <!--[endif]-->AT+CNMI=2,1,0,1,1
設置新消息到達時的指示方式,注意紅色字體1表示位表明狀態報告到達時進行提示,通常的模塊默認都是0,不提示狀態報告。
<!--[if!supportLists]-->2) <!--[endif]-->AT+CMGF=0
設置PDU模式
<!--[if!supportLists]-->3) <!--[endif]-->AT+CSCS=」UCS2」
設置UCS2字符集
第二步:發送短信
AT+CMGS=38
>0031000B913158136777F70008FF18003C0030003000300031003E6D4B8BD577ED4FE156DE9988
+CMGS:8
OK
注意:紅色字體部分31表示須要狀態報告,相應的11表示不須要狀態報告。
第三步:串口讀取到回饋
+CDS:26
0006080D91683158136777F7602070416530006020704165300000
八位元
描述
00
SMSC長度,此處爲零,表示不含短消息中心號碼
06
Firstoctet字節,即00000110B,表示這是一個status report
08
引用消息號碼,就是使用AT+CMGS發送短信成功時返回的那個+CMGS值,能夠一一對應檢索狀態
0D91683158136777F7
對應短信接受方手機號碼13853167777
60207041653000
SMSC接收到所發送短信的時間
60207041653000
SMSC處理並給出狀態的時間
00
對應發送短信的狀態,00表示成功
第四步:一點點拓展
到 這裏咱們已經成功的發送了一條要求狀態報告的短信,而且成功地收取到了它的狀態報告,告訴咱們已經成功送達收信人。實際應用中,大部分的手機模塊對於狀態 報告和普通短信的處理是有所不一樣的。按照協議的規定,狀態報告必須存放在可變內存(volatile memory)中,隨着SIM卡的更換進行清除。這樣限定了狀態報告沒法和普通短信同樣存放在SIM中,這樣對咱們有什麼影響哪?
你們知道,咱們從手機(注意這裏不是SIM卡的提法)模塊中讀取短信時,通常使用三種方式:
<!--[if!supportLists]-->1) <!--[endif]-->使用AT+CMGL進行列表
<!--[if!supportLists]-->2)<!--[endif]-->使用AT+CMGR讀取指定短信
<!--[if!supportLists]-->3)<!--[endif]-->實時監聽串口,直接得到新短信內容
這 樣,若是一個手機模塊自己不具有可變內存,也就意味着沒法再使用1和2中的方法讀取狀態報告。反之手機模塊具有可變內存,那麼可使用AT+CPMS設置 CMGL和CMGR操做的當前存儲空間後使用1和2中的方法,對於WAVECOM的模塊還須要使用AT+CNMI=2,1,0,2,1先設置狀態報告保存 到專屬「SR」空間(不一樣廠家的模塊對於AT+CPMS使用的mem1和mem2空間的定義名稱通常是不一樣的)。例如:
<!--[if!supportLists]-->1) <!--[endif]-->AT+CNMI=2,1,0,2,1
<!--[if!supportLists]-->2) <!--[endif]-->AT+CPMS=」SR」,」SM」
<!--[if!supportLists]-->3) <!--[endif]-->… …
附A:一個根據網上流傳較廣的短信解碼程序修改後的解析代碼片段
switch(getMaskByte(pDst->TP_FIRSTOCT,FOD_TP_MTI))
{
caseSMS_STATUS_REPORT:
gsmString2Bytes(pCloneSrc,&tmp, 2); //TP-Message-Reference
pDst->TP_MR= tmp;
pCloneSrc+= 2; // 指針後移
gsmString2Bytes(pCloneSrc,&tmp, 2); // 取長度
if(tmp& 1) tmp += 1; // 調整奇偶性
pCloneSrc+= 4; // 指針後移,忽略了回覆地址(TP-RA)格式
gsmSerializeNumbers(pCloneSrc,pDst->TPA, tmp); // 取TP-RA號碼
pCloneSrc+= tmp; // 指針後移
gsmSerializeNumbers(pCloneSrc,pDst->TP_SCTS, 14); // 服務時間戳字符串(TP_SCTS)
pCloneSrc+= 14; // 指針後移
gsmSerializeNumbers(pCloneSrc,pDst->TP_DT, 14); // 處理時間戳字符串(TP_DT)
pCloneSrc+= 14; // 指針後移
gsmString2Bytes(pCloneSrc,&tmp, 2); // TP-Status
pDst->TP_ST= tmp;
break;
caseSMS_DELIVER:
default:
… …
}轉自bbs.sendsms.cn