今天給大家介紹的是以太網控制網絡單片機W7100A的應用筆記之如何實現TCP通信。TCP(傳輸控制協議)是用于控制網絡間數據通信的協議。作為組成互聯網的主要協議之一,更多的詳細內容已經寫入IETF(互聯網工程任務組)的RFC 793中。TCP是運行于IP層上的協議,它保證了數據的有效傳輸并且可以按照數據的發送順序依次進行接收。
本文引用地址:http://www.104case.com/article/201611/322031.htm因為W7100A單片機支持傳輸層的TCP協議,所以用戶不需要做任何整合就可以直接使用TCP/IP協議。
下面一一給大家做闡述。
1TCP SOCKET
用戶可以在W7100A提供的所有8個SOCKET中使用TCP協議,但是必須首先創建要使用的SOCKET。在創建SOCKET時,需要用到SOCKET號、協議、端口號以及標志位。這篇文檔將會介紹什么是TCP協議,以及在使用TCP協議時如何將Sn_MR(TCPIP核心中的SOCKET n模式寄存器)設置為Sn_MR_TCP(0×01)。SOCKET號表示用戶可以選擇從0到7這8個SOCKET中的任意一個使用。端口號表示TCP協議下用戶指定使用的端口。如果上面需要的這些都已經設定好,那么socket()函數就可以自行分配創建一個SOCKET。
由于W7100A單片機的TCP協議支持服務器模式和客戶端模式,用戶可以任意選擇一個模式實現此應用。服務器模式和客戶端模式的不同見下圖:

<圖1.1> TCP 服務器和TCP 客戶端
如圖1.1所示,TCP服務器模式和客戶端模式的過程大致相同。唯一的區別在于打開SOCKET之后,SOCKET狀態是監聽還是連接。當TCP協議在服務器模式下運行時,服務器處于監聽狀態等待來自客戶端的連接請求。如果TCP協議運行于客戶端模式下,客戶端將會在連接狀態下請求連接服務器。一旦成功建立連接,SOCKET的狀態將會變成建立(SOCK_ESTABLISHED,0×17)。SOCKET在點對點建立連接之后仍然可以保持連接狀態,從而進行數據交換直到SOCKET關閉。
服務器模式下的SOCKET循環周期是由打開、監聽、發送、接收、斷開和關閉組成。客戶端模式的SOCKET循環周期則是由打開、連接、發送、接收、斷開和關閉組成。
1.1打開(OPEN)
無論是在服務器模式或是客戶端模式下,在創建SOCKET時第一步都是打開SOCKET。利用SOCKET()函數設置SOCKET號、協議、端口號以及標志位來創建一個SOCKETn(取第n-1個SOCKET值)。由于使用的是TCP協議,需要將協議設置為Sn_MR_TCP(0×01)。而端口號的設置則取決于是在服務器模式還是客戶端模式下。如果是在服務器模式下,服務器會根據當前用戶所使用的端口來設置源端口號。但是如果是在客戶端模式下,因為目的端口號正在被使用,最好隨機選擇一個端口號,并每次增加一個數字,直到SOCKET被連接為止。TCP協議的標志位表示‘無延時確認標志位’,一般來說,將該位設置為0。更多關于協議類型、標志位等信息,將會在‘TCPIPCore.h’文件下的‘Sn_MR value’中介紹。
在所有的設置完成之后,通過檢查Sn_SR(n)寄存器來查看SOCKETn的狀態是否變成SOCK_INIT(0×13)。用戶可以通過getSn_SR(SOCKETn)函數來完成Sn_SR(N)寄存器的檢查過程。如果SOCKET的狀態為SOCK_INIT(0×13),表示SOCKET創建成功;如果沒有成功,用戶需要重新創建SOCKET。

例1.1 打開SOCKET
1.2 監聽(LISTEN)
監聽過程只能在服務器模式下使用。在SOCKETn創建完成后,為了能與客戶端連接,需要將SOCKET的狀態從SOCK_INIT(0×13)變成監聽。用戶可以直接將Sn_CR(n)寄存器設置為Sn_CR_LISTEN(0×02)或者可以直接使用’SOCKET.c’文件中的LISTEN()函數。在變成監聽狀態之后,SOCKET將會改變為SOCK_LISTEN(0×14)。然后,SOCKET等待客戶端發出連接請求。一旦與客戶端建立連接,SOCKET的狀態將會重新變成SOCK_ESTABLISHED(0×17)。此時,便可以與客戶端之間進行數據傳輸。

例 1.2 設置監聽狀態
1.3 連接(CONNECT)
連接過程發生在客戶端模式連接到服務器時。在連接SOCKET時需要用到SOCKET號、目的IP以及目的端口號這些參數。用戶可以通過CONNECT()函數進行設置;一旦成功建立連接,SOCKET的狀態將會變成SOCK_ESTABLISHED(0×17)。

例 1.3 設置連接狀態
1.4 發送(SEND)
在使用TCP協議時,與對端的連接在發送數據前就已經完成。用戶可以通過SEND()函數查看設置的SOCKET號、將要發送數據的地址、數據的大小等參數。將要發送的數據的地址通常由選擇的區域確定,輸入數據,并且通過指針設定區域。

例1.4 發送數據
1.5 接收(RECEIVE)
接收過程和發送過程基本相同,唯一不同的是接收(RECEIVE)過程需要檢查的是Sn_RX_RSR(n)。接收過程是指將來自接收緩存器的數據移動到用戶數據存儲區。因此,用戶必須在接收之前檢查Sn_RX_RSR(n)的值是否大于0。如果大于0,表示數據已經保存在接收緩存器中。用戶必須通過getSn_RX_RSR(n)函數在此過程之前確認數據是否被接收。

例1.5 接收數據
1.6 斷開(DISCONNECT)
關閉SOCKET的方法通常有兩種:第一種方法是通過DISCONNECT(n)函數。DISCONNECT(n)函數不能用來直接關閉SOCKET。它先向對端發送斷開連接請求(FIN數據包),然后等待回復信息(FIN/ACK數據包),之后才能將SOCKET的狀態變成SOCK_CLOSED(0×00),最后關閉SOCKET。當收到斷開連接請求時,W7100A發送一個FIN/ACK數據包表示允許對端關閉SOCKET。如果在發送斷開連接請求之后沒有收到對端的回復,將會發生TCP超時,SOCKET的狀態將會變成SOCKET_CLOSED(0×00)。當用戶需要斷開連接時,通過DISCONNECT()函數,選擇合適的SOCKET號,然后發送斷開連接請求。
評論