文獻標識碼: A
文章編號: 0258-7998(2012)08-0129-04
隨著移動互聯網的快速發展,云計算在移動平臺的應用引發了一場變革。在移動領域的云計算(移動云計算)是利用云計算技術解決移動終端的存儲和數據處理等問題,幫助用戶擺脫硬件設備、存儲設備、應用程序等條件的限制,實現將移動終端應用的“計算”從終端轉移到服務器端, 從而弱化了對移動終端設備的處理要求[1]。Openmobster是一個開源的集成了手機應用的云服務平臺,具有開發手機同步應用、開發推送應用、開發離線手機應用、應用開發框架、移動云服務的服務器端開發框架和管理控制臺等特征。其目的是讓應用開發人員省掉開發底層同步及消息通知中間件的工作,只需將注意力集中于更好地實現業務需求上。
本文介紹了一種基于Android智能終端的遠程控制系統,在系統中Android手機利用周圍的無線網絡資源,與云端服務器自發交互,如遠程下發通知、遠程設置密碼、遠程GPS定位、遠程數據同步等操作。通過該系統使云計算真正“落地”,實實在在地為手機提供服務。
1 Openmobster平臺的概述
1.1 Openmobster對應用的支持
(1)數據同步
無需任何特定的設備間的同步程序,即可支持云端和終端間數據的自動同步。允許應用工作于在線或離線模式,一旦檢測到終端數據狀態變更,立即發起對云端的自動數據同步。
(2)實時推送通知消息
云端的狀態變更可以通過實時消息推送通知到終端,該推送機制使用基于網絡Socket的方式,而不是發送短消息或電郵的方式。
(3)移動遠程調用(Mobile RPC)
提供了一種訪問云端服務的方式,無需復雜的網絡底層編碼(http編碼)即可通過RPC API接口進行調用。
(4)管理控制臺
提供了一個管理控制臺用于對云端服務器進行管理(含安全認證、賬號設置等)。
1.2 Openmobster平臺的架構
(1)網絡拓撲結構
Openmobster平臺的網絡拓撲結構如圖1所示[2]。
(2)終端軟件堆棧結構
Openmobster平臺的終端軟件堆棧結構如圖2所示。主要包含以下模塊:
同步模塊:自動將所有本地狀態變更與云端數據保持同步。
推送模塊:管理來自云端服務器的狀態更新通知,從而改善了用戶體驗,使其不必主動查詢新的通知。
離線應用模塊:用于Sync模塊和Push模塊之間的管理協調,用戶可不必關注任何實際同步流程的細節,也不必關注如何處理收到的推送通知消息。
遠程調用:支持從終端到云端MobileServiceBean的同步遠程調用。
網絡連接:管理云端服務器建立的網絡連接,管理接收來自服務器通知的通信頻道。
Inter-App總線:提供了安裝在設備上的Apps/Moblets底層通信協調。
(3)云端軟件堆棧結構
云端軟件堆棧結構主要包含以下模塊:
①同步模塊:同步設備側數據狀態變化到后端服務,這里使用了數據頻道的概念。
②推送模塊:監視數據頻道的更新,一旦發現數據有更新,將發送基于Comet的通知到終端。
③安全模塊:提供了身份驗證和鑒權,以確保連接至服務器的終端得到許可。
④Secure Socket-Based Data Service:這是一個高性能的基于Java NIO的Socket服務器。
⑤Mobile RPC:服務器端的RPC框架。
⑥Management Console:管理控制臺。
2 系統總體設計
系統的總體設計思路是將Openmobster的Jboss服務器部署在一臺PC上,負責提供底層服務并與用戶的Android 手機進行通信。將Openmobster平臺的客戶端CloudManager安裝在手機上,提供管理界面,如用戶登錄、設備激活、推送通知、數據同步、查看網絡連接狀態等。可見這是一個C/S架構的系統,其中PC作為服務器,Android 手機作為客戶端。
在該系統中,PC首先連接到網絡并獲取IP地址,然后將Openmobster的服務器根據此IP地址部署在PC上。Android手機通過打開WiFi連接到此網絡,根據部署服務器的IP地址登錄并激活手機客戶端。用戶便可以通過自己設計的網頁界面下發控制命令到手機終端,JSP模塊獲取并封裝這些命令字段后下發給云服務器端。CloudServer模塊根據 Openmobster平臺提供的一系列接口和通道,將這些命令最終下發給手機終端并執行相應的操作。系統的總體結構如圖3 所示。
圖3所示結構圖主要涉及以下功能模塊:
(1)Jboss服務器:Openmobster的服務器均采用Jboss來搭建服務器。
(2)JSP代碼:網頁界面下發的命令字段通過JSP代碼封裝并下發至云服務器端的工程。
(3)網頁:由于Openmobster只有控制臺沒有自己的網站,操作起來極其不便。因此在本文中設計了一個網頁界面,實現與用戶的交互。
(4)HSQLDB數據庫:建立一個數據庫,方便用戶數據的存儲和讀取。
(5)Hibernate:建立與數據庫的映射關系,方便用戶查看所需要的數據。
(6)Openmobster:為手機云應用的開發提供基本的支持。
(7)Android:手機終端應用開發。
(8)CloudManager:安裝在手機上的客戶端。
3 系統的具體實現
3.1搭建開發環境
(1)云服務器端
由于Openmobster平臺運行于Jboss服務器上,所以先搭建Jboss服務器,下載Jboss軟件并進行相關配置使得Jboss主頁能夠訪問。然后對所使用的數據庫預先進行配置,并將數據庫中的Openmobster目錄拷入server下。具體步驟如下:
首先打開Windows控制臺,進入到$JBOSS\bin目錄下,運行:
Run -c openmobster -b “IP address”以啟動JBoss服務器。
然后在瀏覽器中運行http://{IP address }:{port}/o確認服務器已正常啟動。
使用管理控制臺,進入$Openmobster \cloudConsole\bin目錄下,運行以下腳本:openmobster.sh或openmobster.bat啟動控制臺。
如果是第一次運行,使用如下命令配置root賬號:
configure -a {cloudServer IP Address} -po 1502 -u root -p { password }
然后以root賬戶登錄:
startadmin -u root -p { password }
最后配置其他普通用戶賬號:
register -u {email of the user being registered} -p { password }
(2)手機終端:
手機終端也需要安裝相應的Openmobster的服務模塊,該服務模塊需要開機自啟動。
將CloudManager app模塊安裝到手機,然后啟動該應用,選擇“Activate”菜單,按提示逐步輸入云端服務器IP地址,用戶注冊帳號及密碼等實現登錄。
3.2 云服務器端的開發
(1)實現一個MobileBean類型,并添加getXXX()、setXXX()方法。MobileBean封裝了用于和服務器端同步的域級信息。通過服務器上的頻道傳播到手機終端。
(2)實現一個Channel類型,需要首先實現CRUD(Create, Read, Update, Delete)接口來暴露后端數據。Create用于創建一個MobileBean的新實例,當設備側檢查到一個新的實例并同步回云端,返回單獨的id值。Read用于返回對應id完整加載的MobileBean。另外還有一個readAll()方法用于返回所有相關的MobileBean。
(3)實現bootup()方法,該方法用于返回使程序正常啟動所需的足夠信息 (beans),一般在頻道第一次啟動時調用。
public List<? extends MobileBean> bootup()
{
List<DemoBean>bootupBeans=new ArrayList<DemoBean>();
DemoBean Bean = new DemoBean ();
bootupBeans.add(syncBean);
return bootupBeans;
}
實現scanForNew方法,該方法用于檢查頻道所連接的后端是否已經創建了一個新的MobileBean,基于此,將返回新的bean的id或null。如果這些新的bean可用,信息將被自動同步并通知給用戶。
public String[ ] scanForNew(Device device, Date lastScanTimestamp)
{
return new String[]{"push:1", "push:2"};
}
(4)聲明相關的MobileServiceBean,實現其invoke方法:
List<EmailBean> mockBeans = EmailBean.generateMockBeans();
List<String> subjects = new ArrayList<String>();
for(EmailBean local:mockBeans)
{
subjects.add("id="+local.getOid()+":subject="+local.getSubject());
} response.setListAttribute("subjects", subjects);
(5)在openmobster-config.xml 中注冊該頻道。
<bean name="demobean" class="com.demo.sync.DemoBeanChannel">
3.3 Android手機終端的開發
(1)編寫HomeScreen。HomeScreen組件代表了Android
app啟動時的屏幕主界面。其postRender()方法的實現如下:。
if(MobileBean.isBooted("demobean"))
{
MobileBean[]demobeans=MobileBean.readAll("demobean");
String[] ui = new String[demobeans.length];
for(int i=0,size=ui.length;i<size;i++)
{
ui[i] = demobeans [i].getValue("message");
}
listApp.setListAdapter(new ArrayAdapter(listApp,
android.R.layout.simple_list_item_1, ui));
}
(2)在moblet-app.xml 進行配置。
<screen>com.demo.app.HomeScreen</screen>
3.4 系統的總體設計流程
整個系統的總體設計流程如圖4所示。具體設計步驟如下:
(1)用戶通過瀏覽器打開自己設計的網頁,選取需要下發的控制命令,然后輸入已經在服務器上配置好的賬號和密碼,點擊“確定”后調用JSP代碼:
<form action="action.jsp" method="post" name="form1" id="form1">
(2)JSP執行過程為將網頁請求request封裝的各功能選項字段取出并封裝。
(3)CloudServer中定義的DemoChannel會定期調用scanForNew并對上面的字段進行檢查,一旦發現有新數據,即通過read()接口取出該數據,將其封裝到DemoBean對象中,并通過OpenMobster下發推送通知到終端。
(4)終端的后臺服務Service同樣建立了對應云端
DemoChannel的接口,一旦收到頻道的下發通知,即通過發送Intent的方式啟動一個Activity,在啟動過程中可以通過MobileBean.read(channelUri,userName)接口讀出對應賬號名和通道下發MobileBean,通過MobileBean.getValue接口獲得下發通知中的各功能命令字段。
(5)通過對上述各命令字段的含義解析,獲取字段的值,并進入等待隊列。如果手機上的客戶端已經被用戶登錄并激活,將調用Android平臺提供的各個功能接口,完成下發的控制命令操作[3]。
(6)如果下發的命令字段中要求將手機中的數據上傳到服務器時,通過類似下發的逆過程,相應地建立上傳的通道,將數據上傳到服務器側。如果用戶有需要,還可以將這些數據展示在網頁界面上。
4 實現結果
系統采用了C/S模式的架構進行實現,服務器與客戶端通過Socket 進行網絡通信。在PC 端Openmobster的實現中,采用了基于HTTP長連接的“服務器推送”技術,通過長連接,服務器隨時發送Push通知;服務器采用移動App框架結構,手機的客戶端做成一個可開機自啟動的apk,該手機只要接入網絡而且被激活,會在后臺一直運行等待用戶發送命令。該系統可實現遠程追蹤、遠程擦除、遠程鎖定、遠程同步、遠程推送、遠程過程調用等功能[4],實現環境為Eclipse。Android 手機端的激活與遠程下發和鎖定過程如圖5所示。
經過在Android高通平臺手機上反復測試,手機連接Server 的時間小于3 s,遠端Server對手機控制命令的響應時間小于5 s,基本完成了云服務器對智能手機終端的訪問和控制功能。但是在測試過程中發現Openmobster平臺設計的數據同步算法還不完善,如在本地進行的新增、修改、刪除記錄的操作時,如果沒來得及同步到服務器側,會因為重新同步數據操作而丟失,造成用戶使用不便,有待于今后深入研究和探討。
參考文獻
[1] 王鵬,董靜宜.一種云計算架構的實現方法研究[J].計算機工程與科學,2009,31(1):11-13.
[2] ABI Research. Mobile cloud applications[EB/OL].(2010-03-09)[2011-02-20].http://www.abiresearch.com/research/1003385-Mobile+Cloud+Applications.
[3] 楊文志.Google Android程序設計指南[M].北京:電子工業出版社,2009.
[4] 韓超,梁泉.Android系統原理及開發要點詳解[M].北京:電子工業出版社,2010.