SMS API发送短信

一、          原理与规定

1  原理:

SMS是由Esti 所制定的一个规范(GSM 03.40 GSM 03.38)。收发消息的模式有:文本模式或者PDUprotocol description unit)模式。文本模式只能发送普通的ASCII字符,而要发送图片、铃声、其它编码的字符(如中文)就必须采用PDU模式。PDU模式中,可以采用三种编码方式来编码要发送的内容,分别是 7-bit编码、8-bit编码、16-bit编码。7-bit编码用于发送普通的ASCII字符;8-bit编码通常用于发送数据消息,比如图片和铃声 等;而16-bit编码用于发送Unicode字符。在这三种编码方式下,可以发送的最大字符数分别是 160 140 707-bit编码与ASCII并不是完全对应的,但对于普通大小写英文字母和标点符号的部分,两者是相同。

使用Windows CE可以发送PDU模式的SMS,这里主要讨论使用SmsSendMessage函数发送7-bit编码和16-bit编码的短消息时应使用的参数及各种情况的测试。

 

2  规定:

下面是使用的完整代码,其中红色加粗的部分是在后面的测试中会改为使用其它参数,代码其它部分则保持不变。

 

SMS_HANDLE smsHandle;

HRESULT hr = SmsOpen(SMS_MSGTYPE_TEXT, SMS_MODE_SEND, &smsHandle, NULL);

 

ASSERT(hr == ERROR_SUCCESS);//简化代码,未使用错误处理

 

TEXT_PROVIDER_SPECIFIC_DATA tpsd;

tpsd.dwMessageOptions = PS_MESSAGE_OPTION_STATUSREPORT;//需要状态报告

tpsd.psMessageClass = PS_MESSAGE_CLASS1;

tpsd.psReplaceOption = PSRO_NONE;

//psMessageClass有四种参数PS_MESSAGE_CLASS0PS_MESSAGE_CLASS3,一般只使用PS_MESSAGE_CLASS0PS_MESSAGE_CLASS1PS_MESSAGE_CLASS0表示短信在被接收后立即显示且不存储在收件箱(称为闪信) PS_MESSAGE_CLASS1表示一般的情况,被接收后存储到收件箱并发送一个确认回短信中心,发送方收到一个已被接收的状态报告。

 

SMS_ADDRESS smsaDestination;

smsaDestination.smsatAddressType = SMSAT_INTERNATIONAL;

lstrcpy(smsaDestination.ptsAddress, _T("8613588881696"));//目的号码,也可以写成+8613588881696的形式

 

//以下szMessage在后面的测试中会改为使用其它参数

TCHAR szMessage[] = _T("adfadsfasdgasryoufqrelfjbhldasfasdyrfasdfasdfasoerqljjdasfdasfasdfdf70adfadsfasdgasryoufqrelfjbhldasfasdyrfasdfasdfasoerqljjdasfdasfasdfd140adsfdsdfdadssfdsa160");

DWORD length = lstrlen(szMessage) * sizeof (TCHAR);//szMessage的字节长度

//以下encode在后面的测试中会改为使用其它参数

SMS_DATA_ENCODING encode = SMSDE_GSM;

/*SMS_DATA_ENCODING枚举有3个值,SMSDE_OPTIMAL表示由短信中心决定字符的格式,SMSDE_GSM使用7-bit编码,SMSDE_UCS2使用16-bit (Unicode)编码*/

 

hr = SmsSendMessage(smsHandle, NULL, &smsaDestination, NULL,

            (PBYTE) szMessage, length,

            (PBYTE) &tpsd, 12, encode,

            SMS_OPTION_DELIVERY_NONE, NULL);

//倒数第4个参数是tpsd的长度,这里只能使用12,如果使用sizeof(tpsd)则无法成功发送短消息,因为发送短消息时TEXT_PROVIDER_SPECIFIC_DATA只有前三个结构有用,长度也只能指定为前三个结构的总长度12

 

SmsClose (smsHandle);

 

ASSERT(hr == ERROR_SUCCESS);

 

