<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>
關(guān) 閉

新聞中心

EEPW首頁(yè) > 工控自動(dòng)化 > 設計應用 > 工控網(wǎng)中基于Linux的嵌入式HTTP服務(wù)器設計

工控網(wǎng)中基于Linux的嵌入式HTTP服務(wù)器設計

作者: 時(shí)間:2004-12-30 來(lái)源:網(wǎng)絡(luò ) 收藏
摘要:超文本傳輸協(xié)議是控制網(wǎng)絡(luò )的關(guān)鍵設備,也是實(shí)現設備Internet遠程監控的關(guān)鍵技術(shù)。本文提出一種通用性和可移植性考慮的思路,并利用、PC104總線(xiàn)的CPU卡和通信模塊給出一個(gè)應用實(shí)例。

關(guān)鍵詞: 控制網(wǎng)絡(luò )

引言

控制網(wǎng)絡(luò )一般指以控制“事物對象”為特征的計算機網(wǎng)絡(luò )系統,簡(jiǎn)稱(chēng)Infranet(infrastructure network),它處在企業(yè)網(wǎng)(Intranet)的底層,構成了整個(gè)企業(yè)網(wǎng)的基礎。近些年來(lái),在控制網(wǎng)絡(luò )中采用了現場(chǎng)總線(xiàn)(Field Bus)和工業(yè)以太網(wǎng)(Ethernet)兩種技術(shù)。出現這種情況主要有兩個(gè)原因:第一,目前存在多種現場(chǎng)總線(xiàn)標準,不同的標準采用完全不同的通信協(xié)議,也就是說(shuō)現場(chǎng)總線(xiàn)的開(kāi)放性不夠;第二,以太網(wǎng)雖然能夠解決開(kāi)放性的問(wèn)題,并具備成本低廉、技術(shù)成熟等優(yōu)點(diǎn),但由于以太網(wǎng)最初是被用于以資源共享為目的的計算機局域網(wǎng),因此在實(shí)時(shí)性和可靠性上暫時(shí)還不能完全滿(mǎn)足工業(yè)控制的要求。事實(shí)上,目前一個(gè)較大規模的控制網(wǎng)絡(luò )往往綜合采用了這兩種技術(shù)。在現場(chǎng)層,由于強調實(shí)時(shí)性、可靠性和安全性,常采用現場(chǎng)總線(xiàn)技術(shù);在監控管理層,考慮到采用不同標準的控制網(wǎng)段之間的集成以及與高層企業(yè)信息網(wǎng)絡(luò )的集成,一般采用以太網(wǎng)技術(shù)?,F場(chǎng)層的現場(chǎng)總線(xiàn)控制系統FCS(Field Control System)或其它設備級輕質(zhì)網(wǎng)絡(luò )通過(guò)網(wǎng)關(guān)或嵌入式HTTP服務(wù)器與高層以太網(wǎng)相連。這樣,不僅采用不同協(xié)議的控制網(wǎng)段能夠實(shí)現互聯(lián),而且各個(gè)控制網(wǎng)段能方便地與高層企業(yè)信息網(wǎng)互通,從而最終實(shí)現企業(yè)網(wǎng)的管控一體化和對現場(chǎng)設備的Internet遠程監控。通過(guò)以上分析可以看出,控制網(wǎng)絡(luò )中的網(wǎng)關(guān)或嵌入式HTTP服務(wù)器起著(zhù)連接現場(chǎng)層和監迭管理層的作用,因此它是整個(gè)控制網(wǎng)絡(luò )的關(guān)鍵設備。

