當前位置:首頁 > 通信技術(shù) > 通信技術(shù)
[導讀]介紹一個適用于8/16位單片機的嵌入式TCP/IP協(xié)議棧(uIP)在發(fā)電機遠程監(jiān)測系統(tǒng)中的應用。重點闡述uIP的功能特性、體系結(jié)構(gòu)和相關(guān)接口,并詳細介紹如何在該協(xié)議棧上實現(xiàn)一個嵌入式Web服務器。目前uIP已成功地移植到51單片機上。

    摘要:介紹一個適用于8/16位單片機的嵌入式TCP/IP協(xié)議棧(uIP)在發(fā)電機遠程監(jiān)測系統(tǒng)中的應用。重點闡述uIP的功能特性、體系結(jié)構(gòu)和相關(guān)接口,并詳細介紹如何在該協(xié)議棧上實現(xiàn)一個嵌入式Web服務器。目前uIP已成功地移植到51單片機上。

    關(guān)鍵詞:TCP/IP協(xié)議棧 嵌入式Web服務器 遠程監(jiān)測

目前,隨著互聯(lián)網(wǎng)的發(fā)展,越來越多的工業(yè)測控設(shè)備已經(jīng)將網(wǎng)絡接入功能作為其默認配置,以實現(xiàn)設(shè)備的遠程監(jiān)控和信息分布式處理。筆者曾參與某發(fā)電機射頻監(jiān)測儀的開發(fā),該設(shè)備主要用于診斷和預警發(fā)電機早期故障,并通過RS232接口定時輸出電平和狀態(tài)數(shù)據(jù),現(xiàn)場專門設(shè)一臺PC作接收、顯示及存儲。每年都要有專家到各發(fā)電廠對以往數(shù)據(jù)作檢查和診斷,不勝其煩。因此有必要設(shè)計一個RS232到Internet的數(shù)據(jù)傳輸模塊,以便對發(fā)電機的運行狀況作遠程監(jiān)測。設(shè)計該模塊的關(guān)鍵在于如何實現(xiàn)一個嵌入式TCP/IP協(xié)議棧,根據(jù)以往的經(jīng)驗,自己設(shè)計一個協(xié)議棧的難度很可能超過應用本身,而采用商業(yè)的協(xié)議棧似乎又無必要(功能過于復雜),最后筆者選用一種功能簡易的免費TCP/IP協(xié)議棧uIP 0.9作為設(shè)計核心。

1 嵌入式TCP/IP協(xié)議棧

目前,市場上幾乎所有的嵌入式TCP/IP協(xié)議棧都是根據(jù)BSD版的TCP/IP協(xié)議棧改寫的。在商業(yè)嵌入式TCP/IP協(xié)議棧大都相當昂貴的情況下,很多人轉(zhuǎn)而使用一些源代碼公開的免費協(xié)議棧,并加以改造應用。目前較為著名的免費協(xié)議棧有:

lwIP(Light weight TCP/IP Stack)——支持的協(xié)議比較完整,一般需要多任務環(huán)境支持,代碼占用ROM>40KB,不適合8位機系統(tǒng),沒有完整的應用文檔;

uC/IP(TCP/IP stack for uC/OS)—基于uC/OS的任務管理,接口較復雜,沒有說明文檔。

筆者采用的協(xié)議棧系瑞典計算機科學研究所Adam Dunkels開發(fā)的uIP0.9。其功能特性總結(jié)如下:

*完整的說明文檔和公開的源代碼(全部用C語言編寫,并附有詳細注釋);

*極少的代碼占用量和RAM資源要求,尤其適用于8/16位單片機(見表1);

*高度可配置性,以適應不同資源條件和應用場合;

*支持ARP、IP、ICMP、TCP、UDP(可選)等必要的功能特性;

*支持多個主動連接和被動連接并發(fā),支持連接的動態(tài)分配和釋放;

*簡易的應用層接口和設(shè)備驅(qū)動層接口;

