III.Mô tả WMA

WMA API bao gồm các giao diện trong một package: javax.wireless.messing; định nghĩa tất cả các APIs để gửi và nhận các message text/binary. Gói này gồm các giao diện sau:

  • Message
  • BinaryMessage
  • TestMessage
  • MessageConnection
  • MessageListener

Hình 2 mô tả các components của WMA

3.1.Message interface :

Message là một interface cơ sở để các interface khác kế thừa, các interface kế thừa này tương ứng với các kiểu Message khác nhau. Package này được thiết kế để làm việc với các đối tượng Message mà nó chứa nhiều phần tử khác nhau phụ thuộc vào underlying messaging protocol. Điều này nó khác với Datagram là chỉ cho phép các khối dữ liệu kiểu nhị phân.

Các giao thức message wireless được truy cập thông qua các API và được đặc trưng bởi kiểu lưu trữ và chuyển tiếp tự nhiên(store-and-forward nature), không giống như Datagram trong tầng network.

Interface này chứa đựng các phương thức chung cho tất cả các message. Một  object được tạo ra tương ứng với một message sẽ thực thi các interface khác nhau (các interface này là lớp con của Message) để truy cập vào nội dung và các thông tin khác trong message và nó phụ thuộc vào kiểu của message đó.

Các đối tượng được tạo ra thực thi interface này chỉ đóng vai trò như là các Container để chứa dữ liệu, phương thức setAddress() chỉ thiết lập giá trị địa chỉ trong data container mà không cần kiểm tra giá trị này có hợp lệ hay không.

Các phương thức :

1.public java.lang.String getAddress()

Trả về địa chỉ tương ứng với message này.
Nếu đây là message được dùng để gửi đi, thì sau đó địa chỉ này sẽ là địa chỉ của người nhận.
Nếu message này đã được nhận, thì sau đó địa chỉ này là địa chỉ của người gửi.
Trả về: null nếu địa chỉ của message này vẫn chưa được thiết lập.

2.public java.util.Date getTimestamp()

Trả về timestamp cho biết lúc nào thì message được gửi đi.
Trả về: Date tương ứng với timestamp trong message hay null nếu timestamp chưa được thiết lặp.

3.public void setAddress(java.lang.String addr)

Thiết lập giá trị tương ứng với message này, địa chỉ cũng có thể thiết lập giá trị bằng null.
Tham số:

addr: địa chỉ message.

3.2.MessageConnection interface

  • MessageConnection interface định nghĩa phương thức cơ bản để gửi và nhận các thông điệp. Nó chứa đựng các phương thức dùng để gửi và nhận các thông điệp, các phương thức factory dùng để tạo các đối tượng Message mới, và một phương thức tính toán số lượng các segments của giao thức mà nó cần để gởi cho một đối tượng specified Message.
  • Lớp này được khởi tạo bằng cách gọi phương thức Connector.open(). Ứng dụng nên gọi phương thức close() khi kết thúc kết nối. Và một IOException sẽ được ném ra khi bất kỳ phương thức nào được gọi trên MessageConnection sau khi kết nối này đã được đóng.
  • Các message được gửi trên một kết nối. Một kết nối có thể là kiểu Server hay Client.
  • Trong kết nối kiểu Server, các message có thể được gửi hay được nhận. Kiểu kết nối này được tạo ra bằng cách passing một chuỗi string nhận dạng một điểm kết thúc (identifier end-point) trên local host cho phương thức Connector.open(), nếu chuỗi nhận dạng này đã tồn tại trước đó bởi ứng dụng hệ thống hay các ứng dụng java, thì Connector.open() sẽ ném một IOException. Ứng dụng Java có thể mở nhiều MessageConnection với identifier end-point unreserve mặc dù security permission cũng không cho nó gửi hay nhận tin nhắn sử dụng identifier end-point.
  • Tham số scheme dùng để nhận dạng giao thức được sử dụng. Một ứng dụng cũng có thể có mở nhiều thể hiện MessageConnection cùng một lúc, và các kiểu kết nối này cũng có thể là kiểu Server hay Client.
  • Ứng dụng có thể tạo class mà thực thi interface MessageListener và đăng ký một thể hiện của class đó với MessageConnection để notify khi message đến.

Các field:

1.public static final java.lang.String BINARY_MESSAGE:

  • Giá trị constant tương ứng với kiểu message binary. Nếu constant này được sử dụng trong phương thức newMessage(), thì một đối tượng Message mới được tạo ra thực thi interface BinaryMessage.

2.public static final java.lang.String TEXT_MESSAGE:

  • Giá trị constant tương ứng với kiểu message text. Nếu constant này được sử dụng trong phương thức newMessage() thì một đối tượng Message mới sẽ được tạo ra thực thi interface TextMessage.

Các phương thức:

