Home > Java, Programming > Koneksi perangkat mobile dan PC dengan menggunakan bluetooth – Tutorial

Koneksi perangkat mobile dan PC dengan menggunakan bluetooth – Tutorial


(Download tutorial, source code dan toolkit di bawah)

Tutorial ini dibuat untuk membantu teman-teman FTI-UKSW yang mengambil matakuliah Mobile Computing untuk menyelesaikan proyek akhir praktikum. Isi dari tutorial ini adalah bagaimana langkah-langkah yang harus dilakukan untuk membuat 2 buah aplikasi yang masing-masing ditempatkan pada sebuah perangkat mobile dan sebuah PC sehingga kedua aplikasi ini dapat berkomunikasi dengan menggunakan koneksi bluetooth dimana bluetooth adalah sebuah media jaringan nirkabel yang digunakan untuk menghubungkan tiap perangkat dan juga sebagai tempat tukar-menukar informasi. IDE yang dipakai dalam tutorial ini adalah Netbeans 6.7.1.

Deskripsi Aplikasi

Aplikasi Client (ditempatkan di perangkat mobile)

Setelah terkoneksi dengan Server, aplikasi client dapat mengirimkan perintah untuk mengeksekusi perintah-perintah command prompt (membuka notepad, shutdown, dll), mengirimkan pesan (chat) ke Server dan menggerakkan kursor mouse. Aplikasi Client dibuat dalam porject Mobile Application.

Aplikasi Server (ditempatkan di PC/perangkat lain yang memiliki perangkat bluetooth)

Server menerima permintaan perintah dari client, lalu mengeksekusi sesuai dengan perintah tersebut. Selain itu server juga dapat mengirimkan pesan kepada Client. Aplikasi server dibuat dalam project Java Application berbasis JFrame.

Untuk membedakan antara perintah untuk mengeksekusi perintah command prompt atau perintah untuk menggerakkan kursor, maka perintah yang akan dikirim sebelumnya diberi header terlebih dahulu baru kemudian si penerima perintah akan memilahnya (casting).

Membuat Aplikasi Client

Langkah 1

Buat sebuah project Mobile Application baru, setelah itu tambahkan sebuah midlet baru dengan nama CrossClient. Setelah itu tambahkan interface CommandListener dan DiscoveryListener lalu implementasikan fungsi-fungsi dari kedua interface tersebut. Hasilnya akan terlihat sebagai berikut.

public class Client extends MIDlet implements CommandListener, DiscoveryListener {
    public void startApp() {
    }
    public void pauseApp() {
    }
    public void destroyApp(boolean unconditional) {
    }
    public void commandAction(Command c, Displayable d) {
    }
    public void deviceDiscovered(RemoteDevice btDevice, DeviceClass cod) {
    }
    public void inquiryCompleted(int discType) {
    }
    public void servicesDiscovered(int transID, ServiceRecord[] records) {
    }
    public void serviceSearchCompleted(int transID, int respCode) {
    }
}

Langkah 2

Tambahkan atribut-atribut berikut:

    private Vector vectorPerangkat; //untuk menyimpan perangkat-perangkat bluetooth yang terdeteksi.
    private List listPerangkat; //untuk menampilkan perangkat-perangkat bluetooth yang terdeteksi.
    private Form formUtama, execForm, chatForm;
    private MouseCanvas mouseForm; //Kelas MouseCanvas digunakan untuk menerima input tombol dari user.
    private TextField execText, chatText;
    private Command exit, mulai, kembali;
    private Command shutdown, exec, mouse, chat, kirimExec, kirimChat;
    private Display disp;

Pada awalnya akan terlihat error pada baris ke-4 karena kelas MouseCanvas belum dibuat. Membuat kelas MouseCanvas akan diterangkan pada langkah-langkah selanjutnya. Lanjutkan dengan menambahkan atribut-atribut berikut:

    private LocalDevice lDevice; //dibuat untuk menyimpan instance dari perangkat dimana aplikasi berjalan.
    private DiscoveryAgent agent; //kelas sebagai pencari (agent)  untuk mendeteksi perangkat-perangkat yang aktif.
    private StreamConnection conn;
    private OutputStream os;
    private InputStream is;
    private boolean ada; //boolean untuk menyatakan koneksi yang perangkat dan service yang diinginkan sudah ada atau belum.
    private String url;

Langkah 3

