PUSH資訊自動啟動java移動程式

來源:互聯網
上載者:User

摘  要
有些時候,對於一個企業級行動裝置 App程式,從伺服器將資訊推向行動裝置,並且自動啟用一個已安裝的行動裝置 App程式使其進行必要的處理是非常重要的。由簡訊服務(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平台的新名字),是最流行的開發行動裝置 App程式的技術之一。使用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應用程式中,我們有時候需要從伺服器推資料,並在裝置上自動啟動一個行動裝置 App程式,而不需要由使用者明確的啟動裝置。設想一種情形,當一個針對他/她的名字的工作條款被建立時,使用者必須能自動得到通知,並且必須儘快地對此工作條款做出反應。Java ME的push註冊機制能夠很容易地將資訊推向一個Java ME應用程式,並自動啟動該程式。在這篇文章中,我將向你展示如何將push註冊機制特徵添加到你的行動裝置 App程式中。
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所以。

圖2. 開啟KToolbar
2.現在,在剛才開啟的視窗中點擊建立工程表徵圖。會開啟一個快顯視窗;在那裡你可以指定工程名稱和MIDlet類名。在工程名稱中輸入MySamplePushRegistryProject,在MIDlet類名中輸入com.sample.MySamplePushRegistry。

圖3. 建立一個工程
3.在步驟2後,會自動出現另一個快顯視窗,它將允許你設定項目的其他設定。確保你在API 選擇標籤中。在此標籤中,從目標平台下拉式功能表中選擇JTWI(如果還沒有選擇)。同樣確保CLDC 1.0選項按鈕被選中。不要鉤選Mobile Media API多選框(因為不會使用任何跟多媒體有關的API)。請參考圖4。

圖4. 設定API喜好設定
4.現在進入push註冊標籤。點擊添加按鈕。將會出現一個快顯視窗。在串連URL域中輸入sms://:50001,在類域中輸入com.sample.MySamplePushRegistry,在允許寄件者域中輸入*。請參考圖5。

圖5 設定push註冊的屬性
5.在步驟4後,一個條目將會被加入到父視窗中。6所示。

圖6. 設定push註冊的屬性(續)
6.現在進入許可標籤。單擊添加按鈕。從許可樹中選擇javax/microedtion/io/Connector/sms並單擊OK。重複相同        的步驟來添加許可javax/wireless/messaging/sms/receive 和 javax/microedtion/io/PushRegistry。
7.在步驟6後,三項許可將被添加到應用程式中。7所示。

圖7. 添加許可
8.現在進入使用者定義標籤。這裡,我們添加使用者定義的變數,這將包含SMS連接埠。從我們的程式,我們查閱此使用者定義變數來讀取SMS連接埠。在此標籤中,單擊添加按鈕。開啟一個快顯視窗。輸入SMS-Port作為屬性名稱。選擇OK。出現了最初的彈出的視窗。輸入50001作為SMS-Port的值。8所示。

圖8. 添加定製屬性SMS-Port
9.現在,在設定視窗中單擊OK。這個動作將帶回到KToolbar。
10.在步驟9後,如果你觀察由以上步驟產生的jad檔案,C:/WTK22/apps/MySamplePushRegistryProject/bin/MySamplePushRegistryProject.jad(假設J2ME Wireless Toolkit 2.2被裝在目錄C:/WTK22中),你會找到在前面步驟中設定的完整配置。所有條目中最重要的一個如下:MIDlet-Push-1: sms://:50001, com.smaple.MySamplePushRegistry, *. 此條目確保你的應用程式監聽50001連接埠上的SMS訊息。
現在,讓我們著眼於MIDlet應用程式的代碼。這裡,我僅僅提供MIDlet的一部分代碼片斷。 請看資源來下載在此應用程式中使用的所有代碼。

