<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 將lwIP TCP/IP堆棧整合至嵌入式應(yīng)用的界面

          將lwIP TCP/IP堆棧整合至嵌入式應(yīng)用的界面

          作者: 時(shí)間:2025-02-07 來(lái)源:CTIMES 收藏

          輕量化)堆棧是協(xié)議的精簡(jiǎn)實(shí)作,專門設(shè)計(jì)用來(lái)縮減RAM內(nèi)存的使用量,這使其非常適合用在嵌入式系統(tǒng)。它提供三種獨(dú)特的應(yīng)用程序編程接口(API):
          ? 未封裝的低階API
          ? 負(fù)責(zé)網(wǎng)絡(luò)通訊的高階 API
          ? BSD 風(fēng)格的socket套接字 API

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

          的MaximSDK軟件開(kāi)發(fā)工具包收錄許多必要的軟件與工具,讓用戶針對(duì)的MSX32xxx微控制器開(kāi)發(fā)韌體。套件中有一個(gè)堆棧函式庫(kù)檔案「MaximSDKLibrarieslwIP」。圖一顯示MaximSDK文件夾結(jié)構(gòu)中的lwIP函式庫(kù)檔案。
          圖片.png 圖片.png

          本文引用地址:http://www.ex-cimer.com/article/202502/466710.htm

          圖一 : 的MaximSDK lwIP 函式庫(kù)檔案

          lwIP文件夾包含多個(gè)子目錄:
          ? API 文件夾(網(wǎng)絡(luò)通訊與 socket 套接字API)
          ? 核心文件夾(lwIP 核心檔案,包含 “tcp.c”、“ip.c” 等)
          ? Netif 文件夾(網(wǎng)絡(luò)接口檔案)
          ? Include 文件夾(所有l(wèi)wIP include 引入檔案)
          ? Maxim文件夾(為ADI微控制器設(shè)計(jì)的客制化mac 驅(qū)動(dòng)程序)

          lwIP架構(gòu)依循TCP/IP模型結(jié)構(gòu)。TCP/IP通訊協(xié)議是多個(gè)分層組成的協(xié)定。TCP/IP通常被看成是一個(gè)四層結(jié)構(gòu)的系統(tǒng),如圖二所示。

          圖片.png
           
          圖二 : TCP/IP 通訊協(xié)議分層

          lwIP 項(xiàng)目檔中一定有一個(gè)名為「lwipopts.h」的組態(tài)檔案,以及一個(gè)名為「opt.h」的組態(tài)檔案?!竜pt.h」檔案中記錄所有默認(rèn)的堆棧組態(tài)以及其模塊組態(tài),而「lwipopts.h」則讓用戶能自行設(shè)定堆棧與其模塊的所有組態(tài)。須注意這個(gè)檔案并未包含所有可能的lwIP選項(xiàng)。因此,如果在“l(fā)wipopts.h”組態(tài)檔案中沒(méi)有定義某項(xiàng)組態(tài),系統(tǒng)就會(huì)采用「opt.h」中定義的預(yù)設(shè)組態(tài)。
          類似的情況,lwIP函式庫(kù)有一個(gè)和程序相關(guān)的表頭文件名為 「lwipcfg.h」。包括控制器的IP地址、網(wǎng)關(guān)地址、網(wǎng)絡(luò)屏蔽地址、以及MAC地址都應(yīng)定義在「lwipcfg.h」檔案。
          要在lwIP以及底層的硬件驅(qū)動(dòng)程序之間建立鏈接,需要用到一個(gè)特定平臺(tái)專屬的配接層。舉例來(lái)說(shuō),在為微控制器建置lwIP堆棧時(shí),需要量身設(shè)計(jì)的驅(qū)動(dòng)程序來(lái)橋接lwIP堆棧與微控制器的以太網(wǎng)絡(luò)MAC驅(qū)動(dòng)程序。這個(gè)客制化驅(qū)動(dòng)程序應(yīng)涵蓋以下功能:
          ? 初始化功能: 此項(xiàng)功能負(fù)責(zé)初始化微控制器專屬的MAC驅(qū)動(dòng)程序
          ? 傳送功能: 將從TCP堆棧收到的數(shù)據(jù)傳送給以太網(wǎng)絡(luò)MAC驅(qū)動(dòng)程序,以便進(jìn)行后續(xù)的傳輸
          ? 接收功能: 將從以太網(wǎng)絡(luò)MAC驅(qū)動(dòng)程序收到的封包轉(zhuǎn)送到TCP堆棧

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

          Ping 范例
          「ping」指令是一個(gè)簡(jiǎn)單的工具,用來(lái)進(jìn)行網(wǎng)絡(luò)除錯(cuò)。其能執(zhí)行因特網(wǎng)控制訊息協(xié)議(ICMP)的echo 響應(yīng)請(qǐng)求,向指定的IP地址傳送一個(gè)訊號(hào)然后等候回復(fù)。當(dāng)目的地收到這個(gè)請(qǐng)求,就會(huì)回復(fù)一個(gè)echo封包。本章節(jié)解釋如何從Windows PC向微控制器執(zhí)行基本的ping測(cè)試以檢查其連結(jié)狀態(tài),同時(shí)還會(huì)闡述如何使用微控制器的ping模塊來(lái)和PC進(jìn)行通訊。

          以下詳列Windows環(huán)境中ping工具的工作流程:
          ? 向微控制器傳送4個(gè)數(shù)據(jù)封包,然后等待響應(yīng)
          ? 微控制器將這些數(shù)據(jù)封包傳回PC作為響應(yīng),亦即回響答復(fù)請(qǐng)求。
          ? 執(zhí)行ping測(cè)試
          ? 使用以太網(wǎng)絡(luò)線將微控制器EVKIT套件連到PC
          ? 開(kāi)啟命令行提示窗口,然后輸入「ping <微控制器的IP地址>」然后按下enter鍵
          命令行提示窗口中顯示響應(yīng),如圖三所示,意謂著在PC與微控制器之間已建立正常運(yùn)行的連結(jié)

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

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


          圖片.png 
          圖四 : 序列終端機(jī)顯示的Ping 輸出內(nèi)容

          命令行提示窗口僅顯示ping統(tǒng)計(jì)數(shù)據(jù)。要檢視實(shí)際傳送的數(shù)據(jù),需要用到一個(gè)名為Wireshark的程序。Wireshark能擷取網(wǎng)絡(luò)聯(lián)機(jī)所傳送的數(shù)據(jù)。開(kāi)啟Wireshark后,再選擇以太網(wǎng)絡(luò)選項(xiàng)。另外還能顯示像是來(lái)源與目的地MAC地址、來(lái)源與目的地IP地址、通訊協(xié)議、以及額外傳送數(shù)據(jù)等細(xì)部數(shù)據(jù)。Wireshark顯示的信息如圖五所示。
          正如范例所示,傳送的數(shù)據(jù)為 0x00, 0x01… 一直到0x1F。但如果用戶想要修改傳送數(shù)據(jù)的內(nèi)容那該怎么做?

          圖片.png
           
          圖五 : Wireshark程序中顯示的ping數(shù)據(jù)封包

          修改微控制器Ping指令所發(fā)送的數(shù)據(jù)
          透過(guò)ping指令發(fā)出的數(shù)據(jù)是在「ping. c」檔案中設(shè)定的?!窹ing.c」檔案是ping的傳送程序模塊。要傳送的數(shù)據(jù)大小是以「PING_DATA_SIZE」參數(shù)設(shè)定在“ping.c”檔案中。例如要傳送的數(shù)據(jù)大小為32 字節(jié)。
          準(zhǔn)備要傳送的數(shù)據(jù)的定義亦寫(xiě)在「ping.c」檔案。額外的數(shù)據(jù)緩沖區(qū)會(huì)寫(xiě)入相同的數(shù)據(jù),如「0x00, 0x01, 0x02…to 0x1F.」。
          依據(jù)應(yīng)用程序的需求,如果用戶想要修改數(shù)據(jù),可以在「ping .c」檔案中修改數(shù)據(jù)緩沖區(qū)。舉例來(lái)說(shuō),將所有32字節(jié)的數(shù)據(jù)變更成「0x01, 0x01…0x01」。在Wireshark中顯示修改后的「ping .c」檔案。此處使用新的參數(shù)來(lái)更新數(shù)據(jù)。

          TCP Echo 服務(wù)器
          ping范例中采用ICMP來(lái)判斷目標(biāo)系統(tǒng)的反應(yīng)狀況。其會(huì)使用默認(rèn)數(shù)據(jù)透過(guò)網(wǎng)絡(luò)向目標(biāo)接收端傳送一個(gè)echo請(qǐng)求。當(dāng)目標(biāo)地址收到這個(gè)請(qǐng)求時(shí),它會(huì)回復(fù)一個(gè)echo應(yīng)答封包。
          如果用戶希望從某個(gè)裝置向另一個(gè)裝置傳送客制化數(shù)據(jù),可使用TCP協(xié)議進(jìn)行數(shù)據(jù)傳輸。在標(biāo)準(zhǔn)TCP函式中的Echo服務(wù)主要用來(lái)檢查可及性以及判斷各種路由問(wèn)題。在這項(xiàng)服務(wù)中,服務(wù)器與客戶端都是使用TCP來(lái)建立的。當(dāng)服務(wù)器從客戶端收到訊息,它會(huì)回復(fù)相同的訊息。
          在MaximSDK,「lwIP TCP」原始碼檔案展示如何使用lwIP函式庫(kù)中的 TCP函數(shù)。在這個(gè)案例中,微控制器扮演TCP服務(wù)器,并會(huì)等候客戶端發(fā)送連接請(qǐng)求。接著服務(wù)器會(huì)返傳從客戶端送來(lái)的數(shù)據(jù)。在TCP Echo服務(wù)器范例中,應(yīng)使用「tcpecho_raw.c」原始碼檔案。依循以下步驟設(shè)定TCP Echo服務(wù)器。

          要設(shè)定TCP Echo服務(wù)器:

          ? 建立一個(gè) socket
          ? 將socket綁定到宣告的埠號(hào)
          ? 完成綁定后,其會(huì)開(kāi)始監(jiān)聽(tīng)傳來(lái)的連接請(qǐng)求
          ? 收到連接請(qǐng)求后,其會(huì)接受客戶端設(shè)備發(fā)送來(lái)的連接請(qǐng)求
          ? 服務(wù)器接收到客戶端傳來(lái)的數(shù)據(jù)
          ? 最后,其傳回相同的數(shù)據(jù)

          圖六的腳本顯示了韌體的結(jié)構(gòu),該結(jié)構(gòu)是主函數(shù)的一部分。config_emac會(huì)初始化EMAC,而MXC_ETH_Init 則會(huì)初始化 lwIP堆棧。

          圖片.png
           
          圖六 : 從腳本片斷觀察韌體的結(jié)構(gòu)

          在EMAC與lwIP堆棧完成初始化后,TCP Echo 服務(wù)器會(huì)透過(guò)tcpecho_raw_init進(jìn)行初始化。Echo服務(wù)器結(jié)構(gòu)如圖七所示。

          圖片.png
           
          圖七 : Echo 服務(wù)器初始化結(jié)構(gòu).

          Echo服務(wù)器的初始化會(huì)建立新的socket。之后它會(huì)將指定的IP地址和端口號(hào)綁定到新的socket。完成綁定后,其會(huì)持續(xù)監(jiān)聽(tīng)遠(yuǎn)程客戶端發(fā)送的連接請(qǐng)求。
          要測(cè)試TCP服務(wù)器范例,須使用 echotool.exe PC 客戶端工具。echotool.exe執(zhí)行檔應(yīng)存放在C槽,故我們應(yīng)從C槽開(kāi)啟命令行提示窗口。在客戶端模式中,其會(huì)將數(shù)據(jù)傳送到服務(wù)器并檢查是否會(huì)回傳。確保一定要在客戶端模式中使用echo工具來(lái)測(cè)試服務(wù)器范例。

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

          圖片.png
           
          圖八 : TCP Echo 服務(wù)器輸出內(nèi)容

          TCP協(xié)議和透過(guò)網(wǎng)絡(luò)傳送的數(shù)據(jù),都可透過(guò)Wireshark軟件進(jìn)行檢驗(yàn)。透過(guò)網(wǎng)絡(luò)傳送的封包在會(huì)Wireshark中顯示,如圖九所示。透過(guò)命令行提示欄傳送的數(shù)據(jù)為「LwIP TCP echo server Example」。在Wireshark程序中也能看到相同的數(shù)據(jù)。

          圖片.png
           
          圖九 : Wireshark 程序中的TCP Echo 服務(wù)器輸出結(jié)果

          總結(jié)
          了解并有效率地運(yùn)用lwIP堆棧的功能以及ICMP協(xié)議為基礎(chǔ)的ping工具和TCP協(xié)議,能為網(wǎng)絡(luò)診斷以及數(shù)據(jù)傳輸開(kāi)創(chuàng)出眾多的可能性。ADI的MAX32570微控制器與MaximSDK 提供一個(gè)扎實(shí)的基礎(chǔ)來(lái)建置lwIP堆棧,并建構(gòu)可靠的通訊系統(tǒng)。藉由依循本文列舉的范例,即可排除各種網(wǎng)絡(luò)問(wèn)題,進(jìn)而創(chuàng)造無(wú)縫的鏈接以及確保數(shù)據(jù)完整性。

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



          評(píng)論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();