Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1532579
  • 博文数量: 114
  • 博客积分: 10010
  • 博客等级: 上将
  • 技术积分: 1357
  • 用 户 组: 普通用户
  • 注册时间: 2006-11-19 18:13
文章分类
文章存档

2010年(8)

2009年(9)

2008年(27)

2007年(62)

2006年(8)

我的朋友

分类: LINUX

2007-08-19 11:43:22

北京理工大学 20981 陈罡
原本我以为通过ezx的框架发送短消息会导致系统弹出确认对话框,让用户确认是否需要发送短
消息,如果通过更加底层一点的tapi发送,就一定不会有这个问题了。但是很遗憾的,我得这
个思路不对,似乎moto采用了更加严格的限制措施,即使你调用了tapi发送短消息,仍然会有
这个提示对话框弹出。真是不幸啊,感觉又看到了java的sandbox的影子了。不过,利用tapi发
送短消息,可以让我们更加清晰的明白手机的底层操作,虽然我觉得用ezx框架封装的那个已经
足够了,这里也把更加底层的tapi发送sms的方法展示一下吧,希望对爱好者们有些帮助。(我
已经签了nda保密协议,除非得到motorola的许可请各位朋友不要向我索取头文件,让我为难,
谢谢!)
#include
#include
#include
#include
#include
#include
#include
#include
#include
 
#define  TARGET_NUM "xxxxxxxxxxxx"
#define  TARGET_TXT "hello, this is wayne speaking."

#define  SMSC_NUM   "+8613800100500" // 这是短消息中心的号码
 
using namespace std ;
 
int main(int argc, char * argv[])
{
 INT32             sms_fd ;
 TAPI_APP_MSGID_T  msg_id[] = { TAPI_SMS_NOTIFY_SEND_CNF_MSGID } ;
 TAPI_RESULT_E     res ;
 TAPI_SMS_MO_SM_S  sms_mo ;
 UINT8             ref_num ;
   
//创建tapi客户端
 sms_fd = TAPI_CLIENT_Init( msg_id, sizeof(msg_id)/sizeof(TAPI_APP_MSGID_T) ) ;
 if((sms_fd == TAPI_INVALID_SOCKETFD) || (sms_fd == 0)) {
  cout<<"failed to create sms fd..."<  return -1 ;
 }
 
//设置要发送的短消息
    memset(&sms_mo, 0, sizeof(sms_mo));
    // 这里是设置短消息超时时间为一天
    sms_mo.expirePeriod = TAPI_SMS_EXPIRE_PERIOD_DAY_EV;
    // 这里是关掉发送状态报告
    sms_mo.isNeedAck = FALSE ;
    sms_mo.msgRefNumber = 0 ;
    sms_mo.smBase.isReplyPathValid = TRUE;
   
    // 这里是设置短消息的类型为普通文本,呵呵,想要发送push消息、闪信或者ota的朋友
可以从这里
    // 深入下去,就可以找到方法了,在此不做过多的解释了。
    sms_mo.smBase.protocol = TAPI_SMS_PROTOCOL_TEXT_EV;
                                                                                   
            
    // set encodeType -> UCS2 = 0; ascii = 1; data = 2
    // 这里是设置短消息体的编码类型,如果需要中文支持的话,必须设定为ucs2,我在这里
是图省事了。
    //sms_mo.smBase.encodeType = TAPI_SMS_TYPE_UCS2_TEXT_EV;
    sms_mo.smBase.encodeType = TAPI_SMS_TYPE_ASCII_TEXT_EV ;
   
    // 设置短消息中心的号码
    strcpy((char *)(sms_mo.smBase.scAddress), SMSC_NUM) ;
   
    // 设置短消息的目的号码
    strcpy((char*)sms_mo.smBase.peerAddress, TARGET_NUM);
    // 设置短消息的文字内容
    if(sms_mo.smBase.encodeType == TAPI_SMS_TYPE_ASCII_TEXT_EV) {
     strcpy((char *)(sms_mo.smBase.asciiContent.msgBody), TARGET_TXT) ;
     sms_mo.smBase.asciiContent.msgLength = strlen(TARGET_TXT) ;
    }
                                                                             
    //发送短消息
res = TAPI_SMS_SendSmBlockMode( &sms_mo, &ref_num );                               
                                   
    if ( res == TAPI_RESULT_SUCC ) cout<<"sms send ok"<    else cout<<"sms send failed"<   
    // 最后是释放tapi客户端,这是个好习惯。
    TAPI_CLIENT_Fini() ;
 return 0 ;
}
 
这里需要特别说一下的就是下面这一句:
    // set encodeType -> UCS2 = 0; ascii = 1; data = 2
    // to support chinese characters, it must be set to UCS2
    //sms_mo.smBase.encodeType = TAPI_SMS_TYPE_UCS2_TEXT_EV;
    sms_mo.smBase.encodeType = TAPI_SMS_TYPE_ASCII_TEXT_EV ;
手机短消息发送中文的时候,必须使用UCS2编码,在上述的程序中,我图方便采用了ASCII编码
。而真实的情况下,需要中文进行UCS2编码以后,送入sms_mo.smBase.ucs2Content.msgBody中
,同时字符串的长度也以真实的汉字个数为准,对于ucs2的msgBody,其实每一个msgBody[n]的
数据类型都是short型,两个字节的,这一点需要特别注意。
 
最后,不放真机抓图了,即使使用了tapi,仍然免不了要出现那个是否允许发送的对话框。可
能只有moto他们开发团队自己才有更加底层的办法解决这个问题吧。
阅读(2398) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~