網(wǎng)關(guān)或嵌入式HTTP服務(wù)器與傳統的嵌入式系統相比,有一些不同的特性。傳統的嵌入式系統是面向應用、有一些不同的特性。傳統的嵌入式系統是面向應用、面向產(chǎn)品的,強調成本和高效系統,因此本質(zhì)上不具備通用性和可移植性。網(wǎng)關(guān)或嵌入式HTTP服務(wù)器由于處在現場(chǎng)層和監控管理層的中間,因此它與具體應用和產(chǎn)品是一種弱耦合的關(guān)系。同時(shí),技術(shù)發(fā)展的趨勢是:硬件成本越來(lái)越低,功能越來(lái)越強,越來(lái)越多的芯片和板卡具備“平臺”的特點(diǎn),適用于多種應用場(chǎng)合。嵌入式實(shí)時(shí)操作系統(Embedded Real Time Operationg System)的發(fā)展更是為嵌入式軟件提供了一個(gè)通用的軟件平臺。綜上所述,在網(wǎng)關(guān)或嵌入式HTTP服務(wù)器設計中,考慮通過(guò)選用適合的硬件和嵌入式實(shí)時(shí)操作系統,使整個(gè)系統具備相當的通用性和可移植性。對于連接不同的設備級輕質(zhì)網(wǎng)絡(luò )或不同的應用,只需要通過(guò)更換硬件模塊和對代碼作最小的修改即可實(shí)現。

1 的嵌入式HTTP服務(wù)器的結構

為了實(shí)現設計目標,嵌入式HTTP服務(wù)器一般應采用功能較強的能用PC、工業(yè)PC、或高檔MPU作為硬件平臺,嵌入式實(shí)時(shí)操作系統作為軟件平臺進(jìn)行平發(fā)。硬件平臺應具備以太網(wǎng)口和一個(gè)或多個(gè)通信模塊,比如RS232、RS485、CAN通信卡等。嵌入式實(shí)時(shí)操作系統實(shí)現了TCP/IP等網(wǎng)絡(luò )協(xié)議,并提供實(shí)時(shí)任務(wù)、進(jìn)程管理、內存管理、文件系統、API等功能。

Linux操作系統是一種多進(jìn)程,多用戶(hù)的通用操作。由于它具備免費、源碼公開(kāi)、內核可裁減、支持多線(xiàn)程、網(wǎng)絡(luò )功能強大、設計精巧、性能穩定的特點(diǎn),因此近年它也被廣泛用到嵌入式系統的設計中。一個(gè)應用于嵌入式系統的Linux經(jīng)過(guò)裁減和重新編譯后只包括進(jìn)程管理、內存管理、文件系統、若干個(gè)驅動(dòng)程序和實(shí)用的函數等。

下面以本人參與的轉子秤控制系統為例來(lái)說(shuō)明一個(gè)Linux的嵌入式HTTP服務(wù)器的結構。轉子秤是水泥工業(yè)中的關(guān)鍵計量喂料設備,一條大型的生產(chǎn)線(xiàn)需要許多臺轉子秤,對轉子秤的控制涉及到重量、轉速、溫度、一氧化碳含量等若干個(gè)參量。由于現場(chǎng)環(huán)境的高噪聲、高粉塵、高電磁干擾,無(wú)法在現場(chǎng)配備鍵盤(pán)、顯示器、觸摸屏等人機交互設備,無(wú)法在現場(chǎng)實(shí)現對設備的監控和維護。同時(shí),一條生產(chǎn)線(xiàn)有多臺轉子秤,為每臺轉子秤配備人機交互設備也是不經(jīng)濟的。為此,考慮為整個(gè)系統設計一個(gè)嵌入式HTTP服務(wù)器,各轉子秤控制器與嵌入式HTTP服務(wù)器用CAN總線(xiàn)相連。通過(guò)嵌入式HTTP服務(wù)器實(shí)現對整個(gè)系統的在線(xiàn)監控和遠程監控。在嵌入式HTTP服務(wù)器的設計中,選用研祥公司PC104總線(xiàn)的486X嵌入式CPU卡作為硬件平臺,該板卡是具有128MB的在板ROM、CF卡接口和以太網(wǎng)接口等。選擇該板卡的原因是PC104總線(xiàn)的功能擴展模塊非常豐富,通過(guò)選擇不同的模塊很容易就支持多種總線(xiàn)。軟件平臺方面,選用Linux2.0內核并對它作適當裁減。整個(gè)嵌入式HTTP服務(wù)器的結構簡(jiǎn)圖如圖1所示。

