注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

回首望星辰

See you in the next world

 
 
 

日志

 
 

windows mobile 短消息开发  

2009-10-20 15:28:06|  分类: 手机开发 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
SMS API

  在 Pocket PC Phone 上,您可以使用大量的 Microsoft  Windows  CE API 调用来访问 SMS 消息功能:
函数 说明
SmsOpen 打开用于发送和/或接收访问的 SMS 消息组件。
SmsSendMessage 发送 SMS 消息。
SmsGetMessageStatus 检索已发送消息的状态报告。
SmsReadMessage 阅读先前收到的 SMS 消息。
SmsGetMessageSize 确定缓冲区大小的上限。
SmsGetSMSC 读取默认的短消息服务中心 (SMSC) 地址。
SmsSetSMSC 设置默认的 SMSC。
SmsGetPhoneNumber 获取与 SMS 持有者相关联的设备的电话号码。
SmsGetTime 获取由 SMSC 时钟粗略估计的当前时间。
SmsGetBroadcastMsgRanges 获取移动电话可以侦听的广播消息的范围。
SmsSetMessageNotification 在 SMS 消息到达时启动应用程序。
SmsClearMessageNotification 取消对 SMS 通知的注册。
SmsSetBroadcastMsgRanges 设置移动电话可以侦听的广播消息的范围。
SmsClose 关闭现有的 SMS 消息句柄。

void SendSMS(BOOL bSendConfirmation, BOOL bUseDefaultSMSC, LPCTSTR lpszSMSC, LPCTSTR lpszRecipient, LPCTSTR lpszMessage)

