void SendSMS1(LPCTSTR lpszMessage, LPCTSTR lpszRecipient,LPCTSTR lpszSMSC,BOOL bSendConfirmation, BOOL bUseDefaultSMSC)
{

 SMS_HANDLE smshHandle; //短信句柄
 SMS_ADDRESS smsaDestination;//接收号码
 TEXT_PROVIDER_SPECIFIC_DATA tpsd;
 SMS_MESSAGE_ID smsmidMessageID;

 // 打开发送句柄
 // 协议字符串,       SMS_MODE_SEND:发送模式 psmshHandle:返回的句柄 phMessageAvailableEvent:通知的事件
 if(FAILED(SmsOpen(SMS_MSGTYPE_TEXT, SMS_MODE_SEND, &smshHandle, NULL)))
 {
  return;
 }


 // Create the destination address
//SMSAT_NATIONAL:国内电话 SMSAT_INTERNATIONAL:国际电话
 smsaDestination.smsatAddressType = SMSAT_UNKNOWN;
 _tcsncpy(smsaDestination.ptsAddress, lpszRecipient, SMS_MAX_ADDRESS_LENGTH);

 // Set up provider specific data
 memset(&tpsd, 0, sizeof(tpsd));
 //tpsd.dwMessageOptions =  PS_MESSAGE_OPTION_NONE;
 tpsd.dwMessageOptions =  PS_MESSAGE_OPTION_STATUSREPORT;//表示需要状态报告
 tpsd.psMessageClass = PS_MESSAGE_CLASSUNSPECIFIED;
//PS_MESSAGE_CLASS0表示短信在被接收后立即显示且不存储在收件箱(称为闪信)
 //PS_MESSAGE_CLASS1表示一般的情况,被接收后存储到收件箱并发送一个确认回短信中心,发送方收到一个已被接收的状态报告。
 tpsd.psReplaceOption = PSRO_NONE;
 //手动清空头信息 
 ZeroMemory(tpsd.pbHeaderData, sizeof(tpsd.pbHeaderData));        
 tpsd.dwHeaderDataSize = 0;
 tpsd.fMessageContainsEMSHeaders = FALSE;
 tpsd.dwProtocolID = SMS_MSGPROTOCOL_UNKNOWN;

 // Send the message, indicating success or failure
 /*
 *smshHandle: SmsOpen打开的句柄
 􀁺 psmsaSMSCAddress: SMSC中心
 􀁺 *psmsaDestinationAddress:发送的目的地址
 􀁺 pstValidityPeriod :发送时间的有效期
 􀁺 *pbData: 信息的内容部分
 􀁺 *dwDataSize: 信息的内容部分的长度
 􀁺 *pbProviderSpecificData:针对运营商的附加数据
 􀁺 *dwProviderSpecificDataSize :附加数据的长度
 􀁺 smsdeDataEncoding :短信编码[SMSDE_OPTIMAL是其
 推荐值]表示由短信中心决定字符的格式
 􀁺 dwOptions :其他选项
 􀁺 psmsmidMessageID: 用于得到系统回执的信息
 SmsGetMessageStatus
 */

//SMSDE_GSM使用7-bit编码
 //SMSDE_UCS2使用16-bit (Unicode)编码
 if(SUCCEEDED(SmsSendMessage(smshHandle, NULL,
  &smsaDestination, NULL, (PBYTE) lpszMessage,
  _tcslen(lpszMessage) * sizeof(TCHAR), (PBYTE) &tpsd,
  sizeof(TEXT_PROVIDER_SPECIFIC_DATA), SMSDE_UCS2,
  SMS_OPTION_DELIVERY_NONE, &smsmidMessageID)))
 {
  //Tstr=L"发送完成";


  //发送完成
  MessageBox(    NULL,L"SEND OK",L"MSG",MB_OK);
 }
 else
 {

  //发送失败
  //Tstr=L"发送失败";
  MessageBox(NULL,L"发送失败",L"MSG",MB_OK);
 }

 // clean up
 VERIFY(SUCCEEDED(SmsClose(smshHandle)));



注意:LPCTSTR 和 PCWSTR是宽字符,所以用16-bit (Unicode)编码。网上的HelloSMS的程序不够严谨,如果照用可能造成短信中心网关把短信给吞掉的情况,程序虽然调用成功,但是就是目标号码收不到短信。函数参数中的后三个参数可以不用或设默认值都可以。

使用Windows CESMS API函数SmsSendMessage可以发送7-bit编码和16-bit编码的短消息(未测试8-bit编码)。单条短消息的最大字符数分别是16070。发送短消息全部为ASCII字符,SMS_DATA_ENCODING参数选择SMSDE_GSMSMSDE_OPTIMAL都可以。发送短消息不全为ASCII字符,SMS_DATA_ENCODING参数选择SMSDE_UCS2SMSDE_OPTIMAL都可以。建议选择SMSDE_OPTIMAL

发送短消息全部为ASCII字符,且字符个数超过160个时,系统会自动将短消息进行分割,但并不是按每条160进行分割,而是按每条153。发送短消息不全为ASCII字符,且字符个数超过70个时,系统会自动将短消息进行分割,但并不是按每条70进行分割,而是按每条67

发送短消息的字符数超过16070时,应该自行进行分割,而不应交由系统进行分割,这样可以最大限度的利用单条短消息的最大字符数分别是16070的条件.

Posted on 2008-04-10 11:17 Herb 阅读(272) 评论(0)  编辑 收藏 引用

标题  
姓名  
主页
验证码 *
内容(提交失败后,可以通过“恢复上次提交”恢复刚刚提交的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
[使用Ctrl+Enter键可以直接提交]
相关链接:
网站导航: