添加MIDP 2.0的Push注冊特征到你的設備應用程序中 摘 要
有些時候,對於一個企業級移動應用程序,從服務器將信息推向移動設備,並且自動激活一個已安裝的移動應用程序使其進行必要的處理是非常重要的。由短信服務(SMS)作為推信息的協議,使用push注冊機制可以讓使用Mobile Information Device Profile 2.0的Java微小版本應用程序擁有這一特征。
版權聲明:任何獲得Matrix授權的網站,轉載時請務必保留以下作者信息和鏈接
作者:Srijeeb Roy ;magic003(作者的blog:http://blog.matrix.org.cn/page/magic003)
原文:http://www.matrix.org.cn/resource/article/44/44449_Push+JAVA+Mobile.Html
要害字:Push;JAVA;mobile
移動技術日漸流行。Java微小版本,或者叫Java ME(Sun的J2ME平台的新名字),是最流行的開發移動應用程序的技術之一。使用Java ME,我們可以在使用JVM或KVM的手持設備上運行多種無線應用程序。
Connected Limited Device Configuration (CLDC)被包含在Java ME中,它是面向那些只擁有有限資源,使用KVM的設備。同樣,Mobile Information Device Profile(MIDP)也被包含在Java ME中,這是一個為了在手機上運行應用程序的基於CLDC的profile。運行在移動設備中的應用程序模塊叫做MIDlet,是一個MIDP應用程序。一個MIDlet主要是一組有序運行的類,並且它們由運行在移動設備中的應用程序治理軟件(AMS)所控制。
MIDP的最新版本(2.0)引入了很多新的特征來幫助開發者建立健壯的企業級應用程序。其中一個比較重要的特征就是push注冊機制。在Java ME應用程序中,我們有時候需要從服務器推數據,並在設備上自動啟動一個移動應用程序,而不需要由用戶明確的啟動設備。設想一種情形,當一個針對他/她的名字的工作條款被建立時,用戶必須能自動得到通知,並且必須盡快地對此工作條款做出反應。Java ME的push注冊機制能夠很輕易地將信息推向一個Java ME應用程序,並自動啟動該程序。在這篇文章中,我將向你展示如何將push注冊機制特征添加到你的移動應用程序中。
Push注冊機制的行為可以被描述為如下三個步驟:
1.MIDlet在移動設備中注冊一個連同協議名稱的端口,假如任何信息到達指定的端口,並且使用相同的協議,那麼AMS就將它轉交給MIDlet。注冊使用Java ME應用程序描述符(JAD)文件靜態的完成。程序也能使用應用程序內置的API執行動態注冊。
2. 從服務器,信息被發送到特定的移動設備,使用MIDlet應用程序注冊監聽的協議和端口。
3. 在信息被傳遞到移動設備後,AMS調用注冊了監聽此端口和協議的MIDlet應用程序。一旦信息被轉交到MIDlet,那麼處理信息就是此應用程序的責任了。典型的,根據信息的信息的內容,一個應用程序會選擇打開一個屏幕,並答應用戶與服務器進行一些事務。
在這篇文章的例子中,為了從服務器推信息,我們將使用一個GSM(移動通信全球系統)調制解調器。圖1較高層次地描述了我們將在此文中實現的場景。
圖1. 從服務器push SMS消息到移動設備的高層場景
在jad文件中,每一個push注冊條目都包含如下信息:MIDlet-Push-<n>: <ConnectionURL>, <MIDletClassName>, <AllowedSender>。
MIDlet-Push-<n>:push注冊屬性名稱。MIDlet套件中可以包含多條push注冊。<n>的數值從1開始,並且對於附加的條目必須使用連續的序數。第一個發現的缺失條目將中止列表。任何剩余的條目都會被忽略。
ConnectionURL:被Connector.open()使用的連接字符串。
MIDletClassName:負責連接的MIDlet。指定的MIDlet必須使用MIDlet-<n>記錄在描述文件或jar文件的manifest中登記過。
AllowedSender:一個指定的過濾器, 它將限制哪些發送者能夠能正當啟動請求的MIDlet。
MIDP 2.0 規范定義了數據報和socket帶內連接的語法。當其他規范為其他連接類型定義push 語義時,它們必須既定義過濾器域期望的語法,又定義連接URL字符串的期望格式。
在jad文件中,一個push注冊的典型例子,使用socket連接,類似於如下:
MIDlet-Push-1: socket://:77, com.sample.SampleApplication, *.
這個示例描述符條目在77端口處保存一個流套接字,並且答應所有的發送者。
從服務器推信息到移動設別會帶來一些問題:假如我們想發送信息到一個在指定端口注冊了監聽流套接字的特定設備,我們必須知道那個移動電話的無線網絡IP。因為在無線網絡中,很多手機不使用始終連接環境(有時候,提供商不支持設備中網絡中的靜態IP),發送信息到設備是有問題的。假如我們不知道設備的無線IP,我們將不能使用套接字連接從服務器發送信息到設備。
短信服務(SMS)在這種情況下派上了用場。使用SMS,我們指定目標設備的電話號碼;因此在這種情況下,我們不需要知道設備的IP地址。但是,使用SMS作為觸發器同樣會帶來一些問題:因為MIDP2.0規范只定義了針對數據報和套接字帶內連接的語法,而沒有針對SMS連接的,所以不保證所有支持MIDP2.0的設備都能使用SMS作為觸發器來進行push注冊。但無線消息API(WMA1.1)-一個在MIDP上能支持SMS的的可選包-現在得到很多移動設備的支持,所以有更大的可能性,SMS作為push注冊機制的觸發器將得到很多設備的支持。對於這篇文章,我使用Nokia 6600移動電話,它是支持SMS作為push注冊機制的觸發器的。
另外,從服務器發送一條SMS消息到設備不是簡單直接的,因為有很多途徑存在。SMS服務提供商提供API(或者暴露服務URL),通過這些API你能從你的服務器端應用程序發送消息到你指定的移動電話上。但這種方法依靠於SMS服務提供商和它非凡的計劃。可選的方式是使用一個GSM調制解調器,這樣你需要使GSM調制解調器與你的服務器端應用程序進行交互。在這篇文章中,我將使用一個開源的產品,SMSLib for Java V1.0(原名jSMSEngine),它能使GSM調制解調器與你的Java服務器端程序進行交互。
另一個在此需要注重的要點是一條簡單的SMS消息將不會激活MIDlet。我們必須發送SMS消息到MIDlet注冊監聽的特定的端口。因此被用來發送SMS消息的軟件(或SMS服務提供商)必須能夠將它發送到設備指定的端口。SMSLib for Java v1.0 支持這一功能。
當我們使用GSM調制解調器方案,我們必須了解GSM調制解調器將在內部使用SIM(訂戶識別模塊)卡來發送SMS消息。SIM卡依靠於某個移動服務提供商。因此每條SMS短信將帶來與從常規GSM移動電話發送消息同樣的花費。正相反,對於一個企業級應用(依靠於服務計劃),通過提供商的SMS網關發送批量SMS消息會被證實更節省開銷。但是,假如應用程序不需要發送大量SMS消息來出發MIDlet,那麼GSM調制解調器方案會是有效的開銷,並能從移動服務提供商那裡取消非凡的批量SMS服務依靠。
雖然我建議為了近期的產品使用購買一個單獨的GSM調制解調器,但是測試此行為不要求夠買。通常地,很多GSM移動電話模型帶有一個內置的GSM調制解調器。那些移動模型中的任何一個都能夠作為GSM調制解調器,來代替單獨的調制解調器。在這篇文章中,我使用另外一個Nokia 6600移動電話,而不是一個單獨的GSM調制解調器,因為Nokia 6600有一個內置的GSM調制解調器。
現在,讓我們開發一個實例程序,是我們能夠從一個Java服務器端應用程序發送一條SMS消息到一個移動電話的指定端口,並自動啟動移動設備中的一個MIDlet。
使用push注冊特征開發客戶端MIDlet
為了開發客戶端,我們使用Sun Java Wireless Toolkit(原名為J2ME Wireless Toolkit)。我使用版本2.2。這個產品是免費的,可以從Sun的網站下載。為了安裝和運行此工具包,你必須在你的機器上裝有J2SE 1.4.2_02或更新的版本。
我使用windows 2000 Professional 操作系統。
安裝Sun的工具包後,按照如下描述的步驟:
1.從開始菜單打開KToolBar:選擇程序,然後J2ME Wireless Toolkit 2.2,然後KToolbar。將會打開一個應用程序窗口,如圖2所以。