2 基于Linux的嵌入式HTTP服務(wù)器的設計

領(lǐng)域的嵌入式HTTP服務(wù)器應該具備如下基本功能。

①實(shí)時(shí)數據發(fā)布。實(shí)時(shí)數據主要包括系統運行過(guò)程中設備的各種狀態(tài)信息。嵌入式HTTP服務(wù)器將實(shí)時(shí)數據以網(wǎng)頁(yè)形式發(fā)布到Internet上,且動(dòng)態(tài)實(shí)時(shí)刷新??蛻?hù)可以通過(guò)瀏覽器訪(fǎng)問(wèn)這些實(shí)時(shí)信息。

②參數設置。參數包括運行參數和設備狀態(tài)參數,如各種初始值、常數等。嵌入式HTTP服務(wù)器接收到客戶(hù)提交的參數設備請求后,執行參數寫(xiě)入操作。

③遠程實(shí)時(shí)控制。遠程實(shí)時(shí)控制允許遠程用戶(hù)在線(xiàn)地控制系統中的相應執行機構,比如電機、電磁閥等。嵌入式HTTP服務(wù)器接收到遠方客戶(hù)提交的控制操作請求后,將下發(fā)控制命令驅動(dòng)監控系統中相應的執行機構。

④訪(fǎng)問(wèn)級別設置和權限認證。只有權限不低于要求訪(fǎng)問(wèn)級別的客戶(hù),經(jīng)嵌入式HTTP服務(wù)器認證后,方可進(jìn)行其權限范圍內的監控操作。

3 主要實(shí)現技術(shù)

3.1 超文本傳輸協(xié)議

HTTP協(xié)議是一個(gè)面向事務(wù)、無(wú)狀態(tài)的應用層協(xié)議。在傳輸層,HTTP協(xié)議使用請求(request)/響應(response)模型。一次簡(jiǎn)單的HTTP事務(wù)包括以下過(guò)程。首先,客戶(hù)(瀏覽器)發(fā)起和建立一條到服務(wù)器的TCP連接。然后,客戶(hù)發(fā)送一個(gè)HTTP請求到服務(wù)器,請求包含方法、URI、協(xié)議版本和一個(gè)類(lèi)MIME報文。服務(wù)器解析HTTP請求后,給出相應的HTTP響應,響應包括協(xié)議版本、狀態(tài)碼、解釋狀態(tài)碼的簡(jiǎn)短短語(yǔ)和一個(gè)類(lèi)MIME報文。最后,釋放TCP連接。Linux操作系統為用戶(hù)提供了稱(chēng)為BSD Socket的網(wǎng)絡(luò )編程接口。利用其中的TCP套接口函數,可以非常方便地實(shí)現HTTP協(xié)議。

HTTP1.0為每一次HTTP請求/響應建立一條新的TCP連接,由于建立一條TCP連接要經(jīng)歷3次握手,因此效率不高。HTTP1.1提出了可持續性連接的概念。HTTP1.1只建立一次TCP連接,而重復地使用它傳送一條素的請求/響應消息,減少了額外開(kāi)銷(xiāo)。在嵌入式HTTP服務(wù)器中,一般使用HTTP1.1協(xié)議。HTTP1.1協(xié)議的細節請參考RFC2616。

3.2 通用網(wǎng)關(guān)接口CGI

參數設置和遠程控制功能都是通過(guò)CGI(通用網(wǎng)關(guān)接口)程序和表單實(shí)現的。CGI使用HTML表單向Web服務(wù)器發(fā)送信息?;菊Z(yǔ)法如下:

FORM METHOD=get/post ACTION=URL>/FORM>

其中,METHOD屬性指定將數據傳送到Web服務(wù)器的方法。輸入方法有兩種:GET和POST。ACTION屬性定義要對表單數據進(jìn)行處理的CGI腳本的URL。