windows mobile 短消息开发 - 辉 - 回首望星辰windows mobile 短消息开发 - 辉 - 回首望星辰windows mobile 短消息开发 - 辉 - 回首望星辰{

windows mobile 短消息开发 - 辉 - 回首望星辰    SMS_HANDLE smshHandle;

windows mobile 短消息开发 - 辉 - 回首望星辰    SMS_ADDRESS smsaSource;

windows mobile 短消息开发 - 辉 - 回首望星辰    SMS_ADDRESS smsaDestination;

windows mobile 短消息开发 - 辉 - 回首望星辰    TEXT_PROVIDER_SPECIFIC_DATA tpsd;

windows mobile 短消息开发 - 辉 - 回首望星辰    SMS_MESSAGE_ID smsmidMessageID;

windows mobile 短消息开发 - 辉 - 回首望星辰

windows mobile 短消息开发 - 辉 - 回首望星辰    // try to open an SMS Handle

windows mobile 短消息开发 - 辉 - 回首望星辰    if(FAILED(SmsOpen(SMS_MSGTYPE_TEXT, SMS_MODE_SEND, &smshHandle, NULL)))

windows mobile 短消息开发 - 辉 - 回首望星辰windows mobile 短消息开发 - 辉 - 回首望星辰    windows mobile 短消息开发 - 辉 - 回首望星辰{

windows mobile 短消息开发 - 辉 - 回首望星辰        MessageBox(NULL,

windows mobile 短消息开发 - 辉 - 回首望星辰                    (LPCTSTR)LoadString(ghInstance, IDS_ERROR_SMSOPEN, 0, 0), 

windows mobile 短消息开发 - 辉 - 回首望星辰                    (LPCTSTR)LoadString(ghInstance, IDS_CAPTION_ERROR, 0, 0),

windows mobile 短消息开发 - 辉 - 回首望星辰                    MB_OK | MB_ICONERROR);

windows mobile 短消息开发 - 辉 - 回首望星辰        return;

windows mobile 短消息开发 - 辉 - 回首望星辰    }

windows mobile 短消息开发 - 辉 - 回首望星辰

windows mobile 短消息开发 - 辉 - 回首望星辰    // Create the source address

windows mobile 短消息开发 - 辉 - 回首望星辰    if(!bUseDefaultSMSC)

windows mobile 短消息开发 - 辉 - 回首望星辰windows mobile 短消息开发 - 辉 - 回首望星辰    windows mobile 短消息开发 - 辉 - 回首望星辰{

windows mobile 短消息开发 - 辉 - 回首望星辰        smsaSource.smsatAddressType = SMSAT_INTERNATIONAL;

windows mobile 短消息开发 - 辉 - 回首望星辰        _tcsncpy(smsaSource.ptsAddress, lpszSMSC, SMS_MAX_ADDRESS_LENGTH);

windows mobile 短消息开发 - 辉 - 回首望星辰    }

windows mobile 短消息开发 - 辉 - 回首望星辰

windows mobile 短消息开发 - 辉 - 回首望星辰    // Create the destination address

windows mobile 短消息开发 - 辉 - 回首望星辰    smsaDestination.smsatAddressType = SMSAT_INTERNATIONAL;

windows mobile 短消息开发 - 辉 - 回首望星辰    _tcsncpy(smsaDestination.ptsAddress, lpszRecipient, SMS_MAX_ADDRESS_LENGTH);

windows mobile 短消息开发 - 辉 - 回首望星辰

windows mobile 短消息开发 - 辉 - 回首望星辰    // Set up provider specific data

windows mobile 短消息开发 - 辉 - 回首望星辰    memset(&tpsd, 0, sizeof(tpsd));

windows mobile 短消息开发 - 辉 - 回首望星辰    tpsd.dwMessageOptions = bSendConfirmation ? PS_MESSAGE_OPTION_STATUSREPORT : PS_MESSAGE_OPTION_NONE;

windows mobile 短消息开发 - 辉 - 回首望星辰    tpsd.psMessageClass = PS_MESSAGE_CLASS1;

windows mobile 短消息开发 - 辉 - 回首望星辰    tpsd.psReplaceOption = PSRO_NONE;

windows mobile 短消息开发 - 辉 - 回首望星辰    tpsd.dwHeaderDataSize = 0;

windows mobile 短消息开发 - 辉 - 回首望星辰

windows mobile 短消息开发 - 辉 - 回首望星辰    // Send the message, indicating success or failure

windows mobile 短消息开发 - 辉 - 回首望星辰    if(SUCCEEDED(SmsSendMessage(smshHandle, ((bUseDefaultSMSC) ? NULL : &smsaSource), 

windows mobile 短消息开发 - 辉 - 回首望星辰                                 &smsaDestination, NULL, (PBYTE) lpszMessage, 

windows mobile 短消息开发 - 辉 - 回首望星辰                                 _tcslen(lpszMessage) * sizeof(TCHAR), (PBYTE) &tpsd, 

windows mobile 短消息开发 - 辉 - 回首望星辰                                 sizeof(TEXT_PROVIDER_SPECIFIC_DATA), SMSDE_OPTIMAL, 

windows mobile 短消息开发 - 辉 - 回首望星辰                                 SMS_OPTION_DELIVERY_NONE, &smsmidMessageID)))

windows mobile 短消息开发 - 辉 - 回首望星辰windows mobile 短消息开发 - 辉 - 回首望星辰    windows mobile 短消息开发 - 辉 - 回首望星辰{

windows mobile 短消息开发 - 辉 - 回首望星辰        MessageBox(NULL,

windows mobile 短消息开发 - 辉 - 回首望星辰                    (LPCTSTR)LoadString(ghInstance, IDS_SMSSENT, 0, 0), 

windows mobile 短消息开发 - 辉 - 回首望星辰                    (LPCTSTR)LoadString(ghInstance, IDS_CAPTION_SUCCESS, 0, 0),

windows mobile 短消息开发 - 辉 - 回首望星辰                    MB_OK);

windows mobile 短消息开发 - 辉 - 回首望星辰    }

windows mobile 短消息开发 - 辉 - 回首望星辰    else

windows mobile 短消息开发 - 辉 - 回首望星辰windows mobile 短消息开发 - 辉 - 回首望星辰    windows mobile 短消息开发 - 辉 - 回首望星辰{

windows mobile 短消息开发 - 辉 - 回首望星辰        MessageBox(NULL,

windows mobile 短消息开发 - 辉 - 回首望星辰                    (LPCTSTR)LoadString(ghInstance, IDS_ERROR_SMSSEND, 0, 0), 

windows mobile 短消息开发 - 辉 - 回首望星辰                    (LPCTSTR)LoadString(ghInstance, IDS_CAPTION_ERROR, 0, 0),

windows mobile 短消息开发 - 辉 - 回首望星辰                    MB_OK | MB_ICONERROR);

windows mobile 短消息开发 - 辉 - 回首望星辰    }

windows mobile 短消息开发 - 辉 - 回首望星辰

windows mobile 短消息开发 - 辉 - 回首望星辰    // clean up

windows mobile 短消息开发 - 辉 - 回首望星辰    VERIFY(SUCCEEDED(SmsClose(smshHandle)));

windows mobile 短消息开发 - 辉 - 回首望星辰}

windows mobile 短消息开发 - 辉 - 回首望星辰

这段代码在一般情况下是运行正确的,对于手机与手机的发送是不存在问题的,但是与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 Service Center when it is stored.(接收后被存储,一旦存储,需要向SMSC发送确认信息。)

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 Service Center.

PS_MESSAGE_CLASS3:When the message has successfully reached the destination and can be stored, an acknowledgement is sent to the Service Center.

PS_MESSAGE_CLASSUNSPECIFIED:The message Class is not set in the outgoing or incoming message. (对发出或收到的短信不进行设置)

 

分析以上五个值,前四个值有一个共同的特点,都需要向SMSC发送确认。而最后一个值没有设定。

这个值的改动,解决了我所遇到的问题。但究其原因,我有些想不通为什么?

    但是在实际应用中,出现了tmail.exe的异常。不知道是这个值的变动带来的问题,还是实际模块中存在的问题。还需要继续研究一下。

  评论这张
 
阅读(778)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017