基于XML的移動(dòng)終端網(wǎng)絡(luò )瀏覽方案
摘要:基于XML的移動(dòng)終端網(wǎng)絡(luò )瀏覽方案是在傳統客戶(hù)/ 服務(wù)器瀏覽模式中插入中間層,中間層在后臺服務(wù)器上運行,接收客戶(hù)端服務(wù)請求,并與WEB 服務(wù)器通訊以獲取需要的HTML 文件。并按照規范過(guò)濾此文件,重新組織XML 格式的文件,通過(guò)無(wú)線(xiàn)網(wǎng)絡(luò )傳入客戶(hù)端??蛻?hù)端平臺采用嵌入式Linux,根據需要自由裁減,經(jīng)XML 解析后,調用GUI 函數顯示網(wǎng)頁(yè)。
關(guān)鍵詞:嵌入式瀏覽器;移動(dòng)終端;XML;解析器
引言
移動(dòng)終端受移動(dòng)性和便攜性的制約,CPU 主頻及計算能力較小,存儲器容量、顯示屏和輸入設備大小也受到限制。同時(shí),無(wú)線(xiàn)數據網(wǎng)帶寬、連接可靠性及網(wǎng)絡(luò )可預測性相對較低, 網(wǎng)絡(luò )時(shí)延比有線(xiàn)網(wǎng)大。如果將移動(dòng)終端通過(guò)無(wú)線(xiàn)方式直接接入Internet,技術(shù)實(shí)現有困難。近年業(yè)界提出:一是重寫(xiě)現有Internet 協(xié)議,使其與現有協(xié)議兼容,讓移動(dòng)設備透過(guò)微瀏覽器( Micro-Browser) 能通過(guò)無(wú)線(xiàn)網(wǎng)絡(luò )使用Internet 上所提供的針對WAP 特別定制的資訊及服務(wù)。另是將移動(dòng)終端當作功能簡(jiǎn)化的PC,并內置HTML 瀏覽器,雖可自由訪(fǎng)問(wèn)現有網(wǎng)絡(luò ), 但由于現有Internet 網(wǎng)站網(wǎng)頁(yè)大量采用Flash、Shockwave 等技術(shù),導致其體積龐大, 無(wú)線(xiàn)傳輸中耗時(shí)長(cháng),還要求移動(dòng)終端具有較強運算能力,硬件投入較高。為此,對上述方式進(jìn)行改進(jìn), 使其既可滿(mǎn)足無(wú)線(xiàn)網(wǎng)絡(luò )傳輸中數據量小的要求, 又可讓用戶(hù)獲取現有網(wǎng)絡(luò )上的絕大部分資源。
基于XML 的移動(dòng)終端網(wǎng)絡(luò )瀏覽模型
模型概述
基于XML 的WEB 瀏覽方案是在傳統的客戶(hù)/服務(wù)器瀏覽模式中插入中間層。中間層接收客戶(hù)端的服務(wù)請求,并與WEB 服務(wù)器通訊以獲取所需要的HTML 文件,將此文件按一定規范進(jìn)行過(guò)濾,去掉客戶(hù)端不需要的標簽及內容,重新組織成XML格式文件通過(guò)無(wú)線(xiàn)網(wǎng)絡(luò )傳送給客戶(hù)端。經(jīng)由XML解析器以后,調用GUI 圖形接口函數將網(wǎng)頁(yè)顯示在用戶(hù)界面上??蛻?hù)端瀏覽器的控制部分負責響應用戶(hù)的請求,并處理與用戶(hù)的交互。其結構如圖1。
在無(wú)線(xiàn)網(wǎng)絡(luò )瀏覽中使用XML 的優(yōu)缺點(diǎn)
可擴展標記語(yǔ)言(XML: eXtensible MarkupLanguage) 是用來(lái)描述其它語(yǔ)言的元語(yǔ)言,定義了應用間傳遞數據的結構, 是能用任何編輯器讀取的文本。利用這種機制,程序員可制定底層數據交換的規范,并在此基礎上開(kāi)發(fā)整個(gè)系統的各個(gè)模塊,模塊間傳輸符合既定規則的數據,適合計算機間傳送結構化數據。
每種瀏覽器內置的文檔解析器是最核心的部分之一,影響瀏覽器的運行效率和空間效率。由于XML 統一定義了其文檔解析器的標準接口規范――DOM( Document Object Model),即文檔對象模型,使得應用程序可按需選擇、更換合適的解析器,無(wú)須對程序本身做大的改動(dòng)。在瀏覽模型中, 將HTML 解析等計算量大的任務(wù)交由中間層服務(wù)器完成, 客戶(hù)端進(jìn)行較為簡(jiǎn)單的XML 解析, 符合瘦客戶(hù)機/ 服務(wù)器的信息應用體系模式。當前使用XML 最大的問(wèn)題是支持XML 的應用程序還不多, 許多具體應用還需要開(kāi)發(fā)人員自行設計。
中間層實(shí)現的機制和原理
選擇VC++ 6.0 為中間層的集成開(kāi)發(fā)環(huán)境,中間層運行在后臺服務(wù)器上, 采用模塊化的設計。每個(gè)模塊作為一個(gè)常規動(dòng)態(tài)鏈接庫( Regular DLL )單元, 由后臺服務(wù)器需要時(shí)動(dòng)態(tài)加載。
(1) 數個(gè)無(wú)線(xiàn)MODEM通過(guò)多串口卡連接在后臺服務(wù)器上構成無(wú)線(xiàn)MODEM 池,為多個(gè)移動(dòng)終端用戶(hù)提供服務(wù)??蛻?hù)端與服務(wù)器建立連接時(shí), 先申請MODEM 池中的空閑資源并建立與后臺服務(wù)器連接, 發(fā)送客戶(hù)端瀏覽器服務(wù)請求,任務(wù)完成后釋放MODEM 資源。如沒(méi)有可用資源,等待一定時(shí)間后重新申請。
(2) 后臺服務(wù)器通過(guò)有線(xiàn)網(wǎng)絡(luò )接入Internet,使用標準WWW 協(xié)議棧(HTTP、TCP/IP 等)。與WEB 服務(wù)器通訊時(shí)主要使用CInternetSession,CHttpConnection 和ChttpFile 等3 個(gè)MFC 類(lèi)。核心代碼如下:
C I n t e r n e t S e s s i o n s e s s i o n ;
C H t t p C o n n e c t i o n * p S e r v e r = N U L L ;
C H t t p F i l e * p F i l e = N U L L ;
AfxParseURL(pURL,…);
初始化完成后, 將客戶(hù)端的服務(wù)請求轉化為標準統一資源定位符( URL : Uniform ResourceLocator ), 并調用全局函數AfxParseURL 分析映射此URL。
pServer = session.GetHttpConnection();
pFile = pServer->OpenRequest();
pFile->AddRequestHeaders();
pFile->SendRequest();
打開(kāi)客戶(hù)端請求特定HTTP 連接,向WEB 服務(wù)器發(fā)送相應HTTP 請求消息。
pFile->ReadString();
WEB 服務(wù)器返回響應消息, 調用CHttpFile類(lèi)ReadString 函數取得返回數據, 完成與WEB 服務(wù)器通訊。
(3) 選擇Dillo project 瀏覽器中的解析引擎作為解析過(guò)濾和組裝模塊的核心, 流程如圖2。
HTML 解析部分對輸入的HTML 數據流按HTML 語(yǔ)法特點(diǎn)逐字符分解成三類(lèi):
① Space 數據類(lèi)型: 所有ASCII 碼值在0x09- 0x0d 或0x20 的字符代表空格或占位信息。經(jīng)Space_proces 部分處理,以確定其長(cháng)度。為保持HTML 排版格式基本不變,此類(lèi)數據全部保存在生成的XML 文件中。
② Tag 數據類(lèi)型: 表示HTML 數據流中的所有標簽。由于HTML 語(yǔ)法規則的限制,必須檢查標簽的有效性,例如input> 標簽必須存在于form>標簽之中。為此建立一堆棧存放標簽信息,堆棧中的所有元素構成了當前HTML 文本處的現場(chǎng)信息。遇到新標簽,首先按照HTML 語(yǔ)法規則將新標簽與當前狀態(tài)信息進(jìn)行比較,確認有效后,將當前標簽信息( 包括標簽名及屬性)入棧,在標簽結束處將此信息出棧,此過(guò)程由Tag_process 部分完成。同時(shí)建立一數組保存需要保留的標簽名, 數組具體元素可根據用戶(hù)需要進(jìn)行增減。將每個(gè)經(jīng)檢驗有效的標簽與數組中元素進(jìn)行逐個(gè)對比以確定標簽是否加入XML 文件中,通過(guò)這樣的篩選, 來(lái)減小無(wú)線(xiàn)傳輸量。
③ Word 數據類(lèi)型:需要顯示的文本信息。此部分信息經(jīng)Word_process 處理后,全部加入到XML 文件中。
④ 最后將XML 文件通過(guò)無(wú)線(xiàn)網(wǎng)絡(luò )傳輸給客戶(hù)端瀏覽器。由于無(wú)線(xiàn)通訊環(huán)境數據傳輸的不確定性和不穩定性,定義了HTML 轉換模塊通訊子模塊-PDA:
協(xié)議格式:FramHead(0x01)+ASCII 數據長(cháng)度( 6bytes) 指令+ 空格+ ASICII 數據+ FramTail(0x02)
支持指令OK FAIL
其中第一個(gè)字段表示數據幀頭第二個(gè)字段表示數據總長(cháng)度以10 進(jìn)制表示最大不超過(guò)999999字節指令字段表示中間層服務(wù)器工作狀態(tài)成功則返回OK 最后為幀尾通過(guò)檢驗幀頭和幀尾來(lái)確定數據傳輸的完整性和準確性。
經(jīng)測試經(jīng)過(guò)中間層過(guò)濾掉Java Script 和一些動(dòng)態(tài)圖片并保留了網(wǎng)頁(yè)的主要信息前提下網(wǎng)頁(yè)體積只有原來(lái)的10%左右適宜在GSM 等低速無(wú)線(xiàn)網(wǎng)絡(luò )上傳輸。
客戶(hù)端瀏覽器的實(shí)現機制
客戶(hù)端平臺采用嵌入式Linux 工作流程如下
(1) 瀏覽器啟動(dòng)后首先初始化XmlBrowser結構此結構包括瀏覽器當前URL 顯示結構入口指針及保存已瀏覽的歷史URL 成員結構體等初始化后通過(guò)客戶(hù)端通訊模塊向中間層發(fā)送請求消息其通訊子模塊中間層服務(wù)器通訊子模塊格式如下:
協(xié)議格式FramHead(0x01) 總長(cháng)度(4bytes)指令空格URL 字符串? [POST DATA]
FramTail(0x02)支持指令GET POST HEAD前兩個(gè)字段分別表示幀頭和數據長(cháng)度后四個(gè)字段遵循HTTP 協(xié)議支持標準HTTP 三種指令最后為幀尾。
(2) 瀏覽器收到中間層返回數據后先檢驗數傳中無(wú)數據丟失后將此XML 數據流送入XML解析器選擇可為Gnome Linux 主要窗口管理環(huán)境之一提供XML 支持的XML Library 中的XML解析器它遵循標準DOM 接口可將DOM 看作標準的連接文檔和應用程序或腳本語(yǔ)言的結構體系其提供給用戶(hù)一個(gè)接口以裝載定位操作和序列化XML 文檔基于DOM 的XML 解析器將XML 文檔轉換成對象模型的集合通常為樹(shù)狀結構通過(guò)遍歷整棵樹(shù)來(lái)訪(fǎng)問(wèn)XML 文檔任意處的內容和結構信息。
(3) 從XML 解析到XML 文本的顯示步驟
從流程圖圖3 可見(jiàn)底層GUI 接口調用和上層顯示模塊是分開(kāi)的顯示模塊完成對全部具體元素的顯示信息的計算后向底層GUI 接口形函數發(fā)出服務(wù)請求底層GUI 對服務(wù)請求進(jìn)行響應完成屏幕繪制采用該結構應用程序開(kāi)發(fā)員無(wú)需了解底層圖形引擎的實(shí)現機理和技術(shù)細節只要保持兩者間的接口不變系統底層圖形函數庫的升級將不會(huì )影響現有軟件。
進(jìn)入顯示的DOM 數據流元素分為兩類(lèi)一類(lèi)是在屏幕顯示區域上顯示的對象如輸入框input> 鏈接a>和文本等元素另類(lèi)為Container容器如表格行tr> 表格單元td> 等元素不顯示在屏幕上每個(gè)顯示對象都處在特定Container中以此來(lái)確定它與其它顯示對象間的相對位置關(guān)系整個(gè)屏幕顯示區域視為最外層的容器包含了實(shí)際顯示對象和下層容器以此類(lèi)推構成了整個(gè)顯示結構顯示結構完成后計算每個(gè)元素的實(shí)際顯示位置通過(guò)遍歷整個(gè)顯示結構依據顯示區域長(cháng)寬計算每個(gè)顯示對象的坐標超出顯示區域長(cháng)度的部分使用滾動(dòng)條來(lái)訪(fǎng)問(wèn)。
(4) 瀏覽器與用戶(hù)交互的管理
該管理由瀏覽器的虛擬控制器完成瀏覽器的整個(gè)屏幕除了頁(yè)面顯示區域外還分為滾動(dòng)條和系統區域系統區域上為用戶(hù)提供了一些定制的功能如前進(jìn)后退頁(yè)面刷新等通過(guò)點(diǎn)擊滾動(dòng)條區域可以上下移動(dòng)屏幕。
結束語(yǔ)
基于XML 的移動(dòng)終端網(wǎng)絡(luò )瀏覽方案既考慮到現有網(wǎng)絡(luò )數據結構以HTML 為主的現狀又可滿(mǎn)足未來(lái)網(wǎng)絡(luò )向XML 方向發(fā)展的趨勢并已在我所自行研發(fā)的移動(dòng)終端上運行成功滿(mǎn)足了流動(dòng)性很強的特殊行業(yè)對信息瀏覽和查詢(xún)的需要。
評論