CGI的工作流程是首先由瀏覽器將用戶(hù)輸入的數據傳遞給Web服務(wù)器,Web服務(wù)器根據接收到的數據設置環(huán)境變量并啟動(dòng)CGI腳本,CGI腳本從環(huán)境變量中讀取所需要的數據并進(jìn)行相應處理,最后使用STDOUT輸出HTML形式的結果文件,經(jīng)Web服務(wù)器送回瀏覽器,最終顯示給用戶(hù)。傳統的CGI程序與服務(wù)器代碼分開(kāi),是一個(gè)符號CGI標準的可執行文件,并儲存在CF卡等存儲設備上,一般用腳本語(yǔ)言編寫(xiě)??紤]到嵌入式HTTP服務(wù)器要求速度快,功能和代碼都盡可能精簡(jiǎn)的特點(diǎn),可以把原先由可執行文件完成的功能用C函數實(shí)現,放在服務(wù)器代碼內部,并直接從HTTP請求報文接收數據。與傳統CGI程序相比,這種方法具備如下特點(diǎn):

*不需要標準輸入,CGI函數可以直接獲取到瀏覽器送來(lái)的信息;

*不需要標準輸出,CGI函數可以直接將數據送回給瀏覽器;

*不需要環(huán)境變量,CGI和Web服務(wù)器在同一程序中實(shí)現,不需要環(huán)境變量來(lái)交換信息。

3.3 自定義標記

要在網(wǎng)頁(yè)中顯示系統中大量的實(shí)時(shí)數據,常規方法是將HTML代碼直接集成到程序代碼中,或者反之將C程序代碼集成到HTML標記語(yǔ)言中。這兩種方法均要求開(kāi)發(fā)人員對HTML標記語(yǔ)言的語(yǔ)法細節非常熟悉。網(wǎng)頁(yè)或程序結構的單方面調整都將導致整個(gè)系統全盤(pán)修改,系統不具備靈活性與可擴展性。HTML的精髓在于該語(yǔ)言的“標記”性,各種不同標記的具體含義是由服務(wù)器和瀏覽器進(jìn)行解析。因此,當現有標記不能滿(mǎn)足新的應用需求時(shí),可以自行定義新的標記,只需服務(wù)器將自定義標記解析為標準標記,然后傳送給瀏覽器即可。在本項目中,主要的實(shí)時(shí)數據轉速、重量、一氧化碳含量等狀態(tài)信息,可以定義相應的標記。服務(wù)器中解析相應標記的函數同樣用C語(yǔ)言來(lái)實(shí)現。運行時(shí),當客戶(hù)端發(fā)出查看某實(shí)時(shí)網(wǎng)頁(yè)的請求后,嵌入式HTTP服務(wù)器將相應的網(wǎng)頁(yè)文件從電子盤(pán)加載到內存進(jìn)行逐項解析。當辨識出自定義標記后,就調用相應的函數。該函數返回該標記對應的當前值,并置換HTML文件流中的自定義標記。最后,嵌入式HTTP服務(wù)器將解析結果發(fā)送給客戶(hù)端。實(shí)時(shí)網(wǎng)頁(yè)的設計與相應的HTTP服務(wù)器處理程序得以分離,處于一種弱耦合關(guān)聯(lián)狀態(tài)。這樣,網(wǎng)頁(yè)界面的調整不會(huì )影響HTTP服務(wù)器的程序設計,HTTP服務(wù)器程序的修改也與網(wǎng)頁(yè)界面設計無(wú)關(guān),整個(gè)嵌入式HTTP服務(wù)器具備靈活性和可擴展性。

3.4 多線(xiàn)程

