由兩篇文章組成的系列文章主要闡述如何在嵌入式 Linux 智能設備的應用程序中增加 Web 支持。第 1 部分,我們將會(huì )介紹嵌入式 Linux 智能設備開(kāi)發(fā)的現狀、Qt 和 WebKit 的概念。并以廣告機和手持點(diǎn)菜機等應用為例,敘述在嵌入式 Linux 平臺以及 Qt,WebKit 等技術(shù)的幫助下,如何在終端應用程序中添加網(wǎng)頁(yè)瀏覽的功能,如何用 Web 技術(shù)取代傳統 UI 技術(shù),以及如何在智能設備上實(shí)現從 C/S 到 B/S 的開(kāi)發(fā)模式的轉換。
近幾年,嵌入式 Linux 在智能設備中的應用發(fā)展的非常迅速??梢灶A見(jiàn),嵌入式智能設備和我們的生活將會(huì )越來(lái)越密不可分。
Linux 在嵌入式系統中的應用可以分為兩大類(lèi):面向服務(wù)類(lèi)和面向應用類(lèi)。典型的面向服務(wù)類(lèi)系統有交換機、路由器、監控設備等;典型的面向應用類(lèi)的系統有手機、PDA、機頂盒等。本文主要討論面向應用類(lèi),特別是指帶有網(wǎng)絡(luò )和 UI 的應用系統。
在嵌入式 Linux 上進(jìn)行帶 UI 的應用程序開(kāi)發(fā)是一件非常復雜的事情,主要涉及以下幾個(gè)方面:
Linux 本身的 UI 系統并不統一,嵌入式版本上的 UI 系統更是五花八門(mén),而且與其 PC 版本相比也有一些適應性的改變。而有些產(chǎn)品的開(kāi)發(fā)甚至不使用 UI 系統,通過(guò)直接往 framebuffer 貼圖的方式來(lái)實(shí)現 UI。而且與 PC 相比,嵌入式系統的性能問(wèn)題,也讓嵌入式的 UI 系統在表現上做出很多妥協(xié)。這些都使得開(kāi)發(fā)難度增加,帶來(lái)更多的不兼容問(wèn)題。這些都使嵌入式 Linux 上的應用開(kāi)發(fā)和移植變得更加困難,另外也使培養一名合格的嵌入式工程師的成本變的比較高。
對于一個(gè)嵌入式平臺,其主芯片的生產(chǎn)商對這個(gè)平臺影響巨大。一般來(lái)說(shuō),生產(chǎn)商會(huì )提供對某個(gè)或者某些 UI 系統的支持,但是他們不可能支持所有的系統。所以,選定一個(gè)嵌入式平臺就意味著(zhù)開(kāi)發(fā)團隊需要切換到這個(gè)平臺所能支持的 UI 平臺上。這個(gè)團隊之前做的應用就需要移植到新的 UI 平臺,而這個(gè)移植是非常麻煩的。
嵌入式 Linux 的網(wǎng)絡(luò )接口一般都支持 posix 的標準,但是嵌入式設備的瀏覽器則與 UI 系統一樣是五花八門(mén)的。在應用的推動(dòng)下,嵌入式 Linux 平臺上的瀏覽器在近年發(fā)展也非常迅速。他們基于不同的 UI 平臺進(jìn)行開(kāi)發(fā)(也有一些直接操作 framebuffer),對 Web 標準的支持和兼容性各不相同。比較簡(jiǎn)單的瀏覽器只能支持 HTML 標簽,優(yōu)秀的產(chǎn)品則能在兼容性上做到與 PC 平臺上的瀏覽器幾乎同樣的水平。
很多嵌入式應用需要與服務(wù)器進(jìn)行連接,點(diǎn)菜機就是一個(gè)典型的應用。手持智能設備端需要將用戶(hù)的操作寫(xiě)入遠程的服務(wù)器,然后遠程的信息管理系統進(jìn)行進(jìn)一步的處理。這種類(lèi)型的應用對于 PC 平臺來(lái)說(shuō)就是一個(gè)非常簡(jiǎn)單的數據庫應用系統,數據庫、遠程調用、并發(fā)、中間件等技術(shù)已經(jīng)應用了多年,而且還有眾多成熟的企業(yè)應用的框架,可以靈活而快速的搭建出一個(gè)系統。但是這些在嵌入式平臺都是不存在的,這意味著(zhù)開(kāi)發(fā)人員還需要用相當于 PC 平臺十幾年前的水平來(lái)進(jìn)行開(kāi)發(fā),為了讓嵌入式系統和服務(wù)器的數據庫進(jìn)行對接,開(kāi)發(fā)人員還需要在服務(wù)器端編寫(xiě)一個(gè)專(zhuān)門(mén)的程序來(lái)充當橋梁的作用。筆者見(jiàn)過(guò)在不少項目里還需要直接控制 socket 來(lái)和服務(wù)器進(jìn)行數據交換,這些對于 PC 平臺都是不可想象的。另外開(kāi)發(fā)一個(gè)支持多個(gè)客戶(hù)端并發(fā)的穩定服務(wù)器程序并不是一件容易的事情,這些問(wèn)題都會(huì )影響整個(gè)嵌入式開(kāi)發(fā)過(guò)程的成本和質(zhì)量。
如果一個(gè)公司希望在某個(gè)嵌入式 Linux 平臺上開(kāi)發(fā)一個(gè)包含了 Web 瀏覽的應用,而他自己之前并不擁有一個(gè)完善的平臺的話(huà),其開(kāi)發(fā)團隊首先需要選定一個(gè) UI 系統,然后尋找一家做瀏覽器的公司,與其合作,再想辦法將瀏覽器移植到自己的平臺上。如果是需要在自己的應用程序中嵌入一個(gè)瀏覽網(wǎng)頁(yè)的窗體,那么問(wèn)題就會(huì )更加復雜,因為還涉及到與選定的瀏覽器進(jìn)行代碼或者模塊級別集成的問(wèn)題。
Qt 是一個(gè)跨平臺的 C++ 圖形用戶(hù)界面應用程序框架,對 Windows、Linux、Mac OS X、Unix、Free BSD 等主要的操作系統均有支持。Qt 不僅包含了圖形界面庫,還集成了 Network、File、IO、Database、2D/3D、XML 等模塊,基本涵蓋了一個(gè)應用程序所需要的所有功能,這些讓 Qt 成為最有影響力的跨平臺框架,Linux 平臺上的 KDE 就是基于 Qt 開(kāi)發(fā)的。Qt Embedded 則是 Qt 針對嵌入式平臺的版本,在嵌入式平臺的 UI 市場(chǎng)占有很大的份額。
Qt 可以解決上一節所討論的很多問(wèn)題,因為其優(yōu)異的跨平臺性能,開(kāi)發(fā)人員甚至可以在 PC 上進(jìn)行開(kāi)發(fā)調試,然后直接將代碼放到交叉編譯環(huán)境中生成嵌入式版本,這樣的移植基本不需要改動(dòng)代碼。
WebKit 是一個(gè)開(kāi)源的瀏覽器引擎,目前 Safari,Chrome 等瀏覽器均使用了 WebKit 作為核心。Qt 從 4.5 版本開(kāi)始,集成了 WebKit 作為 Qt 的平臺組件,用戶(hù)可以像使用其他組件一樣將 WebKit 引擎集成到自己的應用程序中,以提供 Web 的支持。



