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