當(dāng)前位置:首頁 > 電源 > 數(shù)字電源
[導(dǎo)讀]摘要:就Ajax技術(shù)中的XMLHttp對象在基于Web的嵌入式遠程控制與實時監(jiān)測系統(tǒng)中的應(yīng)用開發(fā)進行了研究,并基于Microchip TCP/IP協(xié)議棧給出了具體的實現(xiàn)方法,有效地解決了客戶端Web與嵌入式HTTP服務(wù)器的交互問題。 關(guān)

摘要:就Ajax技術(shù)中的XMLHttp對象在基于Web的嵌入式遠程控制與實時監(jiān)測系統(tǒng)中的應(yīng)用開發(fā)進行了研究,并基于Microchip TCP/IP協(xié)議棧給出了具體的實現(xiàn)方法,有效地解決了客戶端Web與嵌入式HTTP服務(wù)器的交互問題。
關(guān)鍵詞:嵌入式系統(tǒng);TCP/IP;Web開發(fā);Ajax;XMLHttp;Javascript

引言
    傳統(tǒng)的Web應(yīng)用在交互操作過程中頻繁出現(xiàn)全頁刷新的問題無法避免,即使當(dāng)前頁面中僅有局部信息是需要動態(tài)刷新顯示的。這不僅影響到界面效果,在實時監(jiān)測過程中還會明顯影響服務(wù)器的響應(yīng)速度。
    Ajax技術(shù)的出現(xiàn)為解決客戶端Web與嵌入式HTTP服務(wù)器之間的交互問題提供了重要途徑。Ajax是異步Javascript與XML的簡稱,這一概念由Jesse James Garrett提出,它是一組與Web開發(fā)相關(guān)的技術(shù),包括基于HTML/XHTML與CSS標(biāo)準(zhǔn)的頁面表示、基于DOM的動態(tài)顯示和交互,以及基于XMLHttpRequest與服務(wù)器之間的異步通信。所有上述技術(shù)通過Javascript綁定在一起。
    嵌入式以太網(wǎng)實時系統(tǒng)開發(fā)者可以嘗試通過Ajax的核心對象XMLHttp在“后臺”與嵌入式HTTP服務(wù)器交瓦,對服務(wù)器發(fā)起遠程控制,讀取服務(wù)器動態(tài)返回的監(jiān)測信息并刷新顯示在客戶端Web界面中的特定位置,且所有操作均不會導(dǎo)致當(dāng)前Web界面被全頁刷新。
    本文以Microchip公司的TCP/IP協(xié)議棧為基礎(chǔ),討論XMLHttp對象在嵌入式Web實時系統(tǒng)中的具體應(yīng)用方法。所選用的測試電路以PIC18F4 52單片機與以太網(wǎng)接口芯片RTL8019AS為核心,嵌入式HTTP服務(wù)器所有Web相關(guān)文件保存在系統(tǒng)外部EEPROM存儲器中。

1 XMLHttp在客戶端Web中的應(yīng)用
    XMLHttp是Ajax技術(shù)的核心,由微軟公司在IE5.0瀏覽器中率先推出,后被命名為XMLHttpRequest。
1.1 客戶端Javascript函數(shù)
1.1.1 創(chuàng)建XMLHttp對象的通用函數(shù)
    客戶端與嵌入式系統(tǒng)HTTP服務(wù)器的所有交互都將基于在客戶端所創(chuàng)建的XMLHttp對象。該函數(shù)在IE中創(chuàng)建XMLHttp對象的語句為:
   
    創(chuàng)建XMLHttp對象后最重要的操作是設(shè)置onreaclystatechange屬性(非IE中為onload),為其綁定異步回調(diào)函數(shù)。當(dāng)XMLHttp對象狀態(tài)變化時,所指定的回調(diào)函數(shù)將自動處理服務(wù)器回應(yīng)數(shù)據(jù)。
