因為手機簡訊的發送是以PDU串的形式發送出去的,中文字符以Unicode碼來表示,所以在發送中文簡訊之前必須首先將中文字符轉換為Unicode 碼,下面的函數將實現這個功能。這個函數主要應用到VB自帶的一個格式轉換函數:ChrW()將中文轉換為Unicode碼。
DimtepAsString
DimtempAsString
DimiAsInteger
DimbAsInteger
tep=rmsg
i=Len(tep)
b=i/4
Ifi=b*4Then
b=b-1
tep=Left(tep,b*4)
Else
tep=Left(tep,b*4)
EndIf
chg=""
Fori=1Tob
temp="&H"&Mid(tep,(i-1)*4 1,4)
chg=chg&ChrW(CInt(Val(temp)))
Nexti
EndFunction
同上,為了發送以PDU模式發送簡訊,必須將手機號碼和對方手機號碼也轉換為PDU格式,下面的函數就是為了實現這種轉換:
PublicFunctiontelc(numAsString)AsString
DimtlAsInteger
Dimltem,rtem,ttemAsString
DimtiAsInteger
ttem=""
tl=Len(num)
Iftl<>11Andtl<>13Then
MsgBox"wrongnumber."&tl
ExitFunction
EndIf
Iftl=11Then
tl=tl 2
num="86"&num
EndIf
Forti=1TotlStep2
ltem=Mid(num,ti,1)
rtem=Mid(num,ti 1,1)
Ifti=tlThenrtem="F"
ttem=ttem&rtem<em
Nextti
telc=ttem
EndFunction
手機號碼有兩種表示方法:11位和13位(帶國家碼86),一般手機發送時都是以13位形式表示的,所以以上的函數還有一個功能是自動將11位格式手機號碼轉換為13位形式,然後再轉換為PDU串。
手機簡訊的發送主要借助於VB的Mscomm控件實現,關於Mscomm控件,前面的技術介紹部分有詳細介紹。簡訊的發送是由AT CMGS指令完成的,採用PDU模式發送,函數代碼如下:
Constprex="0891"
Constmidx="11000D91"
Constsufx="000800"
PublicFunctionSendsms(cscaAsString,numAsString,msgAsString)As_Boolean
Dimpdu,psmsc,pnum,pmsgAsString
DimlengAsString
DimlengthAsInteger
length=Len(msg)
length=2*length
leng=Hex(length)
Iflength<16Thenleng="0"&leng
psmsc=Trim(telc(csca))
pnum=Trim(telc(num))
pmsg=Trim(ascg(msg))
pdu=prex&psmsc&midx&pnum&sufx&leng&pmsg
sleep(1)
mobcomm.Output="AT CMGF=0" vbCr
mobcomm.Output="AT CMGS="&Str(15 length) vbCr
mobcomm.Output=pdu&Chr$(26)
sleep(1)
Sendsms=True
EndFunction
因為手機同一時間只能處理一件事情,因此這個函數只負責發送簡訊,關於簡訊發送成功與否以及閱讀簡訊的部分集中在一起處理。判斷手機簡訊發送成功與否主要由AT CMGS命令執行以後的返回碼來決定(可參見前文的AT指令介紹部分)。
為了防止手機因過於繁忙而出錯,這裡採取了一定的方法讓手機有充分的時間處理發送和接收及刪除等操作。Sleep()函數正是為此而設計的,在發送及刪除操作後都會讓程序暫停一秒,這樣就不至於使得手機過於繁忙。
Unicode碼解碼函數
相比於手機簡訊的發送而言,手機簡訊的接收主要的工作正好與之相反。手機簡訊的發送需要將待發送的簡訊內容轉換為Unicode碼,而簡訊的接收則需要將接收到的Unicode碼轉換成中文字符。下面的函數將實現解碼功能。同手機簡訊發送的編碼函數一樣,這裡也應用了一個VB內置的函數AscW()函數來將Unicode碼轉換為中文:
PublicFunctionascg(smsgAsString)AsString
Dimsi,sbAsInteger
DimstmpAsInteger
DimstempAsString
sb=Len(smsg)
ascg=""
Forsi=1Tosb
stmp=AscW(Mid(smsg,si,1))
IfAbs(stmp)<127Then
stemp="00"&Hex(stmp)
Else
stemp=Hex(stmp)
EndIf
ascg=ascg&stemp
Nextsi
ascg=Trim(ascg)
EndFunction
2手機簡訊接收函數
相對於簡訊的發送函數而言,簡訊的接收相當簡單,只需要以下的三行代碼就完成了。但是它使用的技術卻決不比簡訊的發送少,這裡主要用到了Mscomm控件的Output屬性和AT CMGR指令。
PublicSubreadsms(rnumAsString)
mobcomm.Output="AT CMGF=1" vbCr
mobcomm.Output="AT CMGR="&rnum vbCr
EndSub