Buat sebuah konstruktor lalu inisialisasi variabel-variabel diatas seperti berikut:

     public CrossClient() {
        this.vectorPerangkat = new Vector();
        this.listPerangkat = new List("List perangkat:", Choice.IMPLICIT);
        this.formUtama = new Form("Form Client");
        this.execForm = new Form("Executable Mode");
        this.chatForm = new Form("Chatting");
        this.mouseForm = new MouseCanvas(this);

        this.execText = new TextField("Executable:", "", 100, TextField.ANY);
        this.chatText = new TextField("Pesan:", "", 100, TextField.ANY);

        this.exit = new Command("Keluar", Command.EXIT, 0);
        this.mulai = new Command("Mulai", Command.OK, 1);
        this.kembali = new Command("Kembali", Command.BACK, 0);

        this.shutdown = new Command("Shutdown Compt", Command.OK, 0);
        this.exec = new Command("Excutable", Command.OK, 1);
        this.mouse = new Command("Mouse Pointer", Command.OK, 2);
        this.chat = new Command("Chat Mode", Command.OK, 4);
        this.kirimExec = new Command("Kirim", Command.OK, 0);
        this.kirimChat = new Command("Kirim", Command.OK, 0);

        this.listPerangkat.setCommandListener(this);
        this.formUtama.setCommandListener(this);
        this.execForm.setCommandListener(this);
        this.chatForm.setCommandListener(this);
        this.mouseForm.setCommandListener(this);

        this.listPerangkat.addCommand(exit);
        this.formUtama.addCommand(exit);
        this.formUtama.addCommand(mulai);
        this.execForm.addCommand(kirimExec);
        this.execForm.addCommand(kembali);
        this.chatForm.addCommand(kirimChat);
        this.chatForm.addCommand(kembali);
        this.mouseForm.addCommand(kembali);

        this.execForm.append(this.execText);
        this.chatForm.append(this.chatText);

        this.ada = false;
        this.disp = Display.getDisplay(this);
        this.disp.setCurrent(this.formUtama);
    }

Langkah 4

Tambahkan perintah untuk menutup koneksi pada fungsi destroyApp:

        try {
            if (this.os != null) {
                this.os.close();
            }
            if (this.is != null) {
                this.is.close();
            }
            if (this.conn != null) {
                this.conn.close();
            }
        } catch (Exception e) {
        }

Langkah 5

Pada langkah ini kita akan membuat beberapa fungsi inti dari aplikasi Client. Tambahkan fungsi-fungsi berikut:

  • cariKoneksi() : bertugas untuk membuat sebuah proses baru untuk mencari perangkat-perangkat bluetooth yang aktif.
  • pilahPerintah() : bertugas untuk memilah jenis perintah yang diterima.
  • kirimData() : bertugas untuk mengirimkan data ke Server lewat OutputStream.
  • terimaData() : bertugas untuk membuat sebuah proses baru untuk menerima data dari Server lewat InputStream.
  • reform() : bertugas untuk mereset FormUtama.

Fungsi cariKoneksi().

    public void cariKoneksi(final DiscoveryListener m) {
        Thread t = new Thread() {

            public void run() {
                try {
                    lDevice = LocalDevice.getLocalDevice();
                    agent = lDevice.getDiscoveryAgent();
                    agent.startInquiry(DiscoveryAgent.GIAC, m);
                } catch (Exception ex) {
                    ex.printStackTrace();
                }
            }
        };
        t.start();
    }

Fungsi pilahPerintah().

    private void pilahPerintah(String perintah) {
        if (perintah.startsWith("chat:")) {
            this.chatForm.append("Server: " + perintah.substring(5));
        }
    }

Fungsi kirimData().

    public void kirimData(String data) {
        try {
            if (this.os != null) {
                this.os.write((data + (char) 255).getBytes());
                this.os.flush();
            }
        } catch (Exception e) {
        }
    }

Fungsi terimaData().

    private void terimaData(final InputStream is) {
        Thread t = new Thread() {

            public void run() {
                try {
                    int c = 0;
                    String buff = "";
                    while ((c = is.read()) != -1) {
                        if (c == 255) {
                            pilahPerintah(buff);
                            buff = "";
                        } else {
                            buff += (char) c;
                        }
                    }
                } catch (Exception e) {
                } finally {
                    try {
                        is.close();
                    } catch (Exception e) {
                    }
                }
            }
        };
        t.start();
    }

