一種實(shí)用的嵌入式Web服務(wù)器設計
對于EWS中動(dòng)態(tài)頁(yè)面的生成則要經(jīng)過(guò)動(dòng)態(tài)數據解析以及解析數據的模板頁(yè)面回填這兩個(gè)過(guò)程。在通常的Web交互中,大量動(dòng)態(tài)數據是通過(guò)表單的形式體現在html頁(yè)面設計之中的。而一般上送的表單數據(文件上傳除外)在GET和POST兩種方法下,除了在HTTP請求報文中小現位置的不同外(GET方法下位于請求行,POST方法下位于實(shí)體主體部分),其組織形式并無(wú)差別,如下所示:
e_1-v 1&e 2=v 2…&e N=v N
其中e_N代表表單數據中的元素名,v_N代表該元素的取值。
因此,當連接管理模塊從請求報文中提取出表單數據后,即可對這兩種方法下的提交數據采用相同的解析方法。CGIC采用以下方法來(lái)實(shí)現其解析過(guò)程。
首先,通過(guò)對表單數據字符串的節點(diǎn)分析,用一個(gè)單向鏈表來(lái)對表單數據中的每個(gè)元素進(jìn)行維護,在鏈表成員中包括了對元素名及其值的管理,并針對不同的元素類(lèi)型提供了一系列接口。解析步驟如下:
①用于獲取列表框取值的函數接口cgiFormSelectSingle。
②用于獲取文本框取值的函數接口cgiFormString。
③用于獲取復選框取值的函數接口cgiFormCheckboxMultiple。
在需要訪(fǎng)問(wèn)元素時(shí),只需提供相應的元素名,就可方便地使用這些接口對管理鏈表遍歷來(lái)獲得相應元素的取值。
當CGIC移植時(shí),只需對相應元素解析對應的函數進(jìn)行所選系統的修改即可。需要注意的是,對列表和復選框等非字符取值的獲取,還需按照用戶(hù)定義的取值設置,對相應的接口進(jìn)行一定的修改,以適應用戶(hù)對元素取值范圍的靈活要求。
所謂解析數據的模板頁(yè)面回填,是指在動(dòng)態(tài)頁(yè)面設計中,按照模板中的頁(yè)面顯示格式,將頁(yè)面中各元素的取值寫(xiě)入html模板文件中的對應位置。html標簽代碼如下:
input name=“devName”type=“text”
value=“***”size=“15”/>
它在頁(yè)面上表示一元素名為“devName”,取值為“***”的文本框,在數據回填到模板頁(yè)面時(shí),需要根據具體的取值如“devl”寫(xiě)到原“***”的對應位置上去。結果如下:
input name=“devName”type=“text”
value=“devl”size=“15”/>
本文采用以下方法來(lái)實(shí)現這一處理過(guò)程。首先,沒(méi)計頁(yè)面模板時(shí)在每個(gè)需要進(jìn)行動(dòng)態(tài)修改的頁(yè)面元素前加上不同的注釋語(yǔ)句,對以上html標簽,可加的注釋語(yǔ)句如下(單獨一行):
!-devName_id->
在每次解析完表單數據并且需要對動(dòng)態(tài)頁(yè)面進(jìn)行重新生成時(shí),就可以通過(guò)對模板文件的逐行讀取,來(lái)查找相應的注釋語(yǔ)句,從而確定數據更新的位置。然后再根據具體的元素取值生成新的html標簽字符串,用來(lái)對注釋語(yǔ)句后的標簽字符串進(jìn)行替換。通過(guò)以上過(guò)程,即可方便地實(shí)現解析數據的模板頁(yè)面回填,從而生成相應的動(dòng)態(tài)頁(yè)面。
2.4 文件下載和上傳的功能實(shí)現
文件下載和上傳是服務(wù)器經(jīng)常具有的一項功能,相對來(lái)說(shuō)文件下載較為簡(jiǎn)單,只需將下載時(shí)訪(fǎng)問(wèn)的URL定位于目標文件,然后再由服務(wù)器將該文件的內容直接上送給瀏覽器。而文件上傳功能的實(shí)現則相對復雜,下面對其設計過(guò)程進(jìn)行詳細的說(shuō)明。
首先,要實(shí)現文件的上傳,在其頁(yè)面設計時(shí)必須采用POST方法來(lái)對表單數據進(jìn)行提交,并且需要在頁(yè)面中將其編碼方式修改為“multipa rt/form-data”,否則將無(wú)法在瀏覽器端進(jìn)行文件上傳。然后,通過(guò)html表單中的文件元素來(lái)進(jìn)行上傳文件的選擇。
通過(guò)以上設置,上傳給服務(wù)器的http報文數據將以multipart的編碼形式出現。其特點(diǎn)是,在每個(gè)表單元素項的前后均加有一行分界字符串。以文件元素為例,其格式如下:
--------------------------------7db01d60ffc
Content-Disposition:form-data;name=“file”; filename=“1.TXT”Content-Type:text/plain
This is a txt file.
--------------------------------7db01d60ffc
其中,“----------------------------7db01d60ffc”為分界字符串。CGlC也提供了對該格式的解析支持。它首先提取出分界字符串,然后再通過(guò)cgiParsePostMultltpartInput函數的操作來(lái)實(shí)現報文中各表單元素數據以及文件數據的解析。提取出文件數據后,即可將文件內容按指定的路徑保存在相應的Flash存儲區中。
3 性能測試
通過(guò)以上各環(huán)節,即可實(shí)現一個(gè)相對完整的EWS。綜合以上各個(gè)模塊。
在主頻600 MHz的TMS320DM642處理器上對該EWS從收到請求建立連接到響應結束斷開(kāi)連接的時(shí)間進(jìn)行測試,EWS性能測試如表1所列。本文引用地址:http://dyxdggzs.com/article/149122.htm
其中,由于采用了框架結構進(jìn)行設計,在訪(fǎng)問(wèn)索引主頁(yè)時(shí),涉及的訪(fǎng)問(wèn)請求次數較多,所以其測試時(shí)間相比其他單次請求來(lái)說(shuō)要較長(cháng)一些??傮w來(lái)看,該EWS具有比較快速的服務(wù)響應時(shí)間,能夠滿(mǎn)足具體應用環(huán)境的要求。
結語(yǔ)
本文在BOA和CGIC的基礎上,通過(guò)對其代碼的修改以及HTTP協(xié)議報文的分析,將原本運行于Linux平臺上獨立的兩個(gè)程序進(jìn)行有機的結合,成功地將其整合為DSP/BIOS中的一個(gè)任務(wù),并提出了一種適合一般嵌入式系統使用的訪(fǎng)問(wèn)權限及對Web頁(yè)面的管理及動(dòng)態(tài)生成機制。同時(shí),完成了文件的上傳與下載功能,成功實(shí)現了一個(gè)相對完整的EWS。
評論