*完善的示例程序和應用協(xié)議實現(xiàn)范例。

表1 uIP在ATMEL AVR上代碼和RAM占用情況

協(xié)議模塊 代碼大小/B 使用的RAM/B
ARP 1324 118
IP/ICMP/TCP 3304 360
HTTP 994 110
校驗和函數(shù) 636 0
數(shù)據(jù)包緩存 0 400
總和 6258 988

注:配置為1個TCP聽端口,10個連接,10個ARP表項,400字節(jié)數(shù)據(jù)包緩存。

正是由于uIP所具有的顯著特點,自從0.6版本以來就被移植到多種處理器上,包括MSP430、AVR和Z80等。筆者使用的uIP0.9是2003年11月發(fā)布的版本。目前,筆者已將它成功移植到MCS-51上了。

2 uIP0.9的體系結(jié)構(gòu)

uIP0.9是一個適用于8/16位機上的小型嵌入式TCP/IP協(xié)議棧,簡單易用,資源占用少是它的設(shè)計特點。它去掉了許多全功能協(xié)議棧中不常用的功能,而保留網(wǎng)絡通信所必要的協(xié)議機制。其設(shè)計重點放在IP、ICMP和TCP協(xié)議的實現(xiàn)上,將這三個模塊合為一個有機的整體,而將UDP和ARP協(xié)議實現(xiàn)作為可選模塊。UIP0.9的體系結(jié)構(gòu)如圖1所示。

UIP0.9處于網(wǎng)絡通信的中間層,其上層協(xié)議在這里被稱之為應用程序,而下層硬件或固件被稱之為網(wǎng)絡設(shè)備驅(qū)動。顯然,uIP0.9并不是僅僅針對以太網(wǎng)設(shè)計的,以具有媒體無關(guān)性。

為了節(jié)省資源占用,簡化應用接口,uIP0.9在內(nèi)部實現(xiàn)上作了特殊的處理。

①注意各模塊的融合,減少處理函數(shù)的個數(shù)和調(diào)用次數(shù),提高代碼復用率,以減少ROM占用。

②基于單一全局數(shù)組的收發(fā)數(shù)據(jù)緩沖區(qū),不支持內(nèi)存動態(tài)分配,由應用負責處理收發(fā)的數(shù)據(jù)。

③基于事件驅(qū)動的應用程序接口,各并發(fā)連接采用輪循處理,僅當網(wǎng)絡事件發(fā)生時,由uIP內(nèi)核喚起應用程序處理。這樣,uIP用戶只須關(guān)注特定應用就可以了。傳統(tǒng)的TCP/IP實現(xiàn)一般要基于多任務處理環(huán)境,而大多數(shù)8位機系統(tǒng)不具備這個條件。

④應用程序主動參與部分協(xié)議棧功能的實現(xiàn)(如TCP的重發(fā)機制,數(shù)據(jù)包分段和流量控制),由uIP內(nèi)核設(shè)置重發(fā)事件,應用程序重新生成數(shù)據(jù)提交發(fā)送,免去了大量內(nèi)部緩存的占用?;谑录?qū)動的應用接口使得這些實現(xiàn)較為簡單。

3 uIP的設(shè)備驅(qū)動程序接口

uIP內(nèi)核中有兩個函數(shù)直接需要底層設(shè)備驅(qū)動程序的支持。

一是uip_input()。當設(shè)置驅(qū)動程序從網(wǎng)絡層收到的一個數(shù)據(jù)包時要調(diào)用這個函數(shù),設(shè)備驅(qū)動程序必須事先將數(shù)據(jù)包存入到uip_buf[]中,包長放到uip_len,然后交由uip_input()處理。當函數(shù)返回時,如果uip_len不為0,則表明有帶外數(shù)據(jù)(如SYN,ACK等)要發(fā)送。當需要ARP支持時,還需要考慮更新ARP表示或發(fā)出ARP請求和回應,示例如下:

#define BUF((struct uip_eth_hdr*)&uip_buf[0])

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é),更新ARP表

uip_input(); //IP包處理

if(uip_len>0){ //有帶外回應數(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回應,更新ARP表;如果是請求,構(gòu)造回應數(shù)據(jù)包

if(uip_len>0){ //是ARP請求,要發(fā)送回應

ethernet_devicedriver_send(); //發(fā)ARP回應到以太網(wǎng)上

}

}

另一個需要驅(qū)動程序支持的函數(shù)是uip_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(UIP_DATA)定義成uip_input(),而將uip_process(UIP_TIMER)定義成uip_periodic(),因此從代碼實現(xiàn)上來說是完全復用的。

4 uIP的應用程序接口

為了將用戶的應用程序掛接到uIP中,必須將宏UIP_APPCALL()定義成實際的應用程序函數(shù)名,這樣每當某個uIP事件發(fā)生時,內(nèi)核就會調(diào)用該應用程序進行處理。如果要加入應用程序狀態(tài)的話,必須將宏UIP_APPSTATE_SIZE定義成應用程序狀態(tài)結(jié)構(gòu)體的長度。在應用程序函數(shù)中,依靠uIP事件檢測函數(shù)來決定處理的方法,另外可以通過判斷當前連接的端口號來區(qū)分處理不同的連接。下面的示例程序是筆者實現(xiàn)的一個Web服務器應用的框架。

#define UIP_APPCALL uip51_appcall

#define UIP_APPSTATE_SIZE sizeof(struct uip51app_state)

struct uip51app_state{

unsigned char * dataptr;

unsigned int dataleft;

};

void uip51_initapp{ //設(shè)置主機地址

u16_t ipaddr[2];

uip_ipaddr(ipaddr,202,120,127,192);

uip_sethostaddr(ipaddr);

uip_listen(HTTP_PORT); //HTTP WEB PORT(80);

}

void uip51_appcall(void){

struct uip51app_state *s;

s=(struct uip51lapp_state *)uip_conn->appstate; //獲取當前連接狀態(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)生成網(wǎng)頁

s->dataptr=newpage;

s->dataleft=2653;

uip_send(s->dataptr,s->dataleft); //發(fā)送長度為2653B的網(wǎng)頁

}

}

}

if(uip_acked()){ //收到客戶機的ACK

if(s->dataleft>uip_mss()&&uip_conn->lport==80){ //發(fā)送長度>最大段長時

s->dataptr+=uip_conn->len; //繼續(xù)發(fā)送剩下的數(shù)據(jù)

s->dataleft-=uip-conn->len;

uip_send(s->dataptr,s->dataleft);

}

return;

}

if(uip_poll())

{… //將串口緩存的數(shù)據(jù)復制到電平狀態(tài)數(shù)據(jù)表

return;

}

if(uip_timedout()|| //重發(fā)確認超時

uip_closed()|| //客戶機關(guān)閉了連接

uip_aborted()){ //客戶機中斷連接

return;}

}

5 uIP0.9在電機遠程監(jiān)測系統(tǒng)中的應用

筆者設(shè)計了一個嵌入式Web模塊UIPWEB51,用于將發(fā)電機射頻監(jiān)測儀串口輸出的數(shù)據(jù)上網(wǎng),以實現(xiàn)對發(fā)電機工作狀態(tài)的遠程監(jiān)測,目前已獲得初步成功。該模塊的硬件框圖如圖2所示。

單片機采用的是Atmel的AT89C55WD,它內(nèi)置20KB程序Flash,512字節(jié)RAM,3個這時器/計數(shù)器,工作在22.1184MHz時具有約2MIPS的處理速度。網(wǎng)卡芯片同樣采用的是低成本的RTL8019AS,是一款NE2000兼容的網(wǎng)卡芯片,系統(tǒng)外擴了32KB的SRAM,用于串口數(shù)據(jù)和網(wǎng)絡數(shù)據(jù)的緩沖,另外還存放了uIP的許多全局變量。