public class MySamplePushRegistry extends MIDlet
   implements CommandListener, Runnable, MessageListener {
  
   //....
  
   public void startApp() {
      smsPort = getAppProperty("SMS-Port");
      String smsConnection = "sms://:" + smsPort;
      if (smsconn == null) {
         try {
            smsconn = (MessageConnection)
               Connector.open(smsConnection);

            smsconn.setMessageListener(this);
         } catch (IOException ioe) {
            ioe.printStackTrace();
         }
      }
      display.setCurrent(resumeScreen);
   }
   public void notifyIncomingMessage(MessageConnection conn) {
      if (thread == null) {
         thread = new Thread(this);
         thread.start();
      }
   }    
   public void run() {
      try {
         msg = smsconn.receive();
         if (msg != null) {
            if (msg instanceof TextMessage) {

               content.setString(((TextMessage)msg).getPayloadText());
            }
            display.setCurrent(content);
         }
      } catch (IOException e) {
         e.printStackTrace();
      }
   }
   //other methods to follow
}

在這個片斷中,如下要點值得注意:類MySamplePushRegistry整合了MIDlet。這個類實現了CommandListener,Runnable和MessageListener介面。在MIDlet的startApp()方法中,我們使用getAppProperty()方法得到SMS-Port屬性的值。我們也使用Generic Connection Framework(GCF)建立了一個串連來監聽SMS訊息。GCF的Connector類的open()方法建立了SMS串連。如果一個訊息到達了,notifyIncomingMessage()方法會被調用,它會建立和啟動一個線程(如果還沒有被建立)。線上程的run()方法中,程式等待一條訊息(smsconn.receive())。當訊息被接受到,我們得到原始的訊息並在Alert類中設定訊息。在現實生活的應用程式中,使用者通常開啟一個螢幕來處理訊息。
一旦你的代碼準備好了,使用KToolbar中的建立表徵圖來建立它。在編譯和無錯誤預驗證建立之後,你需要把應用程式打包成一個JAR。為了完成這個任務,選擇工程菜單,然後包,然後建立包。
在把應用程式部署到真實裝置之前,我們先測試程式是否在模擬器中運轉正確。選擇工程菜單,然後通過OTA運行。這個步驟實際上是類比MIDlet的over-the-air安裝。圖9的順序圖描述了全部的過程。保持此模擬器視窗開啟。

圖9. 通過over the air方法在模擬器中安裝應用程式
現在,在KToolbar中進入檔案菜單,並選擇Utilities。得到一個快顯視窗,10所示。

圖10. 開啟Utilities
單擊WMA,然後開啟控制台。開啟了另一個快顯視窗:

圖11. 開啟WMA Utilities 控制台
在視窗中選擇發送SMS按鈕。視窗的內容將會改變,12所示。在選擇用戶端地區內選擇+5550000作為電話號碼。在連接埠文字框中,輸入50001。在訊息域中,輸入Hi Test Message。現在單擊發送按鈕。

圖12. 從Utilities發送SMS訊息
如果在以上步驟中,每一件事都運行良好,那麼模擬器視窗,13所示,將會顯示一個訊息到達了類比行動電話,告訴使用者訊息到達到了,並等到批准。

圖13. 模擬器MIDlet被SMS訊息啟用
如果你在模擬器上選擇Yes,MIDlet會自動啟動,”Hi Test Message”會顯示在模擬器中,14所示。

