源碼公開的TCPIP協(xié)議棧在遠(yuǎn)程監(jiān)測中的應(yīng)用_第1頁
源碼公開的TCPIP協(xié)議棧在遠(yuǎn)程監(jiān)測中的應(yīng)用_第2頁
源碼公開的TCPIP協(xié)議棧在遠(yuǎn)程監(jiān)測中的應(yīng)用_第3頁
已閱讀5頁,還剩3頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

1、源碼公開的 TCP/IP 協(xié)議棧在遠(yuǎn)程監(jiān)測中的應(yīng)用摘要:介紹一個適用于8/16位單片機的嵌入式TCP/IP協(xié)議棧(ulP)在發(fā)電 機遠(yuǎn)程監(jiān)測系統(tǒng)中的應(yīng)用。重點闡述 uIP 的功能特性、體系結(jié)構(gòu)和相關(guān)接口, 并詳細(xì)介紹如何在該協(xié)議棧上實現(xiàn)一個嵌入式Web服務(wù)器。目前ulP已成功地移植到 51 單片機上。關(guān)鍵詞:TCP/IP協(xié)議棧嵌入式Wet服務(wù)器遠(yuǎn)程監(jiān)測目前,隨著互聯(lián)網(wǎng)的發(fā)展,越來越多的工業(yè)測控設(shè)備已經(jīng)將網(wǎng)絡(luò)接入功能 作為其默認(rèn)配置,以實現(xiàn)設(shè)備的遠(yuǎn)程監(jiān)控和信息分布式處理。筆者曾參與某發(fā) 電機射頻監(jiān)測儀的開發(fā),該設(shè)備主要用于診斷和預(yù)警發(fā)電機早期故障,并通過 RS232接口定時輸出電平和狀態(tài)數(shù)據(jù),現(xiàn)

2、場專門設(shè)一臺PC作接收、顯示及存儲。每年都要有專家到各發(fā)電廠對以往數(shù)據(jù)作檢查和診斷,不勝其煩。因此有 必要設(shè)計一個RS232到In ternet的數(shù)據(jù)傳輸模塊,以便對發(fā)電機的運行狀況作 遠(yuǎn)程監(jiān)測。設(shè)計該模塊的關(guān)鍵在于如何實現(xiàn)一個嵌入式 TCP/lP 協(xié)議棧,根據(jù)以 往的經(jīng)驗,自己設(shè)計一個協(xié)議棧的難度很可能超過應(yīng)用本身,而采用商業(yè)的協(xié) 議棧似乎又無必要(功能過于復(fù)雜),最后筆者選用一種功能簡易的免費 TCP/IP 協(xié)議棧 uIP 0.9 作為設(shè)計核心。1 嵌入式 TCP/IP 協(xié)議棧目前,市場上幾乎所有的嵌入式 TCP/IP協(xié)議棧都是根據(jù)BSD版的TCP/IP 協(xié)議棧改寫的。在商業(yè)嵌入式 TCP

3、/IP 協(xié)議棧大都相當(dāng)昂貴的情況下,很多人轉(zhuǎn) 而使用一些源代碼公開的免費協(xié)議棧,并加以改造應(yīng)用。目前較為著名的免費 協(xié)議棧有:lwIP(Light weight TCP/IP Stack) 支持的協(xié)議比較完整,一般需要 多任務(wù)環(huán)境支持,代碼占用 ROM>40KB不適合8位機系統(tǒng),沒有完整的應(yīng)用文 檔;uC/IP(TCP/IP stack for uC/OS) 基于 uC/OS的任務(wù)管理,接口較復(fù) 雜,沒有說明文檔。筆者采用的協(xié)議棧系瑞典計算機科學(xué)研究所 Adam Du nkels開發(fā)的 uIP0.9 。其功能特性總結(jié)如下:*完整的說明文檔和公開的源代碼(全部用C語言編寫,并附有詳細(xì)注釋)