通過(guò)網(wǎng)址 http://qt.nokia.com/downloads 可以找到 Embedded Linux 版本的最新 Qt 源代碼?,F在最新版本是 4.5.3。
WebKit 作為第三方資源可以在如下目錄中找到:
/qt-embedded-Linux-opensource-src-4.5.3/src/3rdparty/WebKit/
Qt 中對 WebKit 做了封裝,主要有以下幾個(gè)類(lèi):
QWebView 最常用的類(lèi),這是一個(gè)窗體控件,可以用來(lái)渲染網(wǎng)頁(yè)
QWebPage 被 QWebView 包含,表示一個(gè) documentQWebFrame 被 QWebPage 包含,表示一個(gè) frameQWebSettings Web 渲染的全局設置 QWebHistory 用于瀏覽的歷史記錄
QWebView 是最常用的類(lèi),接下來(lái)我們大概的介紹一下這個(gè)類(lèi)的組成。
根據頭文件定義,我們可以得知這個(gè)類(lèi)與 Qt 中按鈕、對話(huà)框等一樣,都是由 QWidget 派生,可以當做一個(gè)通用窗體來(lái)使用。
class QWebKit_EXPORT QWebView : public Qwidget
這個(gè)類(lèi)有如下的成員函數:
void load ( const QUrl &url );
void setHtml ( const QString &HTML, const QUrl &baseUrl = QUrl() );
這兩個(gè)函數可以讓 QWebView 加載網(wǎng)頁(yè)或者顯示一段 HTML 內容,是 QWebView 最重要的函數。
這個(gè)類(lèi)還有幾個(gè)重要的 slot:
void stop ();
void back ();void forward ();void reload ();
這幾個(gè)函數也是我們平時(shí)瀏覽網(wǎng)頁(yè)時(shí)常用的功能。
QwebView 類(lèi)還有幾個(gè)重要的 signal:
Q_SIGNALS:
void loadStarted (); void loadProgress ( int progress ); void loadFinished ( bool );
很明顯,這幾個(gè) signal 是用來(lái)顯示網(wǎng)頁(yè)的加載過(guò)程。
接著(zhù)我們通過(guò)代碼來(lái)看 QWebView 是如何使用的。假設程序有一個(gè)主窗體 MainWindow,在 MainWindow 的構造函數中,有如下代碼段:
QWebView* view = new QWebView ( this ); // 設置窗體左上角的坐標以及長(cháng)寬 view -> setGeometry( 50 , 50 , 400 , 300 ); view -> show(); view -> load( QUrl("http://www.google.com") );設備網(wǎng)絡(luò )配置好之后,運行程序,我們就可以看到在窗體中有一個(gè)區域顯示出 google 的主頁(yè)(編譯的時(shí)候要注意在項目的 pro 文件中包含 WebKit 的頭文件路徑和動(dòng)態(tài)庫)??梢?jiàn),Qt 已經(jīng)將 WebKit 做了很好的封裝,子應用程序中加入網(wǎng)頁(yè)瀏覽功能是非常方便的。
如果希望能知道網(wǎng)頁(yè)加載的進(jìn)度,可以通過(guò)如下的代碼來(lái)實(shí)現:
首先實(shí)現槽函數的定義:
Private slot: void setProgress(int progress) { // progress,即百分比進(jìn)度 } void loadFinished() { // 表示網(wǎng)頁(yè)加載完畢 }第二步連接 Qt 的信號與槽函數:
connect(view , SIGNAL(loadProgress(int)), this, SLOT(setProgress(int))); connect(view , SIGNAL(loadFinished(bool)), this, SLOT(loadFinished()));這樣,在程序中加一個(gè)進(jìn)度條表示網(wǎng)頁(yè)加載過(guò)程就實(shí)現了。



在嵌入式 Linux 智能設備上有一個(gè)典型的應用:信息機,或者廣告機。這種機器一般都帶有一個(gè)屏幕,有些會(huì )有觸摸屏。屏幕上會(huì )組合顯示文字、圖片和視頻,或者提供簡(jiǎn)單的查詢(xún)功能。這種類(lèi)型的設備最先是由內置 PC 來(lái)實(shí)現的,在各種服務(wù)大廳供用戶(hù)使用?,F在普遍使用嵌入式系統來(lái)取代 PC,以降低成本。
我們在銀行、通信運營(yíng)商服務(wù)大廳、醫院、電梯房等地方經(jīng)常能看到各種各樣的廣告機。一個(gè)典型的屏幕顯示情況如下:
這是組合比較復雜的情況,也有整個(gè)屏幕就是文字、圖片或者視頻的。與傳統和大型軟件開(kāi)發(fā)相比,實(shí)現這樣的功能看上去并不算很難。開(kāi)發(fā)人員可能需要在嵌入式平臺自己去實(shí)現字幕、圖片和天氣的顯示組件或者模塊(暫時(shí)忽略視頻播放功能),然后在屏幕上進(jìn)行顯示即可。比較困難的地方在于以下幾個(gè)方面:
圖片和字幕需要以某種格式進(jìn)行存放,天氣信息來(lái)源于 Internet,開(kāi)發(fā)人員需要編寫(xiě)代碼對這些內容進(jìn)行顯示,并根據不同規則對內容進(jìn)行切換。如有以下的配置文件內容:
<screen> <duration>30</duration> <pic>1.jpg</pic> <text>1.txt</text> <video>1.avi</video> <weather>http://xxxxx.HTML</weather> </screen> <screen> <duration>25</duration> <pic>2.jpg</pic> <text>2.txt</text> <video>2.avi</video> <weather>http://xxxxx.HTML</weather> </screen> ... ...開(kāi)發(fā)人員需要編寫(xiě)一個(gè)解析器,能夠解析這個(gè) xml 文件,并且按照其中的規則進(jìn)行內容的顯示。
如果需要對廣告機的內容進(jìn)行更換,維護人員則需要將內容按照這個(gè)格式進(jìn)行編排。編排的效果是需要反復調整的,這個(gè)時(shí)候,要不就是每次都用一臺廣告機來(lái)看實(shí)際效果,要不然可能還需要專(zhuān)門(mén)設計一個(gè)預覽程序。
屏幕的顯示布局很可能也是要變動(dòng)的,那么意味著(zhù)布局最好也是可配置的,折舊要求廣告機程序能夠解析并且實(shí)現顯示布局的配置。如果說(shuō)解析上面的配置文件并不是很麻煩的事情,但是如果配置文件變成下面這樣,就不一樣了。
<screen> <duration>30</duration> <pic x=800 y=200 width=320 height=240>1.jpg</pic> <text x=0 y=600 width=1024 height=240>1.txt</text> <video x=0 y=0 width=800 height=600>1.avi</video> <weather>http://xxxxx.HTML</weather> </screen> <screen> <duration>30</duration> <pic x=800 y=200 width=320 height=240>2.jpg</pic> <pic x=800 y=400 width=320 height=240>22.jpg</pic> <text x=0 y=600 width=1024 height=120>2.txt</text> <text x=0 y=800 width=1024 height=120>22.txt</text> <video x=0 y=0 width=800 height=600>2.avi</video> <weather>http://xxxxx.HTML</weather> </screen> ... ...不但各種元素的位置可配置,圖片、文本等的數量也發(fā)生了改變。這個(gè)時(shí)候,解析程序將變得相當復雜。當更多的需求出現,如要求配置滾動(dòng)字幕的速度、背景顏色,要求圖片和文字等內容可以單獨配置刷新時(shí)間等,這樣的配置文件不會(huì )比 HTML 標準簡(jiǎn)單,而解析程序的規模也將急劇膨脹。
綜上,廣告機的軟件關(guān)鍵并不在于內容如何能顯示出來(lái),而是軟件需要有復雜的解析能力,能夠支持可配置的布局和內容。目前這些廣告機的配置文件大多使用 xml 來(lái)存儲信息,而一個(gè)能夠同時(shí)解決復雜布局和內容顯示的程序,實(shí)際上已經(jīng)非常類(lèi)似瀏覽器的概念了。那么,讓我們從真正的瀏覽器的角度來(lái)看待廣告機的這些問(wèn)題。
如果把屏幕內容當成一個(gè)網(wǎng)頁(yè)的話(huà),屏幕布局、內容顯示、更新、維護等都轉換成了設計網(wǎng)頁(yè)的問(wèn)題,而最關(guān)鍵的解析程序的開(kāi)發(fā)可以忽略,用已有的成熟的瀏覽器取代。這里的網(wǎng)頁(yè)設計并不關(guān)系到網(wǎng)頁(yè)服務(wù)器端的開(kāi)發(fā),因為廣告機的內容大多是存儲在本地,所以只需要直接設計頁(yè)面。頁(yè)面內容的更新,或者整個(gè)頁(yè)面的更新都可以通過(guò)標準 HTML,或者 JavaScript 之類(lèi)腳本里實(shí)現。對于“天氣”播放功能的實(shí)現就更加簡(jiǎn)單了,之前的方式需要編寫(xiě)程序通過(guò)網(wǎng)絡(luò )從遠程獲取數據然后顯示,比較麻煩。轉換成網(wǎng)頁(yè)模式之后,只需要在網(wǎng)頁(yè)中嵌入一個(gè)子網(wǎng)頁(yè),指向遠程的服務(wù)器鏈接即可??梢?jiàn),以廣告機為例,在架構上使用網(wǎng)頁(yè)來(lái)取代之前的模式,能充分利用已有的資源和工具,極大的減少開(kāi)發(fā)的工作量。
我們再考慮另外一種應用:帶交互的信息查詢(xún)機。帶交互功能的信息機主要提供給人們索引和查詢(xún)信息的功能,信息被分類(lèi)并且根據索引存儲,信息機的解析程序通過(guò)與用戶(hù)的交互,顯示所需要的信息。實(shí)際上,交互和索引跳轉是網(wǎng)頁(yè)天生的特性,所以,同樣可以采用網(wǎng)頁(yè)和瀏覽器的模式取代編寫(xiě)本地程序進(jìn)行交互和解析,可以把幾乎所有的工作轉換成網(wǎng)頁(yè)設計,從而將開(kāi)發(fā)工作量減到了最低。