UIPWEB51的主程序采用中斷加輪循的方式,用中斷觸發(fā)的方式接收發(fā)電機射頻監(jiān)測儀發(fā)出的數(shù)據(jù),開設(shè)置了一個接收隊列暫存這些數(shù)據(jù)。在程序中輪循有無網(wǎng)絡數(shù)據(jù)包輸入,如有則調(diào)用uIP的相關(guān)處理函數(shù)(如上uip_input()使用示例);如無則檢測定時輪循中斷是否發(fā)生。這里將T2設(shè)為uIP的定時輪循計數(shù)器,在T2中斷中設(shè)置輪循標志,一旦主程序檢測到這一標志就調(diào)用uip_periodic()輪循各連接(如上uip_periodic()使用示例)。

UIPWeb51的應用程序(如uIP的應用程序接口示例),這個Web服務器首先打開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ā)出了MSS個字節(jié),在連接處于空閑的時候(uip_poll()),應用程序可以從串口隊列中讀出原始數(shù)據(jù),經(jīng)格式處理后再存到電機電平與狀態(tài)數(shù)據(jù)隊列中,而在這個隊列中保存著當前1min的設(shè)備工作數(shù)據(jù),以便下次更新網(wǎng)頁時使用。在網(wǎng)頁中添加了更新按鈕,一旦瀏覽器用戶占擊了按鈕,瀏覽器會自動發(fā)出CGI請求,UIPWEB51收到后,立即發(fā)送包含最新數(shù)據(jù)的網(wǎng)頁。如果uIP接收ACK超時,它會自動設(shè)置重發(fā)標志,應用程序中可以用uip_rexmit()來檢測這個標志,重新生成網(wǎng)頁并發(fā)送。一旦用戶關(guān)閉了瀏覽器,uIP也會自動檢測到這一事件(應用程序中可以用uip_closed()來檢測),并且釋放掉這個連接項。

圖3是UIPWEB51的總體程序結(jié)構(gòu)圖。

6 測試結(jié)果

將uIP0.9配置成允許4個并發(fā)連接,1個監(jiān)聽端,10端個ARP表項,去掉UDP支持,UIP_ZBUFSIZE=1500和其它優(yōu)化選項。用KEIL C編譯,整個uIP0.9內(nèi)核模式代碼量小于8KB(含Web應用程序),內(nèi)核對RAM的占用小于2KB(不含網(wǎng)頁)。整個系統(tǒng)程序的代碼量小于12KB,占用的RAM小于10KB。另外,在公網(wǎng)上測試了該模式的傳輸速度,大于20Kbps,對于此項應用已達到要求。目前,該模塊正準備應用于新一代的發(fā)電機射頻監(jiān)測系統(tǒng)中。

本站聲明: 本文章由作者或相關(guān)機構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫毥谦F公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數(shù)字化轉(zhuǎn)型技術(shù)解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關(guān)鍵字: AWS AN BSP 數(shù)字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動 BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務能7×24不間斷運行,同時企業(yè)卻面臨越來越多業(yè)務中斷的風險,如企業(yè)系統(tǒng)復雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報道,騰訊和網(wǎng)易近期正在縮減他們對日本游戲市場的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導體

8月28日消息,在2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會上,華為常務董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機 衛(wèi)星通信

要點: 有效應對環(huán)境變化,經(jīng)營業(yè)績穩(wěn)中有升 落實提質(zhì)增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務引領(lǐng)增長 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競爭力 堅持高質(zhì)量發(fā)展策略,塑強核心競爭優(yōu)勢...

關(guān)鍵字: 通信 BSP 電信運營商 數(shù)字經(jīng)濟

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術(shù)學會聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會上宣布正式成立。 活動現(xiàn)場 NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會上,軟通動力信息技術(shù)(集團)股份有限公司(以下簡稱"軟通動力")與長三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