張永忠,劉鵬,鄭國榮
(北方工業(yè)大學 城市道路交通智能控制技術北京市重點實驗室,北京100041)
隨著嵌入式系統(tǒng)的發(fā)展,原本以PC為中心的互聯(lián)網(wǎng)應用逐漸延伸到了嵌入式系統(tǒng)中[1]。越來越多的設備需要通過互聯(lián)網(wǎng)或者局域網(wǎng)互聯(lián)互通,并在此基礎上形成智能化網(wǎng)絡,使用戶對其進行遠程管理控制及信息傳遞。嵌入式Web技術提供了一種通過PC機或者手機訪問嵌入式設備的方式。采用Internet實現(xiàn)了路口現(xiàn)場數(shù)據(jù)采集,克服了其他串行傳輸方案或速率低、或抗干擾能力差的缺點[2]?;贐/S架構的交通信號機可以使用戶在任何地點使用Web瀏覽器完成對接入網(wǎng)絡的交通信號機進行配置與監(jiān)控。
用戶通過瀏覽器對具有Web服務器功能的嵌入式設備進行監(jiān)視與控制,是嵌入式服務器的研究重點[3]。交通信號機嵌入式Web控制與監(jiān)視系統(tǒng)的總體結構如圖1所示。
系統(tǒng)主要包括前端檢測與執(zhí)行機構、交通信號機和客戶監(jiān)視與控制端,檢測機構主要包括路口設置的諸如視頻行人檢測器、線圈車輛檢測器、地磁車輛檢測器、視頻車輛檢測器等檢測設備,其基礎數(shù)據(jù)可以直接上傳至交通信號機。執(zhí)行機構主要包括路口信號燈、倒計時牌等設備。交通信號機采用SoC設備,硬件平臺采用三星公司生產(chǎn)的S3C2440芯片作為核心處理器,其上搭載嵌入式Linux操作系統(tǒng),并移植Mongoose Web服務器為客戶端的訪問與信息回饋提供服務??蛻舯O(jiān)視與控制端主要由PC機或手機Web瀏覽器組成,實現(xiàn)了在公共網(wǎng)關接口標準協(xié)議規(guī)范下對外部程序的執(zhí)行,并完成了對交通信號機的遠程配置及路口信息實時監(jiān)控功能。在Web瀏覽器中訪問指定交通信號機的URL(Uniform Resource Locator)來唯一地控制和監(jiān)控該路口的檢測與執(zhí)行機構。
圖1 系統(tǒng)總體結構
交通信號機主要包括主控部分和擴展模塊。主控部分主要包括CPU模塊、以太網(wǎng)接口模塊和串口接口模塊。擴展模塊主要由串口電平轉(zhuǎn)換電路、輸入電路、輸出電路和D/A轉(zhuǎn)換電路構成。
CPU模塊采用三星公司的S3C2440處理器,主頻可達400 MHz,保證了交通信號機檢測機構的采集效率、信號機運算執(zhí)行能力和執(zhí)行機構的控制質(zhì)量。其上搭載兩片外接的32 MB SDRAM,時鐘頻率可高達100 MHz。采用64 MB NAND Flash用于內(nèi)核代碼和數(shù)據(jù)保存區(qū)。
以太網(wǎng)接口電路,主要用于交通信號機集中協(xié)調(diào)式控制,設計中使用DM9000芯片。DM9000作為網(wǎng)絡接口芯片,支持網(wǎng)絡協(xié)議中的字、字節(jié)和雙字的讀寫操作。支持自適應的10M/100M帶寬選擇,支持IEEE802.3協(xié)議中的全雙工流控工作模式。為了保證數(shù)據(jù)穩(wěn)定傳輸,DM9000外部信號發(fā)送接口TX-、TX+和外部信號接收接口RX-、RX+經(jīng)過HST-1027SR隔離變壓器與RJ45以太網(wǎng)接口進行連接,實現(xiàn)了外部電路與內(nèi)部電路的電氣隔離,使系統(tǒng)的抗干擾能力提高。
S3C2440擁有3個獨立的串行口,每個串口都可以獨立地以終端模式或者DMA模式完成CPU與UART之間的數(shù)據(jù)傳輸。為了完成交通信號機和檢測與執(zhí)行機構的數(shù)據(jù)傳輸,提高交通信號機與其他外部設備的數(shù)據(jù)擴展能力,需要在原有基礎上另外增加串行接口。設計中選用XR16V554芯片,采用數(shù)據(jù)總線擴展方式增加4路獨立的串口通路。
擴展模塊主要實現(xiàn)串口電平的轉(zhuǎn)換、信號輸入和信號輸出的擴展、A/D轉(zhuǎn)換等功能。通過擴展模塊的設計,實現(xiàn)了交通信號機對外部設備的感知和控制能力。
在交通信號機核心控制單元S3C2440上搭載了嵌入式Linux操作系統(tǒng),包含系統(tǒng)軟件部分和應用軟件部分。系統(tǒng)軟件由Bootloader引導程序、系統(tǒng)內(nèi)核、根文件系統(tǒng)和系統(tǒng)驅(qū)動4個部分組成。應用軟件主要包括嵌入式Mongoose服務器以及交通信號機配時軟件等。
嵌入式Mongoose服務器主要用于向發(fā)出請求的客戶端瀏覽器提供所需的文檔程序。本設計中嵌入式Web服務器采用 Mongoose2.8版本,該版本支持Linux、bsd、solaris、mac、widows、mingw這6種操作系統(tǒng)。本文主要介紹Linux系統(tǒng)下的Mongoose Web服務器。通過分析解壓好的Mongoose Web服務器程序中的Makefile,可以通過使用操作命令make Linux來編譯成Linux操作系統(tǒng)下的Mongoose Web下的可執(zhí)行程序。在Makefile文件中有關Linux操作系統(tǒng)的命令主要包括以下幾條:
由makefile文件可知,編譯過程中源文件主要有兩個:一個為mongoose.c,另一個是main.c。如果想編譯生成嵌入式Linux系統(tǒng)中的可執(zhí)行文件,需將Makefile文件中的$(CC)改為arm-linux-gcc。mongoose服務器的主入口在main函數(shù)中,入口函數(shù)為mg_start(),整個進程結束于 mg_stop();在 main函數(shù)中通過函數(shù) mg_set_option(ctx,"ports","8080")設置服務器程序端口號,本設計設置的端口號為8080。編譯生成兩個文件:一個是文件mongoose,它是可執(zhí)行文件,通過執(zhí)行該文件可以開啟目標板的嵌入式Web服務器功能;另一個為_mongoose.so,該文件為Linux下的標準庫文件,此文件可以直接嵌入于需要使用嵌入式服務器的項目中。當執(zhí)行mongoose后,所在的目錄將被開放,在PC或手機瀏覽器上可以以“http://”+“目標交通信號機ip”+“:8080/”的方式訪問被開放的目錄。
CGI(Common Gateway Interface)即公共網(wǎng)關接口,主要提供了外部CGI應用程序與Web服務器之間標準的接口。CGI標準接口為Web服務器執(zhí)行外部程序提供了可能,可以通過CGI程序完成外部Web瀏覽器與內(nèi)部服務器之間的數(shù)據(jù)信息交互。
CGI程序本質(zhì)為瀏覽器與服務器之間的中間介質(zhì)程序,負責處理超文本文件與運行在服務器中的程序之間的數(shù)據(jù)交換[4],通過客戶端瀏覽器中HTML表單向服務器端發(fā)送CGI請求,服務器監(jiān)聽進程收到該CGI請求后觸發(fā)CGI程序,該CGI程序執(zhí)行客戶請求,然后將處理請求信息傳送至服務器,最后將服務器返回的數(shù)據(jù)信息送回到客戶端瀏覽器。此數(shù)據(jù)信息通常以HTML網(wǎng)頁形式傳回客戶端瀏覽器,由瀏覽器以網(wǎng)頁的形式展現(xiàn)在用戶面前。CGI程序可以使用Perl、Pascal、C語言等編寫。服務器接收用戶請求交給嵌入式Web服務器上的CGI程序處理[5]。CGI程序工作流程如圖2所示。
圖2 CGI程序工作流程
一個基本的CGI接口包括標準輸入、標準輸出和環(huán)境變量3部分。標準輸入可以使用FORM表單的形式,提交過程中以GET或POST的方法向服務器提交數(shù)據(jù)。在CGI程序應用中服務器與CGI程序之間的數(shù)據(jù)信息傳遞是通過環(huán)境變量完成的。標準輸出是CGI程序向客戶端發(fā)送服務器返回數(shù)據(jù)信息的標準,返回的應答是HTTP應答信息,HTTP應答輸出的標準是CGI程序標準輸出的重要格式。在CGI程序中重要的環(huán)境變量包括QUERY_STRING和CONTENT_LENGTH,其分別為 GET方法和POST方法向服務器傳遞數(shù)據(jù)信息的媒介。HTTP引擎是整個Web服務器的核心,負責接收和響應來自客戶端的 HTTP請求[6]。
4.2.1 標準輸入
CGI標準輸入通過定義表單中的method和action來定義客戶端向服務器端提交信息的方式和將要觸發(fā)的CGI程序的路徑。
<form name="form"method="post"action="./cgibin/post.cgi">
以上程序段表示客戶端提交信息的方式為POST方法,CGI程序的觸發(fā)路徑為嵌入式 Web服務器開放目錄下的cgi-bin,當觸發(fā)完成后,服務器將執(zhí)行post.cgi完成客戶端與服務器端的數(shù)據(jù)信息交互??蛻舳藶g覽器向服務器端的數(shù)據(jù)傳輸方式主要有GET和POST兩種,GET方法提交表單時,所傳遞的數(shù)據(jù)信息會在URL上直接顯示出來,從而帶來一定的安全問題,本設計使用POST方法通過標準輸入將客戶端的數(shù)據(jù)信息傳遞給服務器。
4.2.2 標準輸出
CGI程序均通過重定向的標準輸出STDOUT返回結果信息[7]。CGI程序觸發(fā)后,完成了數(shù)據(jù)由客戶端到服務器端的上傳以及解析,最后一步是將處理完成的信息輸出到客戶端瀏覽器,此過程CGI程序有標準的輸出格式,其應滿足HTTP應答信息的基本格式,CGI程序在向客戶端輸出信息時可以使用printf()等標準函數(shù)完成向客戶端的數(shù)據(jù)信息傳遞。
至此,一個完整的客戶端向服務器傳送數(shù)據(jù)信息,經(jīng)過服務器處理,最后返回至客戶端的過程已經(jīng)結束??偨Y起來,可以將Mongoose Web服務器與CGI程序看成是兩個進程,把CGI接口看成是解決了兩個進程間的通信問題。當服務器接收到了客戶端瀏覽器發(fā)送的請求后,將創(chuàng)建一個子進程處理客戶請求,CGI程序?qū)⑼ㄟ^讀取環(huán)境變量得到客戶端的標準輸入,將數(shù)據(jù)信息處理后,通過標準輸出將信息輸出至客戶端瀏覽器進行解析,以網(wǎng)頁的形式呈現(xiàn)給用戶。最后結束此CGI進程,Mongoose服務器繼續(xù)等待下一個客戶端請求。雖然動態(tài)網(wǎng)頁的處理由CGI完全可以實現(xiàn),但由于Web服務器每運行一個CGI程序,就需要fork一個進程為其服務,這樣服務器與瀏覽器的交互越多,對服務器的總體性能影響就越大[8]。
4.2.3 環(huán)境變量
數(shù)據(jù)不會通過標準輸入將客戶端傳遞的數(shù)據(jù)信息直接傳遞給CGI程序,而是服務器通過將FORM表單提供的數(shù)據(jù)信息以特定的格式存放至環(huán)境變量中。CGI程序通過讀取環(huán)境變量CONTENT_LENGTH,將客戶端以POST方式傳遞給服務器的數(shù)據(jù)信息以字符串數(shù)組的方式讀取出來。讀取出來的每組的數(shù)據(jù)格式為“變量名”+“=”+“變量值”,每兩個變量直接又以“&”隔開。例如,本設計中在環(huán)境變量中得到的部分變量的表達形式為“P10101=15&P10102=50&P10103=35&P10104=3”。該數(shù)組有標準的結構,通過解析可以將每一個變量相應地傳遞到服務器端的程序中進行運算處理。
以上述理論為基礎,設計完成了基于B/S架構的交通信號機實時監(jiān)控軟件,用戶登錄時通過輸入目標信號機URL,進入交通信號機配置監(jiān)控頁面。確認用戶信息后,進入主配置頁面后可根據(jù)路口具體信號需求對信號機進行配置。信號機配置頁面與路口實時監(jiān)控頁面略——編者注。
配置結束后前往監(jiān)視運行界面,此界面可以對信號機系統(tǒng)時間、協(xié)調(diào)方式、方案編號、路口信號情況等進行實時監(jiān)視,便于以可視化方式直接掌握路口信號燈運行情況。通過實驗表明,信號燈燈組控制準確、路口監(jiān)控信息上傳及時,達到了良好的控制效果。
基于B/S架構的嵌入式信號機配置軟件,將 Mongoose Web嵌入式服務器移植到嵌入式Linux系統(tǒng)上,通過CGI可以方便地完成客戶端與服務器端數(shù)據(jù)信息通信的實時交互。嵌入式服務器僅占用40 KB空間,提高了系統(tǒng)的靈活性,而且系統(tǒng)升級過程中只需對服務器端進行軟件升級,對客戶端的依賴度比較低,這解決了傳統(tǒng)C/S架構系統(tǒng)設備大范圍升級代價較高的問題。嵌入式Web服務器通過Web瀏覽器方便地向用戶提供信息交互接口,可以預見隨著人們對信息獲取需求的增多,帶有嵌入式Web服務器的設備將有更廣闊的應用空間。
編者注:本文為期刊縮略版,全文見本刊網(wǎng)站www.mesnet.com.cn。
[1]宋凱,嚴麗平,甘嵐.嵌入式 Web服務器的設計與實現(xiàn)[J].計算機工程與設計,2009,30(4):808-810.
[2]王莉,周偉.基于ARM的嵌入式 Web服務器設計[J].計算機工程與應用,2012,48(14):90-93,213.
[3]Yin Jie,Chai Xiaoyong,Yang Qiang.High-level goal recognition in a wireless LAN[C]//Proceedings of the 19th National Conference on Artificial Intelligence(AAAI2004),San Jose,CA USA,2004:578-584.
[4]馬群利.嵌入式WEB服務器及其安全機制研究[J].計算機測量與控制,2007,15(4):538-540.
[5]吳輝,侯思祖.嵌入式 Web的遠程數(shù)據(jù)交互式設計[J].單片機與嵌入式系統(tǒng)應用,2013(6):21-24.
[6]姚雷,盧曉東,萬江文.光伏發(fā)電監(jiān)控系統(tǒng)中嵌入式 Web服務器的實現(xiàn)[J].計算機工程與設計,2012,33(9):3397-3401.
[7]鄭強,彭琳,鄒秋霞,等.基于嵌入式 Web服務器的遠程溫室監(jiān)控系統(tǒng)設計[J].農(nóng)機化研究,2013(11):84-87.
[8]陳嵩,沙斐,周克生.基于嵌入式以太網(wǎng)技術的便攜式數(shù)據(jù)采集系統(tǒng)[J].電子測量與儀器學報,2007,21(6):62-66.