短信發送狀態報告(Status Report)的處理

短信發送狀態報告(Status Report)的處理
作者:劉濤
(原創,未經允許請勿轉載)
術語:

MS: Mobile Station

SC: Service Centre (used for SMS)

SMS: Short Message Service
SMSC: Short Message Service - Service Centre

SRStatus Report Message storage

 
       SMS作爲一種信息載體,不僅僅可以用來傳輸文本信息,還有很多別的用法,例如使用8位元傳輸push、鈴聲、乃至圖片,甚至可以於其上構建專屬TCP/IPWAP協議棧(事實上很少有人這麼去做)。按照ETSI GSM 03.40規範規定,SMS具有下面幾種類型:

1)         SMS-DELIVER

2)         SMS-DELIVER-REPORT

3)         SMS-SUBMIT

4)         SMS-SUBMIT-REPORT,

5)         SMS-STATUS-REPORT

6)         SMS-COMMAND

可以看出,短信的發送狀態報告(SMS-STATUSREPORT)是一種特定格式的短信,被用來從SCMS傳送狀態報告。下面我們以一條中國移動實際的狀態報告獲得過程爲例分析其組成元素。
第一步:發送短信前的準備工作
執行下列AT指令進行發送準備

1)        AT+CNMI=2,1,0,1,1

設置新消息到達時的指示方式,注意紅色字體1表示位代表狀態報告到達時進行提示,一般的模塊默認都是0,不提示狀態報告。

2)        AT+CMGF=0

設置PDU模式

3)        AT+CSCS=”UCS2”

設置UCS2字符集
第二步:發送短信
AT+CMGS=38
> 0031000B913158136777F70008FF18003C0030003000300031003E6D4B8BD577ED4FE156DE9988
+CMGS: 8
OK
注意:紅色字體部分31表示需要狀態報告,相應的11表示不需要狀態報告。
第三步:串口讀取到回饋
+CDS: 26
0006080D91683158136777F7602070416530006020704165300000
八位元
描述
00
SMSC長度,此處爲零,表示不含短消息中心號碼
06
First octet字節,即00000110B,表示這是一個status report
08
引用消息號碼,就是使用AT+CMGS發送短信成功時返回的那個+CMGS值,可以一一對應檢索狀態
0D91683158136777F7
對應短信接受方手機號碼 13853167777
60207041653000
SMSC接收到所發送短信的時間
60207041653000
SMSC處理並給出狀態的時間
00
對應發送短信的狀態,00表示成功
第四步:一點點拓展
到這裏我們已經成功的發送了一條要求狀態報告的短信,並且成功地收取到了它的狀態報告,告訴我們已經成功送達收信人。實際應用中,大部分的手機模塊對於狀態報告和普通短信的處理是有所不同的。按照協議的規定,狀態報告必須存放在可變內存(volatile memory)中,隨着SIM卡的更換進行清除。這樣限定了狀態報告無法和普通短信一樣存放在SIM中,這樣對我們有什麼影響哪?
大家知道,我們從手機(注意這裏不是SIM卡的提法)模塊中讀取短信時,一般使用三種方式:
1) 使用AT+CMGL進行列表
2) 使用AT+CMGR讀取指定短信
3) 實時監聽串口,直接獲得新短信內容
這樣,如果一個手機模塊本身不具備可變內存,也就意味着無法再使用12中的方法讀取狀態報告。反之手機模塊具備可變內存,那麼可以使用AT+CPMS設置CMGLCMGR操作的當前存儲空間後使用12中的方法,對於WAVECOM的模塊還需要使用AT+CNMI=2,1,0,2,1先設置狀態報告保存到專屬“SR”空間(不同廠家的模塊對於AT+CPMS使用的mem1mem2空間的定義名稱一般是不同的)。例如:

1)        AT+CNMI=2,1,0,2,1

2)        AT+CPMS=”SR”,”SM”

3)        … …


A:一個根據網上流傳較廣的短信解碼程序修改後的解析代碼片斷

        switch(getMaskByte(pDst->TP_FIRSTOCT, FOD_TP_MTI))

        {

            case SMS_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;

            case SMS_DELIVER:

            default:

                … …

}
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章