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