最初的進(jìn)程定義包含程序、資源及其執行三部分,其中程序通常指代碼,資源通常包括 內存資源、I/O資源、信號處理等,而程序的執行指執行上下文,這一部分后來(lái)發(fā)展為線(xiàn)程。在線(xiàn)程的概念出現以前,為了減小進(jìn)程切換的開(kāi)銷(xiāo),操作系統設計者逐漸修改正進(jìn)程的概念,允許將進(jìn)程所占有的資源從其主體剝離出來(lái),允許某些進(jìn)程共離享一部分資源,例如文件、信號、數據內存、甚至代碼,這就是輕質(zhì)進(jìn)程的概念。Linux內核的2.0.x版本就已經(jīng)實(shí)現了輕質(zhì)進(jìn)程。應用程序可以通過(guò)一個(gè)統一的clone()系統調用接口,用不同的參數指定創(chuàng )建輕質(zhì)進(jìn)程還是普通進(jìn)程。在內核中,clone()調用經(jīng)過(guò)參數傳遞和解釋后會(huì )調用do_fork(),這個(gè)核內函數同時(shí)也是fork、vfork()系統調用的最終實(shí)現。在do_fork()中,不同的flone_flags將導致不同的行為。在LinuxThreads中,使用(CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND)參數調用clone()創(chuàng )建“線(xiàn)程”,表示共享內存、共享文件系統、共享文件描述符表,以及共享信號處理方式。Linux操作系統下,已經(jīng)實(shí)現基于輕質(zhì)進(jìn)程的符號POSIX1003.C標準的線(xiàn)程庫LinuxThreads。

在傳統的Unix服務(wù)器程序設計中,為了使服務(wù)器具備并發(fā)處理連接的能力,通常采用父進(jìn)程處理連接,并調用fork()創(chuàng )建子進(jìn)程來(lái)處理用戶(hù)請求的方法。這種方法的缺點(diǎn)是進(jìn)程創(chuàng )建慢,耗費資源,進(jìn)程切換開(kāi)銷(xiāo)大,進(jìn)程之間通信比較困難等,不適用對資源、速度有要求的嵌入式系統。因此,在嵌入式HTTP服務(wù)器的開(kāi)發(fā)中使用線(xiàn)程的方法。利用LinuxThreads提供的pthread_create()等函數派生出線(xiàn)程,也即輕質(zhì)進(jìn)程來(lái)處理多個(gè)HTTP請求。

4 工作流程和代碼設計

4.1工作流程

嵌入式HTTP服務(wù)器程序開(kāi)始運行時(shí),主進(jìn)程首先創(chuàng )建一個(gè)接口,并和主機地址綁定到一起,隨后置為被動(dòng)監聽(tīng)狀態(tài),等待客戶(hù)端連接請求的到來(lái)。分別用函數socket()創(chuàng )建一個(gè)接口,bind()綁定地址,listen()監聽(tīng),accept()接收來(lái)完成。當建立一個(gè)TCP連接后,函數accept()返回一個(gè)新的套接口描述符,主進(jìn)程就創(chuàng )建一個(gè)新的子線(xiàn)程(輕質(zhì)進(jìn)程)處理這個(gè)新的連接。

子線(xiàn)程用于處理每具體的HTTP請求。子線(xiàn)程首先解析用戶(hù)的HTTP請求。當用戶(hù)請求一個(gè)網(wǎng)頁(yè)時(shí),子線(xiàn)程查找文件系統。如果該網(wǎng)頁(yè)文件存在,且通過(guò)權限認證,就把它從CF卡讀入內存并掃描,發(fā)現有自定義標記則調用相應函數進(jìn)行處理,最后把結果返回給瀏覽器;否則給一個(gè)簡(jiǎn)單的出錯消息。當用戶(hù)是上傳數據時(shí),子線(xiàn)程調用相應函數讀取數據進(jìn)行處理,并返回處理結果給瀏覽器。

4.2 代碼設計

在嵌入式HTTP服務(wù)器的代碼設計中,考慮到代碼的移植性和擴展性,利用C語(yǔ)言實(shí)現了面向對象風(fēng)格的代碼結構。代碼主要由兩上數據結構request_inf和response_inf以及其上一組操作函數組成。

結構request_inf和response_inf分別用來(lái)保存HTTP請求報文和響應報文的所有信息。在結構定義時(shí),應根據具體應用特點(diǎn)設計結構包含的成分。