1.public javax.wireless.messaging.Message newMessage(java.lang.String type):

  • Tạo một đối tượng Message mới với kiểu type cho trước.
  • Khi type được thiết lập bằng constant text thì một đối tượng được tạo ra và thực thi interface TextMessage.
  • Khi type được thiết lập bằng constant binary thì một đối tượng được tạo ra và thực thi interface BinaryMessage.
  • Khi phương thức này gọi từ kiểu kết nối Client thì đối tượng Message mới được tạo ra phải có địa chỉ đích khi kết nối này được tạo ra.
  • Khi phương thức này gọi từ kiểu kết nối Server thì đối tượng Message mới tạo ra không cần có địa chỉ đích, nó phải được thiết lập bởi ứng dụng trước khi gửi message.
  • Tham số:
    • type : kiểu của tham số được tạo ra.
    • Trả về: một đối tượng Message ứng với kiểu message cho trước.
    • Ngoại lệ :
      • java.lang.IllegalArgumentException nếu kiểu message không phải là TEXT_MESSAGE hay BINARY_MESSAGE.

2.public javax.wireless.messaging.Message newMessage(java.lang.String type, java. lang.String address):

  • Tạo một đối tượng Message với kiểu type và khởi tạo nó với địa chỉ đích đã cho.
  • Tham số:
    • type: kiểu message được tạo ra.
    • address: địa chỉ đích của message mới.
    • Trả về: đối tượng Message ứng với kiểu Message cho trước.
    • Ngoại lệ:
      • java.lang.IllegalArgumentException nếu kiểu message không phải là TEXT_MESSAGE hay BINARY_MESSAGE.

3.public int numberOfSegments(javax.wireless.messaging.Message msg):

  • Trả về số lượng các đoạn(segment) trong giao thức underlying mà có thể cần thiết gửi các thông điệp chỉ định.
  • Lưu ý: phương thức này không thực sự gửi message, nó chỉ tính toán số lượng các giao thức phân đoạn cần thiết cho việc gửi tin nhắn.
  • Phương thức này sẽ tính toán số lượng các phân đoạn cần thiết khi message này được phân tách ra thành các giao thức phân đoạn sử dụng thích hợp các tính năng của giao thức.
  • Tham số:
    • msg: message được sử dụng để tính toán.
    • Trả về: số lượng các giao thức phân đoạn cần thiết để gửi message. Trả về 0 nếu Message Object không thể gửi đi.

4.public javax.wireless.messaging.Message receive() throws IOException, InterruptedException:

  • Được sử dụng để nhận message.
  • Nếu không có message nào cho MessageConnection này đợi, thì phương thức này sẽ block cho đến khi hoặc là message cho Connection này được nhận hoặc MessageConncetion này được đóng lại.
  • Trả về: một đối tượng Message tương ứng với thông tin trong message nhận được.
  • Ngoại lệ:
    • java.io.IOException nếu một lỗi xảy ra trong khi nhận message.
    • java.io.InterruptedException nếu đối tượng MessageConnection được đóng lại trong khi gọi phương thức này.
    • java.lang.SecurityException nếu ứng dụng không có quyền nhận message sử dụng port number cho trước.

5.public void send(javax.wireless.messaging.Message msg) throws IOException, InterruptedException:

  • Dùng để gửi một message.
  • Tham số:
    • msg: message được gửi.
    • Ngoại lệ:
      • java.io.IOException nếu message không được gửi hay network lỗi.
      • java.lang.IllegalArgumentException nếu message chưa hoàn tất hoặc chứa đựng các thông tin không hợp lệ. Ngoại lệ này còn được ném nếu dung lượng của message vượt quá độ dài tối đa của giao thức message đã cho.

6.public void setMessageListener(javax.wireless.messaging.MessageListerner listener):

  • Đăng ký một object MessageListener mà platform có thể notify khi một thông điệp đã được nhận trên MessageConnection.
  • Nếu có các thông điệp incoming trong hàng đợi Queue của MessageConnection này chưa được tải về ứng dụng trước khi gọi phương thức này, ngay lập tức một đối tượng registered listerner sẽ được thông báo một lần cho mỗi tin nhắn đến trong Queue.
  • Tham số:
    • Listener: đối tượng MessageListener được đăng ký. Nếu null, listener đã đăng ký hiện tại sẽ bị ngừng đăng ký và sẽ không nhận được thông báo.
    • Ngoại lệ:
      • java.io.IOException nếu kết nối đã được đóng, hay cố gắng đăng ký một listener trên một kết nối kiểu Client.
      • java.lang.SecurityException nếu ứng dụng không có quyền nhận thông điệp trên chính port cho trước.