Perulangan while diatas akan membaca setiap byte dari data yang ditransfer dengan fungsi read (baris 8 ) dan nilai kembalian dari fungsi read ini adalah berupa nilai integer dari 1-255. Nilai kembalian tersebut kemudian disimpan ke dalam variabel c. Di dalam while dilakukan pengecekan, jika nilai c sama dengan 255 maka akan dilakukan pemanggilan perintah pilahPerintah(buff) lalu nilai buff diubah menjadi kosong (“”). Jika tidak maka nilai variabel buff akan ditambahkan (append) dengan karakter hasil casting dari nilai integer variabel c. Angka 255 merupakan angka yang disepakati sebagai penanda akhir dari sebuah perintah untuk aplikasi ini.

Fungsi reform().

    private void reform() {
        this.disp.setCurrent(this.formUtama);
        this.formUtama.removeCommand(mulai);

        this.formUtama.addCommand(shutdown);
        this.formUtama.addCommand(exec);
        this.formUtama.addCommand(mouse);
        this.formUtama.addCommand(chat);
    }

Langkah 6

Untuk setiap fungsi dari interface DiscoveryListener (deviceDiscovered, inquiryCompleted, servicesDiscovered, dan serviceSearchCompleted), tambahkan perintah-perintah berikut:

Fungsi deviceDiscovered().

    public void deviceDiscovered(RemoteDevice btDevice, DeviceClass cod) {
        try {
            this.vectorPerangkat.addElement(btDevice);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

Fungsi inquiryCompleted().

    public void inquiryCompleted(int discType) {
        try {
            RemoteDevice rev = null;
            for (int i = 0; i < this.vectorPerangkat.size(); i++) {
                rev = (RemoteDevice) this.vectorPerangkat.elementAt(i);
                this.listPerangkat.append(rev.getFriendlyName(true), null);
            }
        } catch (Exception e) {
        }
    }

Fungsi servicesDiscovered().

    public void servicesDiscovered(int transID, ServiceRecord[] records) {
        for (int i = 0; i < records.length; i++) {
            this.url = records[i].getConnectionURL(ServiceRecord.NOAUTHENTICATE_NOENCRYPT, false);
            System.out.println("URL: " + this.url);
            if (this.url.startsWith("btspp")) {
                this.ada = true;
            }
        }
    }

Fungsi serviceSearchCompleted().

    public void serviceSearchCompleted(int transID, int respCode) {
        try {
            if (this.ada) {
                if (this.conn != null) {
                    this.conn.close();
                }
                this.conn = (StreamConnection) Connector.open(this.url);
                this.os = this.conn.openOutputStream();
                this.is = this.conn.openInputStream();
                this.terimaData(this.is);
                this.kirimData("chat:test");
                this.disp.setCurrent(this.formUtama);
            }
        } catch (Exception e) {
        }
    }

Langkah 7

Di dalam fungsi commandAction (fungsi dari interface CommandListener) tambahkan perintah-perintah berikut:

    public void commandAction(Command c, Displayable d) {
        if (c == List.SELECT_COMMAND) { //perintah ini akan dijalankan saat user memilih item pada list
            try {
                RemoteDevice dev = (RemoteDevice) this.vectorPerangkat.elementAt(this.listPerangkat.getSelectedIndex());
                System.out.println("selected index " + this.listPerangkat.getSelectedIndex());
                int searchId = this.agent.searchServices(null, new UUID[]{new UUID(5000)}, dev, this);
                this.reform();
            } catch (Exception e) {
            }
        }

        if (c == this.exit) {
            destroyApp(true);
            notifyDestroyed();
        }
        if (c == mulai) {
            this.disp.setCurrent(this.listPerangkat);
            this.cariKoneksi(this);
        }
        if (c == kembali) {
            this.disp.setCurrent(this.formUtama);
        }
        if (c == shutdown) {
            this.kirimData("exec:shutdown");
        }
        if (c == exec) {
            this.disp.setCurrent(this.execForm);
        }
        if (c == mouse) {
            this.disp.setCurrent(this.mouseForm);
        }
        if (c == chat) {
            this.disp.setCurrent(chatForm);
        }
        if (c == kirimExec) {
            this.kirimData("exec:" + this.execText.getString());
        }
        if (c == kirimChat) {
            this.kirimData("chat:" + this.chatText.getString());
            this.chatForm.append("Client: " + this.chatText.getString());
            this.chatText.setString("");
        }
    }

Langkah 8

Tambahkan sebuah kelas baru bernama MouseCanvas, letakkan didalam kelas Client. Kelas MouseCanvas ini merupakan turunan dari kelas Canvas sehingga kelas ini harus mengimplementasikan fungsi paint(). Kelas ini harus dibuat karena dengan menggunakan Canvas, kita dapat menerima input tombol dari user. Kelas MouseCanvas nantinya akan digunakan sebagai pengirim perintah untuk menggerakkan mouse.

    class MouseCanvas extends Canvas {
        private CrossClient s;
        public MouseCanvas(CrossClient s) {
            this.s = s;
        }
        protected void keyPressed(int keyCode) {
            switch (keyCode) {
                case -1:
                    s.kirimData("mouse:move:atas");
                    break;
                case -2:
                    s.kirimData("mouse:move:bawah");
                    break;
                case -3:
                    s.kirimData("mouse:move:kiri");
                    break;
                case -4:
                    s.kirimData("mouse:move:kanan");
                    break;
                case -5:
                    s.kirimData("mouse:click:");
                    break;
            }
        }
        protected void paint(Graphics g) {
        }
    }

Parameter yang dikirim lewat fungsi kirimData ini nantinya akan dieksekusi sesuai dengan header perintah. Untuk case pertama parameter yang dikirim adalah “mouse:move:atas”. Akhir dari suatu header ditandai dengan karakter ‘:’ sehingga fungsi tersebut akan mengirimkan 3 buah header yaitu mouse:, move: dan atas:. Jika pesan ini diterima oleh Server, maka Server akan menggerakkan mouse ke arah atas. Sedangkan untuk case terakhir, parameter yang dikirim adalah “mouse:click”, Server akan men-generate sebuah event click.

(Download tutorial, source code dan toolkit di bawah)

Membuat Aplikasi Server

Aplikasi Server adalah aplikasi yang dibuat untuk desktop. Secara default, J2SE belum menyediakan library yang dapat berisi fungsi-fungsi microedition JSR-82. JSR-82 adalah spesifikasi API dari Java ME yang memungkinkan sebuah Midlet untuk menggunakan Bluetooth. Sebagai solusi, digunakanlah library tambahan BlueCove (dapat diakses dari www.bluecove.org). Fungsi ini merupakan hasil implementasi untuk JSR-82 yang dapat digunakan untuk J2SE edisi 1.1 ke atas. BlueCove bersifat open source dan multi platform. Sebelum memulai membuat aplikasi, terlebih dahulu download file .jar BlueCove dari http://sourceforge.net/projects/bluecove/files/. Setelah proses download selesai kita dapat melanjutkan membuat aplikasi.

Berdasarkan request dari Client, maka Server harus bisa melakukan dua perintah yaitu mengeksekusi perintah command prompt yang dikirimkan oleh Client dan menggerakkan kursor. Untuk perintah pertama, Server akan menggunakan kelas Runtime. Kelas Runtime adalah kelas bawaan dari Java yang digunakan untuk berinteraksi dengan enviroment sistem. Untuk mendapatkan Runtime tersebut, dipaggil fungsi static getRuntime(). Setelah Runtime didapatkan, maka untuk mengeksekusi perintah command prompt, digunakan fungsi exec(). Keterangan lebih lengkap tentang fungsi-fungsi yang berada di dalam kelas Runtime dapat dilihat di http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Runtime.html. Perintah selanjutnya yang harus dieksekusi oleh Server adalah menggerakkan kursor dari mouse. Untuk itu digunakan kelas Robot. Kelas Robot ini juga adalah kelas bawaan dari Java yang digunakan untuk mensimulasikan sendiri event-event yang membutuhkan inputan user dari mouse atau keyboard (mouse move, mouse click, key press, dan lain-lain). Tujuan utama dari kelas Robot adalah untuk menfasilitasi automatisasi tes dari implementasi platform Java. Keterangan lebih lengkap tentang fungsi-fungsi yang berada di dalam kelas Robot dapat dilihat di http://java.sun.com/j2se/1.4.2/docs/api/java/awt/Robot.html.

Langkah 1

Buat sebuah project Java Application baru. Setelah project terbentuk, pertama-tama tambahkan dahulu library BlueCove dengan klik kanan pada Library, lalu pilih Add JAR/Folder.

Browse ke tempat dimana file .jar hasil download tadi berada, lalu pilih open.

Jika berhasil maka akan muncul nama file .jar di dalam library.

Langkah 2

Tambahkan sebuah JFrame dengan nama CrossServer. Masukkan komponen-komponen berikut:

  • 1 MenuBar ke dalam frame.
  • 2 Menu ke dalam MenuBar.
  • 2 MenuItem ke dalam Menu pertama.
  • 1 JTabbedPane ke dalam frame.
  • 2 JPanel ke dalam JTabbedPane.
  • 1 JTextArea, 1 JTextField, dan satu JButton ke dalam JPanel pertama. Uncheck property Enabled untuk ketiga komponen ini.
  • 1 JTextArea ke dalam JPanel kedua. Uncheck property Enabled untuk komponen ini.

Rename nama variabel dari tiap-tiap komponen sehingga sesuai dengan gambar berikut.

Hasil design dari JFrame CrossServer akan terlihat sebagai berikut.

Langkah 3

Buka bagian source code dari CrossServer lalu tambahkan atribut-atribut berikut:

    private Robot robot;
    private UUID UUID = new UUID(5000);
    private LocalDevice lDevice;
    private OutputStream os;
    private InputStream is;

Langkah 4

Pada langkah ini kita akan membuat fungsi-fungsi yang menjadi penyusun utama Server antara lain:

  • cetakLog() : bertugas untuk mencetak informasi ke dalam text area.
  • bukaKoneksi() : bertugas untuk membuka koneksi dan menunggu client terkoneksi.
  • setCursor() : bertugas mengubah posisi kursor mouse sesuai dengan parameter arah yang diberikan.
  • pilahPerintah() : bertugas untuk memilah jenis perintah yang diterima.
  • kirimData() : bertugas untuk mengirimkan data ke Client lewat OutputStream.
  • terimaData() : bertugas untuk membuat sebuah proses baru untuk menerima data dari Client lewat InputStream.

Fungsi cetakLog().

    private void cetakLog(String txt) {
        this.tLog.setText(this.tLog.getText() + "\n" + txt);
    }

Fungsi bukaKoneksi().

    private void bukaKoneksi(){
        Thread t = new Thread() {

            @Override
            public void run() {
                try {
                    lDevice = LocalDevice.getLocalDevice();
                    lDevice.setDiscoverable(DiscoveryAgent.GIAC);
                    String url = "btspp://localhost:" + UUID + ";name=SisiServer;authorize=false";
                    StreamConnectionNotifier connNotif = (StreamConnectionNotifier) Connector.open(url);
                    System.out.println("URL: " + url);
                    cetakLog("URL: " + url);
                    System.out.println("Tunggu konkeksi...");
                    cetakLog("Tunggu konkesi...");
                    StreamConnection conn = connNotif.acceptAndOpen();
                    System.out.println("Terkoneksi.");
                    cetakLog("Terkoneksi.");
                    os = conn.openOutputStream();
                    is = conn.openInputStream();
                    bKirim.setEnabled(true);
                    tChat.setEnabled(true);
                    tChatArea.setEnabled(true);
                    tLog.setEnabled(true);
                    terimaData(is);
                } catch (Exception ex) {
                }
            }
        };
        t.start();
    }

Fungsi setCursor().

    private void setCursor(String dir) {
        if (dir.equals("kanan")) {
            this.cetakLog("kanan");
            this.robot.mouseMove(MouseInfo.getPointerInfo().getLocation().x + 5, MouseInfo.getPointerInfo().getLocation().y);
        }
        if (dir.equals("kiri")) {
            this.cetakLog("kiri");
            this.robot.mouseMove(MouseInfo.getPointerInfo().getLocation().x - 5, MouseInfo.getPointerInfo().getLocation().y);
        }
        if (dir.equals("atas")) {
            this.cetakLog("atas");
            this.robot.mouseMove(MouseInfo.getPointerInfo().getLocation().x, MouseInfo.getPointerInfo().getLocation().y - 5);
        }
        if (dir.equals("bawah")) {
            this.cetakLog("bawah");
            this.robot.mouseMove(MouseInfo.getPointerInfo().getLocation().x, MouseInfo.getPointerInfo().getLocation().y + 5);
        }
    }

Di dalam fungsi setCursor ini, kelas Robot akan menggeserkan letak cursor 5 pixel (relatif ke monitor) sesuai dengan arah dari parameter. Untuk dapat menggeserkan cursor tersebut, harus diketahui terlebih dahulu letak dari kursor sekarang. Cara yaitu dengan memanggil fungsi MouseInfo.getPointerInfo().getLocation(). Fungsi ini nantinya akan mengembalikan data dengan tipe Point yang kemudian dapat kita ambil atribut x dan y.

Fungsi pilahPerintah().

    private void pilahPerintah(String perintah) {
        this.cetakLog(perintah);
        if (perintah.startsWith("chat:")) {
            this.tChat.setText(this.tChat.getText() + perintah.substring(5) + "\n");
        }
        if (perintah.startsWith("mouse:")) {
            String nPerintah = perintah.substring(6);
            if (nPerintah.startsWith("move:")) {
                String dir = nPerintah.substring(5);
                this.setCursor(dir);
            }
            if (nPerintah.startsWith("click:")) {
                this.robot.mousePress(InputEvent.BUTTON1_MASK);
                this.robot.mouseRelease(InputEvent.BUTTON1_MASK);
            }
        }
        if (perintah.startsWith("key:")) {
        }
        if (perintah.startsWith("exec:")) {
            try {
                Runtime.getRuntime().exec(perintah.substring(5));
            } catch (IOException ex) {
                Logger.getLogger(CrossServer.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }

Fungsi kirimData().

    private void kirimData(String txt) {
        if (this.os != null) {
            try {
                this.os.write((txt + (char) 255).getBytes());
            } catch (IOException ex) {
                Logger.getLogger(CrossServer.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }

Fungsi di atas akan mengirimkan data ke Client dari dengan pesan dari parameternya, kemudian menambahkan karakter dengan nilai ASCII 255 pada akhir sebagai penanda akhir perintah.

Fungsi terimaData().

    private void terimaData(final InputStream is) {
        Thread t = new Thread() {

            @Override
            public void run() {
                try {
                    int c = 0;
                    String buff = "";
                    while ((c = is.read()) != -1) {
                        if (c == 255) {
                            pilahPerintah(buff);
                            buff = "";
                        } else {
                            buff += (char) c;
                        }
                    }
                } catch (Exception e) {
                } finally {
                    if (is != null) {
                        try {
                            is.close();
                        } catch (IOException ex) {
                            Logger.getLogger(CrossServer.class.getName()).log(Level.SEVERE, null, ex);
                        }
                    }
                }
            }
        };
        t.start();
    }

Langkah 5

Pada langkah ini akan ditambahkan perintah-perintah pada saat suatu event terjadi. Akan ada 4 buah event yaitu event ActionPerformed untuk 4 komponen mMulai, mKeluar, mPembuat dan bKirim. Di bagian Design, klik kanan pada komponen yang dikehendaki, lalu pilih Events, Action, actionPerformed. Setelah itu masukkan perintah-perintah dibawah ini sesuai dengan komponennya masing-masing.

Komponen mMulai.

    private void mMulaiActionPerformed(java.awt.event.ActionEvent evt) {
        this.tabPane.setSelectedIndex(1);
        this.bukaKoneksi();
    }

Komponen mKeluar.

    private void mKeluarActionPerformed(java.awt.event.ActionEvent evt) {
        System.exit(1);
    }

Komponen mPembuat.

    private void mPembuatActionPerformed(java.awt.event.ActionEvent evt) {
        JOptionPane.showMessageDialog(this, "Pembuat");
    }

Komponen bKirim.

    private void bKirimActionPerformed(java.awt.event.ActionEvent evt) {
        this.kirimData("chat:"+this.tChat.getText());
        this.tChatArea.setText(this.tChatArea.getText() + ("Server: " + this.tChat.getText()) + "\n");
        this.tChat.setText("");
    }

Untuk mencoba menggunakan Server di dalam emulator dengan menggunakan service BlueCove, silahkan baca di http://bluecove.org/bluecove-emu/index.html. Emulator ini akan berfungsi sebagai implementasi dari JSR-82 tanpa harus menggunakan perangkat bluetooth. Dan sebagai emulator untuk aplikasi Mobile yang akan diintegrasikan dengan emulator BlueCove, dapat menggunakan MicroEmulator (www.microemu.org).

Selamat mencoba dan bereksplorasi dengan library BlueCove. Semangat dalam mengerjakan proyek akhir.

Asisten.

———————————————————————–

Download Source Code, Tutorial (.docx), dan Tools (bluecove.jar, dll).

(Author tidak bertanggung jawab atas resiko atau hal merugikan apapun yang terjadi saat menggunakan source code yang disertakan.)

Categories: Java, Programming Tags: , ,
  1. No comments yet.
  1. 7 April, 2010 at 5:51 am

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: