四、 具體的內部編程思路:
GPRS控件的編寫,我們用到的是Winsock控件,所以首先要先了解一下Winsock控件的使用。
1、Winsock控件的使用:
Winsock控件對用戶來說是不可見的,我們在編寫客戶端或服務器程序時,通過設置控件的屬性并調用其方法即可實現數據的雙向交換。
如果創建客戶應用程序,就必須知道服務器計算機名或者 IP 地址(RemoteHost 屬性),還要知道進行“偵聽”的端口(RemotePort 屬性),然后調用 Connect 方法。
如果創建服務器應用程序,就應設置一個收聽端口(LocalPort 屬性)并調用 Listen 方法。當客戶計算機需要連接時就會發生 ConnectionRequest 事件。為了完成連接,可調用 ConnectionRequest 事件內的 Accept 方法。
建立連接后,任何一方計算機都可以收發數據。為了發送數據,可調用 SendData 方法。當接收數據時會發生 DataArrival 事件。調用 DataArrival 事件內的 GetData 方法就可獲取數據。
2、Winsock控件的常用屬性:
a、協議
在使用Winsock控件時,首先需要考慮使用什么協議。可以使用的協議包括 TCP 和 UDP。兩種協議之間的重要區別在于它們的連接狀態:
? TCP 協議控件是基于連接的協議,可以將它同電話系統相比。在開始數據傳輸之前,用戶必須先建立連接。
? UDP 協議是一種無連接協議,兩臺計算機之間的傳輸類似于傳遞郵件:消息從一臺計算機發送到另一臺計算機,但是兩者之間沒有明確的連接。另外,單次傳輸的最大數據量取決于具體的網絡。
在設計時,可以按如下方式設置應用程序使用的協議:在“屬性”窗口中單擊“協議”,然后選擇 sckTCPProtocol 或者 sckUDPProtocol。也可以使用程序代碼來設置 Protocol 屬性,如下所示:
Winsock1.Protocol = sckTCPProtocol
b、IP地址(計算機名稱)
客戶應用程序在與遠程計算機相連接的時候,需要知道遠程計算機的 IP 地址或者計算機名稱。
我們連接計算機時可以將其作為 RemoteHost 屬性的值。代碼如下:
Winsock1.RemoteHost = 計算機名稱 或者為 Winsock1.RemoteHost =IP地址
服務器程序用到LocalIP 屬性,它返回本地機器的 IP 地址,格式是 IP 地址加點字符串 (xxx.xxx.xxx.xxx)。
用RemoteHostIP屬性返回遠程計算機的IP。
c、端口號
對于客戶應用程序來說,RemotePort 屬性最重要,它設置要連接的遠程端口號。
對于服務器程序來說,LocalPort 屬性最重要,它設置所用到的本地端口。這是用于偵聽的本地端口。如果指定的是端口 0,就使用一個隨機端口。在調用了 Listen 方法后,屬性就包含了已選定的實際端口。
3、Winsock控件的常用事件
a、Connect 事件
該事件是在到服務器的連接建立之后發生。
b、ConnectionRequest 事件
當遠程計算機請求連接時出現。
如果有連接請求時,可以用 Accept 方法接受新連接。
c、DataArrival 事件
當新數據到達時出現。
如果有新數據到達時,可以用GetData方法接收數據。如果沒有獲取一個 GetData 調用中的全部數據,則事件不會出現。只有存在新數據時才激活事件。可隨時用 BytesReceived 屬性檢查可用的數據量。
4、Winsock控件的常用方法
a、Accept 方法
接受新連接。
僅適用于 TCP 服務器應用程序。在處理 ConnectionRequest 事件時用這個方法接受新連接。在 ConnectionRequest 事件中使用 Accept 方法。ConnectionRequest 事件有一個對應的參數,即 RequestID 參數(新連接請求標識),該參數應該傳給 Accept 方法。
b、Bind 方法
指定用于 TCP 連接的 LocalPort(端口號) 和 LocalIP。(IP 地址)
在調用 Listen 方法之前必須調用 Bind 方法。
c、Close 方法
關閉連接。
d、GetData 方法
獲取當前的數據塊并將其存儲在變體類型的變量中。
通常總是將 GetData 方法與 DataArrival 事件并用。
e、Listen 方法
偵聽模式。該方法僅適用于 TCP 連接。
當有新連接時就會出現 ConnectionRequest 事件。處理ConnectionRequest 事件時,應用程序應該(在一個新的控件示例上)用 Accept 方法接受連接。
f、SendData 方法
將數據發送給遠程計算機。
大體了解了Winsock控件的使用之后,對理解GPRS通訊的原理來說,有一定的幫助。
接下來我們將根據Winsock控件的使用來大體理解GPRS通訊的原理。
1、啟動服務
原理為建立一個Tcp的連接,首先設定數據業務中心的IP地址及監聽端口號,將其賦給Winsock控件,并用該控件進行連接,連接成功后,進行監聽。
代碼如下:
myLocalIP = tcpServer(0).LocalIP‘本地機器的 IP 地址(局域網方式)
myLocalIP = “10.14.87.102”‘無線Modem的IP地址(撥號上網方式)
PlngTCPLocalPort = 2020 ‘Tcp服務器的監聽端口號
Winsock.Bind (Port ,IP)
Winsock.Listen
需要注意的是如果計算機上既有本地連接又有無線Modem,在運行程序(啟動服務)時有可能失敗,所以,在編寫代碼的時候一定要注意自己使用的是哪種方式。因為LocalIP屬性獲取的是本地連接的IP,用無線Modem的時候IP最好是直接賦值。
再者就是兩者同時使用的時候,如果用的是無線Modem的撥號連接,則本地連接只能是同一個網段內使用。
2、GPRS模塊連接請求處理
代碼如下:
Public Sub Winsock_ConnectionRequest(ByVal RequestID As Long)
Winsock.Accept Requested‘接收新連接
End Sub
原理為如果現在有連接請求,先把請求連接的GPRS模塊的IP地址記錄下來(用的是Winsock控件的RemoteHostIP屬性),再判斷保存所有GPRS模塊信息的數組中是否出現過,如果沒有出現過,保存該信息;如果出現過,先卸載該控件,然后重新加載該控件,保存信息。
3、GPRS模塊數據通訊處理
代碼如下:
Public Sub Winsock_DataArrival(ByVal bytesTotal As Long)
GprsLong = Winsock.BytesReceived‘返回接收到的(當前在接收端緩沖區內的)數據的數量
Winsock.GetData TempArr, vbByte‘用 GetData 方法來獲取數據,取得的數據存放在TempArr中。
End Sub
原理為如果下面的GPRS模塊向數據業務中心發送數據,數據業務中心用GetData方法將數據從接收緩沖區中讀出來,然后根據條件進行判斷所收到的數據是否正確。
在用GetData方法進行數據接收時需要注意是用哪種方式進行通訊的,收到的數是Hex還是Ascii,這里接收的方式不一樣。如果是Ascii方式,接收的數據要賦給一個字符串變量,方式為:Winsock.GetData TempStr, vbString;如果是Hex方式,接收的數據要賦給一個以Byte 數據類型的數組,方式為:Winsock.GetData TempArr, vbByte 。
在接收數據之后,必須先要進行數據編譯,如果碰到‘80H和90H’在一塊的將其轉換成為‘1AH’,碰到‘8AH和9AH’在一塊的將其轉換成為‘8AH’。
將接收到的數據進行編譯之后,就可根據條件進行數據處理了。
4、數據中心發送數據
代碼如下:
以十六進制發送數據時為:
Dim Cmd(1 to 7) As Byte
Cmd(1)=&H4C
Cmd(2)=&H57
Cmd(3)=&H01
Cmd(4)=&H00
Cmd(5)=&H20
Cmd(6)=&H21
Cmd(7)=&H0D
Winsock.SendData Cmd
以Ascii方式發送數據為:
dim Cmd as string
Cmd=”#01A”+chr(13)
Winsock.SendData Cmd
原理為發送數據時,要知道該GPRS模塊的ID號和發送的數據。程序在發送時,先判斷該ID號是否收到過,如果沒有收到過,程序就不向外發送數據;如果收到過,在發送的時候還要判斷GPRS模塊當前的狀態(是否在線),只有所有條件都符合,才進行發送數據命令。否則程序會出現錯誤,提示網絡連接失敗,不能發送數據。
5、停止服務
代碼如下:
Winsock.Close
原理為如果用戶要關閉服務的話,先關閉所有控件的連接,并把所有加載的控件卸載掉,清空存放GPRS模塊的信息,將數據返回長度置為0。
評論
查看更多