二、          测试及结论

 

发送的短消息全为ASCII字符

1.     发送的短消息全部为ASCII字符,且字符个数少于160个的情况(字符个数为lstrlen(szMessage)

TCHAR szMessage[] = _T("adfadsfasdgasryoufqrelfjbhldasfasdyrfasdfasdfasoerqljjdasfdasfasdfdf70adfadsfasdgasryoufqrelfjbhldasfasdyrfasdfasdfasoerqljjdasfdasfasdfd140adsfdsdfdadssfd158");//158个字符

SMS_DATA_ENCODING encode = SMSDE_GSM;//也可以使用encode = SMSDE_OPTIMAL;

 

结果:收到短消息1条,第1条长158

结论:发送短消息全部为ASCII字符,且字符个数少于160个时,系统会按一条短消息发送。这时SMS_DATA_ENCODING参数选择SMSDE_GSMSMSDE_OPTIMAL都可以。

 

2.     发送的短消息全部为ASCII字符,且字符个数等于160个的情况

TCHAR szMessage[] = _T("adfadsfasdgasryoufqrelfjbhldasfasdyrfasdfasdfasoerqljjdasfdasfasdfdf70adfadsfasdgasryoufqrelfjbhldasfasdyrfasdfasdfasoerqljjdasfdasfasdfd140adsfdsdfdadfdssfd160");//160个字符

SMS_DATA_ENCODING encode = SMSDE_GSM;//也可以使用encode = SMSDE_OPTIMAL;

 

结果:收到短消息1条,第1条长160

结论:发送短消息全部为ASCII字符,且字符个数等于160个时,系统会按一条短消息发送。这时SMS_DATA_ENCODING参数选择SMSDE_GSMSMSDE_OPTIMAL都可以。

 

3.     发送的短消息全部为ASCII字符,且字符个数超过160个的情况

TCHAR szMessage[] = _T("adfadsfasdgasryoufqrelfjbhldasfasdyrfasdfasdfasoerqljjdasfdasfasdfdf70adfadsfasdgasryoufqrelfjbhldasfasdyrfasdfasdfasoerqljjdasfdasfasdfd140adsfdsdfdadssfdsa1601234567");//167个字符

SMS_DATA_ENCODING encode = SMSDE_GSM;//也可以使用encode = SMSDE_OPTIMAL;

 

结果:收到短消息2条,第1条长153,第2条长14

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

2)发送短消息全部为ASCII字符,SMS_DATA_ENCODING参数选择SMSDE_GSMSMSDE_OPTIMAL都可以。

 

4.     发送的短消息不全为ASCII字符,且字符个数少于或等于70个的情况

TCHAR szMessage[] = _T("adfadsfasdgasryoufqrelfjbhldasfasdyrfasdfasdfasoerqljjdasfdasfasdfdf70adfadsfasdgasryoufqrelfjbhldasfasdyrfasdfasdfasoerqljjdasfdasfasdfd140adsfdsdfdadssfdsa1601234567");//167个字符

SMS_DATA_ENCODING encode = SMSDE_GSM;//也可以使用encode = SMSDE_OPTIMAL;

 

结果:收到短消息2条,第1条长153,第2条长14

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

2)发送短消息全部为ASCII字符,SMS_DATA_ENCODING参数选择SMSDE_GSMSMSDE_OPTIMAL都可以。

 

发送的短消息不全为ASCII字符

