摘要:數(shù)字化變電站越來越多地采用以太網(wǎng)技術(shù),針對各種保護和控制IED(Integlrated Drive Electronlcs)的參數(shù)配置以及狀態(tài)監(jiān)測問題,本文通過對Linux平臺上的BOA服務器和CGIC的源碼進行研究和修改,設(shè)計了一種實用的嵌入式Web服務器。它可方便地在支持TCP/IP協(xié)議的非Linux的嵌入式系統(tǒng)上運行,在不影響IED原有功能的前提下對用戶提供Web服務,同時提出了一種適合嵌入式系統(tǒng)使用的訪問權(quán)限認證和對Web頁面的管理及動態(tài)生成機制,并支持Web方式下文件的上傳與下載。它為變電站現(xiàn)場嵌入式IED的遠端訪問與控制提供了一種新的思路和方法。
關(guān)鍵詞:數(shù)字化變電站;嵌入式IED;TCP/IP;嵌入式Web服務器;BOA;CGIC
引言
數(shù)字化變電站是建立在網(wǎng)絡(luò)通信技術(shù)和電子技術(shù)基礎(chǔ)上的一種新型變電站自動化系統(tǒng),其中一個重要特征就是二次設(shè)備的網(wǎng)絡(luò)化。目前在國內(nèi)的數(shù)字化變電站試點中,已經(jīng)出現(xiàn)了大批支持以太網(wǎng)和TCP/IP協(xié)議的嵌入式IED,在具體開發(fā)和應用中發(fā)現(xiàn),由于現(xiàn)場環(huán)境的復雜多變以及客戶需求的多樣性,經(jīng)常需要對這些IED進行參數(shù)的配置和修改。但廠家多采用專門的配置軟件來進行,操作界面不夠統(tǒng)一,給現(xiàn)場操作帶來諸多不便。而采用Web服務器技術(shù),則只需要瀏覽器便可實現(xiàn)對IED參數(shù)的在線修改與配置,從而極大地方便了對設(shè)備的維護和管理。目前,Web服務器功能在數(shù)字化變電站中,多用于調(diào)度與監(jiān)控端設(shè)計,單純在IED上實現(xiàn)Web服務器功能的報道尚不多見。本文通過對Linux平臺上運行的BoA Web服務器和CGIC的研究,將原本兩個獨立運行的程序整合為多任務系統(tǒng)中的一個任務實體,并對其進行相應的精簡和修改;設(shè)計并實現(xiàn)了一種可在一般嵌入式系統(tǒng)上運行的,既相對簡單又響應快速的嵌入式Web服務器。目前已在相關(guān)裝置上得到應用,取得了較好的使用效果。
BOA和CGIC是兩個基于Linux的開源軟件,代碼采用C語言實現(xiàn),程序小巧靈活、執(zhí)行高效,非常適合于嵌入式系統(tǒng)的應用環(huán)境。但目前多用于Linux或μClinux的系統(tǒng)平臺上。鮮見有用于其他系統(tǒng)的相關(guān)報道。
其中BOA是一個單任務的HTTP服務器,它的設(shè)計目標主要是速度和安全。因此,它不像傳統(tǒng)的Web服務器,為每個訪問連接單獨開啟一個進程,也不會為處理多個連接而開啟多個自身的拷貝。BOA對所有活動的HTTP在內(nèi)部進行連接處理,只為每個CGI連接啟動新的進程,在同等硬件下相比其他服務器具有更快的訪問速度。而CGIC是一個為支持通用網(wǎng)關(guān)接口CGI(Common Gateway Interface)而開發(fā)的C語言庫,通常和BOA聯(lián)合使用,它可接收由瀏覽器通過GET或POST方法傳輸過來的表單及文件數(shù)據(jù),并提供了對這些數(shù)據(jù)進行解析的方法,使用非常方便,且源碼也易通過因特網(wǎng)獲得。
基于以上原因,本文主要基于這兩種技術(shù)來實現(xiàn)IED裝置內(nèi)部的嵌入式web服務器功能。
1 系統(tǒng)概述
嵌入式Web服務器EWS(Embedded Web Server)是指將Web服務器引入到現(xiàn)場測試和控制設(shè)備中,在相應的硬件平臺和軟件系統(tǒng)的支持下,使傳統(tǒng)的測試和控制設(shè)備轉(zhuǎn)變?yōu)榫邆淞艘訲CP/IP為底層通信協(xié)議,Web技術(shù)為核心的基于互聯(lián)網(wǎng)的網(wǎng)絡(luò)測試和控制設(shè)備。其中,Web瀏覽器和EWS的交互過程如圖1所示。
首先由Web瀏覽器發(fā)出HTTP請求報文,并建立TCP連接,然后由EWS根據(jù)其請求報文來提供相應的狀態(tài)和頁面信息,若只是請求靜態(tài)頁面,則無需通過CGI,直接返回該對應頁面即可;反之則需要通過CGI來進行相關(guān)報文數(shù)據(jù)的解析,并根據(jù)解析結(jié)果來生成動態(tài)頁面以返回給客戶端瀏覽器。這樣,完成一次交互過程后,即可釋放該TCP連接。
本文的設(shè)計目標是將Web服務器的功能僅作為DSP/BROS中的一個任務,只在監(jiān)聽到HTTP協(xié)議對應端口(通常為80)上的TCP連接請求時,才運行該任務。但是傳統(tǒng)的BOA并沒有對用戶訪問權(quán)限的控制對頁面的管理也依賴于Linux系統(tǒng),因此,結(jié)合變電站運行的特殊性,本文所設(shè)計的EWS系統(tǒng)結(jié)構(gòu)框圖如圖2所示。
系統(tǒng)運行時,由HTTP連接管理模塊負責對網(wǎng)絡(luò)端口進行監(jiān)聽,當監(jiān)聽到有連接請求到達后,即進入HTTP報文解析模塊進行處理,如果解析錯誤,則直接返回HTTP連接管理模塊,發(fā)出相應的響應報文并關(guān)閉該連接;否則,則根據(jù)對報文解析的結(jié)果,提取出本次要訪問的URL,并將其交給訪問權(quán)限管理模塊,以查看該客戶端是否具有足夠的權(quán)限;然后再轉(zhuǎn)由頁面文檔管理模塊進行處理,根據(jù)對報文的初步解析以及對訪問權(quán)限的判斷,由頁面文檔管理模塊來決定是否調(diào)用CGI,以實現(xiàn)文件的下載上傳及響應文檔的生成,從而將正確的響應報文及頁面文檔轉(zhuǎn)交給HTTP連接管理模塊進行網(wǎng)絡(luò)數(shù)據(jù)的應答回送。
[!--empirenews.page--]
2 功能實現(xiàn)
2.1 HTTP連接管理的功能實現(xiàn)
所謂HTTP連接管理,主要是指對連接到服務器端口的socket進行監(jiān)聽、捕獲、讀寫、關(guān)閉,以及對HTTP請求報文協(xié)議字段的解析和響應報文的生成等操作。其中,BOA可提供完整的HTTP協(xié)議數(shù)據(jù)解析及響應報文生成的功能。因此,對和HTTP連接管理中相關(guān)的操作,基本上可直接采用BOA的相關(guān)代碼,實現(xiàn)起來難度不大。
BOA中的連接狀態(tài)切換示意圖如圖3所示。
當程序每次監(jiān)聽到新的socket連接訪問接入時,首先對空閑隊列進行判斷,如果為空,則申請一個request結(jié)構(gòu)空間,并將其插入就緒隊列的隊頭,否則可直接將一個結(jié)構(gòu)空間從空閑隊列轉(zhuǎn)入;對當前正在處理的就緒隊列成員,當網(wǎng)絡(luò)阻塞時則將其移入阻塞隊列的隊頭,當訪問結(jié)束斷開連接時,則將該成員的空間信息移入空閑隊列;而當對阻塞隊列進行輪詢時,根據(jù)其成員所對應的socket上是有讀寫請求還是該連接已超時,分別將其移入就緒隊列或斷開連接移入空閑隊列。
以上過程在BOA中主要是通過get_request、fdset_update和process_requests這三個函數(shù)來實現(xiàn)的,它們也是實現(xiàn)移植的重點,其他函數(shù)則相對簡單。在移植過程中,為了適應嵌入式的應用環(huán)境,在系統(tǒng)初始化時,給空閑隊列分配了足夠大的隊列空間,并對操作時所涉及的一些動態(tài)內(nèi)存分配的語句和結(jié)構(gòu)進行修改,從而盡量減少連接過程中頻繁的內(nèi)存申請。另外,傳統(tǒng)的BOA對每個CGI連接啟動新的任務,在此考慮到配置數(shù)據(jù)的即時生效以及系統(tǒng)資源的節(jié)約,仍然在EWS的任務環(huán)境中處理該CGI連接。實驗證明,這種處理方法簡單可行,而且在裝置的應用環(huán)境中對服務器的性能并無太大影響。
2.2 訪問權(quán)限管理的功能實現(xiàn)
為了應用時操作的安全性,本文將訪問的頁面分成兩類:一類為配置操作頁面,儀供認證用戶訪問;另一類為設(shè)備狀態(tài)頁面,可供任何用戶訪問。其控制主要是通過對用戶IP的判別及訪問頁面的分類來實現(xiàn)的。首先對用戶訪問的URL進行解析,如果訪問對象為配置操作頁面,則需要進行認證,在此通過一個用戶權(quán)限控制管理結(jié)構(gòu)來對通過權(quán)限認證的用戶進行維護,并提供一個時間摔制機制,使通過認證的用戶在一定時間段內(nèi)可持續(xù)有效的對服務器進行訪問。如果當前客戶端(訪問者IP)在用戶權(quán)限控制結(jié)構(gòu)內(nèi),且未超時,則通過認證,由服務器根據(jù)本次申請的URL返回相應頁面;若超時則需要對本次訪問的URL進行重定向,返回密碼校驗頁面,給用戶提供密碼輸入的接口。如果訪問頁面為設(shè)備狀態(tài)頁面,則無需進行認證,直接由URL返回相應頁面即可。訪問權(quán)限認證程序流程如圖4所示。[!--empirenews.page--]
通過以上過程的處理,即可實現(xiàn)對訪問權(quán)限的控制與管理。
2.3 頁面文檔管理及生成的功能實現(xiàn)
由于配置環(huán)境的需要,設(shè)計頁面較多,如果將所有頁面均存儲在Flash上,文件讀寫的問題將更為突出。為此,本文設(shè)計了一個如圖5所示的網(wǎng)頁頁面文件管理結(jié)構(gòu)來對頁面文件進行管理。
下面介紹具體處理過程。
首先,對所有頁面無論是靜態(tài)還是動態(tài)頁面,均建立一個對應的模板文件,并將該模板文件的內(nèi)容以全局靜態(tài)字符串的形式直接寫在程序中。在系統(tǒng)初始化時對各模板內(nèi)容的大小進行統(tǒng)計,并按下式對各文件的最大容量進行粗略的估算:
mS=sizeof(pT)×1.2
其中:mS為估算的頁面內(nèi)容最大尺寸,sizeof(pT)則為該頁面對應模板的實際大小(以上兩者均以字節(jié)為單位)。
按上式估算出頁面的最大尺寸后,為保證對頁面分配內(nèi)存時空間的連續(xù)性,根據(jù)所有頁面的最大尺寸和,一次性分配一個較大的內(nèi)存空間,并將該空間按各個頁面所對應的最大尺寸依次與該頁面對應的管理結(jié)構(gòu)內(nèi)的文件內(nèi)容指針相關(guān)聯(lián)。這樣,每次因配置的修改導致頁面內(nèi)容發(fā)生變化時,僅需對該指針所指向的空間內(nèi)容進行修改即可,而僅在保存配置數(shù)據(jù)時,通過配置文件更新函數(shù)將其存儲在Flash中。這樣既避免了為修改頁面文件內(nèi)容而申請內(nèi)存的操作,又避免了為存儲頁面內(nèi)容而頻繁進行的Flash讀寫操作,從而提高了該EWS的效率。[!--empirenews.page--]
對于EWS中動態(tài)頁面的生成則要經(jīng)過動態(tài)數(shù)據(jù)解析以及解析數(shù)據(jù)的模板頁面回填這兩個過程。在通常的Web交互中,大量動態(tài)數(shù)據(jù)是通過表單的形式體現(xiàn)在html頁面設(shè)計之中的。而一般上送的表單數(shù)據(jù)(文件上傳除外)在GET和POST兩種方法下,除了在HTTP請求報文中小現(xiàn)位置的不同外(GET方法下位于請求行,POST方法下位于實體主體部分),其組織形式并無差別,如下所示:
e_1-v 1&e 2=v 2…&e N=v N
其中e_N代表表單數(shù)據(jù)中的元素名,v_N代表該元素的取值。
因此,當連接管理模塊從請求報文中提取出表單數(shù)據(jù)后,即可對這兩種方法下的提交數(shù)據(jù)采用相同的解析方法。CGIC采用以下方法來實現(xiàn)其解析過程。
首先,通過對表單數(shù)據(jù)字符串的節(jié)點分析,用一個單向鏈表來對表單數(shù)據(jù)中的每個元素進行維護,在鏈表成員中包括了對元素名及其值的管理,并針對不同的元素類型提供了一系列接口。解析步驟如下:
①用于獲取列表框取值的函數(shù)接口cgiFormSelectSingle。
②用于獲取文本框取值的函數(shù)接口cgiFormString。
③用于獲取復選框取值的函數(shù)接口cgiFormCheckboxMultiple。
在需要訪問元素時,只需提供相應的元素名,就可方便地使用這些接口對管理鏈表遍歷來獲得相應元素的取值。
當CGIC移植時,只需對相應元素解析對應的函數(shù)進行所選系統(tǒng)的修改即可。需要注意的是,對列表和復選框等非字符取值的獲取,還需按照用戶定義的取值設(shè)置,對相應的接口進行一定的修改,以適應用戶對元素取值范圍的靈活要求。
所謂解析數(shù)據(jù)的模板頁面回填,是指在動態(tài)頁面設(shè)計中,按照模板中的頁面顯示格式,將頁面中各元素的取值寫入html模板文件中的對應位置。html標簽代碼如下:
<input name=“devName”type=“text”
value=“***”size=“15”/>
它在頁面上表示一元素名為“devName”,取值為“***”的文本框,在數(shù)據(jù)回填到模板頁面時,需要根據(jù)具體的取值如“devl”寫到原“***”的對應位置上去。結(jié)果如下:
<input name=“devName”type=“text”
value=“devl”size=“15”/>
本文采用以下方法來實現(xiàn)這一處理過程。首先,沒計頁面模板時在每個需要進行動態(tài)修改的頁面元素前加上不同的注釋語句,對以上html標簽,可加的注釋語句如下(單獨一行):
<!-devName_id->
在每次解析完表單數(shù)據(jù)并且需要對動態(tài)頁面進行重新生成時,就可以通過對模板文件的逐行讀取,來查找相應的注釋語句,從而確定數(shù)據(jù)更新的位置。然后再根據(jù)具體的元素取值生成新的html標簽字符串,用來對注釋語句后的標簽字符串進行替換。通過以上過程,即可方便地實現(xiàn)解析數(shù)據(jù)的模板頁面回填,從而生成相應的動態(tài)頁面。
2.4 文件下載和上傳的功能實現(xiàn)
文件下載和上傳是服務器經(jīng)常具有的一項功能,相對來說文件下載較為簡單,只需將下載時訪問的URL定位于目標文件,然后再由服務器將該文件的內(nèi)容直接上送給瀏覽器。而文件上傳功能的實現(xiàn)則相對復雜,下面對其設(shè)計過程進行詳細的說明。
首先,要實現(xiàn)文件的上傳,在其頁面設(shè)計時必須采用POST方法來對表單數(shù)據(jù)進行提交,并且需要在頁面中將其編碼方式修改為“multipa rt/form-data”,否則將無法在瀏覽器端進行文件上傳。然后,通過html表單中的文件元素來進行上傳文件的選擇。
通過以上設(shè)置,上傳給服務器的http報文數(shù)據(jù)將以multipart的編碼形式出現(xiàn)。其特點是,在每個表單元素項的前后均加有一行分界字符串。以文件元素為例,其格式如下:
--------------------------------7db01d60ffc
Content-Disposition:form-data;name=“file”; filename=“1.TXT”Content-Type:text/plain
This is a txt file.
--------------------------------7db01d60ffc
其中,“----------------------------7db01d60ffc”為分界字符串。CGlC也提供了對該格式的解析支持。它首先提取出分界字符串,然后再通過cgiParsePostMultltpartInput函數(shù)的操作來實現(xiàn)報文中各表單元素數(shù)據(jù)以及文件數(shù)據(jù)的解析。提取出文件數(shù)據(jù)后,即可將文件內(nèi)容按指定的路徑保存在相應的Flash存儲區(qū)中。
3 性能測試
通過以上各環(huán)節(jié),即可實現(xiàn)一個相對完整的EWS。綜合以上各個模塊。
在主頻600 MHz的TMS320DM642處理器上對該EWS從收到請求建立連接到響應結(jié)束斷開連接的時間進行測試,EWS性能測試如表1所列。
其中,由于采用了框架結(jié)構(gòu)進行設(shè)計,在訪問索引主頁時,涉及的訪問請求次數(shù)較多,所以其測試時間相比其他單次請求來說要較長一些??傮w來看,該EWS具有比較快速的服務響應時間,能夠滿足具體應用環(huán)境的要求。
結(jié)語
本文在BOA和CGIC的基礎(chǔ)上,通過對其代碼的修改以及HTTP協(xié)議報文的分析,將原本運行于Linux平臺上獨立的兩個程序進行有機的結(jié)合,成功地將其整合為DSP/BIOS中的一個任務,并提出了一種適合一般嵌入式系統(tǒng)使用的訪問權(quán)限及對Web頁面的管理及動態(tài)生成機制。同時,完成了文件的上傳與下載功能,成功實現(xiàn)了一個相對完整的EWS。