XMLHttP對象在嵌入式Web實時系統中的應用
2 HTTP服務器功能簡介
Microchip TCP/IP協議棧是一套服務于標準的、基于TCP/IP的應用程序,可應用于HTTP服務器、FTP服務器等,它遵循了TCP/IP參考模型,協議棧按照模塊化方式實現。Microchip整個TCP/IP協議棧的代碼全部用C語言編寫,每層的實現代碼駐留在一個獨立的C程序文件中,服務和應用程序編程接口則通過頭文件或C程序文件定義,協議棧可使用MCC18或HI—TECH PICC 18編譯,圖1對比了TCP/IP參考模型與Microchip TCP/IP協議棧。本文引用地址:http://www.104case.com/article/150063.htm
為實現HTTP服務器功能,協議棧所提供的相關文件主要有TCP.c與HTTP.c,它們分別處理客戶端與服務器端的連接及對HTTP請求的處理。在啟動嵌入式系統HTTP服務器時,主程序首先調用兩個初始化函數:StackInit()與HTTPInit()。前者初始化協議棧,包括MACInit()、ARPInit()、TCPInit();后者初始化HTTP服務器,使所有的HTTP連接處于監聽狀態,受嵌入式系統資源限制,實際支持的最大連接數默認為3個。
HTTP服務器主程序接下來的主要工作是在while(1)中循環調用HTTPServer()函數,處理客戶端對HTTP服務器的請求并作出響應。HTTPSer ver實際執行的任務是循環掃描每個HTTP連接,并在每個連接上調用處理HTTP請求的函數HTTPProcess()。該函數對客戶端發送的控制命令串的處理及動態文件的請求處理將分別通過回調函數HTTPExecCmd和HTTPGetVar完成,這兩個核心回調函數由主程序具體實現。
3 動態響應XMLHttp對象請求的核心函數
對于客戶端Web頁內onClick事件與onLoad事件觸發的以下兩個調用示例,它們都基于XMLHttp對象,前者向嵌入式HTTP服務器發送控制命令,后者請求動態文件:
①Send_Ctrl_CMD(’0? 1=MOTOR’,’);
②RealTime_Monitoring();
3.1 HTTPExecCmd函數
HTTPExecCmd函數對客戶端發送的命令串解碼并執行相應的操作。函數聲明為:void HTTPExecCmd(BYTE**argv,BYTE argc)。考察客戶端函數調用所發送的控制命令串:“0?1=MOTOR”。HTTP服務器函數HTTPProcess在調用HTTPExecCMD之前已經先通過HTTPParse函數由該命令串解析出“0”、“1”、“MOTOR”這三項內容并賦給函數參數argv,所解析出的三項的具體定義由主程序設置。
3.2 HTTPGetVar函數
每當HTTP服務器當前所處理的CGI動態文件Status.cgi中遇到變量碼“%xx”時即調用該函數,處理動態請求。HTTPGetVar函數聲明為:WORD HTTPGetVar(BYTE var,WORD ref,BYTE*val)。該函數的val參數是待解析處理的動態文件內的某個變量的標識符,參數ref用于跟蹤返回值的狀況,參數val用于逐個返回數據字節。
以調用RealTime_Monitoring函數為例,它通過XMLHttp對象請求動態文件Status.cgi,當HTTP服務器接收到該請求時,將從保存于EEPR OM的MPFS文件系統讀取Status.cgi文件,然后由HTTP.c的SendFile函數向客戶端XMLHttp對象回傳所請求的動態文件。在回傳過程中,所遇到的動態文件內的變量將由主程序所實現的HTTPGetVar函數逐一進行處理。動態文件中的各種變量同樣將由HTTP服務器主程序進行定義。以Status.cgi文件中表示AN0通道A/D轉換值的變量“%02”為例,由于主程序不僅循環調用HTTPServer函數響應客戶請求并處理回應,在循環中還會分時處理外設操作,包括所需要執行的AN0通道的A/D轉換操作。通常所有這些相關操作被集中放在處理I/O的函數ProccessIO()中實現。現假定RA0引腳外接可變電阻器RV1,則AN0通道的A/D轉換具體實現如下:
ADCON0=0B10000001;
ADCON1=0B10001110;
ADCON0bits.GO=1;
while(ADCON0bits.GO);
itoa(*((WORD*)(&ADRESL)),ANOString);
每一次的A/D轉換值都被刷新保存在ANOString字符串中,以便發往客戶端顯示。當HTTP服務器的HTTPProcess函數所調用的SendFile函數當前遇到了變量“%02”,它會將其交由HTTPGetVar函數處理。所輸入的第1個參數var為2,它由變量“%02”轉換為BYTE類型得到,用于標識當前變量要獲取的是AN0通道的A/D轉換值。
現假設AN0String當前獲取的A/D值為“709”,HTTPGetVar函數可通過以下關鍵語句返回A/D值:
其中ref初始時默認為0。顯然,該函數將被連續調用3次,每次調用時ref遞增,直到通過*val返回最后一個字節以后,通過返回HTTP_ END_OF_VAR告知SendFile函數當前變量處理結束。對于待返回到客戶端的數據字節,HTTP將通過調用TCP層提供的函數TCPPut及TCPFlush,通過指定的Socket套接字將數據字節發往客戶端,由客戶端XMLHttp對象的異步回調函數通過responseText屬性讀取并刷新顯示在Web中的特定位置。
結語
通過仿真及實物電路測試表明,使用Ajax的XMLHttp對象及Microchip TCP/IP協議棧,可以很好地解決以太網環境下Web操作界面與嵌入式控制系統的交互問題,實現對基于HTTP服務器模式的嵌入式系統進行遠程控制及實時監測,且能夠將所有相關操作保持在穩定的瀏覽器窗口中執行。
tcp/ip相關文章:tcp/ip是什么
評論