圖14. 模擬器MIDlet接受到SMS
接下來的步驟事在真實裝置上安裝MIDlet。你可以使用OTA安裝應用程式。詳細內容請查閱Sun的工具包文檔。除了OTA,我們可以電纜/紅外線/藍芽技術來安裝MIDlet,如果裝置支援那些選項。作為一個用戶端裝置,我使用Nokia 6600,這是支援紅外線技術的,並且因為我有一個紅外線適配器,我使用紅外線技術在Nokia 6600中安裝MIDlet。
如果以上步驟運行良好,你的用戶端應用程式就準備就緒了。現在是時候來程式開發伺服器端應用程式了,實際上,它將發送SMS訊息給監聽50001連接埠的MIDlet。
程式開發伺服器端應用程式來將SMS訊息發送到特定的裝置連接埠
如前所述,為了程式開發伺服器端與GSM數據機互動的的代碼,我使用開源的SMSLib for Java, 它使用關注指令(AT指令)與GSM數據機進行互動。它同時也使用Java通訊API或RxTx與使用的作業系統通訊,並與外部裝置(GSM數據機)交談來發送AT指令。
為了發送訊息到指定的連接埠,使用者資料和協議資料單元(PDU)的使用者資料標題指示(UDHI)域都必須被修改。SMSLib在內部完成了它,所以發送SMS訊息引起的複雜度都被封裝在SMSLib的代碼內。如果你對觀察訊息是如何被正確發送的感興趣,你可以獨自仔細檢查SMSLib的代碼。

 

按照如下的步驟來完成伺服器的編碼和部署:
1.從SMSLib網站下載SMSLib代碼。下載時,確保你下載的是SMSLib-Java-v1.0.1.zip。SMSLib for Java可以跟Java通訊API或RxTx一起使用。最近,Sun撤消了了對Java通訊API Windows版的支援,所以使用RxTx會更好。但如果你已經有了Java通訊API,你同樣可以用它和SMSLib一起運行。在這篇文章中,我將詳述以上兩種運行執行個體程式的方法。
2.以Java通訊API 2.0作為開始,首先,確保你已經正確安裝了API。解壓javacomm20-win32.zip。在commapi子目錄中,你將找到如下檔案:
&#61548;        javax.comm.properties
&#61548;        win32com.dll
&#61548;        comm..jar
把javax.comm.properties拷貝到你的Java運行時環境的lib目錄中。把win32com.dll拷貝到你的JRE的bin目錄中。當運行任何使用SMSLib的程式時,確保comm.jar在classpath中。
為了保證Java通訊API被正確的安裝了,從命令框中進入到commapi\samples\BlackBox目錄中。按如下方式設定PATH變數:以我為例,JRE的家目錄為C:\j2sdk1.4.2_03\jre。根據你的JRE設定做相應的改變。
設定PATH=.;c:\j2sdk1.4.2_03\jre\bin;。現在,使用如下命令來運行Java 黑盒程式:
java -classpath .;../../comm..jar;BlackBox.jar; BlackBox。
如果Java通訊API被正確的安裝了,那麼15所示,會出現一個顯示你機器的可用串口(COM連接埠)的Swing視窗。關閉視窗之後,命令框將會包含一些跟你可用的COM連接埠相關的行,如下面的樣本命令提示輸出所示。記住,依賴於你的PC上的可用連接埠,Swing視窗和命令列提示的內容可能會有變化。但重要的是,如果你能夠看到GUI和在命令提示框中的如下行(就象下面所示),你可以假設Java通訊API已經正確安裝了。在這個測試之後,關閉Swing視窗來中止黑盒程式。