1.1.2 客戶端發(fā)送控制命令的函數(shù)
    (1)Send_Control_CMD(URL,Html_id)
    該函數(shù)可由客戶端Web中的控制命令按鈕點擊事件onClick觸發(fā)調(diào)用,它調(diào)用CreateXMLHttpObj創(chuàng)建XMLHttp對象,設(shè)置回調(diào)函數(shù),然后以GET方法對HTTP服務(wù)器發(fā)起請求。函數(shù)的第一個參數(shù)URL可以是控制命令串,也可以是CGI、HTML及其他各種Web文件名。如果要求在客戶端Web中顯示HTTP服務(wù)器返回信息,則需要設(shè)置第二個參數(shù)Html_id。例如,在發(fā)送控制命令點亮系統(tǒng)中某個指示燈后,要求將服務(wù)器返回的該指示燈的當(dāng)前狀態(tài)顯示在客戶端。所設(shè)置的參數(shù)Html_id是客戶端Web頁中的某個容器的ID,返回信息將顯示到該容器中。如果不需要服務(wù)器回應(yīng)文本信息,或?qū)貞?yīng)信息不予處理,可將該參數(shù)設(shè)為空。函數(shù)具體實現(xiàn)如下:
   
    Send_Control_CMD在每次被涮用時首先創(chuàng)建一個通用對象Obj,然后創(chuàng)建XMLHttp對象,并將其保存在自定義的Obj.xmlhttpobj屬性中,隨后調(diào)用XMLHttp對象的open方法與send方法,調(diào)用格式為:
    oXMLHttpRequest.open(bstrMethod,bstrUrl,varAsync,
    bstrUser,bstrPassword);
    oXMLHttpRequest.send(varBody);
    其中open方法的bstrMethod參數(shù)為HTTP請求的方法,例如所選擇的“GET”方法,bstrUrl參數(shù)為請求的URL地址,在本文討論的嵌入式Web實時系統(tǒng)中,它用來表示控制命令串,譬如用來啟動外部直流電機的控制命令串“0?1=MOTOR”,varAsync參數(shù)用于指定當(dāng)前請求是否為異步方式,默認(rèn)為true,最后兩個參數(shù)提供帳號密碼,用于服務(wù)器驗證。通過open方法初始化XMLHttp對象以后,要用send方法發(fā)送請求到HTTP服務(wù)器并等待回應(yīng)。由于XMLHttp對象被設(shè)為異步模式,send調(diào)用將不會被阻塞,XMLHttp對象的回調(diào)函數(shù)mReadyCallBack將在HTTP服務(wù)器回應(yīng)時異步執(zhí)行。[!--empirenews.page--]
     由于Web頁中可能有多個不同按鈕要發(fā)送不同的控制命令,為簡化程序設(shè)計且便于管理對象,可將每一按鈕調(diào)用該函數(shù)創(chuàng)建的xMLHttp對象統(tǒng)一保存到全局對象數(shù)組ObjArray中。對象數(shù)組ObjArray由Web頁中的Javascript腳本定義,即:
    <script language=“Javascript”>
    var ObjArray=new Array;……
    (2)mReadyCallBack()
    它是Send_Control_CMD函數(shù)所創(chuàng)建的保存于對象數(shù)組ObjArray中的每個XMLHttp對象的異步回調(diào)函數(shù),通過該函數(shù)可統(tǒng)一異步處理服務(wù)器回應(yīng)數(shù)據(jù)。函數(shù)具體實現(xiàn)如下:
   
    當(dāng)ObjArray中的任意一個XMLHttp對象的就緒狀態(tài)變化時,將觸發(fā)對mReadyCallBack函數(shù)的異步調(diào)用,該函數(shù)將通過for循環(huán)掃描對象數(shù)組ObjArray,對HTTP服務(wù)器當(dāng)前回應(yīng)的對象進行處理。通過XMLHttp對象的responseText屬性可獲取服務(wù)器回應(yīng)信息,通過Web容器的inner HTML屬性可將回應(yīng)信息顯示到Web頁中。在處理完當(dāng)前XMLHttp對象以后,mReadyCallBack最終將用delete釋放該對象所占用的資源。如果調(diào)用Send_control_CMD函數(shù)時第2個參數(shù)為空,則表示發(fā)出控制命令后不需要處理服務(wù)器回應(yīng)文本信息,回調(diào)函數(shù)僅僅需要釋放該對象所占用的資源。