嵌入式HTTP服務(wù)器的函數包括通用函數、CGI函數和自定義標記處理函數等,其中通用函數是一些與HTTP1.1協(xié)議有關(guān)的函數。

(1)通用函數

*void prase_request_line(char *,struct *request_inf)

該函數用來(lái)解析HTTP請求報文的請求行(Request_Line),并把相應信息存放在結構request_inf中。其中,對請求行中URI部分的解析包括兩種情況。如果用戶(hù)請求一個(gè)網(wǎng)頁(yè),則獲取文件路徑、文件類(lèi)型;如果用戶(hù)要求上傳數據,則把數據放在一個(gè)字符數組中。然后將文件路徑和類(lèi)型,或者指向該數組的指針、方法、版本號信息都放入結構request_inf中。

*void prease_general_header(char*,struct*request_inf)

該函數用來(lái)解析HTTP請求報文的調用首部(General_Header)。之所以把此函數與函數prase_request_line()分開(kāi),是考慮到程序的修植性和擴展性。請求行和通用首部是請求報文中的不同部分,不不同的場(chǎng)合下,要求解析的信息可能存在差導師。同時(shí),這樣也能使程序結構更清楚。比如,本項目要從通用首部解析字段Keep_Alive。該字段指明一個(gè)最長(cháng)的時(shí)間或最大請求數目,在此范圍內可以保持TCP連接不被釋放(即前文提到的HTTP1.1的持續連接特性,persistent connection)。

*void prase_request_header(char*,struct*request_inf)

void prase_entity_header(char*,struct*request_inf)

HTTP請求報文的請求頭部用來(lái)說(shuō)明瀏覽器的一些信息,實(shí)體頭部則用來(lái)說(shuō)明請求報文中可能存在的實(shí)體主體信息。本項目實(shí)際上并不需要使用這兩個(gè)函數來(lái)獲取相關(guān)信息,但考慮到程序的擴展性和移植性,此處仍然把它列出來(lái),它們是兩個(gè)空函數。

*send_status_line(int fd,struct *response_inf)

此函數用來(lái)產(chǎn)生一個(gè)HTTP響應報文的狀態(tài)行(Status_line)。狀態(tài)行包括三部分內容,即HTTP版本、狀態(tài)碼以及解釋狀態(tài)碼的簡(jiǎn)單短語(yǔ)。這些信息預先放在結構response_inf中。

*send_general_header(int fd,struct*response_inf)

send_response_header(int fd,struct*response_inf)

send_entity_header(int fd,struct*response_inf)

這三個(gè)函數分別用來(lái)產(chǎn)生HTTP響應報文的通用首部、響應首部(Response_header)和實(shí)體首部。嵌入式HTTP服務(wù)器是一個(gè)瘦服務(wù)器,功能非常簡(jiǎn)單。因此HTTP響應報文的通用首部、響應首部和實(shí)體首部中的可選字段許多是不需要的,還有許多是固定不變的,例如Last_modified和Content_type字段。Last_modified字段指出資源上次被修改的時(shí)間并由接收方解釋。如果接收方已有此資源的拷貝,但此拷貝比Last-Modified域所指定的要舊,那該拷貝就是過(guò)期的。由于網(wǎng)頁(yè)文件中含有自定義標記,具有實(shí)時(shí)性,所以此字段根本沒(méi)有含有Content_type字段指出實(shí)體的媒體類(lèi)型,本項目中的嵌入式HTTP服務(wù)器被設計成只支持HTML類(lèi)型,因此該字段的內容總是Content_type=text/html。有關(guān)服務(wù)器和資源的所有標題域信息都被放入結構response_inf中。

*send_white_line(int fd)

此函數用于實(shí)體首部和實(shí)體之間傳送一個(gè)空白行。

*void send_entity_body(int fd,char *buff_file)

此函數用來(lái)傳遞實(shí)體主體,實(shí)體主體實(shí)際上是一個(gè)處理后的網(wǎng)頁(yè)文件,它被放在指針buff_file指向的緩沖區內。