圖15. 測試Java通訊API的安裝
執行個體命令提示框輸出:
COM1:  PORT_OWNED
COM2:  PORT_OWNED
Closing port 1 (COM2)
Closing COM2
Closing port 0 (COM1)
Closing COM1
3.現在,是時候把GSM數據機串連到你的電腦上了。我使用一部Nokia 6600行動電話作為GSM數據機。Nokia 6600沒有串口連接器(COM連接埠連接器)。但是,它提供了紅外線技術串連到電腦,然後作為GSM數據機。如果你有一部有串口直接連接器的電話,那樣使用起來會更簡單。一般地,        實際的GSM數據機會提供串口連接器。但是如果你的裝置缺少串口連接器,但包含一個內建的GSM數據機並能使用紅外線或藍芽技術串連,這種選擇也能起作用。
為了在沒有物理COM連接埠的情況下,在功能上實現COM端,你必須將一個虛擬COM連接埠映射到你的紅外線或藍芽串連上。SMSLib需要一個相容的GSM電話或GSM數據機。如果提供了數據機的能力,大多數GSM電話都能被使用。SMSLib使用串列串連(物理或類比,比如藍芽,紅外線,USB等)來與GSM數據機通訊。通過Nokia 6600, 你可以使用SMSLib來發送SMS訊息,但是因為Nokia 6600把傳入的訊息儲存在記憶卡裡而不是SIM卡中,使用這種模式將不能接受到這些訊息。同樣,Nokia 6600不允許從記憶卡中使用AT指令來讀取訊息。但是,我們僅僅需要發送SMS訊息來啟用我們的MIDlet,Nokia 6600能夠成功的完成這些(不需要接收SMS訊息)。對於使用紅外線或藍芽技術串連的電話來說,最重要的是將紅外線或藍芽串連映射到一個虛擬COM連接埠。參考你的行動電話的文檔,查明它是否支援虛擬COM連接埠映射。
以我為例,我在我的PC上安裝了Nokia PC 套件。為了從我的PC串連Nokia 6600,我使用一個外部USB紅外適配器。因此,為了這種情況,我也在PC上安裝了紅外線驅動。
現在,我用PC上的USB連接埠串連到外部紅外適配器。在Nokia 6600裝置上,我選擇菜單,然後串連,然後數據機。通過紅外線串連的選項在數據機下面。現在,我選擇選項“串連”,並把行動電話放在紅外適配器的有效範圍之內。
4.下一步是驗證從PC,我們能夠使用AT指令訪問GSM數據機。為此,選擇開始菜單,然後程式,然後附件,然後通訊,然後超級終端。會開啟一個對話方塊,並請求一個邏輯名稱。提供任何你願意提供的名字。為了方便,我提供名字“GSM Modem”。選擇OK。

圖16. 開啟超級終端
5.另一個快顯視窗出現。在使用串連的下拉式功能表中,選擇COM連接埠名稱(虛擬或實際的),GSM數據機將通過此連接埠串連到PC。以我為例,是COM4。

圖17. 在超級終端中選擇COM連接埠
6.在下一個對話方塊中(COM連接埠的屬性),只需單擊OK。
7.現在,你會被帶到一個視窗,你將在此視窗中輸入一些命令(以我們為例,我們將輸入AT指令)。輸入如下命令來測試連通性-但是記住,當你輸入指令的時候,不會在控制台中寫入任何東西:AT+CPMS=?。
要點:不要在超級終端中輸入任何未知的命令。這可能會永久性損壞你的行動裝置或擦去所有的資料。
如果一切順利,你將能看到一些輸出,18所示。輸出可能會不盡相同,但是沒有輸出,輸出錯誤,或終端沒有響應都代表這連通性的錯誤。

圖18. 在超級終端中執行AT指令
8.現在從呼叫菜單,使用中斷連線命令從超級終端中斷連線。
9.完成了如上的步驟後,我們可以準備寫Java樣本程式了。此程式將發送SMS訊息到我們剛才配置的的GSM數據機的指定連接埠上:

import org.smslib.*;

public class SendMessageWithPortsSMSLib {
   public static void main(String[] args) {
      CService srv = new CService("COM4", 9600, "", "");
      System.out.println("SendMessage(): sample application.");
      System.out.println("  Using " + srv._name + " v" + srv._version);
      try {
         srv.setSimPin("0000");
         srv.connect();
         srv.setSmscNumber("");
         COutgoingMessage msg =
            new COutgoingMessage("+9198301...", "Message from smslib API.");
         msg.setMessageEncoding(CMessage.MESSAGE_ENCODING_7BIT);
         msg.setSourcePort(0);
         msg.setDestinationPort(50001);
         srv.sendMessage(msg);
         srv.disconnect();
      }
      catch (Exception e) {
         e.printStackTrace();
      }
      System.exit(0);
   }
}