1.1.3 實現(xiàn)客戶端實時監(jiān)測功能的函數(shù)
    (1)RealTime_Monitoring()
    該函數(shù)專門用于實時監(jiān)測動態(tài)數(shù)據(jù),它由Web頁面加載事件onLoad觸發(fā)調(diào)用,通過所創(chuàng)建的xMLHttp對象向服務(wù)器請求動態(tài)文件Status.cgi,以獲取監(jiān)測數(shù)據(jù)。
   
    其中xmlhttp定義為全局變量。
    (2)aReadyCallBack()
    該函數(shù)是實時監(jiān)測系統(tǒng)外設(shè)數(shù)據(jù)函數(shù)RealTime_Monitoring所創(chuàng)建的XMLHttp對象的專用回調(diào)函數(shù),它在處理HTTP服務(wù)器回應(yīng)時將返回的動態(tài)監(jiān)測數(shù)據(jù)顯示在ID為“txtStatus”的Web容器中,譬如<span id=“txtStatus”>…</span>,所返回的內(nèi)容將替換其中的“…”。函數(shù)具體實現(xiàn)如下:
   
   
    回調(diào)函數(shù)aReadyCallBack與回調(diào)函數(shù)mReadyCallBack的差別在于:它釋放已經(jīng)處理回應(yīng)的XMLHttp對象(置為null)以后,接著執(zhí)行了一項重要工作,即調(diào)用實時監(jiān)測函數(shù)RealTime_Monitoring()。通過創(chuàng)建新的XMLhttp對象,將動態(tài)請求與顯示刷新“接力”進行下去,從而使實時監(jiān)測無限延續(xù)。
    顯然,通過XMLHttp對象所實現(xiàn)的實時監(jiān)測,其效果遠遠優(yōu)于傳統(tǒng)的Web請求與響應(yīng)操作模式下所使用的通過在網(wǎng)頁頭部加入<meta http-equiv=“refresh”content=“定時長度”>,或者使用Javascript的setTimeout函數(shù)設(shè)置超時值,使客戶端自動按固定時間間隔請求服務(wù)器刷新顯示動態(tài)信息的方法。
1.2 客戶端Web與嵌入式HTTP服務(wù)器的交互操作
    有了上述以XMLHttp對象為中心的函數(shù)定義,完成客戶端Web與嵌入式HTTP服務(wù)器之間的交互操作就很容易了,例如:
    ①通過Web頁按鈕啟動電機.可有<input type=“button”onClick=“Send_Ctrl_CMD(’0?1=MOTOR’,’)”value=“運行”>。按鈕事件觸發(fā)對Send_Control_CMD的調(diào)用,它通過XMLHttp對象在“后臺”發(fā)送命令串“O?1=MOTOR”,提交給嵌入式系統(tǒng)HTTP服務(wù)器處理,控制電機啟動,實現(xiàn)遠程控制功能。
    ②實時監(jiān)測嵌入式系統(tǒng)外設(shè)狀態(tài),可有<body onLoad=“ReaITime Monitoring();”>。Web頁面加載事件onLoad觸發(fā)對RealTime_Monit oring的函數(shù)調(diào)用,它同樣也通過XMLHttp對象訪問嵌入式系統(tǒng)HTTP服務(wù)器,不同的是它所請求的是動態(tài)文件status.cgi。現(xiàn)假設(shè)所訪問的動態(tài)文件主要內(nèi)容如下:
    <td width=“150”>%02</td>
    <td width=“200”>LED1:%00 LED2:%01</td>
    <td width=“168”>%10</td>
    嵌入式系統(tǒng)HTTP服務(wù)器程序?qū)腗PFS文件系統(tǒng)讀取該動態(tài)文件并將其發(fā)往客戶端。在發(fā)送過程中,HTTP服務(wù)器將對所遇到的形如“%xx”的變量碼進行解析處理。例如“%02”被定義為測試電路中AN0通道的A/D值,“%00”“%01”被定義為兩個外接LED的開關(guān)狀態(tài),“%10”被定義為所控制的直流電機的啟/停狀態(tài)。經(jīng)過HTTP服務(wù)器處理后的變量值將被系統(tǒng)當(dāng)前實際的外設(shè)狀態(tài)值所替換并返回到客戶端。
    由于RealTime_Monitoring函數(shù)與aReadyCallBack函數(shù)配合實現(xiàn)了XMLHttp對象的創(chuàng)建、請求、異步響應(yīng)、釋放,再創(chuàng)建、再請求、再異步響應(yīng)、再釋放等,從而借助XMLHttp對象在“后臺”實現(xiàn)了理想的實時監(jiān)測功能。由于監(jiān)測結(jié)果實時刷新顯示在Web中的特定容器位置,不會導(dǎo)致全頁刷新問題,這也為用戶操作帶來了良好體驗。
    解決了客戶端通過XMLHttp塒象在“后臺”與HTTP服務(wù)器進行交互、發(fā)送控制命令及異步處理回應(yīng)、實現(xiàn)實時監(jiān)測功能的問題以后,接著要解決的是HTTP服務(wù)器端如何處理客戶端XMLHttp對象所發(fā)送的控制命令,以及如何處理并返回客戶端XMLHttp對象所請求的動態(tài)文件。[!--empirenews.page--]

