短消息服务(SMS)编程流程
短消息服务是在移动通讯全球系统(Global System for Mobile Communications networks ,GSM)中的移动电话间发送<-- Copyright 1999-2000 ThruPort Technologies http://www.thruport.com --><-- end dynamic banner insert -->短字母-数字消息(最长160个字符)的标准。它有些象分页技术,但是使用文本,目前的多数电话支持短消息服务。 6@(zL)+b
短消息服务的一个关键特性是通过移动网络操作员的网络立即发送的消息,不需要手工连接到Internet服务提供商(Internet Service Provider,ISP)--SMS消息都是立即发送的,而电子邮件需要接收者从邮件服务器上检索。同样,接收者如果不在线--如果电话关闭了--SMS消息存储在操作者那儿,在电话再次打开时发送。 `jrc"
在Pocket PC 2002 Phone Edition设备上,你能象处理电子邮件消息一样处理SMS消息。SMS消息组件与标准收件箱应用程序集成了,允许象发送和接收电子邮件一样发送和接收消息。你甚至可以把电子邮件作为SMS消息转发和回复。 0|E1oY
可激活短消息服务的应用程序 o1/@y]so9
许多商业情况涉及一些类型的通知,SMS是一条实现多种商业事件通知的强大的途径。可能的情况是销售人员通知服务工程师客户需要某种服务,服务工程师在用户那儿通知执行重要的商业事件,或者执行人员通知所有与客户相关的人员新客户的处理测试。 #0}E7Ep)va
使用SMS的另一个好处是实现移动商务(m-commerce),SMS通常用于处理支付事务。例程开始将演示怎样从Pocket PC 2002 Phone Edition设备发送SMS消息。 p3=e+$R01-
编码过程 0W"9 f6n6
下面是发送SMS消息核心代码。首先需要定义一些微软Windows API: #z^qU"
l 一个API打开SMS消息组件 3V,J'VP;T
l 一个API发送SMS消息 lXE,D~Z~
l 一个API关闭SMS消息组件 14?jh
Public Declare Function SmsOpen Lib "SMS" (ByVal ptsMessageProtocol I[-h
As String, ByVal dwMessageModes As Long, ByRef psmshHandle As !V!V(xIWA
Long, ByRef phMessageAvailableEvent As Long) As Long 0p.gAs`
PSW3q /{
Public Declare Function SmsSendMessage Lib "SMS" (ByVal smshHandle v7!1$ip
As Long, ByVal psmsaSMSCAddress As Long, ByVal QXl( Z~Vq
psmsaDestinationAddress As String, ByVal pstValidityPeriod As peR=O>l
Long, ByVal pbData As String, ByVal dwDataSize As Long, ByVal : 0R4
pbProviderSpecificData As String, ByVal dwProviderSpecificDataSize /*z(z
As Long, ByVal smsdeDataEncoding As Long, ByVal dwOptions As Long, 'F/N t
ByRef psmsmidMessageID As Long) As Long *[a&
F?>|MAWs
Public Declare Function SmsClose Lib "SMS" (ByVal smshHandle As Long) As Long >&Fp*F(
你也需要为不同的API声明一些API常数: d> V!rm
Public Const SMS_MSGTYPE_TEXT = "Microsoft Text SMS Protocol" u
Public Const SMS_MODE_SEND = 2 '用发送模式打开 =}w4Q }E
Public Const SMSDE_GSM = 1 '使用标准GSM 4Qt4wfP
encoding 7+:n ^
Public Const SMSAT_INTERNATIONAL = 1 ' 国际号码 eh M}5s|:
format +ltGV9^
Public Const PS_MESSAGE_OPTION_NONE = 0 ' 没有消息选项 @z(?
Public Const PS_MESSAGE_CLASS0 = 0 ' 立即发送 j wQ$0Ry
Public Const PSRO_NONE = 0 '没有更替 o'f6p.]+9
Public Const SMS_OPTION_DELIVERY_NONE = 0 ' 没有发送选项 [!FmzG.UQ
下面是发送SMS消息的完整代码: kdNb?^QW
Public Sub SendSMS(ByVal Number As String, ByVal Message As String) O&%LT+$
=7Rw3 3
Dim SMSHandle As Long :hMRvn%
Dim SMSEvent As Long 3. o}K3ZWj
Dim SMSAddress As String #d18+h*|
Dim SMSProvider As String Wi,NZeP
2RURRiVa(%
'打开SMS消息组件 w$A=z@D
Call SmsOpen(SMS_MSGTYPE_TEXT, SMS_MODE_SEND, SMSHandle, SMSEvent) `z'xm$Z2w
CiBzia,
'设置地址结构体 3Ls0|= @aj
SMSAddress = LongToBytes(SMSAT_INTERNATIONAL) & Number 4NaXX
h)T~/]
'设置提供者结构体 f?I_*]p!q
SMSProvider = LongToBytes(PS_MESSAGE_OPTION_NONE) & _ 5*h/F.q
LongToBytes(PS_MESSAGE_CLASS0) & _ .giy=
LongToBytes(PSRO_NONE) 3x#Vew F
Umq!+#
'发送消息 [_<^P5R{
If 0 = SmsSendMessage(SMSHandle, 0, SMSAddress, 0, Message, _ x^xq:t
LenB(Message), SMSProvider, 12, SMSDE_GSM, _ d%`p,R7z
SMS_OPTION_DELIVERY_NONE, 0) Then ~->0(a0
MsgBox "Message sent!", vbInformation, App.Title Z~>ZfYQ8F
Else =yx/F=X+
MsgBox "Could not send message!", vbCritical, App.Title Zp AoW6.8
End If !np?8<.p&
fWSO@Pw?6
'关闭SMS消息组件 9;aFgMB
Call SmsClose(SMSHandle) M#gng1(t
b %qUX
End Sub iz(+QYp
首先SMS消息组件被打开(SmsOpen),它的句柄被保存(SMSHandle)。调用SMS API时该句柄是必须的。 w5|H;R)_
调用SmsSendMessage时需要一些结构体或者UDT(用户定义类型)。因为嵌入式Visual Basic缺乏对UDT的支持,简单字符串用于模拟结构体。 $RP;&8
第一个是包含SMS消息地址的结构体。地址结构体包含支持的号码类型以及号码本身。下一个结构体是关于服务提供者的一些选项。该结构体的第一部分指示没有选择特定的项,第二部分显示消息必须立即发送,最后的部分规定不能替换。 G#.q)"jn
在发送消息(SmsSendMessage)的调用中,提供了准备好的结构体、消息文本和一些选项。最后,句柄被关闭(SmsClose)。 ;OXg2>ep
结论 &Z>Rxt7
SMS对于短小及时的文本通知有很大用处。在Pocket PC 2002 Phone Edition的支持下,你可以使应用程序"SMS自唤醒"。使用例程的代码,大部分需要的操作完成了。如果你接受移动世界,按照通讯机制和协议,更多是使用"并且"而不是"或者",你能按需求使用任意选项。
1