只要在嵌入式設備中集成了Web服務器,就能實現用戶與嵌入式設備低成本、高通用性的信息交流,即客戶端利用HTTP瀏覽器,在任何時間、任何地點都能實現與嵌入式設備的信息交互??梢哉f,嵌入式Web的應用極大地促進嵌入式設備,特別是家電設備、通信終端、儀器儀表的信息交互和遠程控制功能。
在三網融合的大背景下,通過家庭網關實現外部網絡即電視網、電信網、因特網與家庭內部電話、電視、電腦以及家庭電器設備的通訊,是當前家居智能化、現代化的重要發展趨勢。本文的主要內容是研究基于家庭網關的嵌入式系統,實現簡單實用的Web服務器功能,為外部網絡提供一個方便快捷地訪問和控制家庭內部資源的平臺。由于Android操作系統能方便地將各種應用程序嵌入網絡,以及開放性好、支持硬件豐富的特點,本文選擇Android操作系統作為家庭網關設計的軟件平臺來建立Web服務器。
1 Android系統介紹
Android移動設備平臺是基于Linux內核再度開發的一個開源的操作系統和軟件平臺,最早期由Google公司進行研究和開發的。后來Goog le為了推廣此技術,它和中國移動、HTC、三星、摩托羅拉等幾十家手機通信運營商和制造商,建立了開放手機聯盟,共同開發Android移動設備平臺。
Android采用了軟件堆層的架構,主要分為三部分:其最底層是基于Linux內核進行再度開發的,Linux內核只提供最為基礎的功能;中間層包括由C++開發的虛擬機Virtual Machine(VM)和函數庫Library;最上層是各種應用軟件,包括通話程序、短信程序等。應用軟件則由各公司自行開發,以Java編寫。每個Android應用程序都在VM的一個實例中運行,這個實例駐留在一個由Linux內核管理的進程中。
本文實現的Web應用雖然基于Android操作系統,但并不像通常的Android APP那樣,需要一個AndroidManifest.xml文件包含必要的配置信息,且需要一個Activity類來提供UI。因為是Web服務不需要用戶圖形界面,只要用到Android提供的接口而已,即android.jar,這是一個Java歸檔文件,其中包含構建應用程序所需的所有的Android SDK類。而且,由于Android VM的原因,不能直接使用.class文件,需要轉換為.dex文件,這些內容將在下文詳細介紹。
2 系統設計
在嵌入式系統中,主控制芯片的選擇對于整個系統性能和良好運行有著至關重要的影響,在選擇主控芯片的過程中,需綜合考慮芯片自身的性能、兼容性、價格以及后續的升級等因素。綜合考慮以上因素,本文設計的家庭網關采用了Cortex—A8處理器作為硬件平臺。因為Cor tex—A8支持大型的操作系統,高頻率、高級存儲管理及豐富的外設接口,為Android系統的運行提供了良好的硬件基礎。
一個Web服務器也被稱為HTTP服務器,它通過HTTP協議與客戶端通信。這個客戶端通常指的是Web瀏覽器。Web服務器監聽瀏覽器的服務請求,根據用戶請求的類型提供相應的服務;Web服務器在接收到用戶端的請求后,處理用戶請求并返回需要的數據。這些數據通常以格式固定、含有文本和圖片的頁面出現在用戶端瀏覽器。本文Web服務器系統的設計架構如圖1所示。
目前常用的嵌入式Web服務器主要有boa、thttpd、mini_httpd、shttpd和lighttpd等,但它們都不能直接應用于Android系統上。本文選用代碼精煉、擴展性強的開源i-jettyWeb服務器,它可直接運行在Android系統上,為Servlet提供運行環境鈍能。
Servlet是一種獨立于平臺和協議的Web服務器端的Java應用程序,可以生成動態的Web頁面。與傳統的從命令行啟動的Java應用程序不同,Servlet由Web服務器進行加載。
一個Web服務器系統是離不開數據庫的支持。SQLite是一款輕型的數據庫,是遵守ACID的關聯式數據庫管理系統,它是針對嵌入式產品而設計的,它占用資源非常的低,在嵌入式設備中,可能只需要幾百K的內存就夠了。Android平臺集成了SQLite數據庫,并提供了操作的API。所以,只要在Servlet中引入開發Android程序提供的API,就能實現用Servlet操作SQLite。
本文下面主要介紹i—ierry web嵌入式服務器的搭建,以及如何實現Servlet對SQIrite數據庫的操作。
2.1 i-jetty Web服務器及其安裝
i—jetty是一個將開源Web容器Jetty移植到GoogleAndroid手機平臺的開源項目,可以使嵌入式設備上運行Web應用。Jetty是一個100%由Java實現的、開源的HTYP服務器和javax.servlet容器,它不僅僅作為一個獨立服務軟件(如Tomcat)被使用,而且其優良的組件(Compone t)設計、高內聚低耦合、高擴展性等特性使得Jetty非常易于作為嵌入式工具使用??傊琂etty具有的優點包括:
1)配置使用簡單;
2)設計模塊化,代碼簡練易懂;
3)Tomcat的應用移植到Jetty基本不用修改;
4)非常適合嵌入式產品,可擴展性好;
i—jetty是使用Java語言編寫的,它的API以一組JAR包的形式發布。開發人員可以j將Jetty容器實例化成一個對象,可以迅速為一些獨立運行(stand—alone)的Java應用提供網絡和web連接。使用簡單、配置簡單,體積很小,但它的功能齊全,并且還是一個Servlet容器,這就讓動態網頁實現和后臺操作(例如數據庫操作)成為可能。同時,i—jetty可以使用Android的接口,這就降低了開發的難度和復雜度。i—jetty與其他主流的服務器一樣,只要將已經做好的Web項目發布到服務器的Webapps目錄下,就能實現網站的正常運行,十分的方便。
下面介紹i—jetty服務器的安裝:
首先,在eclipse里創建i—jetty的android項目,將下載的i—jetty源碼覆蓋進去。然后,將下面目錄下的jar引入到i—jetty項目中:C:\Documents and Settings\org\eclipse\jetty,還需要servlet-api-2.5.jar。最后,編譯i-jetty,并將其安裝到設備中。此后,即可對服務器進行各種配置。若想要使用自己的Web應用,則可以將自己的Web工程打包成war包,并將war包直接放到/sdeard/jetty /webapps/目錄下。
2.2 Servlet和SQLite的設計與使用
Servlet是位于服務器端的Java應用程序,它由Web服務器進行加載。Servlet的主要功能在于交互式地瀏覽和修改數據,生成動態Web內容。Servlet可以用來擴充Java—enabled Server的基本功能,目前最常使用的是增加Web服務器的互動性。但它可以被用來擴充任何種類的服務器,如FTP服務器。
最早用來產生動態網頁服務的方法是CGI(Common Gateway Interface)。它的做法是透過Web服務器將客戶端的請求送給一個進程,這個進程再將請求的執行結果傳回客戶端,只要是一個新的請求,不管它是否和先前的請求相同,CGI都產生一個新的進程來處理,這樣非常耗費系統資源。在Servlet中每一個請求都是由同一個進程下的線程所服務,而且相同的請求會由同一個線程所執行。同時Servlet使用Java語言來開發的,具有跨平臺特性,而這個優點更是CGI所沒有的。因此,Servlet提供了強有力且具有效率的技術來取代CGI。
要在一個i—jetty的web工程中支持servlet,大致的步驟如下:
1)在ecplise中新建Android項目,并添加servlet的支持文件;
2)在項目中新建servlet并配置web.xml,編寫servlet;
3)編譯完成后會自動生成.class文件,需要將.class文件轉換成Android能執行的.dex文件;
4)將.dex文件和web.xml等文件按一定順序保存在一個web工程目錄下,然后打包成一個war包。
SQLite是一款輕型的數據庫,能夠跟很多程序語言相結合,比如Tcl、C#、PHP、Java等,還有ODBC接口,同樣比起Mysql、PostgreSQL這兩款開源世界著名的數據庫管理系統來講,它的處理速度比它們都快。不像常見的客戶端/服務器結構范例,SQLite引擎不是個程序與之通信的獨立進程,而是連接到程序中成為它的一個主要部分。所以主要的通信協議是在編程語言內的直接API調用。這在消耗總量、延遲時間和整體簡單性上有積極的作用。整個數據庫(定義、表、索引和數據本身)都在宿主主機上存儲在一個單一的文件中。Android操作系統采用標準SQLite數據庫,提供管理數據庫相關的API。所以,只要在Servlet中引入開發Android程序提供的API,就能實現用Servlet操作SQLite。Setv let調用SQLite數據庫的方法如下:
首先是數據庫的建立,在Android中使用SQLiteDatabase的靜態方法openOrCreateDatabase(String path,SQLiteDatabae.Cursor Fact ory factory)打開或者創建一個數據庫。然后創建表,為數據庫添加插入數據,刪除數據,修改數據,查詢數據等功能。最后是Servlet的設計,在eclipse中建立Androidproiect,在Web工程中導入android.jar,再引入需要的操作數據庫的類:
3 系統方案的測試
將裝載了Android系統的嵌入式設備連接網絡,查到其網絡連接的IP地址為192.168.137.96,將嵌入式web服務器i—jetty安裝到該設備,并且將設計好的web工程放在SD卡中的/jetty/webapps/目錄下。打開服務器,設置好HTTP的通信端口,開啟服務。
可知,家庭網關服務器端的地址為192.168.137.96。啟動i—jetty后,在瀏覽器地址欄輸入192.168.137.96:8080/temp,可以看到系統登陸頁面,如圖2所示。
這是一個用戶登陸界面,輸入用戶名和密碼后,主頁會將輸入信息提交到Login.java的Servlet里,由此Servlet來查詢數據庫,判斷該用戶是否合法。當用戶合法后,可以進入主頁界面,如圖3所示。
4 結束語
本文首先簡要介紹了Android系統,然后論述了實現嵌入式Web服務器和相關Internet技術,指出了在Android系統下實現Web服務器應要注意的事項。接著介紹了i—jetty的優點以及編譯安裝方法,了解了i—jetty是為數不多的可以在Android下運行的Web服務器,并且還是一個Servlet容器。將傳統的CGI與Servlet做了比較,說明了Servlet在Android系統下的優勢:Setvlet在動態網頁的實現方面更有效率。在后臺操作方面,Android并不支持類似PHP的網頁腳本語言,所以,Servlet是一個很好的選擇。在嵌入式系統里存儲信息,SQLite以其方便的操作,無需額外配置,體積小等優點,得到了廣泛的應用。
評論