2 HTTP服務(wù)器功能簡介
    Microchip TCP/IP協(xié)議棧是一套服務(wù)于標(biāo)準(zhǔn)的、基于TCP/IP的應(yīng)用程序,可應(yīng)用于HTTP服務(wù)器、FTP服務(wù)器等,它遵循了TCP/IP參考模型,協(xié)議棧按照模塊化方式實現(xiàn)。Microchip整個TCP/IP協(xié)議棧的代碼全部用C語言編寫,每層的實現(xiàn)代碼駐留在一個獨立的C程序文件中,服務(wù)和應(yīng)用程序編程接口則通過頭文件或C程序文件定義,協(xié)議??墒褂肕CC18或HI—TECH PICC 18編譯,圖1對比了TCP/IP參考模型與Microchip TCP/IP協(xié)議棧。


    為實現(xiàn)HTTP服務(wù)器功能,協(xié)議棧所提供的相關(guān)文件主要有TCP.c與HTTP.c,它們分別處理客戶端與服務(wù)器端的連接及對HTTP請求的處理。在啟動嵌入式系統(tǒng)HTTP服務(wù)器時,主程序首先調(diào)用兩個初始化函數(shù):StackInit()與HTTPInit()。前者初始化協(xié)議棧,包括MACInit()、ARPInit()、TCPInit();后者初始化HTTP服務(wù)器,使所有的HTTP連接處于監(jiān)聽狀態(tài),受嵌入式系統(tǒng)資源限制,實際支持的最大連接數(shù)默認(rèn)為3個。
    HTTP服務(wù)器主程序接下來的主要工作是在while(1)中循環(huán)調(diào)用HTTPServer()函數(shù),處理客戶端對HTTP服務(wù)器的請求并作出響應(yīng)。HTTPSer ver實際執(zhí)行的任務(wù)是循環(huán)掃描每個HTTP連接,并在每個連接上調(diào)用處理HTTP請求的函數(shù)HTTPProcess()。該函數(shù)對客戶端發(fā)送的控制命令串的處理及動態(tài)文件的請求處理將分別通過回調(diào)函數(shù)HTTPExecCmd和HTTPGetVar完成,這兩個核心回調(diào)函數(shù)由主程序具體實現(xiàn)。

3 動態(tài)響應(yīng)XMLHttp對象請求的核心函數(shù)
    對于客戶端Web頁內(nèi)onClick事件與onLoad事件觸發(fā)的以下兩個調(diào)用示例,它們都基于XMLHttp對象,前者向嵌入式HTTP服務(wù)器發(fā)送控制命令,后者請求動態(tài)文件:
    ①Send_Ctrl_CMD(’0? 1=MOTOR’,’);
    ②RealTime_Monitoring();
3.1 HTTPExecCmd函數(shù)
    HTTPExecCmd函數(shù)對客戶端發(fā)送的命令串解碼并執(zhí)行相應(yīng)的操作。函數(shù)聲明為:void HTTPExecCmd(BYTE**argv,BYTE argc)??疾炜蛻舳撕瘮?shù)調(diào)用所發(fā)送的控制命令串:“0?1=MOTOR”。HTTP服務(wù)器函數(shù)HTTPProcess在調(diào)用HTTPExecCMD之前已經(jīng)先通過HTTPParse函數(shù)由該命令串解析出“0”、“1”、“MOTOR”這三項內(nèi)容并賦給函數(shù)參數(shù)argv,所解析出的三項的具體定義由主程序設(shè)置。
