最近在工作中遇到一個比較怪異的現象,在某些省區與SP的短信交互存在問題,短信發送不出去。查了一下原因:SmsSendMessage參數設置的問題。
在Windows Mobile 5.0SDK的HelloSMS例子中,發送短信的代碼是這樣寫的






































































這段代碼在一般情況下是運行正確的,對于手機與手機的發送是不存在問題的,但是與SP的交互在某些省區就存在短信發送不出去的情況。
為了更好的理解這段代碼,我們先來熟悉一下SmsSendMessage及各個參數。
SmsSendMessage
功能:Use the SmsSendMessage function to create and send an Short Message Service (SMS) message.(創建和發送短信,但短信發送后并不保存到發件箱中)
原型:
HRESULT SmsSendMessage (
const SMS_HANDLE smshHandle, // 調用SmsOpen時獲得的短信句柄
const SMS_ADDRESS * const psmsaSMSCAddress, //指向短信中心號碼的地址
const SMS_ADDRESS * const psmsaDestinationAddress, // 發送的目的地址
const SYSTEMTIME * const pstValidityPeriod, // 發送時間的有效期
const BYTE * const pbData, // 信息的內容部分
const DWORD dwDataSize,// 信息內容的長度
const BYTE * const pbProviderSpecificData, //運營商的附加數據
const DWORD dwProviderSpecificDataSize, // 附加數據的長度
const SMS_DATA_ENCODING smsdeDataEncoding, // 短信編碼
const DWORD dwOptions, // 其他選項
SMS_MESSAGE_ID * psmsmidMessageID); // 用于得到系統回執的信息
(具體介紹可查看http://msdn.microsoft.com/en-us/library/aa455068.aspx)
在實際應用中短信發送不出去,但是SmsSendMessage的返回值是S_OK值。在一些文章中有人這樣認為是短信編碼的問題造成的。
如果編碼格式不對可能造成短信中心網關把短信給吞掉的情況,程序雖然調用成功,但是就是目標號碼收不到短信。函數參數中的后三個參數可以不用或設默認值都可以。
起初我也是認為這個地方造成的,很是興奮。短信的回復內容恰為字母,我誤以為短信內容此時是7-BIT的短消息,短信網關把短信給吞掉了,造成目標號碼收不到短信。在練習中卻也陰差陽錯的成功了。很高興的把理由歸到了這個地方。并這樣總結:SmsSendMessage可以支持7-bit的ASCII碼的短消息,也支持16-bit的unicode的短消息。但內容為ASCII的時候,短信編碼為 SMSDE_GSM或SMSDE_OPTIMAL,當內容不全是ASCII的時候,短信編碼為SMSDE_GSM或SMSDE_OPTIMAL。所以回復內容改為漢字即可。
但是這樣對么?起初我認為我的解釋很合理.但是我卻發現我的一個參數與原來的程序不一樣.
是我在嘗試中無意修改了一個參數,將
tpsd.psMessageClass = PS_MESSAGE_CLASS1;
修改為了
tpsd.psMessageClass = PS_MESSAGE_CLASSUNSPECIFIED;
這是發送短信中的運營商的指定數據TEXT_PROVIDER_SPECIFIC_DATA,它的參數psMessageClass是指
Text Short Message Service (SMS) messages with the appropriate flag can replace previously received notifications with a similar flag and originating address.
它有以下五個值:
PS_MESSAGE_CLASS0: The message should be displayed immediately but not stored. The MS shall send an acknowledgement to the service center when the message has successfully reached the MS. (被接受后立即顯示但不存儲(稱為閃信)。需要向SMSC發送確認信息。)
PS_MESSAGE_CLASS1:The message should be stored and an acknowledgement should be sent to the
PS_MESSAGE_CLASS2:The message should be transferred to the SMS data field in the subscriber identity module (SIM) before an acknowledgement is sent to the
PS_MESSAGE_CLASS3:When the message has successfully reached the destination and can be stored, an acknowledgement is sent to the
PS_MESSAGE_CLASSUNSPECIFIED:The message Class is not set in the outgoing or incoming message. (對發出或收到的短信不進行設置)
分析以上五個值,前四個值有一個共同的特點,都需要向SMSC發送確認。而最后一個值沒有設定。
這個值的改動,解決了我所遇到的問題。但究其原因,我有些想不通為什么?
但是在實際應用中,出現了tmail.exe的異常。不知道是這個值的變動帶來的問題,還是實際模塊中存在的問題。還需要繼續研究一下。
如果大家有知道的,給些建議哈.