成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

源碼公開的TCP/IP協(xié)議棧在遠(yuǎn)程監(jiān)測(cè)中的應(yīng)用

網(wǎng)絡(luò) 網(wǎng)絡(luò)管理
目前,隨著互聯(lián)網(wǎng)的發(fā)展,越來(lái)越多的工業(yè)測(cè)控設(shè)備已經(jīng)將網(wǎng)絡(luò)接入功能作為其默認(rèn)配置,以實(shí)現(xiàn)設(shè)備的遠(yuǎn)程監(jiān)控和信息分布式處理,下面我們給大家介紹一下源碼公開的TCP/IP協(xié)議棧在遠(yuǎn)程監(jiān)測(cè)中的應(yīng)用。

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

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

lwIP(LightweightTCP/IPStack)——支持的協(xié)議比較完整,一般需要多任務(wù)環(huán)境支持,代碼占用ROM>40KB,不適合8位機(jī)系統(tǒng),沒(méi)有完整的應(yīng)用文檔;

uC/IP(TCP/IPstackforuC/OS)——基于uC/OS的任務(wù)管理,接口較復(fù)雜,沒(méi)有說(shuō)明文檔。

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

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

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

◇高度可配置性,以適應(yīng)不同資源條件和應(yīng)用場(chǎng)合;

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

◇支持多個(gè)主動(dòng)連接和被動(dòng)連接并發(fā),支持連接的動(dòng)態(tài)分配和釋放;

◇簡(jiǎn)易的應(yīng)用層接口和設(shè)備驅(qū)動(dòng)層接口;

◇完善的示例程序和應(yīng)用協(xié)議實(shí)現(xiàn)范例。

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

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

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

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

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

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

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

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

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

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

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

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

#defineBUF((structuip_eth_hdr*)&uip_buf[0])

uip_len=ethernet_devicedriver_poll();//接收以太網(wǎng)數(shù)據(jù)包

//(設(shè)備驅(qū)動(dòng)程序)

if(uip_len>0){//收到數(shù)據(jù)

if(BUF->type==HTONS(UIP_ETHTYPE_IP)){//是IP包嗎?

uip_arp_ipin();//去除以太網(wǎng)頭結(jié)

//構(gòu),更新ARP表

uip_input();//IP包處理

if(uip_len>0){//有帶外回應(yīng)數(shù)據(jù)

uip_arp_out();//加以太網(wǎng)頭結(jié)構(gòu),在主動(dòng)連接時(shí)可能要

//構(gòu)造ARP請(qǐng)求

ethernet_devicedriver_send();//發(fā)送數(shù)據(jù)到以太網(wǎng)

//(設(shè)備驅(qū)動(dòng)程序)

}

}elseif(BUF->type==HTONS(UIP_ETHTYPE_ARP)){

//是ARP請(qǐng)求包

uip_arp_arpin();//如是是ARP回應(yīng),更新ARP表;如果是

//請(qǐng)求,構(gòu)造回應(yīng)數(shù)據(jù)包

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

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

}

}

另一個(gè)需要驅(qū)動(dòng)程序支持的函數(shù)是uip_periodic(conn)。這個(gè)函數(shù)用于uIP內(nèi)核對(duì)各連接的定時(shí)輪循,因此需要一個(gè)硬件支持的定時(shí)程序周期性地用它輪循各連接,一般用于檢查主機(jī)是否有數(shù)據(jù)要發(fā)送,如有,則構(gòu)造IP包。使用示例如下。

for(i=0;iuip_periodic(i);

if(uip_len>0){

uip_arp_out();

ethernet_devicedriver_send();

}

}

從本質(zhì)上來(lái)說(shuō),uip_input()和uip_periodic()在內(nèi)部是一個(gè)函數(shù),即uip_process(u8tflag),UIP的設(shè)計(jì)者將uip_process(UIP_DATA)定義成uip_input(),而將uip_process(UIP_TIMER)定義成uip_periodic(),因此從代碼實(shí)現(xiàn)上來(lái)說(shuō)是完全復(fù)用的。

4uIP的應(yīng)用程序接口

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

#defineUIP_APPCALLuip51_appcall

#defineUIP_APPSTATE_SIZEsizeof(structuip51app_state)

structuip51app_state{

unsignedchar*dataptr;

unsignedintdataleft;

};

voiduip51_initapp{//設(shè)置主機(jī)地址

u16_tipaddr[2];

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

uip_sethostaddr(ipaddr);

uip_listen(HTTP_PORT);//HTTPWEBPORT(80);

}