*void zero_request_inf(struct*request_inf)

void zero_response_inf(struct*response_inf)

這兩個(gè)函數用于結構request_inf和response_inf清零。

*void get_file(struct*request_inf,struct * response_inf,char*buff_file,void*,void*)

該函數用來(lái)處理用戶(hù)HTTL請求。首先,函數會(huì )檢查request_inf結構,判斷用戶(hù)是請求一個(gè)網(wǎng)頁(yè)文件還是上傳數據。當用戶(hù)請求網(wǎng)頁(yè)文件時(shí),函數將根據request_inf結構中的文件路徑信息,在文件系統錄找此文件。如果文件不存在或不具備權限,則函數將狀態(tài)碼和解釋短語(yǔ)寫(xiě)入結構response_inf,然后直接返回;否則讀取文件并調用自定義標記處理函數,對標記進(jìn)行處理,處理過(guò)的網(wǎng)頁(yè)文件被放入buff_file指向的緩沖區內,并把狀態(tài)碼、解釋短路和與實(shí)體有關(guān)的一些信息寫(xiě)入結構response_inf。當用戶(hù)上傳數據時(shí),該函數調用CGI處理函數向CAN總線(xiàn)網(wǎng)絡(luò )發(fā)送幀,然后將狀態(tài)碼和解釋短路寫(xiě)入結構response_inf。利用狀態(tài)碼和解釋短語(yǔ)只能用“200,OK”或“500,Internal Server Error”等,簡(jiǎn)單反映執行情況。用戶(hù)要獲取詳細信息,可待一段合適的時(shí)間后請求網(wǎng)頁(yè)文件。函數中兩個(gè)void指針?lè )謩e指向自定義標記處理函數和CGI處理函數,或者對應的函數指針數組。

(2)自定義標記處理函數和CGI處理函數

自定義標記處理函數用于對自定義的處理,每一類(lèi)自定義標記對對應一種自定義標記處理函數,同一類(lèi)自定義標記的不同數據點(diǎn)利用參數來(lái)區分,比如轉子秤1的重量標記可以用weight1來(lái)表示。所有的自定義標記處理函數被放在一起,構成一個(gè)函數指針數組。自定義標記處理函數向CAN總線(xiàn)網(wǎng)絡(luò )發(fā)送遠程幀和接收數據幀,獲取相應的狀態(tài)信息。CGI總線(xiàn)網(wǎng)絡(luò )發(fā)送遠程幀和接收數據幀,獲取相應的狀態(tài)信息。CGI處理函數用變量名來(lái)區分,同一類(lèi)變量對應一種CGI處理函數。與自定義標記處理函數類(lèi)似,所有的CGI處理函數也被放在一起,構成一個(gè)函數指針數組。由于自定義標記函數和CGI處理函數類(lèi)型眾多,這里就不列舉了。

結語(yǔ)

我們設計的嵌入式HTTP服務(wù)器具備良好的通用性和可移植性。通過(guò)更換或增加PC104通信模塊,該服務(wù)器能夠支持不同的現場(chǎng)總線(xiàn),或同時(shí)連接幾種不同的設備級輕質(zhì)網(wǎng)絡(luò )。同時(shí)在服務(wù)器代碼設計中,用C語(yǔ)言實(shí)現了面向對象風(fēng)格的代碼結構。這樣,如果要求服務(wù)器端具備更多的特性,只需要簡(jiǎn)單修改結構request_inf、response_inf、操作函數和網(wǎng)頁(yè)文件即可達到目的。這種設計思路不僅適用于嵌入式HTTP服務(wù)器,隨著(zhù)硬件技術(shù)尤其是嵌入式操作系統技術(shù)的發(fā)展,它同樣能夠應用到其它嵌入式產(chǎn)品的開(kāi)發(fā)中。

linux操作系統文章專(zhuān)題:linux操作系統詳解(linux不再難懂)


評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>