開發手機程序,最能想到的就是對SMS(Short Messaging Service), MMS(Multimedia Messaging Service),Email的支持。
對於SMS, MMS,sun官方已經出了個jsr-205,JSr-102規范對其進行了完善的支持。至於Email嗎,介紹完前兩個後,我再把我的想法說出來,大家參考下。
一。前言
學習 Java™ Micro Edition(Java ME)無線消息 API。這個專欄將從幾個簡單的代碼示例開始,隨後討論它為企業開發人員帶來的各種機會。
<!--START RESERVED FOR FUTURE USE INCLUDE FILES--><!-- include Java script once we verify teams wants to use this and it will work on dbcs and cyrillic characters --> <!--END RESERVED FOR FUTURE USE INCLUDE FILES-->
移動電話最常見的一個特性就是消息傳遞。文本消息或短消息(SMS)自引入之初,已經變得越來越流行。當然,多媒體消息(MMS)又為其增加了圖片、聲音和視頻等多媒體內容。
在 MMS 剛出現時,有些專家預言它會取代 SMS,如果它的價格不是這麼高的話,這個預言確實有可能會成為現實。即便如此,這種能在手機之間傳遞多媒體內容的功能還是漸受青睐。最近手機電子郵件的 成功,意味著未來手機消息傳遞的主要形式可能是電子郵件,但是要到那一步還有很長的一段路要走。
二。無線消息
JSR-205 中定義的無線消息 API(WMA)2.0 是用於無線消息的一組可選 API。WMA 的連接基於通用連接框架,該框架是在基於 CLDC 的 Java ME 架構中進行通信的基礎。WMA 2.0 向後兼容 WMA 1.1,添加了對發送和接收多媒體消息的支持。換句話說,無線消息 API 提供了無線通信的高級抽象。它將傳輸層完全隱藏,因而所要做的工作只是創建消息、發送消息和接收消息。
WMA 支持文本消息、小區廣播和多媒體消息。文本消息很簡單,大多數人都知道它是什麼。SMS 消息極為流行,而且已經成為日常生活的一部分。WMA 支持發送和接收文本消息。發送非常簡單:只需定義目標地址和文本,文本被稱為淨荷(payload)。接收稍微復雜些,因為需要應用程序能夠偵聽進入的消息。在下面的示例中將看到如何讀取進入的消息。
這裡介紹下jsr-102規范是針對WMA1.1的。 比較詳細的資料可以google下。jsr205規范完全向下兼容,也就是說。你在jsr-102寫的程序可以不用任何修改就可以運行在JSr-205規范下。
消息內容
二進制消息顧名思義就是帶有二進制內容的消息。內容可以是要傳遞給應用程序或者從應用程序傳遞給其他客戶機或服務器的任何內容。多部分消息可以包含多塊媒體,例如文本、音頻和視頻。
小區廣播可能是最不為人所知的消息類型。小區廣播服務是一種數據服務,在這種服務中,消息由基站廣播,由偵聽這個基站的每個移動站接收。這個服務是單向的,這意味著 WMA 只能用來接收這類消息。
發送和接收
發送文本消息很簡單。步驟如下:
- 設置手機號碼(地址)。
- 用
Connector
接口創建 MessageConnection
。
- 創建新消息,並把它的類型轉換成
TextMessage
。
- 設置淨荷。
- 通過調用
send()
方法並向方法傳遞 Message
實例,發送消息。
發送的消息中包含的發送人信息,與正常發送消息時的相同。顯示了使用 Java ME WMA 發送消息的代碼。
Java 代碼
- 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
接口,所以要編寫比 更復雜一些的代碼,才能讓它真正工作。
Java 代碼
- 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
。
Java 代碼
- 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 消息的傳遞可以分成:服務器到手機、手機到服務器和手機到手機。
在服務器到手機 消息傳遞中,CRM 應用程序可以向手機應用程序發送數據,手機應用程序可以接收數據並用對用戶友好的方式呈現數據。在手機到服務器 的消息傳遞中,手機應用程序可以向服務器發送數據(HTTP 連接也可以做這項工作,但 HTTP 連接不可能總是存在)。在手機到手機 的消息傳遞中,用戶可以向好友的手機發送應用程序數據或游戲數據,進行游戲項目交換及其他操作。
整理成一個工具類
Java 代碼
- public final static void sendTextMessage(String phone, String text)
- throws IOException {
- checkPhoneNumber(phone);
- MessageConnection conn = (MessageConnection) Connector.open("sms://"
- + phone);
- TextMessage msg = (TextMessage) conn
- .newMessage(MessageConnection.TEXT_MESSAGE);
- msg.setPayloadText(text);
- conn.send(msg);
- }
-
- public final static void sendTextBinary(String phone, byte[] text)
- throws IOException {
- checkPhoneNumber(phone);
- MessageConnection conn = (MessageConnection) Connector.open("sms://"
- + phone);
- BinaryMessage bm = (BinaryMessage) conn
- .newMessage(MessageConnection.BINARY_MESSAGE);
-
- bm.setAddress(phone);
- bm.setPayloadData(text);
- conn.send(bm);
-
- }
-
- private final static void checkPhoneNumber (String phone)
- throws PhoneNumberException{
- if(phone == null
- || phone.equals("")){
- throw new PhoneNumberException("手機號碼不能為空!");
- }
- try{
- Integer.parseInt(phone);
- }catch(NumberFormatException n){
- throw new PhoneNumberException("手機號碼必須為數據!");
- }
- }