适用于:
Pocket PC 2002 Phone Edition
微软® eMbedded Visual Tools
下载本文代码Introapp.exe
SMS和Pocket PC Phone Edition
短消息服务(SMS)是在全球移动通信网络(GSM)的移动电话之间发送简短的字母和数字消息(最大160个字符)的标准。它和传呼机的工作方式很相象,但是它带有文本,而且当今大多数的移动电话都支持SMS。
SMS的一个关键方面是,信息通过移动网络运营商的网络即时发送,而不要手动连接到Internet服务提供商(Internet Service Provider)——SMS信息是即时发送的,而电子邮件需要接收者在邮件服务器上接收。而且,如果接收者不在线的话——例如电话关机——SMS信息会被保存在运营商(的服务器上),并在电话再次开机的时候转发出去。
在装有Pocket PC 2002 Phone Edition的设备上,你可以像管理电子邮件信息一样管理SMS消息。SMS消息组件同标准的收件箱(Inbox)应用程序集成在一起,这就让你能够像发送和接收电子邮件一样发送和接收短消息。你甚至能够将电子邮件作为SMS消息转发和回复,反过来也可以。
支持SMS的应用程序
很多商业情景都需要某种形式的通知,而SMS是实现用于各种商业事件的通知的极好方法。它可以是销售人员告知服务工程师某个客户需要服务,也可以是服务工程师将客户的一个重要商业事件告知执行人员,或者是执行人员将新的客户处理规程通知所有同该客户相关的职员。
SMS另一个有意思的用途是能够使移动商务(mobile commerce,m-commerce)成为可能,因为SMS常常被用来处理支付交易。为了让你有个初步的了解,我们会在下面的例子里向你演示如何利用你的Pocket PC 2002 Phone Edition设备发送SMS信息。
SMS发送示例
一个使用微软® eMbedded Visual Basic®的简单窗体:
![](img/smspkst.jpg)
图1:SMS应用程序示例
在这个窗体里,你可以输入一个国际移动电话的号码以及一条文本信息。当你点击“发送(Send)”按钮的时候,信息就被发送出去了——就这么简单!
示例代码
现在让我们来看看用于发送SMS信息的核心代码。首先,你需要声明多个微软Windows®的API:
一个用于打开SMS信息组件
一个用于发送SMS信息
一个用于关闭SMS信息组件:
Public Declare Function SmsOpen Lib "SMS" (ByValptsMessageProtocol As String, ByValdwMessageModes As Long, ByRefpsmshHandle As Long, ByRefphMessageAvailableEvent As Long) As Long
Public Declare Function SmsSendMessage Lib "SMS" (ByValsmshHandle As Long, ByValpsmsaSMSCAddress As Long, ByVal psmsaDestinationAddress As String, ByValpstValidityPeriod As Long, ByValpbData As String, ByValdwDataSize As Long, ByVal pbProviderSpecificData As String, ByValdwProviderSpecificDataSize As Long, ByValsmsdeDataEncoding As Long, ByValdwOptions As Long,ByRefpsmsmidMessageID As Long) As Long
Public Declare Function SmsClose Lib "SMS" (ByValsmshHandle As Long) As Long
你还需要声明一些用于不同API的API常量:
Public Const SMS_MSGTYPE_TEXT = "Microsoft Text SMS Protocol"
Public Const SMS_MODE_SEND = 2 ' Open in send mode
Public Const SMSDE_GSM = 1 ' Use standard GSM encoding
Public Const SMSAT_INTERNATIONAL = 1 ' International number format
Public Const PS_MESSAGE_OPTION_NONE = 0 ' No message options
Public Const PS_MESSAGE_CLASS0 = 0 ' Send immediately
Public Const PSRO_NONE = 0 ' No replacements
Public Const SMS_OPTION_DELIVERY_NONE = 0 ' No delivery options
下面是发送一条SMS信息的完整代码:
Public Sub SendSMS(ByVal Number As String, ByVal Message As String)
Dim SMSHandleAs Long
Dim SMSEventAs Long
Dim SMSAddressAs String
Dim SMSProviderAs String
' Open SMS Messaging Component
Call SmsOpen(SMS_MSGTYPE_TEXT, SMS_MODE_SEND, SMSHandle, SMSEvent)
' Set Address structure (UDT as string)
SMSAddress = LongToBytes(SMSAT_INTERNATIONAL) & Number
' Set Provider structure (UDT as string)
SMSProvider = LongToBytes(PS_MESSAGE_OPTION_NONE) & _
LongToBytes(PS_MESSAGE_CLASS0) & _
LongToBytes(PSRO_NONE)
' Send message
If 0 = SmsSendMessage(SMSHandle, 0, SMSAddress, 0, Message, _
LenB(Message), SMSProvider, 12, SMSDE_GSM, _
SMS_OPTION_DELIVERY_NONE, 0) Then
MsgBox "Message sent!",vbInformation, App.Title
Else
MsgBox "Could not send message!",vbCritical, App.Title
End If
' Close SMS Messaging Component
Call SmsClose(SMSHandle)
End Sub
首先,SMS信息组件被打开(SmsOpen),其句柄被保存(SMSHandle)。调用其它SMS API的时候需要这个句柄。
准备调用SmsSendMessage的时候需要多个结构或者UDT(用户定义的类型)。由于eMbedded Visual Basic缺乏对UDT的支持,所以会有一个简单的字符串用来仿真一个结构。
第一个是一个包含有SMS信息地址的结构。这个地址结构包含有一个指示器,用来表示提供的是什么类型的号码(在这个是一个国际号码)以及这个号码自身。
下一个结构包含有同服务提供商相关的各种选项。这个结构的第一部分表示没有特别的选项被选中,第二部分表示这条信息应该被立即发送。
最后一部分声明:不应该做出替换。
在对发送该信息(SmsSendMessage)的调用中,会提供已经准备好的结构,以及信息文本和多个选项。最后,这个句柄被关闭(SmsClose)。
要获得完整的例子,请参见本文的示例代码。此外,在Antonio Paneiro的文章《VBCE里的UDT(用户定义的类型)》里,你可以读到更多关于这个技术的内容。
结束语
SMS是发送短小和即时文本通知的好方法。随着Pocket PC 2002 Phone Edition对它的支持,你将能够让你的程序“识别SMS”。有了本例里的示例代码,你就了解了你该做什么。如果接受这样一种观点,即移动世界,用移动通信机制和协议的话来说,是“和(both/and)”而不是“或(or/else)”的,那么你就能够真正地用好每个选项。