4、;*極少的代碼占用量和RAMS源要求,尤其適用于8/16位單片機(見表高度可配置性,以適應(yīng)不同資源條件和應(yīng)用場合;支持ARR IP、ICMP TCP UDP(可選)等必要的功能特性;支持多個主動連接和被動連接并發(fā),支持連接的動態(tài)分配和釋放;簡易的應(yīng)用層接口和設(shè)備驅(qū)動層接口;完善的示例程序和應(yīng)用協(xié)議實現(xiàn)范例。表1 uIP 在ATMEL AV上代碼和 RAh/占用情況協(xié)議模塊代碼大小/B使用的RAM/BARP1324118IP/ICMP/TCP3304360HTTP994110校驗和函數(shù)6360數(shù)據(jù)包緩存0400總和6258988注:配置為1個TCP聽端口,10個連接,10個ARP表項,400字節(jié)

5、數(shù)據(jù)包 緩存。正是由于uIP所具有的顯著特點,自從0.6版本以來就被移植到多種處理 器上,包括MSP430 AVR和Z80等。筆者使用的ulP0.9是2003年11月發(fā)布的 版本。目前,筆者已將它成功移植到 MCS-51上了。2 uIP0.9的體系結(jié)構(gòu)UIP0.9是一個適用于8/16位機上的小型嵌入式TCP/IP協(xié)議棧,簡單易 用,資源占用少是它的設(shè)計特點。它去掉了許多全功能協(xié)議棧中不常用的功 能,而保留網(wǎng)絡(luò)通信所必要的協(xié)議機制。其設(shè)計重點放在IP、ICMP和 TCP協(xié)議的實現(xiàn)上,將這三個模塊合為一個有機的整體,而將UDP和ARP協(xié)議實現(xiàn)作為可選模塊。UIP0.9的體系結(jié)構(gòu)如圖1所示。UIP0

6、.9處于網(wǎng)絡(luò)通信的中間層,其上層協(xié)議在這里被稱之為應(yīng)用程序,而 下層硬件或固件被稱之為網(wǎng)絡(luò)設(shè)備驅(qū)動。顯然,uIPO.9并不是僅僅針對以太網(wǎng)設(shè)計的,以具有媒體無關(guān)性。為了節(jié)省資源占用,簡化應(yīng)用接口,uIPO.9在內(nèi)部實現(xiàn)上作了特殊的處 注意各模塊的融合,減少處理函數(shù)的個數(shù)和調(diào)用次數(shù),提高代碼復(fù)用 率,以減少ROM占用。 基于單一全局?jǐn)?shù)組的收發(fā)數(shù)據(jù)緩沖區(qū),不支持內(nèi)存動態(tài)分配,由應(yīng)用負(fù) 責(zé)處理收發(fā)的數(shù)據(jù)。 基于事件驅(qū)動的應(yīng)用程序接口,各并發(fā)連接采用輪循處理,僅當(dāng)網(wǎng)絡(luò)事 件發(fā)生時,由 uIP 內(nèi)核喚起應(yīng)用程序處理。這樣, uIP 用戶只須關(guān)注特定應(yīng)用 就可以了。傳統(tǒng)的 TCP/IP 實現(xiàn)一般要基于多任

7、務(wù)處理環(huán)境,而大多數(shù) 8 位機系 統(tǒng)不具備這個條件。 應(yīng)用程序主動參與部分協(xié)議棧功能的實現(xiàn)(如TCP的重發(fā)機制,數(shù)據(jù)包分段和流量控制),由 uIP 內(nèi)核設(shè)置重發(fā)事件,應(yīng)用程序重新生成數(shù)據(jù)提交發(fā) 送,免去了大量內(nèi)部緩存的占用。基于事件驅(qū)動的應(yīng)用接口使得這些實現(xiàn)較為 簡單。3 uIP 的設(shè)備驅(qū)動程序接口uIP 內(nèi)核中有兩個函數(shù)直接需要底層設(shè)備驅(qū)動程序的支持一是 uip_input() 。當(dāng)設(shè)置驅(qū)動程序從網(wǎng)絡(luò)層收到的一個數(shù)據(jù)包時要調(diào)用 這個函數(shù),設(shè)備驅(qū)動程序必須事先將數(shù)據(jù)包存入到 uip_buf 中,包長放到 uip_len ,然后交由 uip_input() 處理。當(dāng)函數(shù)返回時,如果 uip_le

