CIO
|
PCDIY!
|
旗標圖書
|
旗景數位影像
|
讀者服務
首 頁
即時新聞
業界動態
最新活動
企業採購
精選文章
線上教學
品牌活動
程式碼下載
雲端運算智庫
最近新增的
精選文章
AP內建AI引擎 Mist Cloud平台分析能力強 Juniper Mist AI領先全球 改善WiFi穩定、效能首選
解決IT供應鏈攻擊
內部威脅的七個警訊
遠百以專案辦公室推動數位體驗
多廠牌與多重電信業者網路架構的挑戰與機會
德明科大啟用電貿暨AI實習基地 ViewSonic ViewBoard 智慧互動電子白板 扮要角
淺談計算誤差
秀傳醫療體系統 以Lenovo HyperConverged HX 超融合架構扎穩智慧醫療發展基礎
模組化設計 偵測率達99.99% 全面防杜惡意郵件入侵 首選Cellopoint Email UTM
滿足網路管理與檔案安全傳輸需求,Ipswitch的MOVEit及WhatsUp Gold一次完整提供
來自學界的資料分析利器 - Weka 與 R
北醫建置肺癌資料庫,透過深度標註訓練AI,協助醫師早期發現癌症
北榮AI門診上路!人工智慧判讀腦瘤,有效縮短醫師確診時間
台灣智慧機器人玩具聯盟攜手英閱音躍研創 推廣T. Robot程式教育,協助國中小學扎根培養運算思維
一場與時間賽跑的戰役 ,人工智慧加速心血管疾病診斷
最多人點閱的
精選文章
免費IT建置--Linux系統操作與管理
初探Hadoop開放原始碼平台環境
免費IT建置--網頁伺服器的完美組合LAMP(下)
免費IT建置--檔案共享與檔案伺服器
Linux下的防火牆(基礎篇)
Linux下的防火牆(進階篇)
N.Y.BAGELS CAFE善用SAP Business One
手機程式設計入門與應用 Android、iPhone、Windows Mobile─ 影片播放器範例
手機程式設計入門與應用 Android、iPhone、Windows Mobile─ 線上查詢匯率
手機程式設計入門與應用 Android、iPhone、Windows Mobile─ 擲骰子遊戲
手機程式設計入門與應用 Android、iPhone、Windows Mobile─ 音樂播放器範例
手機程式設計入門與應用 Android、iPhone、Windows Mobile─ 來電黑名單
免費IT建置--網頁伺服器的完美組合LAMP(上)
手機程式設計入門與應用 Android、iPhone、Windows Mobile─ 繪圖板範例
手機程式設計入門與應用 Android、iPhone、Windows Mobile─ Matrix應用範例
精選文章 - 開發技術
分享到Plurk
分享到FaceBook
Android SDK通用程式設計實務 -當綠色機器人碰到了藍天雲端
文‧圖/何孟翰
2011/12/9 下午 03:35:39
雖然說現在的記憶體愈來愈便宜,但是由於手機有體積和耗電的限制,所以它的運算效能和記憶體容量總是有限。因此你可以預見的是,手機沒有辦法像是桌上型電腦不斷的擴充它的硬體機能,因此需要的反而是一些協助的軟體與服務,以便讓手機將更大量的運算與更大量的儲存空間可以委任給遠端的伺服器。因此不管是Amazon的 EC2, Windows平台的Azure,或者是Apple的iCloud,都是我們可以思考實作的服務對象。
而說到雲端服務,大家大概都同意是以Http為協定的服務,將運算和儲存的需求封裝在後端的複雜服務中,一個簡單的示意圖是如圖1。
▲ 圖1 由手機連線至雲端服務的示意圖
事實上如果移除了手機具有移動式運算的這個特性,你可以發現手機的這種運算和網頁的連線方式並沒有不同。網頁的連線是屬於一種B2C,而且是由一個服務器連線到N個客戶端的N-Tier的主從式架構。因此你可以想像現在的雲端式架構,除了內容的服務會客制化以便更符合需求之外,其實雲端內部的硬體與一些快取的機制和之前N-Tier主從式網頁架構並沒有什麼太大的不同。
當然雲端的實作也是另一個很有趣的課題,在RunPC和 CIO中也有許多不同角度的討論。然而在這裡讓我們先專注在雲端,特別是在這種手機至雲端連接的部份開始討論,看看如果以開發者的角度,如何建立Android裝置至雲端的連線並且取得服務。
連線的方式
當然如果要使用Http服務,由於Android是基於Linux和Java的組態,所以你可以想像在Java中不管你是要使用java自己所提供的URLConnection或者是HttpClient,都可以輕易的達成使用Http來存取網頁伺服器的需求。然而更一般的來說,你可以把一般的HTTP所取得的 HTML當作是給人類所使用的輸出結果,而對於程式來說,一般會使用更通用的 Web Services服務。
實作一個Web Sevices服務
因為開發Android的環境是使用Eclipse作為整合介面的開發工具,而且是基於Java的語言,所以讓我們儘量使用同樣的語言與環境,讓你能夠儘量在同樣的環境底下使用Java作為語言,完成Web Services的部署。同時更基於本文一系列標榜開放源始碼與低成本的傳統,所以找的解決方案或許不是現階段的最佳產品,但是儘量會在免費且是有公開社群支援的情況下,替各位讀者找到一個可以快速上手實作並且實現自己購想的組合。
在Eclipse底下安裝 WTP
要能夠開發web services的應用程式,事實上是需要J2EE,也就是網頁端的開發元件。因此請你先點擊Eclipse底下的Help,並且點擊Install New Software,接著選取你的Eclise的軟體倉儲(例如如果你是Eclipse 3.7/3.8則你可以選擇Indigo的Repository),此時在Web, XML, Java EE, and OSGi Enterprise Development下可以看到需要安裝的元件。讓我們選用Axis2 Tools (作為Web Services開發之用 ),Eclipse Java Web Developer Tools (實作JSP),Eclipse Web Developer Tools(一般網頁),與JST Server Adapter, JST Adapter Extensions, JST Server UI (作為使用Eclipse操作J2EE的伺服器如Tomcat等等 ),Java EE Developer Tool,最後再將WST Server Adapters勾選起來,按下Next之後,你可以檢查一下安裝的元件是不是如圖2。
▲ 圖2 在Eclipse安裝選定的Web開發套件
如果你之前的Eclipse都是以開發Android的應用程式跟 Java 的應用程式為主,那你可能需要多花一些時間等待這些元件都安裝妥當。等到安裝妥當之後,系統會要求你重新啟動,你只要再重新啟動Eclipse讓這些變更生效即可。
在Eclipse中組態AXIS
因為Web Services在這個連線的情境中是很重要的一環,所以讓我們從這邊開始。在此處我們選用的是Apache的AXIS,它是Apache所實作的一個SOAP套件。SOAP是Simple Object Access Protocol的縮寫,也是一個已經被W3C所公認的介面。因此不只是Java社群,事實上在Microsoft的平台底下也有類似的SOAP實作,如果你是使用微軟的平台,可以自行參照其它的文件辦理。
SOAP可以看作是一個輕量的協定,可以用來交換結構化的資訊,它使用XML作為底層的協定,並且有一個信等來定義內存的訊息,以及要如何存取它。同時也有一系列的規則來顯示資料的實例與型態,並且會有一個讓遠端呼叫的參數與回應的列表。因此藉著這個機制,客戶端(可以是網頁,或者是我們的Android應用程式)可以輕易的和伺服器溝通並且取得需要的訊息。
因此你可以在axis.apache.org/axis底下取得這個axis的二進位碼,將它解開後你會看到有bin放著一些執行檔,並且在lib底下會有一些函式庫,讓我們稱解開的這個目錄為
。既然使用了Eclipse並且安裝了plugin,我們不需要直接使用這些檔案和函式庫,可以使用Eclipse介面來幫助我們完成這個部份。然而,我們需要設定Eclipse,讓這個 plugin可以使用到我們下載並且安裝的這個AXIS環境。
因此請你打開Eclipse的 Preference,你可以在Web Services的類別下找到一個Axis2 Preferences的偏好設定如圖3,在此處請你將
填入。如果你看到Axis2 runtime loaded successfully,即是已經完成了Axis2的組態,則我們就可以準備下一個元件的安裝。
▲ 圖3 在Eclipse底下設定 AXIS的下載位置
設定應用程式伺服器
相信讀者一定知道,所謂的web services就是使用web 伺服器所提供的服務。因此再來我們需要組態J2EE的應用程式伺服器。你可以選擇自己常用的應用程式伺服器,例如Oracle的glass fish J2EE標準應用程式伺服器實作(就是之前從Sun合併之前的glass fish),或者是使用其它如JBoss等等你所熟悉的應用程式伺服器。此處讓我們使用最輕量最簡單的Tomcat作舉例,你可以在tomcat.apache.org底下選擇你所想要的版本。最新的tomcat是到7.0,可以支援到Java7,在此處讓我們使用Tomcat 6.0.33的穩定版本來舉例,同樣的請你將它下載在本地端並且解開它,並且讓我們稱這個解壓縮的目錄為
。
之後同樣請你打開eclipse的偏好設定,在Server的類別底下可以看到有一個Runtime Environment,你可以點擊Add來新增一個應用程式伺服器的組態如圖4。
▲圖4 設定應用程式伺服器的版本
在下一個畫面,請你提供剛才的
到tomcat installation directory,而在JRE的部份,請你提供JDK的安裝目錄,如果沒有設定正確的JDK請你進Preference中也將它設定正確,設定完成的畫面如圖5。
▲ 圖5 完成Tomcat的設定畫面
都設定好之後,按下Finish就完成了 Tomcat的組態。如此在完成了伺服器的組態與Web Services的工具設定之後,讓我們先作一個簡單的 Web Services再來想想如何使用Android的客戶端進行連線。
進行Web Services的撰寫
基本上一個Web Services也是一個web的應用程式。因此我們可以新增一個web的J2EE應用程式並且開始實作它的內容。你可以在新增的專案精靈中看到有一個 Web的類別,在它底下有一個Dynamic Web Project的專案如圖6,請你選擇它並且按下下一步。
▲ 圖 6 新增一個Dynamic Web Project的專案
在此處請你填上專案的名稱,Target Runtime中選擇之前你所設定的應用程式伺服器(如Apache Tomcat 6),同時請你按下Configuration底下的Modify...如圖7,你可以將 Axis2 Web Services勾選起來。
▲ 圖7 設定 Axis2 Web Services
再來請你按下一般的設定,就可以完成簡單的J2EE的網頁專案。此時我們已經完成了大致的設定,再來讓我們實作一個Web Services。
定義Web Services
如果你對Web Services並不是太熟悉,那你可能會擔心是不是一個很複雜的結構使用很龐大的XML包起來的組態。事實上在實作時你完全不用擔心,你只要想像你想要這個Web Services提供什麼樣的服務即可。因此,讓我們舉一個最簡單的方式,讓這個Web Services提供一個Hello的函數,不需要傳入任何參數,並且會輸出"CIO Magazine"。因此你可以創立一個類別FlagInfo,並且實作一個函數hello直接回應出"CIO Magazine"即可。
產生Web Services的元件
產生完這個類別之後,再來讓我們看看如何產生出對應的web services服務。你可以在這個類別上按右鍵,按下Web Services,並且按下Create Web Services,你可以看到如圖8的畫面。
▲ 圖8 產生web services的畫面
在此處你可以看到大致上的組態都是正確的,但是我們要使用的web services runtime不是Apache Axis2而是Apache Axis,此時請你點擊這個Apache Axis的link並且更改它成為Axis2如圖9。
▲ 圖9 設定Web Service的runtime是Apache Axis2
再來你可以直接按下Finish,完成這個元件的部署。事實上如果你的設定都是正確的,那麼你應該在按下Finish的時候,就完成了專案的部署,同時也會啟動tomcat的引擎,所以我們就可以來觀察結果。
部署的web services
如果你的環境沒有特別的設定,tomcat會部署在你的localhost底下的port 8080,並且會以你的專案名稱作為應用程式的名稱,也就是說,你會看到一個http://localhost:8080/RunPC的 URL,並且看到它的結果如圖10。
▲ 圖10 使用AXIS建立的web services
你可以看到Services,點擊進去可以看到AXIS所生成的服務如圖11。你可以看到除了FlagInfo之外,還有一個Version的服務,在FlagInfo下你可以看到它有一個可以使用的操作動作是hello的函數。而在Version的服務可以看到一個getVersion的函數。
▲ 圖11 檢視合適的函數
以FlagInfo來說,這個服務的定義是在一組叫作WSDL的XML之中定義的。你可以直接點擊FlagInfo之中看到它的內容如圖12。在這邊看起來是一組複雜的XML,但是你不用太擔心,在這邊我們需要注意的只有幾個重點。第一個是你可以看到targetNamespace指的是http://foo,也就是你的package名字,這個在之後的客戶端聯線時會需要使用。另外在這個WSDL之中你也可以看到所需要傳入的參數與傳回的參數。不過在這個例子之中為了簡便,我們使用沒有參數的方式來實作,所以不需要太仔細看這個檔案,你只要了解它的結構即可。
▲ 圖12 檢視產生的 WSDL檔案
在知道了WSDL的檔案之後,讓我們看看這個web services到底提供了什麼樣子的服務。你可以看到我們有一個服務是FlagInfo,裡面有一個函數是hello,它會提供CIO Magazine的這個字串。因此就讓你使用如下的URL,讓我們先用手動來設定。你可以在瀏覽器底下輸入http://localhost:8080/RunPC/services/FlagInfo/hello,也就是在services底下先輸入你的類別的名稱再輸入函數的名稱,則你可以看到如圖13的結果。
▲ 圖13 查詢hello函數的結果
你可以看到這是一個簡單的 XML格式,中間有xml:ns對應的是http://foo,也就是namespace,另外看到傳回的正是CIO Magazine的字串。
從上面的這個例子,你可以想像AXIS就像是一個包裝紙,幫助我們將一個類別包裝具有http與XML的 SOAP結構的網頁應用程式和URL。因此再來我們就可以在手機的客戶端進行存取的任務。
使用 Android進行存取
在Android底下要存取SOAP的web services,你可以使用ksoap2的函式庫,現在ksoap2是被host在google的專案底下,你可以去code.google.com/p/ksoap2-android/專案底下去下載它的二進位檔。下載後解開後看到一個ksoap2-android-assembly-XXX.jar,你可以放在任何一個地方備用。
在一般的android專案底下,由於這個函式庫並不是android預設的函式庫,所以你不能直接使用它,你必須要作一個匯入的動作,請你打開你的android專案,並且按右鍵點擊屬性,在專案的偏好設定目錄下,點擊Java Build Path,並且按下Add External Jars,並且將這個Jar檔案加入專案中。加入之後,你的專案空間應該可以看到有一個參照的函式庫,底下有你剛才下載並且設定的ksoap2-android-assembly-XXX.jar檔案如圖14。
▲ 圖14 將函式庫加到android的專案中
結語
在本文中我們實作了一個本地端的Web Services並且使用一個Eclipse的客戶端作連結。雖然說整個結構並不是太複雜,但是其實一般的情形你會使用其它公司所提供的web-services,將你的需求遞交進雲端的伺服器,再取出結果並且展現在畫面上。因此真正需要的知識還是回到Android如何使用Java來設計使用者元件,並且使用這些ksoap的函式庫來和遠端的web services進行互動。我們會在後續的文章中繼續討論這些議題中值得注意的事項。
回首頁...
關於RUN!PC
|
廣告刊登
|
聯絡我們
|
讀者服務
|
雜誌訂閱
|
出刊&補寄時間
-- Copyright© FLAG INFORMATION CO., LTD. 旗訊科技(股)公司. All rights reserved. 本站圖文著作權所有 未經授權 不得任意轉載使用 --
-- 請使用1024*768螢幕解析度,IE 7.0或firefox 3.0以上瀏覽器,以達到最佳閱讀效果--