3.2 HTTPGetVar函數(shù)
    每當(dāng)HTTP服務(wù)器當(dāng)前所處理的CGI動態(tài)文件Status.cgi中遇到變量碼“%xx”時即調(diào)用該函數(shù),處理動態(tài)請求。HTTPGetVar函數(shù)聲明為:WORD HTTPGetVar(BYTE var,WORD ref,BYTE*val)。該函數(shù)的val參數(shù)是待解析處理的動態(tài)文件內(nèi)的某個變量的標(biāo)識符,參數(shù)ref用于跟蹤返回值的狀況,參數(shù)val用于逐個返回數(shù)據(jù)字節(jié)。
    以調(diào)用RealTime_Monitoring函數(shù)為例,它通過XMLHttp對象請求動態(tài)文件Status.cgi,當(dāng)HTTP服務(wù)器接收到該請求時,將從保存于EEPR OM的MPFS文件系統(tǒng)讀取Status.cgi文件,然后由HTTP.c的SendFile函數(shù)向客戶端XMLHttp對象回傳所請求的動態(tài)文件。在回傳過程中,所遇到的動態(tài)文件內(nèi)的變量將由主程序所實現(xiàn)的HTTPGetVar函數(shù)逐一進行處理。動態(tài)文件中的各種變量同樣將由HTTP服務(wù)器主程序進行定義。以Status.cgi文件中表示AN0通道A/D轉(zhuǎn)換值的變量“%02”為例,由于主程序不僅循環(huán)調(diào)用HTTPServer函數(shù)響應(yīng)客戶請求并處理回應(yīng),在循環(huán)中還會分時處理外設(shè)操作,包括所需要執(zhí)行的AN0通道的A/D轉(zhuǎn)換操作。通常所有這些相關(guān)操作被集中放在處理I/O的函數(shù)ProccessIO()中實現(xiàn)。現(xiàn)假定RA0引腳外接可變電阻器RV1,則AN0通道的A/D轉(zhuǎn)換具體實現(xiàn)如下:
    ADCON0=0B10000001;
    ADCON1=0B10001110;
    ADCON0bits.GO=1;
    while(ADCON0bits.GO);
    itoa(*((WORD*)(&ADRESL)),ANOString);
    每一次的A/D轉(zhuǎn)換值都被刷新保存在ANOString字符串中,以便發(fā)往客戶端顯示。當(dāng)HTTP服務(wù)器的HTTPProcess函數(shù)所調(diào)用的SendFile函數(shù)當(dāng)前遇到了變量“%02”,它會將其交由HTTPGetVar函數(shù)處理。所輸入的第1個參數(shù)var為2,它由變量“%02”轉(zhuǎn)換為BYTE類型得到,用于標(biāo)識當(dāng)前變量要獲取的是AN0通道的A/D轉(zhuǎn)換值。
    現(xiàn)假設(shè)AN0String當(dāng)前獲取的A/D值為“709”,HTTPGetVar函數(shù)可通過以下關(guān)鍵語句返回A/D值:
   
    其中ref初始時默認(rèn)為0。顯然,該函數(shù)將被連續(xù)調(diào)用3次,每次調(diào)用時ref遞增,直到通過*val返回最后一個字節(jié)以后,通過返回HTTP_ END_OF_VAR告知SendFile函數(shù)當(dāng)前變量處理結(jié)束。對于待返回到客戶端的數(shù)據(jù)字節(jié),HTTP將通過調(diào)用TCP層提供的函數(shù)TCPPut及TCPFlush,通過指定的Socket套接字將數(shù)據(jù)字節(jié)發(fā)往客戶端,由客戶端XMLHttp對象的異步回調(diào)函數(shù)通過responseText屬性讀取并刷新顯示在Web中的特定位置。

結(jié)語
    通過仿真及實物電路測試表明,使用Ajax的XMLHttp對象及Microchip TCP/IP協(xié)議棧,可以很好地解決以太網(wǎng)環(huán)境下Web操作界面與嵌入式控制系統(tǒng)的交互問題,實現(xiàn)對基于HTTP服務(wù)器模式的嵌入式系統(tǒng)進行遠程控制及實時監(jiān)測,且能夠?qū)⑺邢嚓P(guān)操作保持在穩(wěn)定的瀏覽器窗口中執(zhí)行。

本站聲明: 本文章由作者或相關(guān)機構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫毥谦F公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數(shù)字化轉(zhuǎn)型技術(shù)解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關(guān)鍵字: AWS AN BSP 數(shù)字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動 BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運行,同時企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風(fēng)險,如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報道,騰訊和網(wǎng)易近期正在縮減他們對日本游戲市場的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機 衛(wèi)星通信

要點: 有效應(yīng)對環(huán)境變化,經(jīng)營業(yè)績穩(wěn)中有升 落實提質(zhì)增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競爭力 堅持高質(zhì)量發(fā)展策略,塑強核心競爭優(yōu)勢...

關(guān)鍵字: 通信 BSP 電信運營商 數(shù)字經(jīng)濟

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術(shù)學(xué)會聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會上宣布正式成立。 活動現(xiàn)場 NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會上,軟通動力信息技術(shù)(集團)股份有限公司(以下簡稱"軟通動力")與長三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