3.3.MessageListener interface:

  • Cung cấp một cơ chế cho ứng dụng được thông báo khi có thông điệp đến, thì phương thức notifyIncomingMessage() được gọi. Ứng dụng phải lấy được thông điệp bằng cách sử dụng phương thức receive() của MessageConnection.
  • MessageListener không nên gọi phương thức receive() một cách trực tiếp. Thay vào đó, nó nên bắt đầu với một Thread mà sẽ nhận thông điệp hay gọi phương thức khác của ứng dụng(mà nó nằm bên ngoài ứng dụng) và các phương thức này gọi phương thức receive().
  • Cơ chế listener cho phép ứng dụng nhận các thông điệp incoming mà không cần phải có một thread block trong khi gọi phương thức receive().

Các phương thức

public void notifyIncomingMessage (javax.wireless.messaging.MessageConnection conn):

  • Phương thức này được gọi bởi platform khi thông điệp incoming đến MessageConnection nơi ứng dụng đã đăng ký đối tượng listener.
  • Phương thức này được gọi một lần đối với mỗi thông điệp incoming trên MessageConnection.
  • Lưu ý: Ứnd dụng không nên nhận và xử lý các message trong khi phương thức này được gọi. Thay vào đó, nó chỉ nên hoạt động như là một trigger để bắt đầu hoạt động trong chính Thread của ứng dụng.
  • Tham số:
    • conn: MessageConnection nơi các thông điệp incoming đã đến.

3.4.TextMessage interface:

TextMessage tương ứng với một TextMessage. Interface này kế thừa từ Message mà nó get và set dung lượng của nội dung text. Phương thức setPayloadText() thiết lập giá trị của payload mà không cần kiểm tra tính hợp lệ của giá trị này.

Các phương thức

1.public java.lang.String getPayloadText():

  • Trả về dung lượng message như một chuỗi String, bằng null nếu dung lượng của message chưa được thiết lập.

2.public void setPayloadText(java.lang.String data):

  • Thiết lập dữ liệu của message này, dữ liệu này có thể bằng null.
  • Tham số: payload data as a string.

3.5.BinaryMessage interface:

  • Là một interface tương ứng với một thông điệp binary. Nó kế thừa từ interface Message.
  • Chứa các phương thức dùng để get và set dữ liệu kiểu binary. Phương thức setPayloadData thiết lập giá trị của payload trong data container mà không cần kiểm tra giá trị này có hợp lệ hay không.

Các phương thức

1.public byte[] getPayloadData():

  • Trả về dữ liệu của Message dưới dạng một mảng byte, trả về null nếu payload của message không được thiết lập.

2.public void setPayloadData(byte[] data):

  • Thiết lập dung lượng dữ liệu của message này. Dung lượng này có thể thiết lập bằng null.
  • Thiết lập dung lượng sử dụng phương thức này chỉ thiết lập tham chiếu đến mảng byte. Thay đổi này làm cho nội dung của mảng byte ảnh hưởng đến nội dung của đối tượng BinaryMessage. Vì vậy, ứng dụng không nên sử dụng mảng byte này trước khi message được gửi và trước khi phương thức MessageConnection.send() trả về.
  • Tham số:
    • data: payload data as a string.

IV.Một số ví dụ

Ví dụ 1: Gửi SMS

import javax.microedition.io.Connector;

import javax.microedition.lcdui.Command;

import javax.microedition.lcdui.CommandListener;

import javax.microedition.lcdui.Display;

import javax.microedition.lcdui.Displayable;

import javax.microedition.lcdui.Form;

import javax.microedition.lcdui.TextBox;

import javax.microedition.lcdui.TextField;

import javax.microedition.midlet.MIDlet;

import javax.wireless.messaging.MessageConnection;

import javax.wireless.messaging.TextMessage;

