UML软件工程组织

短消息服务(SMS)编程介绍
作者:上海 王凯明 本文选自:赛迪网 2003年03月19日

 



短消息服务与Pocket PC Phone Edition

短消息服务是在移动通讯全球系统(Global System for Mobile Communications networks ,GSM)中的移动电话间发送短字母-数字消息(最长160个字符)的标准。它有些象分页技术,但是使用文本,目前的多数电话支持短消息服务。

短消息服务的一个关键特性是通过移动网络操作员的网络立即发送的消息,不需要手工连接到Internet服务提供商(Internet Service Provider,ISP)--SMS消息都是立即发送的,而电子邮件需要接收者从邮件服务器上检索。同样,接收者如果不在线--如果电话关闭了--SMS消息存储在操作者那儿,在电话再次打开时发送。

在Pocket PC 2002 Phone Edition设备上,你能象处理电子邮件消息一样处理SMS消息。SMS消息组件与标准收件箱应用程序集成了,允许象发送和接收电子邮件一样发送和接收消息。你甚至可以把电子邮件作为SMS消息转发和回复。

可激活短消息服务的应用程序

许多商业情况涉及一些类型的通知,SMS是一条实现多种商业事件通知的强大的途径。可能的情况是销售人员通知服务工程师客户需要某种服务,服务工程师在用户那儿通知执行重要的商业事件,或者执行人员通知所有与客户相关的人员新客户的处理测试。

使用SMS的另一个好处是实现移动商务(m-commerce),SMS通常用于处理支付事务。例程开始将演示怎样从Pocket PC 2002 Phone Edition设备发送SMS消息。

发送短消息服务例子

使用微软嵌入式Visual Basic的例子:

图1.SMS例程

在这个窗体中,你能输入一个国际移动电话号码和一条文本消息。点击Send按钮时,消息就发送了--就这么简单。

编码过程

下面是发送SMS消息核心代码。首先需要定义一些微软Windows API:

l 一个API打开SMS消息组件

l 一个API发送SMS消息

l 一个API关闭SMS消息组件

Public Declare Function SmsOpen Lib "SMS" (ByVal ptsMessageProtocol
As String, ByVal dwMessageModes As Long, ByRef psmshHandle As
Long, ByRef phMessageAvailableEvent As Long) As Long

Public Declare Function SmsSendMessage Lib "SMS" (ByVal smshHandle
As Long, ByVal psmsaSMSCAddress As Long, ByVal
psmsaDestinationAddress As String, ByVal pstValidityPeriod As
Long, ByVal pbData As String, ByVal dwDataSize As Long, ByVal
pbProviderSpecificData As String, ByVal dwProviderSpecificDataSize
As Long, ByVal smsdeDataEncoding As Long, ByVal dwOptions As Long,
ByRef psmsmidMessageID As Long) As Long

Public Declare Function SmsClose Lib "SMS" (ByVal smshHandle As Long) As Long


你也需要为不同的API声明一些API常数:

Public Const SMS_MSGTYPE_TEXT = "Microsoft Text SMS Protocol"
Public Const SMS_MODE_SEND = 2 '用发送模式打开
Public Const SMSDE_GSM = 1 '使用标准GSM
encoding
Public Const SMSAT_INTERNATIONAL = 1 ' 国际号码
format
Public Const PS_MESSAGE_OPTION_NONE = 0 ' 没有消息选项
Public Const PS_MESSAGE_CLASS0 = 0 ' 立即发送
Public Const PSRO_NONE = 0 '没有更替
Public Const SMS_OPTION_DELIVERY_NONE = 0 ' 没有发送选项


下面是发送SMS消息的完整代码:

Public Sub SendSMS(ByVal Number As String, ByVal Message As String)

Dim SMSHandle As Long
Dim SMSEvent As Long
Dim SMSAddress As String
Dim SMSProvider As String

'打开SMS消息组件
Call SmsOpen(SMS_MSGTYPE_TEXT, SMS_MODE_SEND, SMSHandle, SMSEvent)

'设置地址结构体
SMSAddress = LongToBytes(SMSAT_INTERNATIONAL) & Number

'设置提供者结构体
SMSProvider = LongToBytes(PS_MESSAGE_OPTION_NONE) & _
LongToBytes(PS_MESSAGE_CLASS0) & _
LongToBytes(PSRO_NONE)

'发送消息
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

'关闭SMS消息组件
Call SmsClose(SMSHandle)

End Sub


首先SMS消息组件被打开(SmsOpen),它的句柄被保存(SMSHandle)。调用SMS API时该句柄是必须的。

调用SmsSendMessage时需要一些结构体或者UDT(用户定义类型)。因为嵌入式Visual Basic缺乏对UDT的支持,简单字符串用于模拟结构体。

第一个是包含SMS消息地址的结构体。地址结构体包含支持的号码类型以及号码本身。下一个结构体是关于服务提供者的一些选项。该结构体的第一部分指示没有选择特定的项,第二部分显示消息必须立即发送,最后的部分规定不能替换。

在发送消息(SmsSendMessage)的调用中,提供了准备好的结构体、消息文本和一些选项。最后,句柄被关闭(SmsClose)。

结论

SMS对于短小及时的文本通知有很大用处。在Pocket PC 2002 Phone Edition的支持下,你可以使应用程序"SMS自唤醒"。使用例程的代码,大部分需要的操作完成了。如果你接受移动世界,按照通讯机制和协议,更多是使用"并且"而不是"或者",你能按需求使用任意选项。



版权所有:UML软件工程组织