voiduip51_appcall(void){

structuip51app_state*s;

s=(structuip51app_state*)uip_conn->appstate;

//獲取當(dāng)前連接狀態(tài)指針

if(uip_connected()){

…//有一個(gè)客戶機(jī)連上

}

if(uip_newdata()||uip_rexmit()){//收到新數(shù)據(jù)或需要重發(fā)

if(uip_datalen()>0){

if(uip_conn->lport==80){//收到GETHTTP請(qǐng)求

update_table_data();//根據(jù)電平狀態(tài)數(shù)據(jù)表動(dòng)態(tài)

//生成網(wǎng)頁(yè)

s->dataptr=newpage;

s->dataleft=2653;

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

//發(fā)送長(zhǎng)度為2653B的網(wǎng)頁(yè)

}

}

}

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

if(s->dataleft>uip_mss()&&uip_conn->lport==80){

//發(fā)送長(zhǎng)度>最大段長(zhǎng)時(shí)

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ù)復(fù)制到

//電平狀態(tài)數(shù)據(jù)表

return;

}

if(uip_timedout()||//重發(fā)確認(rèn)超時(shí)

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

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

return;}

}

5uIP0.9在發(fā)電機(jī)遠(yuǎn)程監(jiān)測(cè)系統(tǒng)中的應(yīng)用

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

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

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

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

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

6測(cè)試結(jié)果

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

【編輯推薦】

  1. 嵌入式LwIP協(xié)議棧的內(nèi)存管理
  2. TCP/IP網(wǎng)絡(luò)中的顯式擁塞通告解析
  3. 關(guān)于IPv6的六大誤區(qū):IPv6并非更安全
  4. TCP調(diào)整和部署要根據(jù)實(shí)際情況
責(zé)任編輯:于爽 來(lái)源: hi.baidu.com
相關(guān)推薦

2010-09-08 15:24:28

TCP IP協(xié)議棧

2010-09-08 15:34:27

TCP IP協(xié)議棧

2010-07-01 15:38:41

TCP IP協(xié)議棧單片機(jī)

2010-09-08 15:11:36

TCP IP協(xié)議棧

2014-10-15 09:14:24

IP

2010-09-09 14:43:08

TCP IP協(xié)議棧

2010-09-08 15:18:54

單片機(jī)TCP IP協(xié)議棧

2010-06-13 14:54:40

TCP IP協(xié)議棧linux

2010-09-08 15:15:12

TCP IP協(xié)議棧

2010-09-27 13:25:58

TCP IP協(xié)議棧

2021-05-12 00:07:27

TCPIP協(xié)議

2010-06-19 14:10:35

TCP IP協(xié)議棧

2010-06-19 13:32:36

TCP IP協(xié)議棧

2010-06-08 13:50:40

TCP IP協(xié)議族

2010-06-18 15:31:21

TCP IP協(xié)議簇

2019-09-30 09:28:26

LinuxTCPIP

2010-06-13 14:49:40

TCP IP協(xié)議優(yōu)化

2010-06-08 15:10:08

2010-06-13 13:39:46

TCP IP協(xié)議棧

2021-07-06 21:29:16

TCPIP協(xié)議棧
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 999在线精品 | 亚洲一区二区三区在线 | 9191在线播放 | caoporn视频在线 | 久久精品亚洲 | 欧美日韩国产综合在线 | 九九国产在线观看 | 日韩免费激情视频 | 色综合99 | 欧美精品导航 | 狠狠婷婷综合久久久久久妖精 | 免费同性女女aaa免费网站 | 精品在线看 | 播放一级毛片 | 久久av一区二区三区 | 找个黄色片 | 日韩欧美在线免费观看 | 91美女视频| 久久高清 | 久久久久久久久99 | 黄色在线免费看 | 99re99| 97伦理影院| 韩日在线观看视频 | 成年视频在线观看 | 国产精品久久一区二区三区 | 中文字幕一区在线观看视频 | av在线免费观看网站 | 2022国产精品 | 免费xxxx大片国产在线 | 欧美一级网站 | 成人h免费观看视频 | 青青草一区二区三区 | 欧美成视频 | 成人午夜在线 | 国产午夜精品久久久 | 精品久久久久香蕉网 | 99精品欧美一区二区三区综合在线 | 亚洲一区二区三区视频在线 | 久久久国产精品视频 | 午夜久久久 |