public class SendSMS extends MIDlet implements CommandListener, Runnable {

private static final String EXIT = “Exit”;

private static final String OK   = “Ok”;

private static final String BACK = “Back”;

private static final String SEND = “Send”;

private Form form;

private TextField textfield;

private TextBox textbox;

private Display display;

private Thread thread;

/*this command is used to exit from the current application*/

Command cmdExit = new Command(EXIT, Command.EXIT, 2);

/*command for acceptance to display next screen*/

Command cmdOk = new Command(OK, Command.OK, 1);

/*command which allows to move to previous screen*/

Command cmdBack = new Command(BACK, Command.BACK, 2);

/*command to send the entered message to destination*/

Command cmdSend = new Command(SEND, Command.OK, 1);

private String getPort = null;

public SendSMS() {

/*gets the port number from JAD*/

getPort = this.getAppProperty(“portNo”);

display = Display.getDisplay(this);

form = new Form(“Enter Destination address”);

textfield = new TextField(“Enter Destination address:”, “”, 20,

TextField.PHONENUMBER);

form.append(textfield);

form.addCommand(cmdExit);

form.addCommand(cmdOk);

form.setCommandListener(this);

}

public void startApp() {

display.setCurrent(form);

}

public void pauseApp() {

/*all interupts can be handled here*/

}

public void destroyApp(boolean unconditional) {

}

public void commandAction(Command cmd, Displayable disp) {

if (cmd == cmdExit && disp == form) {

exitMidlet();

} else if (cmd == cmdOk && disp == form) {

textbox = new TextBox(“Enter Message”, null, 256, TextField.ANY);

textbox.addCommand(cmdBack);

textbox.addCommand(cmdSend);

textbox.setCommandListener(this);

display.setCurrent(textbox);

} else if (cmd == cmdBack && disp == textbox) {

display.setCurrent(form);

} else if (cmd == cmdSend && disp == textbox) {

sendSMS();

}

}

public void sendSMS() {

/*recomeneded to start the players in a separate thread*/

thread = new Thread(this);

thread.start();

}

public void run() {

MessageConnection msgconn = null;

try {

/*full destination address*/

String address = “sms://” + textfield.getString() + “:” + getPort;

/*to open message connection*/

msgconn = (MessageConnection) Connector.open(address);

/*to send text message*/

TextMessage textmsg = (TextMessage) msgconn.newMessage

(MessageConnection.TEXT_MESSAGE);

/*pay load text passed here*/

textmsg.setPayloadText(textbox.getString());

/*send the message*/

msgconn.send(textmsg);

} catch (Exception exe) {

exe.printStackTrace();

} finally {

try {

msgconn.close();

} catch (Exception io) {

io.printStackTrace();

}

exitMidlet();

}

}

public void exitMidlet() {

destroyApp(false);

notifyDestroyed();

}

}
Ví dụ 2: Nhận message.

import javax.microedition.io.Connector;
import javax.microedition.lcdui.Alert;
import javax.microedition.lcdui.Command;
import javax.microedition.lcdui.CommandListener;
import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.Displayable;
import javax.microedition.midlet.MIDlet;
import javax.wireless.messaging.BinaryMessage;
import javax.wireless.messaging.Message;
import javax.wireless.messaging.MessageConnection;
import javax.wireless.messaging.MessageListener;
import javax.wireless.messaging.TextMessage;

public class ReceiveSMS extends MIDlet implements CommandListener,
  MessageListener, Runnable {

    private static final String EXIT = "Exit";

    private Display display;
    private Thread thread;
    private MessageConnection msgconn;
    private Message msg;
    private String senderAddress;
    private Alert recMess;

    /*this command is used to exit from the current application*/
    Command cmdExit = new Command(EXIT, Command.EXIT, 2);

    private String getPort = null;

    public ReceiveSMS() {
        /*gets the port number from JAD*/
        getPort = this.getAppProperty("portNo");
        display = Display.getDisplay(this);
        recMess = new Alert("Message");
        recMess.setString("Waiting for SMS");
        recMess.setTimeout(Alert.FOREVER);
        recMess.addCommand(cmdExit);
        recMess.setCommandListener(this);
    }

    public void startApp() {
        display.setCurrent(recMess);
        try {
            /*port on which to receive sms*/
            String address = "sms://:" + getPort;
            /*open connection*/
            msgconn = (MessageConnection) Connector.open(address);
            /*set listening mode*/
            msgconn.setMessageListener(this);
            /*need to start the players in a separate thread to
            avoid dead lock*/
            thread = new Thread(this);
            thread.start();
        } catch (Exception exe) {
            exe.printStackTrace();
        }

    }

    public void pauseApp() {
        thread = null;
       /*all interupts can be handled here*/
    }

    public void destroyApp(boolean unconditional) {
        thread = null;

        if (msgconn != null) {
            try {
                msgconn.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    public void commandAction(Command cmd, Displayable disp) {
        if (cmd == cmdExit && disp == recMess) {
            exitMidlet();
        }
    }

    public void exitMidlet() {
        destroyApp(true);
        notifyDestroyed();
    }

    public void notifyIncomingMessage(MessageConnection msgconn) {
        thread = new Thread(this);
        thread.start();
    }

    public void run() {
        try {
            /*gets message object*/
            msg = msgconn.receive();
            if (msg != null) {
                /*gets address of the message received*/
                senderAddress = msg.getAddress();
                recMess.setTitle("From: " + senderAddress);
                /*check for the type of message received*/
                if (msg instanceof TextMessage) {
                    recMess.setString("Recieved Messsage: \n" + ((TextMessage) 
                      msg).getPayloadText());
                } else {
                    /*get the binary data of the message*/
                    byte[] data = ((BinaryMessage) msg).getPayloadData();

                /*wite here code to convert binary to text message*/

                }
            }
        } catch (Exception exe) {
            exe.printStackTrace();
        }
    }
}

Bạn thấy bài viết này thế nào?

Câc bài liên quan:
Wireless Messaging API – JSR120 -Phan1