將lwIP TCP/IP堆棧整合至嵌入式應用的界面
輕量化TCP/IP(lwIP)堆棧是TCP/IP協(xié)議的精簡(jiǎn)實(shí)作,專(zhuān)門(mén)設計用來(lái)縮減RAM內存的使用量,這使其非常適合用在嵌入式系統。它提供三種獨特的應用程序編程接口(API):
? 未封裝的低階API
? 負責網(wǎng)絡(luò )通訊的高階 API
? BSD 風(fēng)格的socket套接字 API
本文專(zhuān)注探討使用未封裝API接口的范例。運用未封裝API建置callback回調函數的應用程序會(huì )由核心事件觸發(fā)。
盡管未封裝API較socket套接字API更為復雜,但由于其處理負荷(overhead)較低,因此能提供高出許多的吞吐量。
接著(zhù)將探討幾個(gè)建構在lwIP TCP/IP堆棧之上的范例,其中采用Analog Devices的MAX32570微控制器。開(kāi)始的部分是一個(gè)ping展示,主要從PC向裝置發(fā)送ping探測訊號。后續的部分介紹TCP Echo服務(wù)器范例,這個(gè)初步的服務(wù)器展示對于測試TCP連結相當實(shí)用。
ADI的MaximSDK軟件開(kāi)發(fā)工具包收錄許多必要的軟件與工具,讓用戶(hù)針對ADI的MSX32xxx微控制器開(kāi)發(fā)韌體。套件中有一個(gè)lwIP堆棧函式庫檔案「MaximSDKLibrarieslwIP」。圖一顯示MaximSDK文件夾結構中的lwIP函式庫檔案。
圖一 : ADI的MaximSDK lwIP 函式庫檔案
lwIP文件夾包含多個(gè)子目錄:
? API 文件夾(網(wǎng)絡(luò )通訊與 socket 套接字API)
? 核心文件夾(lwIP 核心檔案,包含 “tcp.c”、“ip.c” 等)
? Netif 文件夾(網(wǎng)絡(luò )接口檔案)
? Include 文件夾(所有lwIP include 引入檔案)
? Maxim文件夾(為ADI微控制器設計的客制化mac 驅動(dòng)程序)
lwIP架構依循TCP/IP模型結構。TCP/IP通訊協(xié)議是多個(gè)分層組成的協(xié)定。TCP/IP通常被看成是一個(gè)四層結構的系統,如圖二所示。
圖二 : TCP/IP 通訊協(xié)議分層
lwIP 項目檔中一定有一個(gè)名為「lwipopts.h」的組態(tài)檔案,以及一個(gè)名為「opt.h」的組態(tài)檔案?!竜pt.h」檔案中記錄所有默認的堆棧組態(tài)以及其模塊組態(tài),而「lwipopts.h」則讓用戶(hù)能自行設定堆棧與其模塊的所有組態(tài)。須注意這個(gè)檔案并未包含所有可能的lwIP選項。因此,如果在“l(fā)wipopts.h”組態(tài)檔案中沒(méi)有定義某項組態(tài),系統就會(huì )采用「opt.h」中定義的預設組態(tài)。
類(lèi)似的情況,lwIP函式庫有一個(gè)和程序相關(guān)的表頭文件名為 「lwipcfg.h」。包括控制器的IP地址、網(wǎng)關(guān)地址、網(wǎng)絡(luò )屏蔽地址、以及MAC地址都應定義在「lwipcfg.h」檔案。
要在lwIP以及底層的硬件驅動(dòng)程序之間建立鏈接,需要用到一個(gè)特定平臺專(zhuān)屬的配接層。舉例來(lái)說(shuō),在為微控制器建置lwIP堆棧時(shí),需要量身設計的驅動(dòng)程序來(lái)橋接lwIP堆棧與微控制器的以太網(wǎng)絡(luò )MAC驅動(dòng)程序。這個(gè)客制化驅動(dòng)程序應涵蓋以下功能:
? 初始化功能: 此項功能負責初始化微控制器專(zhuān)屬的MAC驅動(dòng)程序
? 傳送功能: 將從TCP堆棧收到的數據傳送給以太網(wǎng)絡(luò )MAC驅動(dòng)程序,以便進(jìn)行后續的傳輸
? 接收功能: 將從以太網(wǎng)絡(luò )MAC驅動(dòng)程序收到的封包轉送到TCP堆棧
對于A(yíng)DI微控制器,預存的客制化驅動(dòng)程序已放在「MaximSDKLibrarieslwIPMaximmxc_eth.c」路徑下的MaximSDK。這個(gè)驅動(dòng)程序可作為包裝器,能包裝微控制器本身的Ethernet MAC (EMAC)外圍函式庫,該函式庫位于「C:MaximSDK LibrariesPeriphDriversSourceEMAC」路徑下的外圍驅動(dòng)程序中。
Ping 范例
「ping」指令是一個(gè)簡(jiǎn)單的工具,用來(lái)進(jìn)行網(wǎng)絡(luò )除錯。其能執行因特網(wǎng)控制訊息協(xié)議(ICMP)的echo 響應請求,向指定的IP地址傳送一個(gè)訊號然后等候回復。當目的地收到這個(gè)請求,就會(huì )回復一個(gè)echo封包。本章節解釋如何從Windows PC向微控制器執行基本的ping測試以檢查其連結狀態(tài),同時(shí)還會(huì )闡述如何使用微控制器的ping模塊來(lái)和PC進(jìn)行通訊。
以下詳列Windows環(huán)境中ping工具的工作流程:
? 向微控制器傳送4個(gè)數據封包,然后等待響應
? 微控制器將這些數據封包傳回PC作為響應,亦即回響答復請求。
? 執行ping測試
? 使用以太網(wǎng)絡(luò )線(xiàn)將微控制器EVKIT套件連到PC
? 開(kāi)啟命令行提示窗口,然后輸入「ping <微控制器的IP地址>」然后按下enter鍵
命令行提示窗口中顯示響應,如圖三所示,意謂著(zhù)在PC與微控制器之間已建立正常運行的連結
圖三 : 命令行提示窗口顯示的 Ping輸出內容
從微控制器測試Ping
「lwIP_Ping」檔案是ADI旗下MAX32570微控制器的ping范例,收錄于MaximSDK開(kāi)發(fā)工具包。該檔案存放在「C:MaximSDKExamples MAX32570lwIP_Ping」,目錄中并提供以下指南:
? 微控制器的IP地址是使用「lwipcfg.h」檔案來(lái)設定。微控制器與PC的IP地址應在同一個(gè)網(wǎng)段。在微控制器的「lwipcfg.h」檔案中,PC的IP地址應設定成網(wǎng)關(guān)地址。
? 使用以太網(wǎng)絡(luò )線(xiàn)連接PC與MAX32570 EVKIT套件
? 執行ping范例碼
? 在eclipse程序中開(kāi)啟序列終端機 (Window-> Show view -> Terminal)。如圖四所示,如果ping成功,終端機畫(huà)面應顯示ping的結果
圖四 : 序列終端機顯示的Ping 輸出內容
命令行提示窗口僅顯示ping統計數據。要檢視實(shí)際傳送的數據,需要用到一個(gè)名為Wireshark的程序。Wireshark能擷取網(wǎng)絡(luò )聯(lián)機所傳送的數據。開(kāi)啟Wireshark后,再選擇以太網(wǎng)絡(luò )選項。另外還能顯示像是來(lái)源與目的地MAC地址、來(lái)源與目的地IP地址、通訊協(xié)議、以及額外傳送數據等細部數據。Wireshark顯示的信息如圖五所示。
正如范例所示,傳送的數據為 0x00, 0x01… 一直到0x1F。但如果用戶(hù)想要修改傳送數據的內容那該怎么做?
圖五 : Wireshark程序中顯示的ping數據封包
修改微控制器Ping指令所發(fā)送的數據
透過(guò)ping指令發(fā)出的數據是在「ping. c」檔案中設定的?!窹ing.c」檔案是ping的傳送程序模塊。要傳送的數據大小是以「PING_DATA_SIZE」參數設定在“ping.c”檔案中。例如要傳送的數據大小為32 字節。
準備要傳送的數據的定義亦寫(xiě)在「ping.c」檔案。額外的數據緩沖區會(huì )寫(xiě)入相同的數據,如「0x00, 0x01, 0x02…to 0x1F.」。
依據應用程序的需求,如果用戶(hù)想要修改數據,可以在「ping .c」檔案中修改數據緩沖區。舉例來(lái)說(shuō),將所有32字節的數據變更成「0x01, 0x01…0x01」。在Wireshark中顯示修改后的「ping .c」檔案。此處使用新的參數來(lái)更新數據。
TCP Echo 服務(wù)器
ping范例中采用ICMP來(lái)判斷目標系統的反應狀況。其會(huì )使用默認數據透過(guò)網(wǎng)絡(luò )向目標接收端傳送一個(gè)echo請求。當目標地址收到這個(gè)請求時(shí),它會(huì )回復一個(gè)echo應答封包。
如果用戶(hù)希望從某個(gè)裝置向另一個(gè)裝置傳送客制化數據,可使用TCP協(xié)議進(jìn)行數據傳輸。在標準TCP函式中的Echo服務(wù)主要用來(lái)檢查可及性以及判斷各種路由問(wèn)題。在這項服務(wù)中,服務(wù)器與客戶(hù)端都是使用TCP來(lái)建立的。當服務(wù)器從客戶(hù)端收到訊息,它會(huì )回復相同的訊息。
在MaximSDK,「lwIP TCP」原始碼檔案展示如何使用lwIP函式庫中的 TCP函數。在這個(gè)案例中,微控制器扮演TCP服務(wù)器,并會(huì )等候客戶(hù)端發(fā)送連接請求。接著(zhù)服務(wù)器會(huì )返傳從客戶(hù)端送來(lái)的數據。在TCP Echo服務(wù)器范例中,應使用「tcpecho_raw.c」原始碼檔案。依循以下步驟設定TCP Echo服務(wù)器。
要設定TCP Echo服務(wù)器:
? 建立一個(gè) socket
? 將socket綁定到宣告的埠號
? 完成綁定后,其會(huì )開(kāi)始監聽(tīng)傳來(lái)的連接請求
? 收到連接請求后,其會(huì )接受客戶(hù)端設備發(fā)送來(lái)的連接請求
? 服務(wù)器接收到客戶(hù)端傳來(lái)的數據
? 最后,其傳回相同的數據
圖六的腳本顯示了韌體的結構,該結構是主函數的一部分。config_emac會(huì )初始化EMAC,而MXC_ETH_Init 則會(huì )初始化 lwIP堆棧。
圖六 : 從腳本片斷觀(guān)察韌體的結構
在EMAC與lwIP堆棧完成初始化后,TCP Echo 服務(wù)器會(huì )透過(guò)tcpecho_raw_init進(jìn)行初始化。Echo服務(wù)器結構如圖七所示。
圖七 : Echo 服務(wù)器初始化結構.
Echo服務(wù)器的初始化會(huì )建立新的socket。之后它會(huì )將指定的IP地址和端口號綁定到新的socket。完成綁定后,其會(huì )持續監聽(tīng)遠程客戶(hù)端發(fā)送的連接請求。
要測試TCP服務(wù)器范例,須使用 echotool.exe PC 客戶(hù)端工具。echotool.exe執行檔應存放在C槽,故我們應從C槽開(kāi)啟命令行提示窗口。在客戶(hù)端模式中,其會(huì )將數據傳送到服務(wù)器并檢查是否會(huì )回傳。確保一定要在客戶(hù)端模式中使用echo工具來(lái)測試服務(wù)器范例。
如何測試 TCP Server 范例
? 確保所有連結都正常運行
? 使用eclipse軟件將范例程序代碼組建成可執行程序
? 在除錯模式中執行腳本
? 在遠程PC開(kāi)啟命令行提示窗口。
? 在命令行提示欄中輸入以下指令:
「C:>echotool IP_address /p tcp /r 7 /n 15 /t 2 /d LwIP TCP echo server Example」
IP_address 是實(shí)際的機板IP 地址。靜態(tài) IP 地址為192.168.100.200
/p tcp 是通訊協(xié)議 (TCP協(xié)定)
/r 是回應服務(wù)器的實(shí)際遠程通信埠 (echo port)
/n 是echo請求的數量
/t 是連接時(shí)長(cháng)限制的秒數
/d 是請求響應的訊息 (像是 「LwIP TCP echo server Example」)
圖八 : TCP Echo 服務(wù)器輸出內容
TCP協(xié)議和透過(guò)網(wǎng)絡(luò )傳送的數據,都可透過(guò)Wireshark軟件進(jìn)行檢驗。透過(guò)網(wǎng)絡(luò )傳送的封包在會(huì )Wireshark中顯示,如圖九所示。透過(guò)命令行提示欄傳送的數據為「LwIP TCP echo server Example」。在Wireshark程序中也能看到相同的數據。
圖九 : Wireshark 程序中的TCP Echo 服務(wù)器輸出結果
總結
了解并有效率地運用lwIP堆棧的功能以及ICMP協(xié)議為基礎的ping工具和TCP協(xié)議,能為網(wǎng)絡(luò )診斷以及數據傳輸開(kāi)創(chuàng )出眾多的可能性。ADI的MAX32570微控制器與MaximSDK 提供一個(gè)扎實(shí)的基礎來(lái)建置lwIP堆棧,并建構可靠的通訊系統。藉由依循本文列舉的范例,即可排除各種網(wǎng)絡(luò )問(wèn)題,進(jìn)而創(chuàng )造無(wú)縫的鏈接以及確保數據完整性。
(本文作者Anju Puthenpurayil為ADI應用工程師)
評論