新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 將lwIP TCP/IP堆棧整合至嵌入式應用的界面

        將lwIP TCP/IP堆棧整合至嵌入式應用的界面

        作者: 時間:2025-02-07 來源:CTIMES 收藏

        輕量化)堆棧是協議的精簡實作,專門設計用來縮減RAM內存的使用量,這使其非常適合用在嵌入式系統。它提供三種獨特的應用程序編程接口(API):
        ? 未封裝的低階API
        ? 負責網絡通訊的高階 API
        ? BSD 風格的socket套接字 API

        本文專注探討使用未封裝API接口的范例。運用未封裝API建置callback回調函數的應用程序會由核心事件觸發。
        盡管未封裝API較socket套接字API更為復雜,但由于其處理負荷(overhead)較低,因此能提供高出許多的吞吐量。
        接著將探討幾個建構在 堆棧之上的范例,其中采用Analog Devices的MAX32570微控制器。開始的部分是一個ping展示,主要從PC向裝置發送ping探測訊號。后續的部分介紹TCP Echo服務器范例,這個初步的服務器展示對于測試TCP連結相當實用。

        的MaximSDK軟件開發工具包收錄許多必要的軟件與工具,讓用戶針對的MSX32xxx微控制器開發韌體。套件中有一個堆棧函式庫檔案「MaximSDKLibrarieslwIP」。圖一顯示MaximSDK文件夾結構中的lwIP函式庫檔案。
        圖片.png 圖片.png

        本文引用地址:http://www.104case.com/article/202502/466710.htm

        圖一 : 的MaximSDK lwIP 函式庫檔案

        lwIP文件夾包含多個子目錄:
        ? API 文件夾(網絡通訊與 socket 套接字API)
        ? 核心文件夾(lwIP 核心檔案,包含 “tcp.c”、“ip.c” 等)
        ? Netif 文件夾(網絡接口檔案)
        ? Include 文件夾(所有lwIP include 引入檔案)
        ? Maxim文件夾(為ADI微控制器設計的客制化mac 驅動程序)

        lwIP架構依循TCP/IP模型結構。TCP/IP通訊協議是多個分層組成的協定。TCP/IP通常被看成是一個四層結構的系統,如圖二所示。

        圖片.png
         
        圖二 : TCP/IP 通訊協議分層

        lwIP 項目檔中一定有一個名為「lwipopts.h」的組態檔案,以及一個名為「opt.h」的組態檔案。「opt.h」檔案中記錄所有默認的堆棧組態以及其模塊組態,而「lwipopts.h」則讓用戶能自行設定堆棧與其模塊的所有組態。須注意這個檔案并未包含所有可能的lwIP選項。因此,如果在“lwipopts.h”組態檔案中沒有定義某項組態,系統就會采用「opt.h」中定義的預設組態。
        類似的情況,lwIP函式庫有一個和程序相關的表頭文件名為 「lwipcfg.h」。包括控制器的IP地址、網關地址、網絡屏蔽地址、以及MAC地址都應定義在「lwipcfg.h」檔案。
        要在lwIP以及底層的硬件驅動程序之間建立鏈接,需要用到一個特定平臺專屬的配接層。舉例來說,在為微控制器建置lwIP堆棧時,需要量身設計的驅動程序來橋接lwIP堆棧與微控制器的以太網絡MAC驅動程序。這個客制化驅動程序應涵蓋以下功能:
        ? 初始化功能: 此項功能負責初始化微控制器專屬的MAC驅動程序
        ? 傳送功能: 將從TCP堆棧收到的數據傳送給以太網絡MAC驅動程序,以便進行后續的傳輸
        ? 接收功能: 將從以太網絡MAC驅動程序收到的封包轉送到TCP堆棧

        對于ADI微控制器,預存的客制化驅動程序已放在「MaximSDKLibrarieslwIPMaximmxc_eth.c」路徑下的MaximSDK。這個驅動程序可作為包裝器,能包裝微控制器本身的Ethernet MAC (EMAC)外圍函式庫,該函式庫位于「C:MaximSDK LibrariesPeriphDriversSourceEMAC」路徑下的外圍驅動程序中。

        Ping 范例
        「ping」指令是一個簡單的工具,用來進行網絡除錯。其能執行因特網控制訊息協議(ICMP)的echo 響應請求,向指定的IP地址傳送一個訊號然后等候回復。當目的地收到這個請求,就會回復一個echo封包。本章節解釋如何從Windows PC向微控制器執行基本的ping測試以檢查其連結狀態,同時還會闡述如何使用微控制器的ping模塊來和PC進行通訊。

        以下詳列Windows環境中ping工具的工作流程:
        ? 向微控制器傳送4個數據封包,然后等待響應
        ? 微控制器將這些數據封包傳回PC作為響應,亦即回響答復請求。
        ? 執行ping測試
        ? 使用以太網絡線將微控制器EVKIT套件連到PC
        ? 開啟命令行提示窗口,然后輸入「ping <微控制器的IP地址>」然后按下enter鍵
        命令行提示窗口中顯示響應,如圖三所示,意謂著在PC與微控制器之間已建立正常運行的連結

        圖片.png
         
        圖三 : 命令行提示窗口顯示的 Ping輸出內容

        從微控制器測試Ping
        「lwIP_Ping」檔案是ADI旗下MAX32570微控制器的ping范例,收錄于MaximSDK開發工具包。該檔案存放在「C:MaximSDKExamples MAX32570lwIP_Ping」,目錄中并提供以下指南:
        ? 微控制器的IP地址是使用「lwipcfg.h」檔案來設定。微控制器與PC的IP地址應在同一個網段。在微控制器的「lwipcfg.h」檔案中,PC的IP地址應設定成網關地址。
        ? 使用以太網絡線連接PC與MAX32570 EVKIT套件
        ? 執行ping范例碼
        ? 在eclipse程序中開啟序列終端機 (Window-> Show view -> Terminal)。如圖四所示,如果ping成功,終端機畫面應顯示ping的結果


        圖片.png 
        圖四 : 序列終端機顯示的Ping 輸出內容

        命令行提示窗口僅顯示ping統計數據。要檢視實際傳送的數據,需要用到一個名為Wireshark的程序。Wireshark能擷取網絡聯機所傳送的數據。開啟Wireshark后,再選擇以太網絡選項。另外還能顯示像是來源與目的地MAC地址、來源與目的地IP地址、通訊協議、以及額外傳送數據等細部數據。Wireshark顯示的信息如圖五所示。
        正如范例所示,傳送的數據為 0x00, 0x01… 一直到0x1F。但如果用戶想要修改傳送數據的內容那該怎么做?

        圖片.png
         
        圖五 : Wireshark程序中顯示的ping數據封包

        修改微控制器Ping指令所發送的數據
        透過ping指令發出的數據是在「ping. c」檔案中設定的。「Ping.c」檔案是ping的傳送程序模塊。要傳送的數據大小是以「PING_DATA_SIZE」參數設定在“ping.c”檔案中。例如要傳送的數據大小為32 字節。
        準備要傳送的數據的定義亦寫在「ping.c」檔案。額外的數據緩沖區會寫入相同的數據,如「0x00, 0x01, 0x02…to 0x1F.」。
        依據應用程序的需求,如果用戶想要修改數據,可以在「ping .c」檔案中修改數據緩沖區。舉例來說,將所有32字節的數據變更成「0x01, 0x01…0x01」。在Wireshark中顯示修改后的「ping .c」檔案。此處使用新的參數來更新數據。

        TCP Echo 服務器
        ping范例中采用ICMP來判斷目標系統的反應狀況。其會使用默認數據透過網絡向目標接收端傳送一個echo請求。當目標地址收到這個請求時,它會回復一個echo應答封包。
        如果用戶希望從某個裝置向另一個裝置傳送客制化數據,可使用TCP協議進行數據傳輸。在標準TCP函式中的Echo服務主要用來檢查可及性以及判斷各種路由問題。在這項服務中,服務器與客戶端都是使用TCP來建立的。當服務器從客戶端收到訊息,它會回復相同的訊息。
        在MaximSDK,「lwIP TCP」原始碼檔案展示如何使用lwIP函式庫中的 TCP函數。在這個案例中,微控制器扮演TCP服務器,并會等候客戶端發送連接請求。接著服務器會返傳從客戶端送來的數據。在TCP Echo服務器范例中,應使用「tcpecho_raw.c」原始碼檔案。依循以下步驟設定TCP Echo服務器。

        要設定TCP Echo服務器:

        ? 建立一個 socket
        ? 將socket綁定到宣告的埠號
        ? 完成綁定后,其會開始監聽傳來的連接請求
        ? 收到連接請求后,其會接受客戶端設備發送來的連接請求
        ? 服務器接收到客戶端傳來的數據
        ? 最后,其傳回相同的數據

        圖六的腳本顯示了韌體的結構,該結構是主函數的一部分。config_emac會初始化EMAC,而MXC_ETH_Init 則會初始化 lwIP堆棧。

        圖片.png
         
        圖六 : 從腳本片斷觀察韌體的結構

        在EMAC與lwIP堆棧完成初始化后,TCP Echo 服務器會透過tcpecho_raw_init進行初始化。Echo服務器結構如圖七所示。

        圖片.png
         
        圖七 : Echo 服務器初始化結構.

        Echo服務器的初始化會建立新的socket。之后它會將指定的IP地址和端口號綁定到新的socket。完成綁定后,其會持續監聽遠程客戶端發送的連接請求。
        要測試TCP服務器范例,須使用 echotool.exe PC 客戶端工具。echotool.exe執行檔應存放在C槽,故我們應從C槽開啟命令行提示窗口。在客戶端模式中,其會將數據傳送到服務器并檢查是否會回傳。確保一定要在客戶端模式中使用echo工具來測試服務器范例。

        如何測試 TCP Server 范例
        ? 確保所有連結都正常運行
        ? 使用eclipse軟件將范例程序代碼組建成可執行程序
        ? 在除錯模式中執行腳本
        ? 在遠程PC開啟命令行提示窗口。
        ? 在命令行提示欄中輸入以下指令:
        「C:>echotool IP_address /p tcp /r 7 /n 15 /t 2 /d LwIP TCP echo server Example」
        IP_address 是實際的機板IP 地址。靜態 IP 地址為192.168.100.200
        /p tcp 是通訊協議 (TCP協定)
        /r 是回應服務器的實際遠程通信埠 (echo port)
        /n 是echo請求的數量
        /t 是連接時長限制的秒數
        /d 是請求響應的訊息 (像是 「LwIP TCP echo server Example」)

        圖片.png
         
        圖八 : TCP Echo 服務器輸出內容

        TCP協議和透過網絡傳送的數據,都可透過Wireshark軟件進行檢驗。透過網絡傳送的封包在會Wireshark中顯示,如圖九所示。透過命令行提示欄傳送的數據為「LwIP TCP echo server Example」。在Wireshark程序中也能看到相同的數據。

        圖片.png
         
        圖九 : Wireshark 程序中的TCP Echo 服務器輸出結果

        總結
        了解并有效率地運用lwIP堆棧的功能以及ICMP協議為基礎的ping工具和TCP協議,能為網絡診斷以及數據傳輸開創出眾多的可能性。ADI的MAX32570微控制器與MaximSDK 提供一個扎實的基礎來建置lwIP堆棧,并建構可靠的通訊系統。藉由依循本文列舉的范例,即可排除各種網絡問題,進而創造無縫的鏈接以及確保數據完整性。

        (本文作者Anju Puthenpurayil為ADI應用工程師)



        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 囊谦县| 迁安市| 长顺县| 华亭县| 县级市| 厦门市| 贡嘎县| 萝北县| 潮州市| 吴川市| 贵港市| 南部县| 额敏县| 大英县| 永兴县| 荆门市| 湘潭市| 建昌县| 精河县| 辰溪县| 崇义县| 吉木乃县| 南木林县| 衡南县| 牙克石市| 江口县| 东台市| 墨竹工卡县| 三原县| 济南市| 永和县| 项城市| 蒙自县| 唐山市| 郧西县| 通江县| 綦江县| 武山县| 乌恰县| 延安市| 木里|