5.     发送的短消息不全为ASCII字符,且字符个数少于70个的情况(以下字符个数的计算方式为lstrlen(szMessage),注意不是lstrlen(szMessage) * sizeof (TCHAR)

TCHAR szMessage[] = _T("二零零八adfadsfdasfekutkadfyqierbhzteqwrgadgffsfgsdfgcvadgfddfafdafa68");//68个字符

SMS_DATA_ENCODING encode = SMSDE_GSM;//也可以使用encode = SMSDE_OPTIMAL;

 

结果:收到短消息1条,第1条长68

结论:发送短消息全部为ASCII字符,且字符个数少于160个时,系统会按一条短消息发送。这时SMS_DATA_ENCODING参数选择SMSDE_GSMSMSDE_OPTIMAL都可以。

 

6.     发送的短消息不全为ASCII字符,且字符个数超过70个的情况

TCHAR szMessage[] = _T("二零零八adfadsfdasfekutkadfyqierbhzteqwrgadgffsfgsdfgcvadgfddfaaddfaddfasfdafa76");//76个字符

SMS_DATA_ENCODING encode = SMSDE_UCS2;//也可以使用encode = SMSDE_OPTIMAL;

 

结果:收到短消息2条,第1条长67,第2条长9

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

2)发送短消息不全为ASCII字符,SMS_DATA_ENCODING参数选择SMSDE_UCS2SMSDE_OPTIMAL都可以。

 

总结

1、使用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

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

3、根据以上总结1和总结2,发送短消息的字符数超过16070时,应该自行进行分割,而不应交由系统进行分割,这样可以最大限度的利用单条短消息的最大字符数分别是16070的条件。关于判断是否全为ASCII字符及超过16070时自行进行分割的办法就很简单了,网上也有很多相关资料,代码就不再给出了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
SMS短信API 名 称:SMS API 版 本:V1.1(built 2004.02.29) 功 能:通过短信网关发送手机短信 作 者:Starboy (starboy@xdevelop.net) Longlybug (sales@xdevelop.net) 网 址:http://www.xdevelop.net 简介   SMS API(for java)是一个通过网关发送手机短信的JAVA开发包,提供了方便的开发应用接口,JAVA开发者可利用它轻松的定制出各类短信应用平台,如:企业OA应用中的短信提醒、网站中的定单短信提醒、交友平台的手机短信互动等等。短信应用开发者无需再去关心网关协议,或者研究与手机间的通信指令等。使用本API,开发者无需关心其它细节,只需调用API,即可实现手机短信应用中最常用的短信发送功能。 功能特点 支持移动和联通手机,自动识别 SMS API实现了短信即时发送和定时发送。支持联通和移动手机,发送时无需关心目标手机运营商,自动识别移动和联通。整体成功率约90%左右。   发送性能优异稳定 API使用的网关服务器拥有多线程发送能力,每秒可同时处理数十个客户端的并发请求。   平台无关性 客户端适用于任何可运行JAVA的平台,包括:Windows、LINUX、UNIX、MAC等。 不像DLL接口,只能运行于WINDOWS平台。 对于WEB应用来说,本API可运行于任何J2EE规范的应用服务器。   接口简洁易用 短信API的接口非常简单,封装了与短信服务器网关的通讯,调用者无需关心底层通讯细节。   无硬件设备要求 只要能上INTERNET网即可使用本API发送短信,无需购买任何手机硬件、短信MODEM、短信卡、数据线等。   费用低廉,接入简单 只需缴纳一定量的接入费并签定短信内容保证书,即可立刻拥有自己的短信平台,每条短信发送费用为0.1元,可根据需要随时充值。   适合用户 本平台适合那些对短信功能要求比较单一,以及每日发送量不大的各类应用。 安装部署   SMS API开发包由两个文件组成,一个是smsclient.jar:API程序文件,另一个是sms.ini:程序配置文件。   对于JAVA桌面应用程序,需将smsclient.jar加入classpath,并将sms.ini放于classpath所在的一个目录   对于JSP WEB应用程序,可将smsclient.jar放入对应WEB应用的WEB-INF/lib/目录下,并将sms.ini放于WEB-INF/classes/根目录下。   关于API的使用及sms.ini的配置,请参看doc目录下的API使用说明和API文档。   试用版的功能限制   试用版只能发5条短信! 购买联系   欢迎您注册本软件,请与双子星工作室的程先生联系:   EMAIL:sales@xdevelop.net   OICQ:33450   网址:http://www.xdevelop.net   TEL:13510015276   如果您有任何疑问,也请通过以上方式同我们联系,谢谢您的支持!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值