在嵌入式智能設備的應用中,有很大一部分是嵌入式智能終端需要與遠程的服務(wù)器進(jìn)行連接,通過(guò)人機交互和數據采集來(lái)實(shí)現應用,比較典型的就是點(diǎn)菜機。
無(wú)線(xiàn)點(diǎn)菜機是一種很常見(jiàn)的嵌入式智能設備,大多采用 Windows CE 或嵌入式 Linux 作為操作系統。如果把點(diǎn)菜機當成一個(gè) PC 系統,那么這就是一個(gè)非常典型的客戶(hù)端 / 服務(wù)器架構的應用。
圖 2. 無(wú)線(xiàn)點(diǎn)菜機系統示例
如圖 2 所示,點(diǎn)菜機通過(guò) WIFI 與服務(wù)器相連,通過(guò)網(wǎng)絡(luò )與服務(wù)器通訊進(jìn)行點(diǎn)菜操作,廚房端也有客戶(hù)端與服務(wù)器相連,根據點(diǎn)菜情況進(jìn)行菜品制作的安排。忽略 PC 和嵌入式開(kāi)發(fā)的差異性,這個(gè)應用的實(shí)現過(guò)程和原理與 PC 基本是一致的。不同的是,通過(guò)網(wǎng)絡(luò )實(shí)現業(yè)務(wù)的調用,如我們在前面提到過(guò)的,這在 PC 平臺上已經(jīng)有了很多資源甚至成熟企業(yè)應用框架,但是在嵌入式 Linux 平臺上幾乎都沒(méi)有。所以,開(kāi)發(fā)人員需要自己來(lái)實(shí)現點(diǎn)菜機和服務(wù)器之間的業(yè)務(wù)調用,進(jìn)而與服務(wù)器端的業(yè)務(wù)處理部分進(jìn)行集成。
對于服務(wù)器而言,最重要的部分就是數據庫,要遠程的操作數據庫,PC 平臺有大量的數據庫組件實(shí)現對各種數據庫的支持,但是在嵌入式 Linux 平臺就沒(méi)那么豐富的組件資源可以利用。所以,開(kāi)發(fā)人員需要在服務(wù)器端實(shí)現一個(gè)“代理”,點(diǎn)菜機通過(guò)“代理”對數據庫進(jìn)行操作。這個(gè)“代理”不一定很復雜,但問(wèn)題是,它仍然會(huì )占用大量的開(kāi)發(fā)工作量,消耗工作時(shí)間。另外一個(gè)問(wèn)題在于,當這個(gè)系統功能需要改變時(shí),比如希望在點(diǎn)菜機界面增加顯示圖片的功能,客戶(hù)端和“代理”端都需要同步進(jìn)行開(kāi)發(fā),因此維護起來(lái)也是比較麻煩的。
實(shí)際上,這一類(lèi)的應用在 PC 上現在大多已經(jīng)由 C/S 模式轉向了 B/S 模式。既然現在嵌入式 Linux 平臺已經(jīng)有了 Web 的支持,那么在嵌入式 Linux 平臺 B/S 是否也同樣適用呢。對于點(diǎn)菜系統這樣的應用,假如我們在 pc 平臺已經(jīng)用 B/S 模式進(jìn)行了實(shí)現(與很多企業(yè)應用相比,這是比較簡(jiǎn)單的)。只要嵌入式平臺支持標準 Web,那么直接用嵌入式客戶(hù)端的瀏覽器,這套系統的遷移很可能只需要考慮嵌入式設備的屏幕尺寸問(wèn)題,把網(wǎng)頁(yè)顯示調整一下而已。
除了點(diǎn)菜機之外,物流行業(yè)中廣泛使用的條碼掃描機也是典型的應用之一。當貨物入倉之時(shí),工作人員用手持智能終端掃描條形碼,數據會(huì )上傳到服務(wù)器進(jìn)行處理。如果采用 Web 方式,嵌入式 Linux 端開(kāi)發(fā)工作量就會(huì )大大降低,只需要讀取條碼,然后通過(guò) Web 輸入即可。
聯(lián)系客服