寫(xiě)完<<在PC上通過(guò)手機(jī)發(fā)送短消息>>后,就打算接著寫(xiě)中文短信息的發(fā)送的,可是畢業(yè)論文時(shí)間實(shí)在太緊,一直耽擱下來(lái)了,這幾天陸續(xù)有幾個(gè)網(wǎng)友給我發(fā)郵件,關(guān)注這個(gè)話題的網(wǎng)友也比較多,而且CSDN郵件期刊也將我的那一篇文章收錄進(jìn)來(lái)了,我感到十分的欣慰,同時(shí)也覺(jué)得應(yīng)該盡快完成我未完成的工作,要不然太對(duì)不起大家了.
使用Text模式收發(fā)短信代碼簡(jiǎn)單,實(shí)現(xiàn)起來(lái)十分輕易,但是最大的缺點(diǎn)是不能收發(fā)中文短信,實(shí)在是有點(diǎn)美中不足.不過(guò)Pdu模式完全可以解決這個(gè)問(wèn)題,Pdu模式不僅支持中文短信,也能發(fā)送英文短信,堪稱完美無(wú)缺.Pdu模式收發(fā)短信可以使用三種編碼: 7-bit、8-bit和UCS2編碼. 7-bit編碼用于發(fā)送普通的ASCII字符,8-bit編碼通常用于發(fā)送數(shù)據(jù)消息,UCS2編碼用于發(fā)送Unicode字符。我們要實(shí)現(xiàn)中文短信的發(fā)送,所以選擇UCS2,即中文Unicode碼.
首先介紹一下VB中的兩個(gè)函數(shù):ChrW()和AscW().對(duì)于Chr()和Asc()函數(shù)大家一定很熟悉,對(duì)于ChrW()和AscW()可能會(huì)比較生疏一點(diǎn). ChrW 函數(shù)返回包含 Unicode 的 String,若在不支持 Unicode 的平臺(tái)上,則其功能與 Chr 函數(shù)相同; AscW 函數(shù)返回 Unicode 字符代碼,若平臺(tái)不支持 Unicode,則與 Asc 函數(shù)功能相同。對(duì)于這兩個(gè)函數(shù)我們各舉一個(gè)例子說(shuō)明:
?ascw("短")
30701
?chrw(26482)
杲
可見(jiàn)這兩個(gè)函數(shù)可以實(shí)現(xiàn)中文和Unicode碼之間的轉(zhuǎn)換,對(duì)于我們編碼解碼十分方便.我們得到中文的Unicode碼之后,就可以編制Pdu串了.
我們?cè)倭私庖幌翽du串的構(gòu)成,我們看這樣一個(gè)Pdu串(我調(diào)試程序時(shí)采用): 0891683110301405F011000D91683159717456F4000800165982679C6536523077ED4FE1
002C8BF756DE590D002E.我們將其分解為:
08 SMSC地址信息的長(zhǎng)度(91683110301405F0共八位字節(jié))
91 SMSC地址格式(TON/NPI)
683110301405F0 SMSC地址(8613010341500南京的短信服務(wù)中心號(hào)碼)
11 基本參數(shù)(TP-MTI/VFP)( 發(fā)送,接收為84)
00 MR Message Reference
0D 目標(biāo)SIM卡號(hào)碼長(zhǎng)度(683159717456F4按阿拉伯?dāng)?shù)字個(gè)數(shù)計(jì))
91 同上
683159717456F4 對(duì)方手機(jī)SIM卡號(hào)(8613057575064)
00 普通GSM類(lèi)型,點(diǎn)到點(diǎn)方式
08 UCS2編碼
00 有效期
16 用戶信息長(zhǎng)度(5982679C6536523077ED4FE1002C8BF756DE590D002E的長(zhǎng)度共22為字節(jié))
5982679C6536523077ED4FE1002C8BF756DE590D002E(“假如收到短信,請(qǐng)回復(fù).”Unicode碼)
Pdu碼的構(gòu)成我們已經(jīng)了解后,我們就可以開(kāi)始編碼了,上面的紅色部分就是我們要編碼實(shí)現(xiàn)的.
首先看SMSC地址: 683110301405F0與8613010341500F(SMSC最后一位補(bǔ)F構(gòu)成14位),我們可以發(fā)現(xiàn)只需將奇偶位對(duì)調(diào)即可.同樣道理: 683159717456F4與8613057575064也是一樣的處理.
對(duì)于用戶信息長(zhǎng)度,我們可以通過(guò)VB里的Len函數(shù)得到,例如”你好”,我們用Len(“你好”)得到2,那么2*2=4即為用戶信息長(zhǎng)度04(這里要轉(zhuǎn)換為16進(jìn)制,并且是兩位).對(duì)于Unicode碼,我們可以通過(guò)AscW()函數(shù)一個(gè)一個(gè)漢字取出其Unicode碼即可得到.
下面給出短信發(fā)送的具體實(shí)現(xiàn)代碼(相關(guān)知識(shí)可參見(jiàn)前一篇文章):
If MSComm1.PortOpen = False Then MSComm1.PortOpen = True
Length=Len(“假如收到短信,請(qǐng)回復(fù).”)*2
MSComm1.Output = "AT+CMGF=0" + vbCr ‘以Pdu模式發(fā)送短信
MSComm1.Output = "AT+CMGS=" & Str(15 + length * 2) + vbCr
MSComm1.Output= “0891683110301405F011000D91683159717456F4000800165982679C6536523077ED
4FE1002C8BF756DE590D002E” & Chr$(26)
start = Timer
pause =1
While Timer < start + pause
DoEvents
Wend
reco = MSComm1.Input
If InStr(reco, "OK") Then sendsms = True
If InStr(reco, "ERROR") Then sendsms = False
MSComm1.Output = "AT+CMGS=" & Str(15 + length * 2) + vbCr中的15為 11000D91683159717456F400080016的位數(shù).length*2為5982679C6536523077ED4FE1002C8BF756DE590D002E的位數(shù).
到這里,短信的發(fā)送基本完成,短信的接收更簡(jiǎn)單一點(diǎn),主要是解碼,就是應(yīng)用ChrW()函數(shù)了.寫(xiě)完這篇文章,才算送了一口氣,算是對(duì)大家有個(gè)交待吧,感謝大家的關(guān)注.假如需要源代碼,可以給我發(fā)郵件 :tmjpd@21cn.com.
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注