2742
- 收藏
- 点赞
- 分享
- 举报
Windows Mobile下发送短信SMS
SMS(Short Messaging Service)是最早的短消息业务,也是现在普及率最高的一种短消息业务。在Windows Mobile中我们同样也可以利用已提供的SMS API接口,来实现发送/接收短信的功能。
要实现一个简单的SMS发送短信程序,主要有三个步骤:
1. 打开SMS句柄,这里调用SmsOpen()来实现;
HRESULT SmsOpen (
const LPCTSTR ptsMessageProtocol, //SMS要使用到的协议
const DWORD dwMessageModes, //发送/接收模式
SMS_HANDLE* const psmshHandle, //成功返回的句柄
HANDLE* const phMessageAvailableEvent ) //等待信号的事件句柄
2. 初始化短信的源地址和目的地址,和一些参数结构;
这里的地址主要使用SMS_ADDRESS结构体:
typedef struct sms_address_tag {
SMS_ADDRESS_TYPE smsatAddressType; //地址的类型
TCHAR ptsAddress[SMS_MAX_ADDRESS_LENGTH]; //地址
} SMS_ADDRESS, *LPSMS_ADDRESS;
数据
typedef struct text_provider_specific_data_tag {
DWORD dwMessageOptions; //操作命令
PROVIDER_SPECIFIC_MESSAGE_CLASS psMessageClass; //消息类
PROVIDER_SPECIFIC_REPLACE_OPTION psReplaceOption; //代替操作
DWORD dwHeaderDataSize; //头大小
BYTE pbHeaderData[SMS_DATAGRAM_SIZE];//头地址
BOOL fMessageContainsEMSHeaders; //是否含有EMS头
DWORD dwProtocolID; //协议ID
} TEXT_PROVIDER_SPECIFIC_DATA;
3. 发送短信SmsSendMessage
HRESULT SmsSendMessage (
const SMS_HANDLE smshHandle, //SMS句柄
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); //消息ID
4. 关闭SMS句柄
HRESULT SmsClose (
const SMS_HANDLE smshHandle);
下面给出一段发送短信的实现函数代码
示例:
void SendSMS(BOOL bSendConfirmation, BOOL bUseDefaultSMSC, LPCTSTR lpszSMSC, LPCTSTR lpszRecipient, LPCTSTR lpszMessage)
{
SMS_HANDLE smshHandle;
SMS_ADDRESS smsaSource;
SMS_ADDRESS smsaDestination;
TEXT_PROVIDER_SPECIFIC_DATA tpsd;
SMS_MESSAGE_ID smsmidMessageID;
// try to open an SMS Handle
if(FAILED(SmsOpen(SMS_MSGTYPE_TEXT, SMS_MODE_SEND, &smshHandle, NULL)))
{
MessageBox(NULL, (LPCTSTR)LoadString(ghInstance, IDS_ERROR_SMSOPEN, 0, 0),
(LPCTSTR)LoadString(ghInstance, IDS_CAPTION_ERROR, 0, 0), MB_OK | MB_ICONERROR);
return;
}
// Create the source address
if(!bUseDefaultSMSC)
{
smsaSource.smsatAddressType = SMSAT_INTERNATIONAL;
_tcsncpy(smsaSource.ptsAddress, lpszSMSC, SMS_MAX_ADDRESS_LENGTH);
}
// Create the destination address
smsaDestination.smsatAddressType = SMSAT_INTERNATIONAL;
_tcsncpy(smsaDestination.ptsAddress, lpszRecipient, SMS_MAX_ADDRESS_LENGTH);
// Set up provider specific data
memset(&tpsd, 0, sizeof(tpsd));
tpsd.dwMessageOptions = bSendConfirmation ? PS_MESSAGE_OPTION_STATUSREPORT : PS_MESSAGE_OPTION_NONE;
tpsd.psMessageClass = PS_MESSAGE_CLASS1;
tpsd.psReplaceOption = PSRO_NONE;
tpsd.dwHeaderDataSize = 0;
// Send the message, indicating success or failure
if(SUCCEEDED(SmsSendMessage(smshHandle, ((bUseDefaultSMSC) ? NULL : &smsaSource),
&smsaDestination, NULL, (PBYTE) lpszMessage,
_tcslen(lpszMessage) * sizeof(TCHAR), (PBYTE) &tpsd,
sizeof(TEXT_PROVIDER_SPECIFIC_DATA), SMSDE_OPTIMAL,
SMS_OPTION_DELIVERY_NONE, &smsmidMessageID)))
{
MessageBox(NULL, (LPCTSTR)LoadString(ghInstance, IDS_SMSSENT, 0, 0),
(LPCTSTR)LoadString(ghInstance, IDS_CAPTION_SUCCESS, 0, 0),
MB_OK);
}
else
{
MessageBox(NULL, (LPCTSTR)LoadString(ghInstance, IDS_ERROR_SMSSEND, 0, 0),
(LPCTSTR)LoadString(ghInstance, IDS_CAPTION_ERROR, 0, 0),
MB_OK | MB_ICONERROR);
}
// clean up
VERIFY(SUCCEEDED(SmsClose(smshHandle)));
}
要实现一个简单的SMS发送短信程序,主要有三个步骤:
1. 打开SMS句柄,这里调用SmsOpen()来实现;
HRESULT SmsOpen (
const LPCTSTR ptsMessageProtocol, //SMS要使用到的协议
const DWORD dwMessageModes, //发送/接收模式
SMS_HANDLE* const psmshHandle, //成功返回的句柄
HANDLE* const phMessageAvailableEvent ) //等待信号的事件句柄
2. 初始化短信的源地址和目的地址,和一些参数结构;
这里的地址主要使用SMS_ADDRESS结构体:
typedef struct sms_address_tag {
SMS_ADDRESS_TYPE smsatAddressType; //地址的类型
TCHAR ptsAddress[SMS_MAX_ADDRESS_LENGTH]; //地址
} SMS_ADDRESS, *LPSMS_ADDRESS;
数据
typedef struct text_provider_specific_data_tag {
DWORD dwMessageOptions; //操作命令
PROVIDER_SPECIFIC_MESSAGE_CLASS psMessageClass; //消息类
PROVIDER_SPECIFIC_REPLACE_OPTION psReplaceOption; //代替操作
DWORD dwHeaderDataSize; //头大小
BYTE pbHeaderData[SMS_DATAGRAM_SIZE];//头地址
BOOL fMessageContainsEMSHeaders; //是否含有EMS头
DWORD dwProtocolID; //协议ID
} TEXT_PROVIDER_SPECIFIC_DATA;
3. 发送短信SmsSendMessage
HRESULT SmsSendMessage (
const SMS_HANDLE smshHandle, //SMS句柄
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); //消息ID
4. 关闭SMS句柄
HRESULT SmsClose (
const SMS_HANDLE smshHandle);
下面给出一段发送短信的实现函数代码
示例:
void SendSMS(BOOL bSendConfirmation, BOOL bUseDefaultSMSC, LPCTSTR lpszSMSC, LPCTSTR lpszRecipient, LPCTSTR lpszMessage)
{
SMS_HANDLE smshHandle;
SMS_ADDRESS smsaSource;
SMS_ADDRESS smsaDestination;
TEXT_PROVIDER_SPECIFIC_DATA tpsd;
SMS_MESSAGE_ID smsmidMessageID;
// try to open an SMS Handle
if(FAILED(SmsOpen(SMS_MSGTYPE_TEXT, SMS_MODE_SEND, &smshHandle, NULL)))
{
MessageBox(NULL, (LPCTSTR)LoadString(ghInstance, IDS_ERROR_SMSOPEN, 0, 0),
(LPCTSTR)LoadString(ghInstance, IDS_CAPTION_ERROR, 0, 0), MB_OK | MB_ICONERROR);
return;
}
// Create the source address
if(!bUseDefaultSMSC)
{
smsaSource.smsatAddressType = SMSAT_INTERNATIONAL;
_tcsncpy(smsaSource.ptsAddress, lpszSMSC, SMS_MAX_ADDRESS_LENGTH);
}
// Create the destination address
smsaDestination.smsatAddressType = SMSAT_INTERNATIONAL;
_tcsncpy(smsaDestination.ptsAddress, lpszRecipient, SMS_MAX_ADDRESS_LENGTH);
// Set up provider specific data
memset(&tpsd, 0, sizeof(tpsd));
tpsd.dwMessageOptions = bSendConfirmation ? PS_MESSAGE_OPTION_STATUSREPORT : PS_MESSAGE_OPTION_NONE;
tpsd.psMessageClass = PS_MESSAGE_CLASS1;
tpsd.psReplaceOption = PSRO_NONE;
tpsd.dwHeaderDataSize = 0;
// Send the message, indicating success or failure
if(SUCCEEDED(SmsSendMessage(smshHandle, ((bUseDefaultSMSC) ? NULL : &smsaSource),
&smsaDestination, NULL, (PBYTE) lpszMessage,
_tcslen(lpszMessage) * sizeof(TCHAR), (PBYTE) &tpsd,
sizeof(TEXT_PROVIDER_SPECIFIC_DATA), SMSDE_OPTIMAL,
SMS_OPTION_DELIVERY_NONE, &smsmidMessageID)))
{
MessageBox(NULL, (LPCTSTR)LoadString(ghInstance, IDS_SMSSENT, 0, 0),
(LPCTSTR)LoadString(ghInstance, IDS_CAPTION_SUCCESS, 0, 0),
MB_OK);
}
else
{
MessageBox(NULL, (LPCTSTR)LoadString(ghInstance, IDS_ERROR_SMSSEND, 0, 0),
(LPCTSTR)LoadString(ghInstance, IDS_CAPTION_ERROR, 0, 0),
MB_OK | MB_ICONERROR);
}
// clean up
VERIFY(SUCCEEDED(SmsClose(smshHandle)));
}
我来回答
回答0个
时间排序
认可量排序
暂无数据
或将文件直接拖到这里
悬赏:
E币
网盘
* 网盘链接:
* 提取码:
悬赏:
E币
Markdown 语法
- 加粗**内容**
- 斜体*内容*
- 删除线~~内容~~
- 引用> 引用内容
- 代码`代码`
- 代码块```编程语言↵代码```
- 链接[链接标题](url)
- 无序列表- 内容
- 有序列表1. 内容
- 缩进内容
- 图片![alt](url)
相关问答
-
2008-08-07 19:12:46
-
2012-12-04 11:37:28
-
2018-06-25 15:14:10
-
2012-12-04 13:07:48
-
2008-08-14 01:01:56
-
2020-09-23 09:36:17
-
2012-12-04 12:57:16
-
2008-07-06 21:15:38
-
2010-07-19 15:15:27
-
2012-12-04 11:57:50
-
2012-12-04 11:57:10
-
2008-05-26 22:18:30
-
2012-12-04 13:08:38
-
2012-12-04 11:55:04
-
2012-12-04 11:49:35
-
2008-08-27 23:28:34
-
2008-08-27 23:29:54
-
2012-12-04 11:46:15
-
2012-12-04 11:44:18
无更多相似问答 去提问
点击登录
-- 积分
-- E币
提问
—
收益
—
被采纳
—
我要提问
切换马甲
上一页
下一页
悬赏问答
-
5Hi3516CV610 如何使用SD卡升级固件
-
5cat /dev/logmpp 报错 <3>[ vi] [func]:vi_send_frame_node [line]:99 [info]:vi pic queue is full!
-
50如何获取vpss chn的图像修改后发送至vo
-
5FPGA通过Bt1120传YUV422数据过来,vi接收不到数据——3516dv500
-
50SS928 运行PQtools 拼接 推到设备里有一半画面会异常
-
53536AV100的sample_vdec输出到CVBS显示
-
10海思板子mpp怎么在vi阶段改变视频数据尺寸
-
10HI3559AV100 多摄像头同步模式
-
9海思ss928单路摄像头vio中加入opencv处理并显示
-
10EB-RV1126-BC-191板子运行自己编码的程序
举报反馈
举报类型
- 内容涉黄/赌/毒
- 内容侵权/抄袭
- 政治相关
- 涉嫌广告
- 侮辱谩骂
- 其他
详细说明
提醒
你的问题还没有最佳答案,是否结题,结题后将扣除20%的悬赏金
取消
确认
提醒
你的问题还没有最佳答案,是否结题,结题后将根据回答情况扣除相应悬赏金(1回答=1E币)
取消
确认