對(duì)于SMS, MMS,sun官方已經(jīng)出了個(gè)jsr-205,jsr-102規(guī)范對(duì)其進(jìn)行了完善的支持。至于Email嗎,介紹完前兩個(gè)后,我再把我的想法說(shuō)出來(lái),大家參考下。
一。前言
學(xué)習(xí) Java™ Micro Edition(Java ME)無(wú)線消息 API。這個(gè)專欄將從幾個(gè)簡(jiǎn)單的代碼示例開(kāi)始,隨后討論它為企業(yè)開(kāi)發(fā)人員帶來(lái)的各種機(jī)會(huì)。<!--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-->
移動(dòng)電話最常見(jiàn)的一個(gè)特性就是消息傳遞。文本消息或短消息(SMS)自引入之初,已經(jīng)變得越來(lái)越流行。當(dāng)然,多媒體消息(MMS)又為其增加了圖片、聲音和視頻等多媒體內(nèi)容。
在 MMS 剛出現(xiàn)時(shí),有些專家預(yù)言它會(huì)取代 SMS,如果它的價(jià)格不是這么高的話,這個(gè)預(yù)言確實(shí)有可能會(huì)成為現(xiàn)實(shí)。即便如此,這種能在手機(jī)之間傳遞多媒體內(nèi)容的功能還是漸受青睞。最近手機(jī)電子郵件的 成功,意味著未來(lái)手機(jī)消息傳遞的主要形式可能是電子郵件,但是要到那一步還有很長(zhǎng)的一段路要走。
二。無(wú)線消息JSR-205 中定義的無(wú)線消息 API(WMA)2.0 是用于無(wú)線消息的一組可選 API。WMA 的連接基于通用連接框架,該框架是在基于 CLDC 的 Java ME 架構(gòu)中進(jìn)行通信的基礎(chǔ)。WMA 2.0 向后兼容 WMA 1.1,添加了對(duì)發(fā)送和接收多媒體消息的支持。換句話說(shuō),無(wú)線消息 API 提供了無(wú)線通信的高級(jí)抽象。它將傳輸層完全隱藏,因而所要做的工作只是創(chuàng)建消息、發(fā)送消息和接收消息。
WMA 支持文本消息、小區(qū)廣播和多媒體消息。文本消息很簡(jiǎn)單,大多數(shù)人都知道它是什么。SMS 消息極為流行,而且已經(jīng)成為日常生活的一部分。WMA 支持發(fā)送和接收文本消息。發(fā)送非常簡(jiǎn)單:只需定義目標(biāo)地址和文本,文本被稱為 凈荷(payload) 。接收稍微復(fù)雜些,因?yàn)樾枰獞?yīng)用程序能夠偵聽(tīng)進(jìn)入的消息。在下面的示例中將看到如何讀取進(jìn)入的消息。
這里介紹下jsr-102規(guī)范是針對(duì)WMA1.1的。 比較詳細(xì)的資料可以google下。jsr205規(guī)范完全向下兼容,也就是說(shuō)。你在jsr-102寫(xiě)的程序可以不用任何修改就可以運(yùn)行在jsr-205規(guī)范下。
二進(jìn)制消息顧名思義就是帶有二進(jìn)制內(nèi)容的消息。內(nèi)容可以是要傳遞給應(yīng)用程序或者從應(yīng)用程序傳遞給其他客戶機(jī)或服務(wù)器的任何內(nèi)容。多部分消息可以包含多塊媒體,例如文本、音頻和視頻。
小區(qū)廣播可能是最不為人所知的消息類型。小區(qū)廣播服務(wù)是一種數(shù)據(jù)服務(wù),在這種服務(wù)中,消息由基站廣播,由偵聽(tīng)這個(gè)基站的每個(gè)移動(dòng)站接收。這個(gè)服務(wù)是單向的,這意味著 WMA 只能用來(lái)接收這類消息。
發(fā)送文本消息很簡(jiǎn)單。步驟如下:
- 設(shè)置手機(jī)號(hào)碼(地址)。
- 用
Connector
接口創(chuàng)建MessageConnection
。 - 創(chuàng)建新消息,并把它的類型轉(zhuǎn)換成
TextMessage
。 - 設(shè)置凈荷。
- 通過(guò)調(diào)用
send()
方法并向方法傳遞Message
實(shí)例,發(fā)送消息。
發(fā)送的消息中包含的發(fā)送人信息,與正常發(fā)送消息時(shí)的相同。顯示了使用 Java ME WMA 發(fā)送消息的代碼。
- 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) {
- ...
- }
接收文本消息略微復(fù)雜,但也不是太復(fù)雜。在一個(gè)端口上打開(kāi) MessageConnection
(在這個(gè)示例中是 5432)并從 MessageConnection
讀取進(jìn)入的消息。可以用 instanceof
測(cè)試消息的類型。要接收有消息進(jìn)入的通知,應(yīng)用程序必須實(shí)現(xiàn) MessageListener
接口,所以要編寫(xiě)比 更復(fù)雜一些的代碼,才能讓它真正工作。
- 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) {
- ...
- }
發(fā)送二進(jìn)制消息與發(fā)送文本消息很相似。首先需要把數(shù)據(jù)放在字節(jié)數(shù)組中,然后創(chuàng)建 MessageConnection
(如 清單 3 BINARY_MESSAGE
。
- 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 消息的傳遞可以分成:服務(wù)器到手機(jī)、手機(jī)到服務(wù)器和手機(jī)到手機(jī)。
在 服務(wù)器到手機(jī) 消息傳遞中,CRM 應(yīng)用程序可以向手機(jī)應(yīng)用程序發(fā)送數(shù)據(jù),手機(jī)應(yīng)用程序可以接收數(shù)據(jù)并用對(duì)用戶友好的方式呈現(xiàn)數(shù)據(jù)。在 手機(jī)到服務(wù)器 的消息傳遞中,手機(jī)應(yīng)用程序可以向服務(wù)器發(fā)送數(shù)據(jù)(HTTP 連接也可以做這項(xiàng)工作,但 HTTP 連接不可能總是存在)。在 手機(jī)到手機(jī) 的消息傳遞中,用戶可以向好友的手機(jī)發(fā)送應(yīng)用程序數(shù)據(jù)或游戲數(shù)據(jù),進(jìn)行游戲項(xiàng)目交換及其他操作。
上面大部分文字摘自 www.ibm.com/developerworks/cn/java/wi-arch32.html
- 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("手機(jī)號(hào)碼不能為空!");
- }
- try{
- Integer.parseInt(phone);
- }catch(NumberFormatException n){
- throw new PhoneNumberException("手機(jī)號(hào)碼必須為數(shù)據(jù)!");
- }
- }
這篇文章會(huì)持續(xù)更新中,請(qǐng)關(guān)注
更新一。對(duì)Email
的支持:有用過(guò)手機(jī)支持email瀏覽是比較痛苦的。就單純拿我的nokia6630來(lái)說(shuō)吧。設(shè)置就一大堆了。搞的我都不想去設(shè)置了。其實(shí)對(duì)于手機(jī)瀏覽
email來(lái)說(shuō)我們直需要其中的文本信息就ok了(如果郵件帶有附件(一般附件是word,圖片等)對(duì)于智能機(jī)來(lái)說(shuō),是可以通過(guò)安裝office來(lái)支持瀏
覽的,但很辛苦。
該怎么樣來(lái)省去那些麻煩的設(shè)置呢,我們只需要用戶提供一個(gè)郵箱地址,密碼就可以登錄到郵箱跟發(fā)郵件了,對(duì)于那些協(xié)議的設(shè)置我們來(lái)幫它們做。
比如設(shè)計(jì)一個(gè)自己的郵件轉(zhuǎn)發(fā)服務(wù)器。一個(gè)郵件客戶端(j2me)實(shí)現(xiàn),然后客戶端的所有請(qǐng)求都是通過(guò)我們這邊的服務(wù)器進(jìn)行工作,我們可以把那些郵件數(shù)據(jù)進(jìn)行壓縮,后在傳送,這樣不僅可以提高速度,而且處理起來(lái)也是比較方便的。
過(guò)段時(shí)間,決定自己實(shí)現(xiàn)一個(gè)這樣的結(jié)構(gòu)。