在如上的代碼片斷中,我們首先使用4個參數來建立類CService的一個執行個體。第一個參數為COM連接埠的名稱。(以我為例,這裡是COM4,因為我的GSM數據機是串連到一個虛擬COM連接埠的。確保根據你的COM連接埠名稱來改變這裡的值。)第二個參數指定傳輸速率。當數據機串連時你會發現這一限制。第三個參數指定移動/GSM數據機的構成。第四個參數指定模式。在一個特定的構成和模式需要不同的AT指令集來與GSM數據機互動的地方,第三和第四參數有時啟動很重要的作用。例如,對於Sony Ericsson模式,需要一個不同的AT指令集和邏輯;因此,伴隨著jSMSEngine發行版,你能找到一個單獨的對於Sony Ericsson的處理包。對於特定類型的構成和模式,jSMSEngine有不同的處理包。對於Nokia,預設的處理包對於Nokia 6600 和我們的目的已經足夠好了。因此,我沒有對第三和第四個參數指定任何值。
CService被初始化之後,我們使用connect()方法串連到GSM數據機。我們設定SMSC數字(SMS中心數字)為空白。這會被SIM卡得到。在那之後,我們使用類CoutgoingMessage()建立一個發出的訊息。COutgoingMessage()的建構函式需要兩個參數:發送訊息的設別數字和訊息本身。在一個典型的實際的應用程式中,一些類似於數字代碼的指示符會被作為SMS訊息發送;根據那個代碼,在MIDlet端會發生一些動作。另外一個要點是setDestinationPort()方法,在這裡我們設定目標連接埠。
圖19展示了詳細的建立過程。

