2006 年 12 月 31 日
學習 Java™ Micro Edition(Java ME)無線消息 API。這個專欄將從幾個簡單的代碼示例開始,隨後討論它為企業開發人員帶來的各種機會。
移動電話最常見的一個特性就是消息傳遞。文本消息或短消息(SMS)自引入之初,已經變得越來越流行。當然,多媒體消息(MMS)又為其增加了圖片、聲音和視頻等多媒體內容。
在 MMS 剛出現時,有些專家預言它會取代 SMS,如果它的價格不是這麼高的話,這個預言確實有可能會成為現實。即便如此,這種能在手機之間傳遞多媒體內容的功能還是漸受青睐。最近手機電子郵件的成功,意味著未來手機消息傳遞的主要形式可能是電子郵件,但是要到那一步還有很長的一段路要走。
本月,我將討論 Java ME 無線消息 API.我將從幾個簡單的編碼示例開始,隨後討論它為企業開發人員帶來的各種機會。
無線消息 API
JSR-205 中定義的無線消息 API(WMA)2.0 是用於無線消息的一組可選 API.WMA 的連接基於通用連接框架,該框架是在基於 CLDC 的 Java ME 架構中進行通信的基礎。WMA 2.0 向後兼容 WMA 1.1,添加了對發送和接收多媒體消息的支持。換句話說,無線消息 API 提供了無線通信的高級抽象。它將傳輸層完全隱藏,因而所要做的工作只是創建消息、發送消息和接收消息。
WMA 支持文本消息、小區廣播和多媒體消息。文本消息很簡單,大多數人都知道它是什麼。SMS 消息極為流行,而且已經成為日常生活的一部分。WMA 支持發送和接收文本消息。發送非常簡單:只需定義目標地址和文本,文本被稱為淨荷(payload)。接收稍微復雜些,因為需要應用程序能夠偵聽進入的消息。在下面的示例中將看到如何讀取進入的消息。
消息內容
二進制消息顧名思義就是帶有二進制內容的消息。內容可以是要傳遞給應用程序或者從應用程序傳遞給其他客戶機或服務器的任何內容。多部分消息可以包含多塊媒體,例如文本、音頻和視頻。
小區廣播可能是最不為人所知的消息類型。小區廣播服務是一種數據服務,在這種服務中,消息由基站廣播,由偵聽這個基站的每個移動站接收。這個服務是單向的,這意味著 WMA 只能用來接收這類消息。
發送和接收
發送文本消息很簡單。步驟如下:
設置手機號碼(地址)。
用 Connector 接口創建 MessageConnection。
創建新消息,並把它的類型轉換成 TextMessage。
設置淨荷。
通過調用 send() 方法並向方法傳遞 Message 實例,發送消息。
發送的消息中包含的發送人信息,與正常發送消息時的相同。清單 1 顯示了使用 Java ME WMA 發送消息的代碼。
清單 1. 發送消息
try {
String addr = ?ms://+358401234567?
MessageConnection conn = (MessageConnection) Connector.open(addr);
TextMessage msg =
(TextMessage)conn.newMessage(MessageConnection.TEXT_MESSAGE);
msg.setPayloadText(?his is a test message!?;
conn.send(msg);
} catch (Exception e) {
...
}
接收文本消息略微復雜,但也不是太復雜。在一個端口上打開 MessageConnection (在這個示例中是 5432)並從 MessageConnection 讀取進入的消息。可以用 instanceof 測試消息的類型。要接收有消息進入的通知,應用程序必須實現 MessageListener 接口,所以要編寫比 清單 2 更復雜一些的代碼,才能讓它真正工作。
清單 2. 接收消息
try {
String addr = ?ms://:5432?
MessageConnection conn = (MessageConnection) Connector.open(addr);
Message msg = null;
while (someExitCondition) {
msg = conn.receive();
if (msg instanceof TextMessage) {
TextMessage tmsg = (TextMessage)msg;
String receivedText = tmsg.getPayloadText();
// respond with the same text with ?hanks.?
tmsg.setPayloadText(?hanks?;
conn.send(tmsg);
} else {
// Received message was not a text message, but e.g. binary
...
}
} // end while
} catch (Exception e) {
...
}
發送二進制消息與發送文本消息很相似。首先需要把數據放在字節數組中,然後創建 MessageConnection(如 清單 3 所示),並創建 BINARY_MESSAGE。
清單 3. 發送二進制消息
try {
String str = "Hello!";
byte[] msg = str.getBytes();
String addr = "sms://+358401234567";
MessageConnection conn = (MessageConnection) Connector.open(addr);
BinaryMessage bm = (BinaryMessage)mc.newMessage
(MessageConnection.BINARY_MESSAGE);
if (url!= null)
bm.setAddress(url);
bm.setPayloadData(msg);
conn.send(bm);
}
catch(Exception e) {
}
如果想學習使用 WMA 編寫代碼的更多內容,請參閱本文末尾的 參考資料。現在,我把重點放在 WMA 的潛在應用上。
無盡的可能性
用消息能做什麼呢?從 Java ME 應用程序發送文本消息確實很酷 —— 可以按自己的想法定制用戶界面和用途 —— 但它還算不上是招人喜愛的應用程序。在讓這種消息傳遞盡可能簡單便捷方面,Nokia 和 Sony-Ericsson 已經投入了大量時間和金錢。
商業應用程序和預定義文本信息為其帶來了真正的優勢。例如,在商業應用中,很可能會出現這樣的一些情況:GPRS、WLAN 或者其他基於 IP 的協議不可用或不可靠;使用的是基於 SMS 的傳統接口;操作的也還是帶有 SMS 接口的設備,此時您就可以用文本消息作為傳輸協議。比如在某種場景下,您可以讓服務器(例如 CRM 服務器)發送帶有最新銷售數據的文本消息,然後手機應用程序可以確認來自業務服務的消息,並用圖表或者其他您喜歡的方式呈現數據(對於更大量的數據,當然用 HTTP 或數據報會更好)。
也可以在游戲編程中同時使用文本和二進制消息。例如,一個玩家可以把特定於游戲的一些內容(例如獲得的級別、工具或點數)發送給玩同一手機游戲的好友。好友的應用程序會接收消息,並打開發送的內容。當然,二進制數據也可以用於商業應用程序。
多媒體消息在應用或服務中還不太流行,但是它們確實為游戲領域提供了一些有趣的機會。例如,可以把游戲屏幕的快照發送給好友,好友能以多媒體消息的形式接收快照,而不依賴任何特定的應用程序。以圖片形式發送天氣預報是利用 MMS 的方便性的另一個便利服務。
三類消息傳遞
WMA 消息的傳遞可以分成:服務器到手機、手機到服務器和手機到手機。
在服務器到手機 消息傳遞中,CRM 應用程序可以向手機應用程序發送數據,手機應用程序可以接收數據並用對用戶友好的方式呈現數據。在手機到服務器 的消息傳遞中,手機應用程序可以向服務器發送數據(HTTP 連接也可以做這項工作,但 HTTP 連接不可能總是存在)。在手機到手機 的消息傳遞中,用戶可以向好友的手機發送應用程序數據或游戲數據,進行游戲項目交換及其他操作。
結束語
在本文中,我介紹了使用 Java ME WMA 進行無線消息傳遞的相關內容。我提供了一些基本的發送和接收示例,並討論了無線消息傳遞的一些使用方式。WMA 支持發送和接收文本消息、二進制消息和多媒體消息,支持接收小區廣播消息。所有這些消息類型為游戲開發人員和商業應用程序開發人員提供了許多機會。
消息傳遞(電子郵件、IM)已經證明是 Internet 日常應用的重要部分。文本消息已經成為了手機用戶體驗至關重要的一部分。WMA 的簡單性讓它有幸成為了無線應用程序開發人員的工具包中的一員。
參考資料
學習
您可以參閱本文在 developerWorks 全球站點上的 英文原文 。
“The Wireless Messaging API”(Sun Developer Network,2002 年 12 月):學習關於 JSR 120 的更多內容。
“移動 P2P 消息傳遞,第 2 部分”(developerWorks,2002 年 12 月):這篇文章介紹了使用 WMA 進行點對點消息傳遞。
“將 J2ME 擴展到無線消息傳遞”(developerWorks,2003 年 2 月):這篇文章對小區廣播進行了很好的介紹。
架構性宣言:請閱讀這一系列中的每篇文章。
developerWorks Web development 專區:專注於 Web 技術。
討論
developerWorks blogs:加入 developerWorks 社區!
關於作者
Mikko Kontio 是領先的芬蘭軟件公司 Softera 的生產經理。他擁有計算機科學的碩士學位,是多部圖書的作者或合作者,最新大作是 Professional Mobile Java with J2ME,由 IT Press 出版。您可以通過 Mikko 的郵件 [email protected] 與他聯系。