近幾年,嵌入式 Linux 在智能設備中的應用發展的非常迅速。可以預見,嵌入式智能設備和我們的生活將會越來越密不可分。
應用分類
Linux 在嵌入式系統中的應用可以分為兩大類:面向服務類和面向應用類。典型的面向服務類系統有交換機、路由器、監控設備等;典型的面向應用類的系統有手機、PDA、機頂盒等。本文主要討論面向應用類,特別是指帶有網絡和 UI 的應用系統。
在嵌入式 Linux 上進行帶 UI 的應用程序開發是一件非常復雜的事情,主要涉及以下幾個方面:
UI 系統
Linux 本身的 UI 系統并不統一,嵌入式版本上的 UI 系統更是五花八門,而且與其 PC 版本相比也有一些適應性的改變。而有些產品的開發甚至不使用 UI 系統,通過直接往 framebuffer 貼圖的方式來實現 UI。而且與 PC 相比,嵌入式系統的性能問題,也讓嵌入式的 UI 系統在表現上做出很多妥協。這些都使得開發難度增加,帶來更多的不兼容問題。這些都使嵌入式 Linux 上的應用開發和移植變得更加困難,另外也使培養一名合格的嵌入式工程師的成本變的比較高。
廠商支持
對于一個嵌入式平臺,其主芯片的生產商對這個平臺影響巨大。一般來說,生產商會提供對某個或者某些 UI 系統的支持,但是他們不可能支持所有的系統。所以,選定一個嵌入式平臺就意味著開發團隊需要切換到這個平臺所能支持的 UI 平臺上。這個團隊之前做的應用就需要移植到新的 UI 平臺,而這個移植是非常麻煩的。
瀏覽器
嵌入式 Linux 的網絡接口一般都支持 posix 的標準,但是嵌入式設備的瀏覽器則與 UI 系統一樣是五花八門的。在應用的推動下,嵌入式 Linux 平臺上的瀏覽器在近年發展也非常迅速。他們基于不同的 UI 平臺進行開發(也有一些直接操作 framebuffer),對 Web 標準的支持和兼容性各不相同。比較簡單的瀏覽器只能支持 HTML 標簽,優秀的產品則能在兼容性上做到與 PC 平臺上的瀏覽器幾乎同樣的水平。
服務器技術
很多嵌入式應用需要與服務器進行連接,點菜機就是一個典型的應用。手持智能設備端需要將用戶的操作寫入遠程的服務器,然后遠程的信息管理系統進行進一步的處理。這種類型的應用對于 PC 平臺來說就是一個非常簡單的數據庫應用系統,數據庫、遠程調用、并發、中間件等技術已經應用了多年,而且還有眾多成熟的企業應用的框架,可以靈活而快速的搭建出一個系統。但是這些在嵌入式平臺都是不存在的,這意味著開發人員還需要用相當于 PC 平臺十幾年前的水平來進行開發,為了讓嵌入式系統和服務器的數據庫進行對接,開發人員還需要在服務器端編寫一個專門的程序來充當橋梁的作用。筆者見過在不少項目里還需要直接控制 socket 來和服務器進行數據交換,這些對于 PC 平臺都是不可想象的。另外開發一個支持多個客戶端并發的穩定服務器程序并不是一件容易的事情,這些問題都會影響整個嵌入式開發過程的成本和質量。
如果一個公司希望在某個嵌入式 Linux 平臺上開發一個包含了 Web 瀏覽的應用,而他自己之前并不擁有一個完善的平臺的話,其開發團隊首先需要選定一個 UI 系統,然后尋找一家做瀏覽器的公司,與其合作,再想辦法將瀏覽器移植到自己的平臺上。如果是需要在自己的應用程序中嵌入一個瀏覽網頁的窗體,那么問題就會更加復雜,因為還涉及到與選定的瀏覽器進行代碼或者模塊級別集成的問題。
Qt 和 WebKit 簡介
Qt 是一個跨平臺的 C++ 圖形用戶界面應用程序框架,對 Windows、Linux、Mac OS X、Unix、Free BSD 等主要的操作系統均有支持。Qt 不僅包含了圖形界面庫,還集成了 Network、File、IO、Database、2D/3D、XML 等模塊,基本涵蓋了一個應用程序所需要的所有功能,這些讓 Qt 成為最有影響力的跨平臺框架,Linux 平臺上的 KDE 就是基于 Qt 開發的。Qt Embedded 則是 Qt 針對嵌入式平臺的版本,在嵌入式平臺的 UI 市場占有很大的份額。
Qt 可以解決上一節所討論的很多問題,因為其優異的跨平臺性能,開發人員甚至可以在 PC 上進行開發調試,然后直接將代碼放到交叉編譯環境中生成嵌入式版本,這樣的移植基本不需要改動代碼。
WebKit 是一個開源的瀏覽器引擎,目前 Safari,Chrome 等瀏覽器均使用了 WebKit 作為核心。Qt 從 4.5 版本開始,集成了 WebKit 作為 Qt 的平臺組件,用戶可以像使用其他組件一樣將 WebKit 引擎集成到自己的應用程序中,以提供 Web 的支持。
在應用程序中添加網頁瀏覽的支持
通過網址 http://qt.nokia.com/downloads 可以找到 Embedded Linux 版本的最新 Qt 源代碼。現在最新版本是 4.5.3。
WebKit 作為第三方資源可以在如下目錄中找到:
\qt-embedded-Linux-opensource-src-4.5.3\src\3rdparty\WebKit\
Qt 中對 WebKit 做了封裝,主要有以下幾個類:
QWebView 最常用的類,這是一個窗體控件,可以用來渲染網頁?
QWebPage 被 QWebView 包含,表示一個 documentQWebFrame 被 QWebPage 包含,表示一個 frameQWebSettings??? Web 渲染的全局設置 QWebHistory 用于瀏覽的歷史記錄
QWebView 是最常用的類,接下來我們大概的介紹一下這個類的組成。
根據頭文件定義,我們可以得知這個類與 Qt 中按鈕、對話框等一樣,都是由 QWidget 派生,可以當做一個通用窗體來使用。
class QWebKit_EXPORT QWebView : public Qwidget
這個類有如下的成員函數:
void load ( const QUrl &url );
void setHtml ( const QString &HTML, const QUrl &baseUrl = QUrl() );
這兩個函數可以讓 QWebView 加載網頁或者顯示一段 HTML 內容,是 QWebView 最重要的函數。
這個類還有幾個重要的 slot:
void stop ();
void back ();void forward ();void reload ();
這幾個函數也是我們平時瀏覽網頁時常用的功能。
QwebView 類還有幾個重要的 signal:
Q_SIGNALS:
void loadStarted (); void loadProgress ( int progress ); void loadFinished ( bool );
很明顯,這幾個 signal 是用來顯示網頁的加載過程。
接著我們通過代碼來看 QWebView 是如何使用的。假設程序有一個主窗體 MainWindow,在 MainWindow 的構造函數中,有如下代碼段:
清單 1. MainWindow 構造函數的代碼段
QWebView* view = new QWebView ( this ); // 設置窗體左上角的坐標以及長寬 view -> setGeometry( 50 , 50 , 400 , 300 ); view -> show(); view -> load( QUrl("http://www.google.com") );
設備網絡配置好之后,運行程序,我們就可以看到在窗體中有一個區域顯示出 google 的主頁(編譯的時候要注意在項目的 pro 文件中包含 WebKit 的頭文件路徑和動態庫)。可見,Qt 已經將 WebKit 做了很好的封裝,子應用程序中加入網頁瀏覽功能是非常方便的。
如果希望能知道網頁加載的進度,可以通過如下的代碼來實現:
首先實現槽函數的定義:
清單 2. 槽函數的定義
Private slot: void setProgress(int progress) {? // progress,即百分比進度 } void loadFinished() {? // 表示網頁加載完畢 }
第二步連接 Qt 的信號與槽函數:
清單 3. 連接 Qt 信號與槽函數
connect(view , SIGNAL(loadProgress(int)), this, SLOT(setProgress(int))); connect(view , SIGNAL(loadFinished(bool)), this, SLOT(loadFinished()));
這樣,在程序中加一個進度條表示網頁加載過程就實現了。
用 Web 取代本地 UI 的應用
在嵌入式 Linux 智能設備上有一個典型的應用:信息機,或者廣告機。這種機器一般都帶有一個屏幕,有些會有觸摸屏。屏幕上會組合顯示文字、圖片和視頻,或者提供簡單的查詢功能。這種類型的設備最先是由內置 PC 來實現的,在各種服務大廳供用戶使用。現在普遍使用嵌入式系統來取代 PC,以降低成本。
我們在銀行、通信運營商服務大廳、醫院、電梯房等地方經常能看到各種各樣的廣告機。一個典型的屏幕顯示情況如下:
圖 1. 廣告機屏幕示例
?
?
這是組合比較復雜的情況,也有整個屏幕就是文字、圖片或者視頻的。與傳統和大型軟件開發相比,實現這樣的功能看上去并不算很難。開發人員可能需要在嵌入式平臺自己去實現字幕、圖片和天氣的顯示組件或者模塊(暫時忽略視頻播放功能),然后在屏幕上進行顯示即可。比較困難的地方在于以下幾個方面:
內容顯示
圖片和字幕需要以某種格式進行存放,天氣信息來源于 Internet,開發人員需要編寫代碼對這些內容進行顯示,并根據不同規則對內容進行切換。如有以下的配置文件內容:
清單 4. 屏幕配置文件 1
30 1.jpg 1.txt 1.avi http://xxxxx.HTML 25 2.jpg 2.txt 2.avi http://xxxxx.HTML ... ...
開發人員需要編寫一個解析器,能夠解析這個 xml 文件,并且按照其中的規則進行內容的顯示。
內容更新
如果需要對廣告機的內容進行更換,維護人員則需要將內容按照這個格式進行編排。編排的效果是需要反復調整的,這個時候,要不就是每次都用一臺廣告機來看實際效果,要不然可能還需要專門設計一個預覽程序。
顯示布局
屏幕的顯示布局很可能也是要變動的,那么意味著布局最好也是可配置的,折舊要求廣告機程序能夠解析并且實現顯示布局的配置。如果說解析上面的配置文件并不是很麻煩的事情,但是如果配置文件變成下面這樣,就不一樣了。
清單 5. 屏幕配置文件 2
30 1.jpg 1.txt 1.avi http://xxxxx.HTML 30 2.jpg 22.jpg 2.txt 22.txt 2.avi http://xxxxx.HTML ... ...
不但各種元素的位置可配置,圖片、文本等的數量也發生了改變。這個時候,解析程序將變得相當復雜。當更多的需求出現,如要求配置滾動字幕的速度、背景顏色,要求圖片和文字等內容可以單獨配置刷新時間等,這樣的配置文件不會比 HTML 標準簡單,而解析程序的規模也將急劇膨脹。
綜上,廣告機的軟件關鍵并不在于內容如何能顯示出來,而是軟件需要有復雜的解析能力,能夠支持可配置的布局和內容。目前這些廣告機的配置文件大多使用 xml 來存儲信息,而一個能夠同時解決復雜布局和內容顯示的程序,實際上已經非常類似瀏覽器的概念了。那么,讓我們從真正的瀏覽器的角度來看待廣告機的這些問題。
如果把屏幕內容當成一個網頁的話,屏幕布局、內容顯示、更新、維護等都轉換成了設計網頁的問題,而最關鍵的解析程序的開發可以忽略,用已有的成熟的瀏覽器取代。這里的網頁設計并不關系到網頁服務器端的開發,因為廣告機的內容大多是存儲在本地,所以只需要直接設計頁面。頁面內容的更新,或者整個頁面的更新都可以通過標準 HTML,或者 JavaScript 之類腳本里實現。對于“天氣”播放功能的實現就更加簡單了,之前的方式需要編寫程序通過網絡從遠程獲取數據然后顯示,比較麻煩。轉換成網頁模式之后,只需要在網頁中嵌入一個子網頁,指向遠程的服務器鏈接即可。可見,以廣告機為例,在架構上使用網頁來取代之前的模式,能充分利用已有的資源和工具,極大的減少開發的工作量。
我們再考慮另外一種應用:帶交互的信息查詢機。帶交互功能的信息機主要提供給人們索引和查詢信息的功能,信息被分類并且根據索引存儲,信息機的解析程序通過與用戶的交互,顯示所需要的信息。實際上,交互和索引跳轉是網頁天生的特性,所以,同樣可以采用網頁和瀏覽器的模式取代編寫本地程序進行交互和解析,可以把幾乎所有的工作轉換成網頁設計,從而將開發工作量減到了最低。
從 C/S 到 B/S 的轉換
在嵌入式智能設備的應用中,有很大一部分是嵌入式智能終端需要與遠程的服務器進行連接,通過人機交互和數據采集來實現應用,比較典型的就是點菜機。
無線點菜機是一種很常見的嵌入式智能設備,大多采用 Windows CE 或嵌入式 Linux 作為操作系統。如果把點菜機當成一個 PC 系統,那么這就是一個非常典型的客戶端 / 服務器架構的應用。
圖 2. 無線點菜機系統示例
?
如圖 2 所示,點菜機通過 WIFI 與服務器相連,通過網絡與服務器通訊進行點菜操作,廚房端也有客戶端與服務器相連,根據點菜情況進行菜品制作的安排。忽略 PC 和嵌入式開發的差異性,這個應用的實現過程和原理與 PC 基本是一致的。不同的是,通過網絡實現業務的調用,如我們在前面提到過的,這在 PC 平臺上已經有了很多資源甚至成熟企業應用框架,但是在嵌入式 Linux 平臺上幾乎都沒有。所以,開發人員需要自己來實現點菜機和服務器之間的業務調用,進而與服務器端的業務處理部分進行集成。
對于服務器而言,最重要的部分就是數據庫,要遠程的操作數據庫,PC 平臺有大量的數據庫組件實現對各種數據庫的支持,但是在嵌入式 Linux 平臺就沒那么豐富的組件資源可以利用。所以,開發人員需要在服務器端實現一個“代理”,點菜機通過“代理”對數據庫進行操作。這個“代理”不一定很復雜,但問題是,它仍然會占用大量的開發工作量,消耗工作時間。另外一個問題在于,當這個系統功能需要改變時,比如希望在點菜機界面增加顯示圖片的功能,客戶端和“代理”端都需要同步進行開發,因此維護起來也是比較麻煩的。
實際上,這一類的應用在 PC 上現在大多已經由 C/S 模式轉向了 B/S 模式。既然現在嵌入式 Linux 平臺已經有了 Web 的支持,那么在嵌入式 Linux 平臺 B/S 是否也同樣適用呢。對于點菜系統這樣的應用,假如我們在 pc 平臺已經用 B/S 模式進行了實現(與很多企業應用相比,這是比較簡單的)。只要嵌入式平臺支持標準 Web,那么直接用嵌入式客戶端的瀏覽器,這套系統的遷移很可能只需要考慮嵌入式設備的屏幕尺寸問題,把網頁顯示調整一下而已。
除了點菜機之外,物流行業中廣泛使用的條碼掃描機也是典型的應用之一。當貨物入倉之時,工作人員用手持智能終端掃描條形碼,數據會上傳到服務器進行處理。如果采用 Web 方式,嵌入式 Linux 端開發工作量就會大大降低,只需要讀取條碼,然后通過 Web 輸入即可。
?
評論
查看更多