8、n 不為 0, 則表明有帶外數(shù)據(jù)(如SYN ACK等)要發(fā)送。當(dāng)需要ARP支持時,還需要考慮 更新ARP表示或發(fā)出ARPi青求和回應(yīng),示例如下:#define BUF(struct uip_eth_hdr*)&uip_buf0) uip_len=ethernet_devicedriver_poll(); /接收以太網(wǎng)數(shù)據(jù)包(設(shè)備驅(qū)動程序)if(uip_len>0) /收到數(shù)據(jù)if(BUF->type= =HTONS(UIP_ETHTYPE_IP)/ 是 IP 包嗎?uip_arp_ipin(); /去除以太網(wǎng)頭結(jié)結(jié),更新ARPSuip_input(); /IP包處理if(u

9、ip_len>0) /有帶外回應(yīng)數(shù)據(jù)uip_arp_out(); /加以太網(wǎng)頭結(jié)構(gòu),在主動連接時可能要構(gòu)造 ARP請求ethernet_devicedriver_send(); /發(fā)送數(shù)據(jù)到以太網(wǎng)(設(shè)備驅(qū)動程序)else if(BUF->type=HTONS(UIP_ETHTYPE_ARP)/是ARP青求包uip_arp_arpin(); / 如是是ARP回應(yīng),更新 ARF表;如果是請求,構(gòu)造 回應(yīng)數(shù)據(jù)包if(uip_len>0) /是ARP青求,要發(fā)送回應(yīng)ethernet_devicedriver_send(); /發(fā) ARP回應(yīng)到以太網(wǎng)上另一個需要驅(qū)動程序支持的函數(shù)是ui

10、p_periodie( conn)。這個函數(shù)用于uIP 內(nèi)核對各連接的定時輪循,因此需要一個硬件支持的定時程序周期性地用 它輪循各連接,一般用于檢查主機是否有數(shù)據(jù)要發(fā)送,如有,則構(gòu)造 IP 包。使 用示例如下:for(i=0;i<UIP_CONNS;i+)uip_periodic(i);if(uip_len>0)uip_arp_out();ethernet_devicedriver_send();從本質(zhì)上來說, uip_input() 和 uip_periodic() 在內(nèi)部是一個函數(shù),即 uip_process(u8t flag) , UIP 的設(shè)計者將 uip_process(

11、UIP_DATA) 定義成 uip_input() ,而將 uip_process(UIP_TIMER) 定義成 uip_periodic() ,因此從 代碼實現(xiàn)上來說是完全復(fù)用的。4 uIP 的應(yīng)用程序接口為了將用戶的應(yīng)用程序掛接到 ulP中,必須將宏UIP_APPCAL()定義成 實際的應(yīng)用程序函數(shù)名,這樣每當(dāng)某個 uIP 事件發(fā)生時,內(nèi)核就會調(diào)用該應(yīng)用 程序進行處理。如果要加入應(yīng)用程序狀態(tài)的話,必須將宏 UIP_APPSTATE_SIZE 定義成應(yīng)用程序狀態(tài)結(jié)構(gòu)體的長度。在應(yīng)用程序函數(shù)中,依靠 uIP 事件檢測函數(shù)來決定處理的方法,另外可以通過判斷當(dāng)前連接的端口號來區(qū)分處理不同的 連接。

12、下面的示例程序是筆者實現(xiàn)的一個 Web服務(wù)器應(yīng)用的框架。#define UIP_APPCALL uip51_appcall#define UIP_APPSTATE_SIZE sizeof(struct uip51app_state)struct uip51app_stateunsigned char * dataptr;unsigned int dataleft;void uip51_initapp / 設(shè)置主機地址u16_t ipaddr2;uip_ipaddr(ipaddr,202,120,127,192);uip_sethostaddr(ipaddr);uip_listen(HTTP_P

13、ORT); /HTTP WEB PORT (80);void uip51_appcall(void)struct uip51app_state *s;s=(struct uip51lapp_state *)uip_conn->appstate; /獲取當(dāng)前連接狀態(tài)指針if(uip_connected()/有一個客戶機連上if(uip_newdat()|uip_rexmit() /收到新數(shù)據(jù)或需要重發(fā)if(uip_datalen()>0)if(uip_conn->lport=80) /收到 GET HTTP請求update_table_data();/ 根據(jù)電平狀態(tài)數(shù)據(jù)表動態(tài)生

14、成網(wǎng)頁s->dataptr=newpage;2653B的網(wǎng)頁發(fā)送長度 最大s->dataleft=2653; uip_send(s->dataptr,s->dataleft); / 發(fā)送長度為 if(uip_acked() / 收到客戶機的 ACK if(s->dataleft>uip_mss()&&uip_conn->lport=80) / 段長時s->dataptr+=uip_conn->len; / 繼續(xù)發(fā)送剩下的數(shù)據(jù) s->dataleft-=uip-conn->len;uip_send(s->da

15、taptr,s->dataleft);return;if(uip_poll()/將串口緩存的數(shù)據(jù)復(fù)制到電平狀態(tài)數(shù)據(jù)表 return;if(uip_timedout()| / 重發(fā)確認(rèn)超時 uip_closed()| /客戶機關(guān)閉了連接uip_aborted() / 客戶機中斷連接 return;5 uIP0.9 在電機遠(yuǎn)程監(jiān)測系統(tǒng)中的應(yīng)用筆者設(shè)計了一個嵌入式 Web莫塊UIPWEB51用于將發(fā)電機射頻監(jiān)測儀串口 輸出的數(shù)據(jù)上網(wǎng),以實現(xiàn)對發(fā)電機工作狀態(tài)的遠(yuǎn)程監(jiān)測,目前已獲得初步成 功。該莫塊的硬件框圖如圖 2 所示。單片機采用的是 Atmel的AT89C55W,它內(nèi)置20KB程序Flash

16、,512字節(jié) RAM 3個這時器/計數(shù)器,工作在22.1184MHz時具有約2MIPS的處理速度。網(wǎng) 卡芯片同樣采用的是低成本的 RTL8019AS是一款NE200C兼容的網(wǎng)卡芯片,系 統(tǒng)外擴了 32KB的SRAM用于串口數(shù)據(jù)和網(wǎng)絡(luò)數(shù)據(jù)的緩沖,另外還存放了 uIP 的許多全局變量。UIPWEB5的主程序采用中斷加輪循的方式,用中斷觸發(fā)的方式接收發(fā)電機 射頻監(jiān)測儀發(fā)出的數(shù)據(jù),開設(shè)置了一個接收隊列暫存這些數(shù)據(jù)。在程序中輪循 有無網(wǎng)絡(luò)數(shù)據(jù)包輸入,如有則調(diào)用 uIP 的相關(guān)處理函數(shù)(如上 uip_input() 使 用示例);如無則檢測定時輪循中斷是否發(fā)生。這里將 T2 設(shè)為 uIP 的定時輪循 計數(shù)

17、器,在 T2 中斷中設(shè)置輪循標(biāo)志,一旦主程序檢測到這一標(biāo)志就調(diào)用 uip_periodic() 輪循各連接(如上 uip_periodic() 使用示例)。UIPWeb51的應(yīng)用程序(如uIP的應(yīng)用程序接口示例),這個 Web服務(wù)器首 先打開 80 端口的監(jiān)聽,一旦有客戶機要求連上, uIP 內(nèi)部會給它分配一個連接 項,接著等收到客戶機IE瀏覽器發(fā)出的“ GET HTTP”請求后,將發(fā)電機電 平與狀態(tài)數(shù)據(jù)隊列中的數(shù)據(jù)填入網(wǎng)頁莫板,生成一幅新的網(wǎng)頁發(fā)給客戶機。因 為這幅網(wǎng)頁的大小已經(jīng)超過uIP的最大段長(MSS,因此在uIP內(nèi)核第一次實 際只發(fā)出了 MSSt字節(jié),在連接處于空閑的時候(uip_poll(),應(yīng)用程序可 以從串口隊列中讀出原始數(shù)據(jù),經(jīng)格式處理后再存到電機電平與狀態(tài)數(shù)據(jù)隊列 中,而在這個隊列中保存著當(dāng)前 1min 的設(shè)備工作數(shù)據(jù),以便下次更新網(wǎng)頁時使 用。在網(wǎng)頁中添加了更新按鈕,一旦瀏覽器用戶占擊了按鈕,瀏覽器會自動發(fā) 出CGI請求,UIPWEB5收到后,立即發(fā)送包含最新數(shù)據(jù)的網(wǎng)頁。如果uIP接收ACK超時,它會自動設(shè)置重發(fā)標(biāo)志,應(yīng)用程序中可以用uip_rexmit()來檢測這個標(biāo)志,重新生成網(wǎng)頁并發(fā)送。一旦用戶關(guān)閉了瀏覽器, uIP 也會自動檢測到 這一事件(應(yīng)用程序中可以用 uip_c

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論