一種在無(wú)操作系統(tǒng)設(shè)備中利用CGI技術(shù)實(shí)現(xiàn)動(dòng)態(tài)web服務(wù)器的方法
【專利摘要】本發(fā)明涉及一種在無(wú)操作系統(tǒng)設(shè)備中利用CGI技術(shù)實(shí)現(xiàn)動(dòng)態(tài)web服務(wù)器的方法,包括步驟如下:首先,HTTP解析與組包模塊對(duì)HTTP服務(wù)收到的網(wǎng)絡(luò)包進(jìn)行處理;然后,web服務(wù)器總調(diào)度模塊開始根據(jù)解析出的網(wǎng)絡(luò)參數(shù)URI,搜索網(wǎng)頁(yè)文件定義模塊中的數(shù)組:查找URI請(qǐng)求的文件;再次,由CGI文件解析及函數(shù)解析模塊和CGI函數(shù)實(shí)現(xiàn)模塊對(duì)CGI文件進(jìn)行處理。該方法是在無(wú)操作系統(tǒng)、無(wú)文件系統(tǒng)、無(wú)web庫(kù)支持,內(nèi)存也非常的有限的單片機(jī)或者是ARM?CPU設(shè)備中進(jìn)行的。本發(fā)明使用簡(jiǎn)單、模塊化的方法為只有簡(jiǎn)單CPU的設(shè)備實(shí)現(xiàn)動(dòng)態(tài)web服務(wù)器的功能,并且實(shí)現(xiàn)AJAX效果,增加了用戶與設(shè)備進(jìn)行動(dòng)態(tài)交互的能力。
【專利說(shuō)明】—種在無(wú)操作系統(tǒng)設(shè)備中利用CGI技術(shù)實(shí)現(xiàn)動(dòng)態(tài)web服務(wù)器的方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及一種在無(wú)操作系統(tǒng)設(shè)備中利用CGI技術(shù)實(shí)現(xiàn)動(dòng)態(tài)web服務(wù)器的方法,屬于嵌入式Internet設(shè)備的【技術(shù)領(lǐng)域】。
【背景技術(shù)】
[0002]隨著物聯(lián)網(wǎng)的發(fā)展以及網(wǎng)絡(luò)化尤其是web應(yīng)用的普及,對(duì)設(shè)備的聯(lián)網(wǎng)、智能化等要求也越來(lái)越高。如何使用簡(jiǎn)單的方法讓簡(jiǎn)單的設(shè)備也能接入Internet并通過(guò)web對(duì)其管理、配置將是我們面臨的一個(gè)難題。[0003]在現(xiàn)有技術(shù)中,傳統(tǒng)的以單片機(jī)或者是CorteX-M3ARM為CPU的設(shè)備一般沒(méi)有實(shí)現(xiàn)web功能或者只能實(shí)現(xiàn)靜態(tài)網(wǎng)頁(yè);而有動(dòng)態(tài)網(wǎng)頁(yè)支持的設(shè)備一般是支持嵌入式操作系統(tǒng)的CPU再使用成熟的web服務(wù)器(如boa)實(shí)現(xiàn),這樣勢(shì)必成本、功耗以及復(fù)雜度會(huì)成倍的提高。
【發(fā)明內(nèi)容】
[0004]針對(duì)現(xiàn)有技術(shù)的不足,本發(fā)明提供一種在無(wú)操作系統(tǒng)設(shè)備中利用CGI技術(shù)實(shí)現(xiàn)動(dòng)態(tài)web服務(wù)器的方法。本發(fā)明的目的在于:提供一種簡(jiǎn)單、模塊的化的方法在無(wú)操作系統(tǒng)支持的設(shè)備中使用CGI技術(shù)實(shí)現(xiàn)動(dòng)態(tài)web服務(wù)器。公共網(wǎng)關(guān)接口 CGI (CommonGatewayInterface)是WWW技術(shù)中最重要的技術(shù)之一,有著不可替代的重要地位。CGI是外部應(yīng)用程序(CGI程序)與Web服務(wù)器之間的接口標(biāo)準(zhǔn),是在CGI程序和Web服務(wù)器之間傳遞信息的規(guī)程。CGI規(guī)范允許Web服務(wù)器執(zhí)行外部程序,并將它們的輸出發(fā)送給Web瀏覽器,CGI將Web的一組簡(jiǎn)單的靜態(tài)超媒體文檔變成一個(gè)完整的新的交互式媒體。
[0005]本發(fā)明的技術(shù)方案如下:
[0006]一種在無(wú)操作系統(tǒng)設(shè)備中利用CGI技術(shù)實(shí)現(xiàn)動(dòng)態(tài)web服務(wù)器的方法,包括步驟如下:
[0007]其中,該方法的實(shí)現(xiàn)包括了以下模塊:HTTP解析與組包模塊(http.c),web服務(wù)器總調(diào)度模塊(web_server.C)、網(wǎng)頁(yè)文件定義模塊(web_page.C)、CGI文件解析及函數(shù)解析模塊(cgi_parser.c)和CGI函數(shù)實(shí)現(xiàn)模塊(cgi_fun);所述HTTP協(xié)議解析與組包模塊,用于解析HTTP協(xié)議;所述web服務(wù)器總調(diào)度模塊,用于整個(gè)web服務(wù)器的調(diào)度,包括根據(jù)URI查找對(duì)應(yīng)的文件、錯(cuò)誤處理;所述CGI文件解析及函數(shù)解析模塊中的CGI文件解析模塊,用于解析CGI文件,分析出CGI文件中嵌入在<?cgi?>標(biāo)記中CGI函數(shù)的名字和參數(shù);所述CGI函數(shù)解析模塊,將CGI文件解析模塊解析出來(lái)的函數(shù)名字與CGI函數(shù)執(zhí)行體相對(duì)應(yīng)并執(zhí)行;
[0008]該方法包括步驟如下:
[0009](I)首先,HTTP解析與組包模塊對(duì)HTTP服務(wù)收到的網(wǎng)絡(luò)包進(jìn)行處理,HTTP解析與組包模塊按照HTTP1.1的格式,解析出網(wǎng)絡(luò)參數(shù)放到HTTP_RQST_HEAD結(jié)構(gòu)體中;所述的網(wǎng)絡(luò)參數(shù)包括 Command、UR1、Version、Host、Cookies 等參數(shù);所述 HTTP_RQST_HEAD 結(jié)構(gòu)體包含HTTP協(xié)議的規(guī)定的參數(shù):例如GET的參數(shù)放到$_GET[]數(shù)組中,POST的參數(shù)放到$_POST 口數(shù)組中,Cookies 放到 $_C00KIE[]中;
[0010](2)然后,web服務(wù)器總調(diào)度模塊開始根據(jù)解析出的網(wǎng)絡(luò)參數(shù)URI,搜索網(wǎng)頁(yè)文件定義模塊(web_page.c)中的數(shù)組:web_pages[]數(shù)組,查找URI請(qǐng)求的文件,如果沒(méi)有找到,則返回404N0T FOUND頁(yè)面;如果找到了對(duì)應(yīng)的文件,則首先判斷是否為CGI文件,如果不是,則直接把web_pageS[]數(shù)組表示的文件拷貝到發(fā)送緩沖區(qū)由HTTP解析與組包模塊發(fā)送;如果為CGI文件,則將此文件送給CGI文件解析及函數(shù)解析模塊中的CGI文件解析模塊進(jìn)行處理,然后將CGI函數(shù)執(zhí)行的結(jié)果拷貝到發(fā)送緩沖區(qū)由HTTP解析與組包模塊發(fā)送;
[0011](3) CGI文件解析及函數(shù)解析模塊中的CGI文件解析模塊從CGI文件的第一個(gè)字符開始掃描,每當(dāng)遇到<?cgi?>標(biāo)記時(shí),說(shuō)明標(biāo)記里面是CGI函數(shù),然后把標(biāo)記里面的字符串送給CGI文件解析及函數(shù)解析模塊中的CGI函數(shù)解析模塊進(jìn)行處理,當(dāng)CGI函數(shù)實(shí)現(xiàn)模塊處理完畢時(shí),返回結(jié)果就在發(fā)送緩沖區(qū)了 ;
[0012](4)CGI函數(shù)解析模塊首先將<?cgi?>中字符串格式的CGI函數(shù)名字和參數(shù),解析為多個(gè)tokens,然后根據(jù)tokens [0]在web_cgi_funs []中查找對(duì)應(yīng)的CGI函數(shù),如果沒(méi)有找到,則直接把<?cgi?>作為普通的文本放到發(fā)送緩沖區(qū)中等待發(fā)送;如果找到了,則將除了 tokens[0]以外的tokens作為參數(shù)傳遞給CGI函數(shù)并執(zhí)行CGI函數(shù),格式如下:
[0013]outbuf=(*web_cgi_funs[i].func)(tokensNum, cgi_cmd_tokens, outbuf, http_rqst_head, http_resp_head);
[0014](5) CGI函數(shù)如果需要頁(yè)面?zhèn)鱽?lái)的GET或者是POST變量,則使用http_get_arg_get O函數(shù)或者是http_post_arg_get O函數(shù)從http_rqst_head中獲取;在使用IP地址設(shè)置頁(yè)面設(shè)置IP地址時(shí),HTTP解析與組包模塊將IP、子網(wǎng)掩碼以及網(wǎng)關(guān)的設(shè)置結(jié)果放至Ij http_rqst_head 的 $_P0ST[]變量中,cgi_ip_set 函數(shù)使用 http_post_arg_get (http_rqst_head, 〃IP〃)得到IP參數(shù),然后進(jìn)行處理;CGI函數(shù)最后將結(jié)果放到發(fā)送緩沖區(qū);
`[0015](6)當(dāng)CGI文件解析及函數(shù)解析模塊中的CGI文件解析模塊將整個(gè)CGI文件處理完畢時(shí),直接將HTTP協(xié)議發(fā)送的參數(shù)放在http_reSp_head變量中和發(fā)送緩沖區(qū)送給HTTP解析與組包模塊進(jìn)行發(fā)送發(fā)送便可。
[0016]根據(jù)本發(fā)明優(yōu)選的,步驟(2)中web_pages[]描述所有web文件的靜態(tài)數(shù)組,此數(shù)組包括所有web文件的路徑名字、類型、尺寸和詳細(xì)定義;所有的web文件以數(shù)組的方式編寫進(jìn)代碼中。
[0017]根據(jù)本發(fā)明優(yōu)選的,步驟(4)中web_cgi_funs[]描述所有CGI函數(shù)的靜態(tài)數(shù)組,此數(shù)組包含所有定義的CGI函數(shù)。
[0018]根據(jù)本發(fā)明優(yōu)選的,所述存放所有web文件的靜態(tài)數(shù)組包括HTML文件、CGI文件、圖片和CSS文件。這些文件都是以靜態(tài)的方式存放在此數(shù)組,無(wú)需專門的文件系統(tǒng)存放;而CGI文件只是將CGI函數(shù)使用<?cgi?>標(biāo)記插入普通的HTML文件形成。
[0019]根據(jù)本發(fā)明優(yōu)選的,所述存放所有CGI函數(shù)的靜態(tài)數(shù)組,包含所有的CGI函數(shù)。所有的CGI函數(shù)都是以C語(yǔ)言實(shí)現(xiàn)。保持與系統(tǒng)語(yǔ)言一致,便于實(shí)現(xiàn)。
[0020]根據(jù)本發(fā)明優(yōu)選的,所述HTTP協(xié)議解析與組包模塊,包括對(duì)HTTP Command、UR1、HTTP Version、Host,HTTP標(biāo)準(zhǔn)協(xié)議參數(shù)的解析,以及Cookies的解析與處理。
[0021]根據(jù)本發(fā)明優(yōu)選的,所述方法還包括AJAX效果實(shí)現(xiàn)方法:所述AJAX效果,是指不需要人工刷新整個(gè)頁(yè)面,而是由瀏覽器自動(dòng)發(fā)送查詢參數(shù),并刷新顯示在頁(yè)面的部分區(qū)域內(nèi);本方法中的設(shè)備運(yùn)行時(shí)間實(shí)時(shí)顯示便是使用AJAX實(shí)現(xiàn);javascript文件get_time.js包含一個(gè)定時(shí)器,每隔I秒向web服務(wù)器指定的頁(yè)面發(fā)送查詢請(qǐng)求,等web服務(wù)器應(yīng)答后,get_time.js變將結(jié)果在后臺(tái)刷新到頁(yè)面的指定區(qū)域。
[0022]本發(fā)明的優(yōu)勢(shì)在于:
[0023]1、本發(fā)明所述的方法只需要5K的代碼空間就能實(shí)現(xiàn)一個(gè)如上所述功能的webserver。
[0024]2、本發(fā)明所述的方法只需要基本的C語(yǔ)言實(shí)現(xiàn)整個(gè)代碼,不需要任何第三方庫(kù)。
[0025]3、本發(fā)明所述的方法中,各個(gè)模塊劃分明確,算法實(shí)現(xiàn)簡(jiǎn)單,運(yùn)行效率非常高。
[0026]4、本發(fā)明所述的方法不需要文件系統(tǒng)支持。
【專利附圖】
【附圖說(shuō)明】
[0027]圖1為本發(fā)明的流程圖;
[0028]圖2為本發(fā)明CGI文件解析及函數(shù)解析模塊的流程圖;
[0029]圖3為本發(fā)明的實(shí)現(xiàn)的自動(dòng)刷新設(shè)備運(yùn)行時(shí)間的AJAX效果圖;
[0030]圖4為本發(fā)明的實(shí)現(xiàn)獲取和設(shè)置設(shè)備IP地址效果圖。
【具體實(shí)施方式】
[0031]下面結(jié)合實(shí)施例和說(shuō)明書附圖對(duì)本發(fā)明做詳細(xì)的說(shuō)明,但不限于此。
[0032]在執(zhí)行本發(fā)明所述方法之前,
[0033]首先介紹該方法中用到的數(shù)據(jù)結(jié)構(gòu)
[0034]1.web_pages[]數(shù)組主要包含所有web頁(yè)面的描述,包括文件的名字、格式、尺寸、
已經(jīng)指向具體文件字符串的指針,具體內(nèi)容如下:
[0035]
【權(quán)利要求】
1.一種在無(wú)操作系統(tǒng)設(shè)備中利用CGI技術(shù)實(shí)現(xiàn)動(dòng)態(tài)web服務(wù)器的方法,其特征在于,該方法包括步驟如下: 其中,該方法的實(shí)現(xiàn)包括了以下模塊=HTTP解析與組包模塊(http.c),web服務(wù)器總調(diào)度模塊(web_server.C)、網(wǎng)頁(yè)文件定義模塊(web_page.C)、CGI文件解析及函數(shù)解析模塊(cgi_parser.c)和 CGI 函數(shù)實(shí)現(xiàn)模塊(cgi_fun); 該方法包括步驟如下: (1)首先,HTTP解析與組包模塊對(duì)HTTP服務(wù)收到的網(wǎng)絡(luò)包進(jìn)行處理,HTTP解析與組包模塊按照HTTP1.1的格式,解析出網(wǎng)絡(luò)參數(shù)放到HTTP_RQST_HEAD結(jié)構(gòu)體中; (2)然后,web服務(wù)器總調(diào)度模塊開始根據(jù)解析出的網(wǎng)絡(luò)參數(shù)URI,搜索網(wǎng)頁(yè)文件定義模塊(web_page.c)中的數(shù)組:web_pages[]數(shù)組,查找URI請(qǐng)求的文件,如果沒(méi)有找到,則返回404N0T FOUND頁(yè)面;如果找到了對(duì)應(yīng)的文件,則首先判斷是否為CGI文件,如果不是,則直接把web_pageS[]數(shù)組表示的文件拷貝到發(fā)送緩沖區(qū)由HTTP解析與組包模塊發(fā)送;如果為CGI文件,則將此文件送給CGI文件解析及函數(shù)解析模塊中的CGI文件解析模塊進(jìn)行處理,然后將CGI函數(shù)執(zhí)行的結(jié)果拷貝到發(fā)送緩沖區(qū)由HTTP解析與組包模塊發(fā)送; (3)CGI文件解析及函數(shù)解析模塊中的CGI文件解析模塊從CGI文件的第一個(gè)字符開始掃描,每當(dāng)遇到<?cgi?>標(biāo)記時(shí),說(shuō)明標(biāo)記里面是CGI函數(shù),然后把標(biāo)記里面的字符串送給CGI文件解析及函數(shù)解析模塊中的CGI函數(shù)解析模塊進(jìn)行處理,當(dāng)CGI函數(shù)實(shí)現(xiàn)模塊處理完畢時(shí),返回結(jié)果就在發(fā)送緩沖區(qū)了 ; (4)CGI函數(shù)解析模塊首先將<?cgi?>中字符串格式的CGI函數(shù)名字和參數(shù),解析為多個(gè)tokens,然后根據(jù)tokens [O]在web_cgi_funs []中查找對(duì)應(yīng)的CGI函數(shù),如果沒(méi)有找到,則直接把<?cgi?>作為普通的文本放到發(fā)送緩沖區(qū)中等待發(fā)送;如果找到了,則將除了tokens [O]以外的tokens作為參數(shù)傳遞給CGI函數(shù)并執(zhí)行CGI函數(shù),格式如下:
outbuf= (*web_cgi_funs [i].func) (tokensNum, cgi_cmd_tokens, outbuf, http_rqst_head, http_resp_head); (5)CGI函數(shù)如果需要頁(yè)面?zhèn)鱽?lái)的GET或者是POST變量,則使用http_get_arg_get O函數(shù)或者是http_post_arg_get O函數(shù)從http_rqst_head中獲取;在使用IP地址設(shè)置頁(yè)面設(shè)置IP地址時(shí),HTTP解析與組包模塊將IP、子網(wǎng)掩碼以及網(wǎng)關(guān)的設(shè)置結(jié)果放到http_rqst_head 的 $_P0ST[]變量中,cgi_ip_set 函數(shù)使用 http_post_arg_get (http_rqst_head, 〃IP〃)得到IP參數(shù),然后進(jìn)行處理;CGI函數(shù)最后將結(jié)果放到發(fā)送緩沖區(qū); (6)當(dāng)CGI文件解析及函數(shù)解析模塊中的CGI文件解析模塊將整個(gè)CGI文件處理完畢時(shí),直接將HTTP協(xié)議發(fā)送的參數(shù)放在http_reSp_head變量中和發(fā)送緩沖區(qū)送給HTTP解析與組包模塊進(jìn)行發(fā)送發(fā)送便可。
2.根據(jù)權(quán)利要求1所述一種在無(wú)操作系統(tǒng)設(shè)備中利用CGI技術(shù)實(shí)現(xiàn)動(dòng)態(tài)web服務(wù)器的方法,其特征在于: 步驟(2)中web_pages[]描述所有web文件的靜態(tài)數(shù)組,此數(shù)組包括所有web文件的路徑名字、類型、尺寸和詳細(xì)定義;所有的web文件以數(shù)組的方式編寫進(jìn)代碼中。
3.根據(jù)權(quán)利要求1所述一種在無(wú)操作系統(tǒng)設(shè)備中利用CGI技術(shù)實(shí)現(xiàn)動(dòng)態(tài)web服務(wù)器的方法,其特征在于: 步驟(4)中web_cgi_funs[]描述所有CGI函數(shù)的靜態(tài)數(shù)組,此數(shù)組包含所有定義的CGI函數(shù)。
4.根據(jù)權(quán)利要求2所述一種在無(wú)操作系統(tǒng)設(shè)備中利用CGI技術(shù)實(shí)現(xiàn)動(dòng)態(tài)web服務(wù)器的方法,其特征在于:所述存放所有web文件的靜態(tài)數(shù)組包括HTML文件、CGI文件、圖片和CSS文件。
5.根據(jù)權(quán)利要求3所述一種在無(wú)操作系統(tǒng)設(shè)備中利用CGI技術(shù)實(shí)現(xiàn)動(dòng)態(tài)web服務(wù)器的方法,其特征在于:所述存放所有CGI函數(shù)的靜態(tài)數(shù)組,包含所有的CGI函數(shù)。所有的CGI函數(shù)都是以C語(yǔ)言實(shí)現(xiàn)。
6.根據(jù)權(quán)利要求1所述一種在無(wú)操作系統(tǒng)設(shè)備中利用CGI技術(shù)實(shí)現(xiàn)動(dòng)態(tài)web服務(wù)器的方法,其特征在于:所述HTTP協(xié)議解析與組包模塊,包括對(duì)HTTP Command、UR1、HTTPVersion、Host, HTTP標(biāo)準(zhǔn)協(xié)議參數(shù)的解析,以及Cookies的解析與處理。
7.根據(jù)權(quán)利要求1所述一種在無(wú)操作系統(tǒng)設(shè)備中利用CGI技術(shù)實(shí)現(xiàn)動(dòng)態(tài)web服務(wù)器的方法,其特征在于:所述方法還包括AJAX效果實(shí)現(xiàn)方法:javascript文件get_time.js包含一個(gè)定時(shí)器,每隔I秒向web服務(wù)器指定的頁(yè)面發(fā)送查詢請(qǐng)求,等web服務(wù)器應(yīng)答后,get_time.js變將結(jié)果在后臺(tái)刷新到頁(yè)面`的指定區(qū)域。
【文檔編號(hào)】G06F9/44GK103513986SQ201310422509
【公開日】2014年1月15日 申請(qǐng)日期:2013年9月16日 優(yōu)先權(quán)日:2013年9月16日
【發(fā)明者】李幸福, 馬中駿, 張會(huì)昌, 張鵬, 李寧, 肖計(jì)偉, 楊善松 申請(qǐng)人:山東華辰泰爾信息科技股份有限公司