圖19. 詳細的建立過程
重要註解:SMSLib在CLogger.java中使用了J2SE 5.0的API。CLogger.java中有一行使用PrintStream的建構函式,並用java.io.File類型作為參數。這個PrintStream類中的建構函式從J2SE 5.0才有支援。但是由於我使用J2SE 1.4,我把那一行從:stream = new PrintStream(new File(filename)); 改成:stream = new PrintStream(new FileOutputStream(filename));
改變之後,我構建了SMSLib提供的原始碼,並建立了新的JAR使用JRE 1.4.2。
10.為了編譯樣本程式,確保在你的classpath中有新的JAR(是你在修改CLogger代碼後產生的)和comm.jar。然後編譯應用程式範例。
11.編譯完成之後,運行應用程式。確保之前步驟提到的JAR在classpath中。如果一切順利,你能夠看到你安裝在另外一個裝置中MIDlet已經自動啟動了,並顯示你的訊息。
現在,讓我們看看如何使用RxTx來代替Java通訊API 2.0。你可以從SMSLib下載RxTx。當使用RxTx的時候,我們需要注意如下幾點:
1.拷貝RXTXComm.jar到(JDKDIR)\jre\lib\ext目錄,拷貝rxtxSerial.dll檔案到(JDKDIR)\jre\bin目錄。
2.為了使用,SMSLib同Java通訊API一起打包,但是進行一小部分的代碼修改,我們也能讓它跟RxTx一起使用。為了讓SMSLib同RxTx一起使用,修改CSerialDriver.java並刪除行javax.comm.*;。添加行import gnu.io.*;。然後重建。
3.RxTx也支援Win32。當我寫這篇文章的時候,RxTx能很好的支援物理串列串連,但是對於“虛擬”序列埠則有些例外,例如,通過藍芽/紅外線/USB串連類比序列埠。但是,在顯示生活的情況中,你不會使用一個行動電話作為數據機,而是一個真實的GSM數據機,它將通過真實的COM(串列)連接埠來串連。這將不會成為問題。現在,以我為例,在發送SMS訊息時我接受到了一些錯誤,因為我的紅外線串連有一個虛擬連接埠映射。為了消除那些錯誤,我在CSerialDriver中注釋掉了一些行。特別的,找到outStream.flush();,注釋掉,然後重建。
4.現在,按照上面列表中的步驟3開始。在步驟11中,確保當運行SendMessageWithPortsSMSLib的時候,在你的classpath中有最近產生的JAR(對於RxTx的改變),同時保證使用RXTXcomm.jar和rxtxSerial.dll檔案代替Java通訊API的comm.jar和相應的dll檔案。
注意的要點:因為SMSLib使用Java通訊API,或者RxTx,這些會對作業系統進行本地調用,我建議不要將這些代碼直接嵌入到應用程式伺服器或Web伺服器。一個可選的解決方案是將這些代碼嵌入到一個單獨的RMI(遠程方法調用)伺服器或Web service伺服器,然後從應用伺服器來訪問他。但是,因為我們使用GSM數據機,SMS的發送速度很低;所以如果我們直接調用介面(RMI或Web service),最好使用非同步設計。例如,當你試著發送一條訊息到裝置,將必須的資訊(移動號碼,連接埠,訊息等)放到一個JavaMessage Service隊列中。寫一個訊息驅動的bean來採集訊息,然後使用一個Web service來調用服務(嵌入在SMS發送代碼中)。
我談到了一種可行的方式;你可以選擇任何最適合你的架構的設計。但是當做任何決定的時候,緊記如下兩點:
使用GSM數據機,發送SMS訊息的速度不是很快(依賴與你選擇的GSM數據機和SMS服務提供者)
SMSLib使用Java通訊API或RxTx,這將對作業系統發生本地調用
雖然我建議使用兩個Nokia 6600移動設定(一個作為GSM數據機,另一個作為Java ME用戶端),你可以僅僅使用一個來測試此行為。首先,把MIDlet安裝在裝置上。然後使用相同的裝置作為GSM數據機。當發送SMS訊息時,把訊息發送到與你作為發送訊息的GSM數據機的行動裝置相同的移動號碼上。在這中情況下,寄件者和接收者行動電話是相同的。
總 結
在這篇文章中,你學到了如何使用push註冊特徵來寫Java ME應用程式。同時,你也學到了如何從伺服器發送一條SMS訊息,然後自動啟動MIDlet。為了僅僅測試push註冊特徵,你可以使用兩部支援MIDP 2.0和WMA1.1的手機(不需要伺服器端SMS push),和Sun Java Wireless Toolkit提供的SMSSend和SMSRecieve樣本程式。但是在實際應用程式中,你可能需要從伺服器發送SMS訊息,而不是從另一個MIDlet。
在本文中展示的代碼片斷不是很複雜;搭建環境的步驟卻很複雜。但是一旦正確地搭建了環境,你會很興奮的看到使用伺服器端SMS push,push註冊特徵在真實的裝置上運行。如果你在使用SMSLib時遇到任何問題,你總是發行就緒問題和向SMSLib使用者組請求協助。最後,我要感謝SMSLib項目的所有者Thanasis Delenikas分享了一些關於SMSLib最近開發中的有價值的資訊。
關 於 作 者
Srijeeb Roy擁有印度加爾各答Jadavpur大學電腦科學和工程學的學士學位。他目前作為技術架構師,在Tata Consultancy Services Limited公司的一個基於Java EE的項目中工作。他在Java/Java EE的領域中工作了6年以上,在IT工業擁有總共多餘7年的經驗。他為他的公司和客戶開發了多個Java的內部架構。他也工作在多個其他的領域,比如Forte,CORBA和Java ME。
資  源
下載文章中的原始碼:
http://www.javaworld.com/javaworld/jw-04-2006/push/jw-0417-push.zip
下載Sun Java Wireless Toolkit:
http://java.sun.com/products/sjwtoolkit/
下載SMSLib:
http://smslib.org/
RxTx首頁:
http://rxtx.org/

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.