北京理工大学 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) |