




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
信息相信為正確且可靠之信息,但并不保證本文件中絕無錯誤。請于向凌陽提出訂單前,自行確定所使用之相關(guān)技術(shù)文件及規(guī)格為之版本。若因貴公司使用本公司之文件或產(chǎn)品,而涉及第三人之專利或著作權(quán)等智能財之應(yīng)用及配合時,則應(yīng)由貴公司負責取得同意及,本公司僅單純販售產(chǎn)品,上述關(guān)于同意及,非屬本公司應(yīng)為保證之責任。又凌陽有限公司之正式,本公司之所有產(chǎn)品不得使用于醫(yī)療器材,維持生命系統(tǒng)及飛航等相關(guān)設(shè)備。 unIP簡 unIPStack的特 unIPStack的硬件需 協(xié)議棧的API說 網(wǎng)絡(luò)接口層API函數(shù)列 動態(tài)內(nèi)存管理模塊API函數(shù)說 UDP層API函數(shù)說 TCP層API函數(shù)說 網(wǎng)絡(luò)字節(jié)輔助函數(shù) StepbyStep建立自己的WEBSERVER 網(wǎng)頁的制 HTTP請求的處理以及動態(tài)效果的實 運行WEB WebServer的實 WebServer的初始 unIPunIP是運行在凌陽公司U’nSP系列單片機上的一個精簡TCP/IP協(xié)議棧。協(xié)議棧的初始版本由LwIP移植而來,之所以不沿用LwIP的名字是因為移植工作不僅僅只是LwIP說明的arch下的地址也是以16bit為單位因此unIP與LwIP并不兼容,此外,增加了DNS (解析客戶名為unIP,特指是運行于U’nSP系列單片機之上的網(wǎng)絡(luò)協(xié)議棧。表 unIPStack特性TCP選項(TCPTCPTCPTCP緊急數(shù)據(jù)(urgentDHCP客戶端(可自動獲取網(wǎng)絡(luò)設(shè)置原始API(網(wǎng)絡(luò)編程為了方便用戶的使用,本手冊也一并詳細介紹利用本協(xié)議棧在凌陽的SPCE061上實現(xiàn)的一個WEBSERVER的全過程,并配套有硬件開發(fā)板,可供用戶實驗之用。此開發(fā)實例以及源程序可以用 Dm9000配置的不同可以為400Word至600Word左右。(pbufUDP層、TCP層、DHCPDNS層的所有APInetif_init()、netif_add()、netif_set_addr()、netif_remove()、netif_find()()netif_init netif_initnetif_add ip地址指針 無類型指針 回調(diào)函數(shù)指針用于初始化本網(wǎng)絡(luò)接口包括網(wǎng)絡(luò)接口的名稱例如eth0,lo0等等。還要指定新接口最大傳輸單元,MTU,新接口的數(shù)據(jù)發(fā)送回調(diào) packettcp/ip協(xié)議中,此函數(shù)應(yīng)該為失敗原因:內(nèi)存不夠。initinput函數(shù)指針均是此網(wǎng)絡(luò)接口的硬件驅(qū)動層的函數(shù)(由用戶根據(jù)實際使用的硬件而編寫,init函數(shù)在此函數(shù)調(diào)用中會立即被調(diào)用,以初始化鏈路層硬件。inputnetifNULLinit函數(shù)中加netif_remove
netif_set_addr(structnetif*netif,structip_addr*ipaddr,structip_addrstructip_addr 網(wǎng)絡(luò)接口指針 新的ip地址指針 無voidnetif_remove(structnetif*無netif_find 字符 netif_set_defaultvoidnetif_set_default(structnetif 無netif_set_ipaddrvoidnetif_set_ipaddr(structnetif*netifstructip_addr*ipaddr); 無voidvoidnetif_set_gw(structnetif*netif,structip_addr無mem_init mem_init 無voidvoid*mem_realloc(void*mem,mem_size_t并返回mem_realloc()的返回值給調(diào)用者。據(jù)結(jié)構(gòu):ROM模式的pbuf,UDP協(xié)議控制塊,TCP協(xié)議控制塊,狀態(tài)的TCP協(xié)議控制塊(用來實現(xiàn)服務(wù)器程序,TCP收發(fā)Packet的隊列。用戶根據(jù)實際應(yīng)用需要,可以配置這些固定結(jié)構(gòu)數(shù)組的大小。具體的配置方法將會在本手冊后續(xù)的Lib配置中敘述。本模塊的API均為內(nèi)部API,在協(xié)議棧內(nèi)unIP中,所有的Packet均用同一種結(jié)構(gòu)來封裝,那就是pbuf。pbuf是一個鏈表,用來一個packet的各個組成部分,類似于Linux下的sk_buff一樣的結(jié)構(gòu),只是pbuf的設(shè)計更加節(jié)省RAM。pbuf結(jié)structpbufstructpbufvoid u16_t u16_t u16_t //pbufu16_t //本pbuf的次 對應(yīng)flagPBUF_FLAG_ROM,此類pbuf在分配的時候不會分配任何RAM區(qū)域給payloadpayloadROM區(qū)域中。這種數(shù)pbufflagPBUF_FLAG_REFROM區(qū)域,也可能是RAM中,一般用來不同的pbuf中的數(shù)據(jù)。由于并不會分外的內(nèi)存給payload,因此此類PBUF有一個特點就是pbuf的大小固定,因此這類pbuf可以以模式化內(nèi)存來分配。用戶可以自行配置系統(tǒng)中所需要的此類pbuf的數(shù)量。一般來說如果有大量的數(shù)據(jù)位于ROM中需要傳送的話,這類pbuf的數(shù)量就應(yīng)該設(shè)置得適當多一些。大小RAM區(qū)域payloadpayload一定是指RAM區(qū)域。這類pbuf用來存放動態(tài)生成的packet,例如頁數(shù)據(jù),等等。由于大小都是由調(diào)用者指定,因此這類pbuf不能以模式化來處理,只能完全靠動態(tài)內(nèi)存分配來得到。PBUF_POOL:對應(yīng)flag為PBUF_FLAG_POOL,此pbuf的數(shù)據(jù)指針也是指向一片RAMpacketpacket的長度會有一個不太大的上限值,例如以Packet1500Byte(除去以太包頭和校驗和)pool的長度750wordTCPTCPMSS設(shè)定好以后,此處的poolsize救只用設(shè)置為(MSS+40)/2word就可以了。pbuf_ref()、pbuf_()、pbuf_clen()、pbuf_chain()和pbuf_cat()。下面是所有函數(shù)的詳細說明表。pbuf_init()函數(shù)原 void參 返回 功能說 初始化pbuf區(qū)pbuf_alloc函數(shù)原 structpbuf*pbuf_alloc(pbuf_layerl,u16_tsize,pbuf_flag參 IP層的packet 枚舉類型pbuf_flag,包括以下數(shù)值 傳輸層20+20+14網(wǎng)絡(luò)層鏈路層原始型用戶使用的是payload之后的區(qū)域,大小依然是size。這里的單位均為字節(jié)。在應(yīng)用層編程的時候,基本用不著網(wǎng)絡(luò)層與鏈路層的pbuf,一般純用戶數(shù)據(jù)就用原始型,而需要利用UDP的時候,就需要選擇傳輸層的pbuf,用戶使用的是payload后的數(shù)據(jù),而payload前的數(shù)據(jù)就預(yù)留給封裝packet之用。voidpbuf_realloc(structpbuf*p,u16_tsize) 準備調(diào)整的 無例如,事先分配了一個pbuf鏈P1->P2->pbuf_refvoidpbuf_ref(structpbuf 無pbuf_ref_chainvoidpbuf_ref_chain(structpbuf 無pbuf_chainvoidpbuf_chain(structpbuf*h,structpbuf pbuf pbuf無將兩個pbuf鏈表連接起來,成為一個新的pbuf。新的pbuf所包含的數(shù)據(jù)是兩者的順序聯(lián)合。此外t的ref域會被加一。多用于不同層的數(shù)據(jù)的聯(lián)合。h為低層的pbuf,而t為的pbuf。因為t的ref值會加一,按照pbuf_的算法,它不會與h一同被釋放掉,這正好適合分層處理的pbuf_clenudp_remove
pbuf_clenstructpbuf*p) 目標pbuf鏈的首指針無voidudp_remove(structudp_pcb無udp_bind 成功則返回ERR_OKudp_connecterr_tudp_connect(structudp_pcb*pcb,structip_addr*ipaddr,u16_tport);remotehostipremotehost的端pcbremoteipremoteport設(shè)定為參數(shù) (structudp_pcb*pcb,structpbufp存放需要發(fā)送的應(yīng)用層數(shù)據(jù)的pbuf指針,此pbuf應(yīng)該為傳輸層pbuf。 目前一定返回ERR_OK upcb=udp_send(upcb,p);udp_recv (structudp_pcbvoid(*recv) (void*arg,structudp_pcb*upcb,structpbuf*p,structip_addr*addr,u16_tport),void 出錯可能返回ERR_USE,表示無可用端口。void(*recv) void(*recv) structudp_pcb*upcb,structpbufstructip_addr*addr,u16_tport)premotehostipremotehost的端udpp中存放,addr和port為remoteipaddr和remoteportudp層的協(xié)議的接收處理部分就在此函數(shù)中進行。利用UDP層實現(xiàn)的應(yīng)用層協(xié)議的實現(xiàn),主體部分一般在recv函數(shù)中進行。tcp_allocstructtcp_pcb* (u8_t 通過宏TCP_NUM配置。tcp_arg (structtcp_pcb*pcb,void無PCBTCPPCB塊對應(yīng)的回tcp_bind (structtcp_pcb*pcb,structip_addru16_t 成功則返回ERR_OK是綁定到本地所有ip地址(當有多網(wǎng)絡(luò)接口時,就是綁定到所有的接口。structstructtcp_pcb* (structtcp_pcbTCP協(xié)議控制塊指針將pcb所指定的連接置于隊列中。在此操作之前,必須已經(jīng)執(zhí)行完綁定動作。于隊列以后,若有客戶端連接已經(jīng)綁定的端口,則會調(diào)用接下來由函數(shù)由于處于listen狀態(tài)的tcp協(xié)議控制塊所需的ram較小,因此本函數(shù)將釋放的pcbtcp_accept (structtcp_pcberr_t(*accept)(void*arg,structtcp_pcb*newpcb,err_terr));無當有連接到pcb中的相應(yīng)端口時,accept所指向的函數(shù)將被調(diào)用(STtcp_connect tcp_connect(structtcp_pcb*pcb,structip_addr*ipaddr,u16_tport,err_t(*connected)(void*arg,structtcp_pcberr_tremotehostipremotehost的端建立到服務(wù)器的接。并指定一個回調(diào)函數(shù)指針connected,當連接被服務(wù)器接SYN,并不會等服務(wù)器回應(yīng)就立刻返回,后續(xù)的動作是在ERR_OKERR_MEMRAMSYN回調(diào)函數(shù)(函數(shù)名稱可以由程序員自己指定SYNACK后會調(diào)用 (structtcp_pcb*pcb,constvoid*dataptr,u16_tu8_t應(yīng)用層傳輸TCP數(shù)據(jù)函數(shù)。此函數(shù)一般在ESTABLISED狀態(tài)下調(diào)用。用來發(fā)送以dataptr為首地址,長度為len(bytelength)的數(shù)據(jù)。copy0表示不需要在協(xié)議棧內(nèi)部拷貝一份該數(shù)據(jù),多用于romcopy1,讓協(xié)議??截恠ent指向的函數(shù)將在tcp層得知有新的數(shù)據(jù)被remotesenterr_t(*sent)(void*arg,structtcp_pcbu16_t操作成功返回ERR_OK,讓連接繼續(xù)。 (struct (structtcp_pcberr_t(*recv)(void*arg,structtcp_pcb*tpcb,structpbuf*p,err_terr));無recv err_t(*recv)(void*arg,structtcp_pcbstructpbuf*p,err_t ptcp_recved (structtcp_pcb*pcb,u16_t無tcp_poll (structtcp_pcberr_t(*poll)(void*arg,structtcp_pcb*tpcb),u8_tinterval);無err_terr_t(*poll)(void*arg,structtcp_pcbu8_t無tcp_err (structtcp_pcbvoid(*err)(void*arg,err_t(structtcp_pcb返回 操作成功返回ERR_MEM,程序員要負責處理這種情形,例如可以輪詢一直到返回成tcp_abort (structtcp_pcb無RSTremotehost。本函數(shù)執(zhí)行到最后會調(diào)tcp_tmr 2.7及送數(shù)據(jù)到網(wǎng)絡(luò)鏈路中去的時候都應(yīng)該做一下轉(zhuǎn)換。還有,UnSP單片機的一個字節(jié)在物理上是16bit的數(shù)據(jù),而網(wǎng)絡(luò)字節(jié)流的單位為字節(jié),因此也不能直接利用數(shù)組下標的模式來取數(shù),而需要用別的方法來處理。本節(jié)就是介紹用于處理以上兩類情形的API函數(shù)。下面就是詳細說明: 16bit數(shù)據(jù)16bit數(shù)據(jù)8bit例如n=m=u16_tntohs(u16_t 16bit16bit高低8bit數(shù)據(jù)互換了n=0x1234m=htons(n)htonlu32_thtonl(u32_t 32bit32bit高低8bit數(shù)據(jù)互換了n=0x12345678m=htons(n)m0x785634m0x785634getbyteu8_tgetbyte(u16_t*data,u16_toffset為偶數(shù),則offset處的數(shù)據(jù)為data[offset/2]8位數(shù)據(jù) : :0x1234 0x1374 offet為0對應(yīng)的數(shù)據(jù)為0x34,u16_tu16_tpackstrncat(u16_t*data,char*str,u16_toffset)data中,得到一個新的壓縮型字符串。str必須以’\0’結(jié)束,’\0’并不會被寫入data緩沖區(qū)的末尾。u16_t無unIP超件標 tcp u16_tiTemp=if(iTemp&DHCP_COARSE_TIMEOUT)dhcp_coarse_tmr();if(iTemp&DHCP_FINE_TIMEOUT)dhcp_fine_tmr();if(iTemp&TCP_TIMEOUT)tcp_tmr();在第2節(jié)中已經(jīng)有許多API函數(shù)的說明中提到了協(xié)議棧的配置事項,在這里這些配置整理一unIPRAM消CODE不同的選項,今后應(yīng)該會突破此限制。下面是所有的可配置參數(shù),均在config.h中配置。表2unIP11131344455
最大值說明于總得RAM大小一般只會一次處理一個輸入得POOL的大小,以字為單位,此POOL的大小應(yīng)該是能容納鏈路不支持IP分片,因此為了能正packet,理論WEBSERVER又是利用的TCP層,TCP層有自己的mss,因此可以設(shè)置此處大小為(TCP_MSS+54)/2即可接收到所有的TCPpacket。存放DNS記錄的表的大小(若沒有使用DNS功能則此項無效)TCP層MSS值TCPMSS的整TCP普通packet最大重傳次數(shù)TCPSYN最大重傳次數(shù)PBUF_ROM的個數(shù),如果需要pbuf應(yīng)該設(shè)置得大一些UDP通信個數(shù)(若UDP的庫,則此TCP連接數(shù)(庫是不帶TCP11能同時處于狀態(tài)得TCP個數(shù),一個服務(wù)器應(yīng)用對應(yīng)一個LTCP(TCP的庫則此項無效55TCP層發(fā)送緩沖區(qū)的packet隊設(shè)置得大一些。(若庫是不帶TCP的庫則此項無效SPCE061WebServerAPI的組合運用。本節(jié)unIPTCP服務(wù)器程序的一個范例。為了先建立一個感性認識,在本節(jié)的第一小節(jié)中,我們會引導(dǎo)用以改寫部分程序以支持的HTTP請求,例如POST等。webfile下存放著所有的網(wǎng)頁文件,用在IE問到它們。第一步就是將網(wǎng)頁數(shù)據(jù)轉(zhuǎn)換為c語言文件,運行本手冊附帶的工具NetPageToC,選中我們需要轉(zhuǎn)換的所有網(wǎng)頁文件(webfile下)Convert,生成文fsdata.c,用這c文件覆蓋原打開工程文件,選擇rebuildall,然后點擊,運行。回頭來配置一下網(wǎng)絡(luò)參數(shù),WEBSERVER的默認配置為IP地址:14 與PC機的最方便的連接方式是雙機對連,需要一根對連的網(wǎng)線,將DM9000上的RJ45接口與PC上的網(wǎng)卡連接起來。將PC機的IP地址設(shè)為54,子網(wǎng)掩碼設(shè)為,網(wǎng)關(guān)設(shè)為54。打開IE,在IE中選擇不用服務(wù)器。然后在IE地址欄輸入:MAC驅(qū)動層的實現(xiàn)之上,而是放在如何利用TCP層API以及unIP的其它API來實現(xiàn)一個Web))netif_set_defau初始化HTTPSERVEunIP圖 WebServer主程序流程圖 WebServer協(xié)議棧處理流程WebServer工作的一個大概流程,用戶應(yīng)該可以從中找出幾個回調(diào)函WebServer{structtcp_pcb*pcb;pcb=tcp_new();if(pcb==NULL)return;pcb=tcp_listen(pcb);//因為在函數(shù)tcp_listen中已經(jīng)釋放了原pcb。tcp_accept(pcb,http_accept); //設(shè)定accept回調(diào)函數(shù)指針}http_accept2http_accept的位置,思http_accept(void*arg,structtcp_pcb*pcb,err_t{structhttp_state hs=mem_malloc(sizeof(structhttp_state));if(hs==NULL){return}hs->retries= hs->web=tcp_arg(pcb, tcp_recv(pcb, tcp_err(pcb,conn_err); tcp_poll(pcb,http_poll,10); //設(shè)置http_poll為輪詢回調(diào)函數(shù)returnERR_OK; //返回ERR_OK,接受此連接請求}structhttp_statestructwebdata structwebdatastructwebdata*next//u16_toffset; u16_tlen; u16_t //屬性,DYNAMICRAMhttp_accept函數(shù)執(zhí)行完畢以后,連接就順利的建立起來了,并且也設(shè)定了三個回調(diào)函數(shù)http_recv、http_poll和conn_err。前兩個函數(shù)的調(diào)用時機在圖1與圖2中可以看出來,conn_err的調(diào)用時機是在接收到RST后或者發(fā)出RST時會被調(diào)用。正常情況下,http_accept執(zhí)行完畢系統(tǒng)就開始等候后續(xù)的客戶端的HTTP請求,類似于GETHTTP: 達服務(wù)器,則函數(shù)http_recv會被調(diào)用,用來分析客戶端的頁面請求,并給出正確的回應(yīng)。本小節(jié)是分析客戶端的頁面請求,并回送相應(yīng)的頁面數(shù)據(jù)給客戶端(假設(shè)為IE。這個過程是HTTP協(xié)議處理的主要過程,正確完成后,在IE上就會出現(xiàn)我們期望的頁面。http_accep函數(shù)分析客戶的請求,并且準備好相應(yīng)的頁面數(shù)據(jù)到HTTP協(xié)議控制塊的web域,然后通過函數(shù)send_data來發(fā)送
溫馨提示
- 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)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 南召縣2025屆數(shù)學(xué)四年級第二學(xué)期期末檢測模擬試題含解析
- 資產(chǎn)配置一線實戰(zhàn)課程知到課后答案智慧樹章節(jié)測試答案2025年春上海財經(jīng)大學(xué)
- 南通大學(xué)《現(xiàn)代生物儀器分析》2023-2024學(xué)年第二學(xué)期期末試卷
- 山西大同市第一中學(xué)2025年高三下學(xué)期學(xué)業(yè)質(zhì)量監(jiān)測(二模)英語試題含解析
- 廈門演藝職業(yè)學(xué)院《綠色建筑與綠色施工》2023-2024學(xué)年第二學(xué)期期末試卷
- 韓山師范學(xué)院《建設(shè)監(jiān)理1》2023-2024學(xué)年第二學(xué)期期末試卷
- 安徽省滁州市部分高中2025年高三第一次聯(lián)考試卷(英語試題文)試題含解析
- 廣州華立科技職業(yè)學(xué)院《日語綜合能力訓(xùn)練(2)》2023-2024學(xué)年第一學(xué)期期末試卷
- 古詩表達技巧
- 公共交通乘客服務(wù)評價制度
- 2025年食品供應(yīng)商合同范本
- 2025年咸陽職業(yè)技術(shù)學(xué)院單招職業(yè)技能測試題庫完整版
- 《網(wǎng)絡(luò)信息安全教學(xué)》課件
- 公路養(yǎng)護服務(wù)方案(技術(shù)方案)
- 徐州2025年江蘇徐州市口腔醫(yī)院招聘非在編醫(yī)務(wù)人員53人筆試歷年參考題庫附帶答案詳解-1
- 新版人音版小學(xué)音樂一年級下冊全冊教案
- (高清版)JTGT 3650-01-2022 公路橋梁施工監(jiān)控技術(shù)規(guī)程
- DZ∕T 0213-2020 礦產(chǎn)地質(zhì)勘查規(guī)范 石灰?guī)r、水泥配料類(正式版)
- MOOC 跨文化交際通識通論-揚州大學(xué) 中國大學(xué)慕課答案
- GB/T 28799.2-2020冷熱水用耐熱聚乙烯(PE-RT)管道系統(tǒng)第2部分:管材
- 2023-瑞幸咖啡vi手冊
評論
0/150
提交評論