Thursday, July 06, 2006

Pengumpulan Tugas Berakhir

Ya, karena ini sudah tanggal 7 Juli maka batas waktu untuk pengumpulan tugas Wireless sudah berakhir. Mengingat banyaknya orang yang sulit menerima invite (padahal semua email yang masuk - asalkan subjectnya benar - pasti di-invite), maka saya akan membolehkan tugas yang dikumpulkan dengan memakai login teman. Nilainya tidak akan saya kurangi.

Ok, selamat liburan untuk semua !

Thursday, June 29, 2006

J2ME Profiling dengan Wireless Toolkit

Yohanes Wayan — 203115008



Profiling adalah tindakan mencari bagian sistem yang performanya kurang untuk dioptimasi belakangan.

Profiling cukup penting karena prosesor pada mobile device agak lambat sehingga operasi yang biasanya pada desktop tidak terasa lambatnya dapat jadi mengganggu pada mobile device.



Mencoba Profiling



Buat new project dengan nama ProfileTest dan nama MIDlet ProfileTest. Program di bawah ini (ProfileTest.java) akan mendemonstrasikan salah satu hal yang banyak mengakibatkan alokasi objek tidak diperlukan yaitu penggunaan String secara tidak tepat (membuat string seperti "1, 2, 3, 4, ..." dari array). Sebagai perbandingannya digunakan StringBuffer dengan method append().




import javax.microedition.lcdui.*;
import javax.microedition.midlet.*;

public class ProfileTest
extends MIDlet
implements CommandListener {
private Form mMainForm;
private StringItem mStringItem;
private Command mExitCommand, mTestStringCommand, mTestStringBufferCommand;
private int[] mSomeIntegers = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
private static int TIMES = 10;

public ProfileTest() {
mMainForm = new Form("HelloMIDlet");
mStringItem = new StringItem(null, "Hello, MIDP!");
mMainForm.append(mStringItem);
mExitCommand = new Command("Exit", Command.SCREEN, 0);
mTestStringCommand = new Command("Test String", Command.SCREEN, 0);
mTestStringBufferCommand = new Command("Test StringBuffer", Command.SCREEN, 0);
mMainForm.addCommand(mExitCommand);
mMainForm.addCommand(mTestStringCommand);
mMainForm.addCommand(mTestStringBufferCommand);
mMainForm.setCommandListener(this);
}

public void startApp() {
Display.getDisplay(this).setCurrent(mMainForm);
}

public void pauseApp() {}

public void destroyApp(boolean unconditional) {}

public void commandAction(Command c, Displayable s) {
if (c == mExitCommand)
notifyDestroyed();
else if (c == mTestStringCommand)
testString();
else if (c == mTestStringBufferCommand)
testStringBuffer();
}
public void testString() {
String temp = "";
for (int times = 0; times < TIMES; times++) {
for (int i = 0; i < mSomeIntegers.length; i++) {
temp = temp + mSomeIntegers[i];
if (i < mSomeIntegers.length - 1) temp = temp + ", ";
}
}
mStringItem.setText(temp);
}
public void testStringBuffer() {
StringBuffer temp = new StringBuffer();
for (int times = 0; times < TIMES; times++) {
for (int i = 0; i < mSomeIntegers.length; i++) {
temp = temp.append(mSomeIntegers[i]);
if (i < mSomeIntegers.length - 1) temp.append(", ");
}
}
mStringItem.setText(temp.toString());
}
}


Nyalakan profiling di menu Edit > Preferences… bagian Monitor. Centang Enable Profiling dan Enable Memory Monitor. Untuk mensimulasikan lambatnya prosesor, centanglah Enable VM speed emulation pada tab Performance dan aturlah slidernya ke level yang sesuai.



Apabila program anda sekarang dijalankan dengan tombol Run maka akan muncul window Memory Monitor yang akan menampilkan jumlah byte yang dialokasi dan jumlah objek lengkap dengan graph alokasi. Cobalah menjalankan program dan mencoba pilihan Test String dan Test StringBuffer serta perhatikan bagaimana jumlah objek meningkat tajam ketika menggunakan String (di sini 248 (sesudah GC) jadi 1042) dan hanya meningkat sedikit saja ketika menggunakan StringBuffer (di sini 248 (sesudah GC) jadi 272). Ketika emulator ditutup maka akan tampak window Method Profiler dengan tampilan Call Graph di sebelah kiri dan tampilan method di sebelah kanan lengkap dengan berapa kali dipanggilnya dan jumlah Cycle yang dihabiskannya. Di sini meskipun sama-sama dipanggil dua kali, method testString menghabiskan 512813191 cycle dan method testStringBuffer menghabiskan 7781136 cycle. Tampak bahwa menggunakan StringBuffer lebih efisien.



Kesimpulan



Profiling penting untuk mencari tempat yang potensial ditingkatkan performancenya. Meskipun Wireless Toolkit menyediakan Profiler tapi jangan lupa melakukan tes pada device yang sebenarnya. Juga jangan lupa bahwa bagi user performance yang kelihatan (perceived performance) lebih penting oleh karena itu jangan sampai aplikasi anda terlihat tidak responsif meskipun sedang melakukan proses. Lebih baik aplikasi anda menampilkan layar menunggu dengan Gauge meskipun akan memakan waktu sedikit lebih lama daripada tampak hang.



Referensi



New Features in the J2ME Wireless Toolkit 1.0.4

http://developers.sun.com/techtopics/mobility/midp/articles/wtk104/

Wireless Development Tutorial Part I

http://developers.sun.com/techtopics/mobility/midp/articles/wtoolkit/

Membuat Midlet dengan EclipseME

Pesan Sponsor…



Untuk keperluan penilaian, NRP saya adalah 203115002.



Kembali ke Program Semula&hellip



EclipseME adalah plugin untuk Eclipse yang berfungsi untuk mempermudah pembuatan aplikasi J2ME menggunakan Sun Java Wireless Toolkit. Mungkin anda sekalian sudah cukup familiar dengan penggunaan Netbeans dan Mobility Pack untuk membuat aplikasi J2ME. Berikut ini akan dijelaskan langkah-langkah instalasi EclipseME pada Eclipse 3.0 dengan menggunakan Wireless Toolkit 2.2. Sistem operasi yang digunakan adalah Linux (Debian 3.1).



Prasyarat



  • Wireless Toolkit

  • J2SDK (untuk Wireless Toolkit)

  • Eclipse (jelas)


Sebelum menggunakan EclipseME, maka anda harus memiliki Wireless Toolkit untuk emulator dan class librarynya. Wireless Toolkit sendiri memerlukan J2SDK v1.4 ke atas. Sehingga tentu kedua hal tersebut harus dimiliki. Tentu saja Eclipse juga diperlukan. Versi EclipseME terbaru memerlukan Eclipse 3.1. Yang akan digunakan di sini adalah EclipseME versi 1.0 karena ini adalah versi terakhir yang masih mendukung Eclipse 3.0.



Untuk download J2SDK dapat dicari di situs Sun. Untuk download Wireless Toolkit dapat dilihat di halaman downloadnya (perlu registrasi Sun Developer Network (gratis)). Pada sistem saya J2SDK sudah diinstall dengan bantuan make-jpkg dari package java-package, letaknya di /usr/lib/j2sdk1.5-sun/. Ketika instalasi Wireless Toolkit anda akan diminta lokasi J2SDK (misal /user/jdk1.4/bin) apabila tidak bisa ditemukan oleh installernya. Pada sistem saya saya menjawab /usr/lib/j2sdk1.5-sun/bin. Wireless Toolkit sendiri saya install di ~/pkg/sun-wtk-2.2/.



Instalasi EclipseME



Untuk menginstall EclipseME dapat digunakan feature Software Updates milik Eclipse yang dapat diakses dari menu Help > Software Updates > Find and Install. Instalasi dapat dilakukan dari Internet atau dari site archive file (berbentuk jar atau zip) yang dapat didownload dan diinstall tanpa koneksi Internet. Karena di update site EclipseME yang tersedia hanya versi terbaru maka saya melakukan instalasi dari site archive. Untuk instruksi instalasi dari internet silahkan merujuk pada instruksi instalasi EclipseME.



Site archive yang saya download bernama eclipseme.feature_1.0.0_site.zip dan saya download dari situs SourceForge. Sesudah melakukan download maka site archive bisa diinstall melalui menu Help > Software Updates > Find and Install. Pilih Search for new features to install lalu Next. Pilih New Archived Site dan pilih file zip yang baru didownload. Centang pilihan eclipseME, pilih Next. Pilih feature eclipseME, pilih Next. Setujuilah lisensinya, pilih Next lalu Finish. Akan muncul kotak dialog menyatakan bahwa plugin ini tidak digitally signed. Pilih install saja.



Konfigurasi EclipseME



Setelah diinstall, EclipseME perlu dikonfigurasi.



  1. Pilih menu Window > Preferences.

  2. Pilih node J2ME > Platform Components di tree sebelah kiri.

  3. Klik Wireless Toolkits di tree Platform Components (sebelah kanan). Apabila kosong, klik kanan dan pilih Add Wireless Toolkit. Isilah dengan direktori instalasi Wireless Toolkit (untuk saya, /home/loumz/pkg/sun-wtk-2.2/) lalu klik Finish.

  4. Sesudah menambahkan Wireless Toolkit pastikan tree Platform Components bagian Platform Definitions, Profiles, dan Configurations ada isinya.



Penggunaan EclipseME



Sekarang mari buat proyek J2ME baru. Pilih menu File > New Project…. Pilih J2ME > J2ME Midlet Suite. Beri nama projectnya misalnya di sini HelloMidlet. Pilih Finish.



Sekarang buka project HelloMidlet di Package Explorer. Perhatikan bahwa telah dibuatkan file HelloMidlet.jad, dan J2ME library telah disertakan. Mari kita buat satu Midlet baru. Pilih menu File > New > Other…. Lalu pilih J2ME > J2ME Midlet. Isi nama class dengan HelloMidlet. Pastikan pilihan Add To Application Descriptor? tercentang. Tekan Finish.



Eclipse akan membuatkan file HelloMidlet.java berisi Midlet baru. Ada satu constructor default dan tiga method abstract yaitu startApp(), pauseApp(), dan destroyApp(boolean) yang harus dioverride. Untuk saat ini kita hanya akan menambahkan code di bagian constructor berupa tiga baris berikut ini di bawah super():




Display display = Display.getDisplay(this);
Form form = new Form("Hello Form");
form.append("Hello, World!");
display.setCurrent(form);


Karena kita belum melakukan import maka pasti ada highlight kesalahan (garis bawah merah) pada class yang belum diimport. Pilih menu Source > Organize Imports (Ctrl-Shift-O) untuk meletakkan statement import yang dibutuhkan, lalu Save (Ctrl-S).



Untuk menjalankannya, pilih menu Run > Run As > Emulated J2ME Midlet. Emulator akan tampak dengan Midlet anda di layar (tulisan Hello, World! pada form berjudul Hello Form).



Apabila anda tertarik mengutak-atik file application descriptor (.jad), EclipseME juga menyediakan editor untuknya. Coba saja doubleclick file HelloMidlet.jad pada Package Explorer.



Kesimpulan




Dapat dilihat di sini bahwa ada banyak faktor yang menyebabkan instalasi EclipseME (paling tidak untuk saya) agak rumit dan berbelit-belit. Pertama adalah kenyataan bahwa Eclipse yang digunakan adalah Eclipse versi 3.0 (lama) sehingga perlu mencari versi EclipseME yang lama pula. Kedua adalah bahwa EclipseME memerlukan Wireless Toolkit tetapi tidak menyertakannya. Ketiga adalah bahwa sistem operasi yang saya gunakan agak kurang umum. Saya sendiri mengalami sedikit kesusahan dalam mengkonfigurasi EclipseME setelah instalasinya.



Dari beberapa alasan di atas, saran saya adalah agar tetap menggunakan NetBeans + Mobility Pack untuk membuat aplikasi J2ME karena lebih mudah diinstall dan digunakan.



Referensi




EclipseME

http://eclipseme.org

Dokumentasi EclipseME

http://eclipseme.org/docs/index.html

Eclipse

http://eclipse.org

Sun Java Wireless Toolkit

http://java.sun.com/products/sjwtoolkit/

Multimedia dan MIDP 2.0

Sofian Coessoy
200114053

MIDP 2.0 dan Mobile Media API 1.1 (MMAPI), dapat digunakan untuk meningkatkan kemampuan multimedia dari mobile devices. Kemampuan tersebut antara lain menjalankan dan merekam audio dan video dari berbagai sumber. Tentu saja tidak semua mobile devices bisa menjalankan semua feature - feature tersebut.

Karena itu MIDP 2.0 yang merupakan subset dari MMAPI, dibuat untuk menjamin bahwa jika ada mobile devices yang tidak support terhadap MMAPI, mobile devices tersebut masih dapat menggunakan feature – feature yang dibatasi kemampuannya. Batasan tersebut contohnya, sebuah mobile devices masih dapat menggunakan audio (termasuk ringtones), tapi tidak dapat menggunakan semua feature yang berhubungan dengan video atau gambar.

Untuk selengkapnya di :
http://twmn4053.blogspot.com/

NB : Karena loadingnya lama, silahkan kunjungi blog saya.

Wednesday, June 28, 2006

Handle SOAP messages on MIDP devices using kSOAP

Andhika Candra W
203114774

XML menyajikan kemampuan untuk memproses yang baik yang merupakan salah satu persyaratan utama untuk aplikasi Wireless Web Service. MIDP/J2ME standar kurang memiliki kemampuan untuk XML API, yang tidak tergabung dalam spesifiksi MIDP 2.0 atau yang lainnya. Untuk itu dibutuhkan CLDC/library tambahan untuk menghandle XML, terutama untuk XML Web Service.

Untuk itu di enhydra.org terdapat package untuk dapat menjalankan aplikasi SOAP danXML pada KVM. Class utama pada kSOAP adalah SoapObject yang dapat build SOAP pada wireless aplikasi.

Kode program dibawah menampilkan Hello World dengan menggunakan kSOAP:

ByteArrayInputStream bis = new ByteArrayInputStream (mesg.getBytes ());
InputStreamReader reader = new InputStreamReader (bis);
XmlParser xp = new XmlParser (reader);
// Use default mapping between Java objects and Soap elements
SoapEnvelope envelope = new SoapEnvelope (new ClassMap (Soap.VER12));
envelope.parse (xp);

variable mesg berisi keseluruhan SOAP document.

Sekarang kita mendapatkan isi dari SOAP envelope.
Kode dibawah ini mendapatkan child pertama dari SOAP Body element:
// For Hello World Listing 1String result = (String) envelope.getBody();

Kode dibawah ini mendapatkan grandchild pertama dari SOAP Body element:
// For Hello World Listing 2
String result = (String) envelope.getResult();

Method SoapEnvelope.getResult() mendapatkan nilai dari SOAP RPC response messages yang berisi Hello World seperti pada Listing 2. SOAP parser bukan mendapatkan text string dari SOAP document melainkan mapping SOAP XML ke JAVA object.

kSOAP objects structure

Pada SOAP message, element xsi:type berfungsi untuk mendapatkan tipe data dari sebuah XML element. Sebagai contoh 123, berarti sebuah nilai integer yang besarnya 123. Sedangkan 123 berarti sebuah string yang isinya "123".
kSOAP secara otomatis mapping 4 tipe SOAP ke Java type berdasar list berikut :
xsd:int --> java.lang.Integer
xsd:long --> java.lang.Long
xsd:string --> java.lang.String
xsd:boolean --> java.lang.Boolean

Sewaktu kSOAP parser membaca tiap element SOAP, parser tersebut membaca XML element tersebut ke dalam memori internal Java data object berdasarkan rule berikut:
1. Jika SOAP element merupakan salah satu dari tipe diatas maka parser mengkonversi menjadi Java object tersebut
2. Jika SOAP element tidak memiliki child(primitive element) tetapi merupakan sebuah default tipe, maka dikonversi menjadi SoapPrimitive Object. Tetapi element original tipenya dapat didapatkan melalui method getNamespace() dan getName(). Dapat juga mengkases string melalui method SoapPrimitive.toString().
3. Jika SOAP element memiliki children maka diubah menjadi KVMSerializable Object. KVMSerializable adalah sebuah interface, kSOAP menyediakan implement untuk interface tsb yang bernama SoapObject.
4. Element dari children yang lebih kompleks dikonversi menjadi properties-properties didalam SoapObject sesuai 3 rule diatas. Setiap property memiliki PropertyInfo yang berisi informasi seperti SOAP element name dan JavaObject type. PropertyInfo tidak support element namespace, tapi untuk kSOAP release berikutnya akan support.

Advanced Features

Arrays

Listing . Stock-order response message dengan array


xmlns:SOAP-ENV="http://www.w3.org/2001/12/soap-envelope"
xmlns:SOAP-ENC="http://www.w3.org/2001/12/soap-encoding"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:n="http://www.javaworld.com/ksoap/test">



Michael Yuan
SOAP-ENC:arrayType="n:transaction[2]">

ABC
500
true
43.21


XYZ
1000
true
123.45


2002-07-18T23:20:52.52Z





kSOAP mengubah SOAP array menjadi java.util.Vector. Nethod vector,elementAT(i) mengekstrak array ke i. Tergantung dari arrayType, object tersebut bisa berupa SoapObject, SoapPrimitive atau default java type atau marshaled java object. Pada program diatas, array diubah menjadi SoapObject.

SoapObject Template

Pada contoh diatas, kita hanya membahas mengenai SOAP document dan parsing ke SoapObject. Pada banyak kasus, kita sering menangani message dengan format tertentu dan menginginkan parser untuk validate sebelum diparsing. Untuk proses validate dipakai class java biasa ClassMap. Untuk itu kita perlu menambah SoapObject template kosongan yang berisi informasi parent SOAP type, children element names dan Java types.

Dengan method ClassMap.addTemplate() pada SoapObject atau ClassMap.addMapping pada Marshal Object, maka ditambahkan SOAP type pada SoapPrimitive Object.

Source:
enhydra.org
http://www.javaworld.com/javaworld/jw-08-2002/jw-0823-wireless.html?
http://webservices.xml.com/pub/a/ws/2003/08/19/ksoap.html

Mengakses Localhost PC Kita dari Pocket Internet Explorer pada Emulator PPC

Hokgiarto Saliem / 201114229

Mengakses Localhost PC Kita dari Pocket Internet Explorer pada Emulator PPC

Dalam pemrograman web kita selalu tidak bisa lepas dari yang namanya localhost. Dengan dibantu oleh web server seperti IIS, Apache, atau yang lain, kita membutuhkan localhost untuk mencoba aplikasi web kita sebelum ditempatkan pada web hosting. Pada pemrograman aplikasi web pada pc, biasanya kita menggunakan pc untuk mengakses localhost. Localhost adalah sebuah alamat IP (Internet Protocol) yang dicadangkan khusus untuk loopback / testing. Selain berguna untuk mengetest aplikasi web kita, localhost juga berguna untuk mengetest jaringan.
Kemudian bagaimana jika kita ingin membuat mobile web programing? Tentu saja kita dapat mengetesnya dengan menggunakan cara yang sama dengan aplikasi web programing biasa. Tapi tentu saja hal itu tidak optimal. Agar lebih baik, tentu saja harus ditest dengan menggunakan Pocket Internet Explorer yang khusus terdapat pada Pocket PC. Berikut ini adalah contoh source code html yang digunakan:

HTML>
HEAD>
TITLE>JUDUL WEB /title>
/HEAD>
BODY>
H1>TEST /h1>
/BODY>
/HTML>

* Semua TAG dihilangkan kurung bukanya agar tidak difilter oleh blogger

Berikut ini adalah perbedaan tampilan dari Internet Explorer dan Pocket Internet Explorer dalam membuka file tersebut:

Bagaimanakah caranya agar bisa membuka localhost dengan Pocket Internet Explorer? Langkah pertama adalah pastikan localhost tersebut bisa diakses dengan menggunakan Internet Explorer / Browser lain pada PC. Langkah kedua adalah mengintall Microsoft Active Sinc, yang dapat didownload pada http://download.microsoft.com/download/1/c/5/1c541c3d-c8c7-4899-81fd-1b8e9bac09ed/setup.exe . Langkah ketiga adalah menginstall emulatornya. Emulator ini bisa didapat secara langsung dalam Visual Studio 2005 ataupun didownload secara terpisah beserta image nya di http://www.microsoft.com/downloads/details.aspx?FamilyID=c62d54a5-183a-4a1e-a7e2-cc500ed1f19a&DisplayLang=en .
Setelah Active Sinc dan Emulatornya diinstall, maka jalankan emulatornya. Pilih Pocket PC yang hendak diemulasikan. Untuk menjalankanya pilih menu Action – Connect, seperti pada gambar dibawah ini:


Setelah itu buka Active Sinc. Masuk pada menu File – Connection Setting. Centang pada bagian Allow connection to the one of the following dan pilih DMA.


Kemudian balik lagi pada emulator PPC (Pocket PC), klik kanan pada Poket PC yang telah aktif dan pilih Cradle. Sesaat selelah memilih Cradle maka Active Sinc akan tersambung dengan Emulator dan seolah-seolah ada Pocket PC yang terhubung. Kemudian akan muncul beberapa Wizard tergantung dari versi PPC nya. Untuk Wizard nya tidak akan dibahas, klik next, next, next, ..., finish atau pilh default saja.
Langkah selanjutnya adalah pada pocket PC. Dalam artikel ini ditest dengan menggunakan Windows Mobile 5.0 Pocket PC Emulator. Setelah itu pastikan tanda network pada PPC nya terhubung.


Perhatikan tanda disebelah kanan Start pada PPC yang dilingkari dengan lingkaran hitam. Itu artinya PPC telah terhubung pada suatu jaringan. Pada Pocket PC ganti network dari ISP ke WORK, caranya: Klik Start – Setting – tab Connection – Connections. Pilih tab Advanced – Klik Button Select Network, maka muncul seperti gambar berikut:


Pada gambar itu pastikan yang diberi kotak hitam mengandung kata WORK dan tidak mengandung kata ISP. Klik OK. Klik OK. Klik X (Silang).
Langkah terakhir adalah mengetest apakah Pocket Internet Explorer dapat membuka localhost. Caranya Klik Start – Internet Explorer. Ketik pada address bar à http://localhost/ . Jika berhasil maka akan tampak seperti pada Gambar 1 di sebelah kiri. Selamat mencoba dan semoga bermanfaat.

Sumber:
http://www.petri.co.il/download_ppc_device_emulator.htm
http://www.microsoft.com/downloads/details.aspx?FamilyID=c62d54a5-183a-4a1e-a7e2-cc500ed1f19a&DisplayLang=en
http://windowsmobilepro.blogspot.com/2006/04/emulator-troubleshootingtip-01-to.html
http://blogs.msdn.com/akhune/archive/2005/11/16/493329.aspx
http://msdn2.microsoft.com/en-us/library/ms228835.aspx
http://www.developer.net.au/Develop_for_Windows_Mobile_50_with_Visual_Studio_2005.htm

Network Programming dengan J2ME Wireless Devices

Network Programming dengan J2ME Wireless Devices

Veranita Saputra
202114707

Peralatan Wireless seperti telepon selular dapat menjaga pemiliknya terhubung dengan dunia luar setiap waktu di manapun mereka berada. Mereka menawarkan konektivitas yang bagus yang tidak disediakan oleh peralatan
lainnya. Pengembangan aplikasi untuk peralatan wireless ini telah menjadi permintaan yang besar pada beberapa tahun ke depan. Pemrograman jaringan memainkan peranan penting pada pengembangan aplikasi wireless untuk mengambil keuntungan dari konektivitas yang ditawarkan.

Sun’s Java 2 Micro Edition (J2ME) menawarkan platform untuk mengembangkan aplikasi yang tertanam dalam peralatan elektronik dan peralatan mobile. Pada Java 2 Micro Edition (J2ME), Connected Limited Devide Configuration (CLDC) mendefinisikan konfigurasi umum untuk broad range pada handheld devces. Pada bagian atas CLDC, Mobile Information Device Profile (MIDP) didefinisikan secara khusus untuk peralatan wireless seperti telepon selular dan two-way pagers. Penghasil peralatan wireless perlu mengimplementasikan MIDP untuk mendukung aplikasi Java pada peralatan mereka. Contohnya, Motorola hendak mengeluarkan implementasi MIDP untuk keluarga mobile phone iDEN pada kuarter pertama tahun 2001.

Pada bagian berikutnya, kita akan melihat apa yang baru pada pemrograman jaringan J2ME. Kemudian akan dibahas class HttpConnection pada J2ME MIDP dan akan ditutup dengan contoh bagaimana menggunakan class HttpConnection.

J2ME Generic Connection Framework
Pada Java 2 Standard Edition (J2SE), class yang terhubung dengan jaringan terletak pada package java.net. Kurang lebih terdapat 20 class pada package ini. Class-class ini menyediakan kumpulan fungi yang mendukung komunikasi jaringan pada aplikasi Java. Package java.net tidak sesuai untuk aplikasi wireless yang dijalankan pada telepon selular dan two-way pagers. Ukuran java.net kurang lebih 200KB. Ukuran ini terlalu besar untuk diletakkan pada peralatan wireless yang hanya mempunyai total memori dan tempat penyimpanan beberapa ratus kilobyte. Di samping ukuran, terdapat tantangan lainnya yang berkaitan dengan peralatan wireless: J2ME harus mendukung peralatan mobile yang bervariasi yang mempunyai ukuran dan bentuk yang berbeda-beda, kemampuan network yang berbeda-beda, dan kebutuhan file I/O yang berbeda.

Terdapat 1 class (Connector) dan 7 interface connection lainnya (Connection, ContentConnection, DatagramConnection, InputConnection, OutputConnection, StreamConnection, dan StreamConnectionNotifier) yang didefinisikan pada Generic Connection framework. Class-class tersebut dapat ditemukan pada package javax.microedition.io yang berasal dari J2ME CLDC. Sebagai catatan, tidak ada implementasi dari connection interface pada level CLDC. Implementasi sebenarnya pada sisi kiri MIDP. Ketujuh connection interface mendefinisikan gambaran 6 tipe dasar komunikasi : basic serial input, basic serial output, datagrams communications, sockets communications, mekanisme pada komunikasi client-server, dan komunikasi dasar HTTP dengan Web server.

Hubungan antara interface ini diilustrasikan pada diagram berikut ini :




Seperti yang terdapat pada gambar, connection adalah interface dasar dan root dari hirarki connection interface. Semua interface connection lainnya didapat dari Connection.StreamConnection. Di dalamnya terdapat InputConnection dan OutputConnection. Hal ini mendefinisikan kemampuan input dan output untuk koneksi stream. ContentConnection diperoleh dari StreamConnection. Class ini menambah mehod tambahan dari MIME pada bagian atas method I/O pada StreamConnection.
Class Connector adalah inti dari Generic Connection framework. Alasannya adalah karena semua objek connection yang telah disebutkan di atas dibuat oleh method static open yang didefinisikan pada class Connector. Tipe komunikasi yang berbeda dapat dibuat dengan method yang sama dengan parameter yang berbeda. Koneksi tersebut dapat berupa file I/O, serial port communication, datagram connection, atau http connection tergantung dari parameter string yang dipassingkan ke method tersebut. Desain tersebut membuat implementasi J2ME mudah diperluas dan fleksibel dalam mendukung peralatan dan produk baru.

Penggunaan method tersebut adalah sebagai berikut :
Connector.open(String connect);

Parameter connect adalah variabel String. Paramenter ini mempunyai format seperti URL: {protocol}:[{target}][{params}] dan terdiri dari 3 bagian : protocol, target, dan params. Ketentuan protocol adalah jenis connection yang akan dibuat oleh method. Terdapat beberapa nilai yang mungkin untuk protocol : file, socket, com, datagram, dan http. File menunjukkan connection yang akan digunakan untuk file I/O, comm menunjukkan connection yang akan digunakan untuk komunikasi serial port, dan http menunjukkan connection yang dibuat untuk mengakses web servers.
Target dapat berupa host name, nomor port network, nama file, atau nomor komunikasi port. Params optional, menunjukkan informasi tambahan yang diperlukan untuk melengkapi connect string. Contoh berikut ini menggambarkan bagaimana menggunakan method open untuk membuat jenis komunikasi yang berbeda berdasarkan protocol yang berbeda.

HTTP communication :
Connection hc = Connector.open("http://www.wirelessdevnet.com");

Stream-based Socket communication:
Connection sc = Connector.open("socket://localhost:9000");

Datagram-based socket communication:
Connection dc = Connector.open("datagram://:9000");

Serial-port communication:
Connection cc = Connector.open("comm:0;baudrate=9000");

File I/O:
Connection fc = Connector.open("file://foo.dat");

Seperti yang telah disebutkan sebelumnya, dukungan untuk protokol ini bervariasi dari vendor satu ke vendor lainnya. Developers harus mengecek dokumentasi untuk masing-masing penghasil device MIDP untuk mengetahui apakah mereka mendukung protocol tertentu. Socket, datagrams, dan koneksi http dengan MotoSDK (kit pengembangan dari Motorola) telah diuji. Ketiga jenis koneksi tersebut didukung oleh MIDP Motorola. Sun’s MIDP mereferensikan implementasi yang hanya mendukung koneksi HTTP. Jika program membuat koneksi berdasarkan protocol yang tidak didukung oleh device manufacturer, ConnectionNotFoundException akan diberikan.

Class HttpConnection

Class HttpConnection didefinisikan pada MIDP J2ME untuk mengijinkan develoer manghandle koneksi http pada aplikasi wirelessnya. Class HttpConnection pasti tersedia pada semua peralatan MIDP. Secara teori, kita mungkin menggunakan socket atau datagram untuk komunikasi remote pada aplikasi J2ME jika manufacturer device MIDP mendukungnya. Tetapi hal ini membuat aplikasi menjadi portable karena kita tidak dapat selalu bergantung pada manufacturer device lainnya . Hal ini berarti program tersebut mungkin dapat dijalankan pada satu peralatan MIDP tetapi tidak dapat dijalankan pada device MIDP lainnya. Jadi kita pertama kali harus menggunakan class HttpConnection pada aplikasi karena HTTPConnection adalah mandatory untuk semua aplikasi MIDP.
Interface HttpConnection didapat dari interface ContentConnection pada CLDC. Interface ini menginherit semua method I/O stream dari StreamConnection, semua MIME menghandle method dari ContentConnection dan menambah beberapa method tambahan untuk menghandle kebutuhan spesifik protocol http.

I/O yang terhubung:
DataInputStream openDataInputStream()
InputStream openInputStream()
DataOutputStream openDataOutputStream()
OutputStream openOutputStream()

Input stream dapat digunakan untuk membaca isi Web Server ketika output stream dapat digunakan untuk mengirim permintaan kepada Web server. Stream ini dapat diperoleh dari HttpConnection setelah koneksi dibangun pada Web Server. Pada contoh berikut ini, koneksi http dibentuk dengan web server
www.wirelessdevnet.com pada port 80 (port default). Kemudian input stream diperoleh untuk membaca respons dari Web:
HttpConnection hc = (HttpConnection);
InputStream is = new hc.openInputStream();
int ch;
// Check the Content-Length first
long len = hc.getLength();
if(len!=-1)
{
for(int i = 0;i
if((ch = is.read())!= -1 )
System.out.print((char) ch));
} else
{ // if the content-length is not available
while ((ch = is.read()) != -1)
System.out.print((char) ch));
}
is.close();
hc.close();

MIME yang terhubung:
String getEncoding()
Long getLength()
String getType()

Sekali koneksi http dibentuk, ketiga method dapat digunakan untuk memperoleh nilai nilai dari ketiga field pada header HTTP: Content-Length, Content-Encoding, dan Content-Type.

Protocol Http yang terhubung:
long getDate()
long getExpiration()
String getFile()
String getHeaderField(int index)
String getHeaderField(String name)
long getHeaderFieldDate(String name, long def)
int getHeaderFieldInt(String name, int def)
String getHeaderFieldKey(int n)
String getHost()
long getLastModified()
int getPort()
String getProtocol()
String getQuery()
String getRef()
String getRequestMethod()
String getRequestProperty(String key)
int getResponseCode()
String getResponseMessage()
String getURL()
void setRequestMethod(String method)
void setRequestProperty(String key, String value)

Method berikut ini untuk memperoleh informasi header: getDate, getExpiration, getFile, getHeaderField, getHeaderField, getHeaderFieldDate, getHeaderFieldInt, getHeaderFieldKey and getLastModified

Method berikut ini untuk memperoleh komponen individual yang diparse dari string URL: GetHost, getPort, getProtocol, getQuery, getRef, getRequestMethod, getRequestProperty, getResponseCode, getResponseMessage, dan getURL.

Ketiga method ini untuk dipakai bersama HEAD, GET, dan POST: setRequestMethod, setRequestProperty, and getRequestMethod

Berikut ini adalah contoh lengkapnya:

import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
import javax.microedition.io.*;
import java.io.*;

public class Sample1 extends MIDlet
implements CommandListener {
/*
* the default value for the URL string is
* http://www.webyu.com/servlets/webyu/wirelessdevnetsample1
*/

private static String defaultURL =
"http://www.webyu.com/servlets/webyu/wirelessdevnetsample1";

// GUI component for user to enter String
private Display myDisplay = null;
private Form mainScreen;
private TextField requestField;

// GUI component for displaying header information
private Form resultScreen;
private StringItem resultField;

// the "SEND" button used on the mainScreen
Command sendCommand = new Command("SEND", Command.OK, 1);

// the "BACK" button used on the resultScreen
Command backCommand = new Command("BACK", Command.OK, 1);

public Sample1(){
// initializing the GUI components for entering Web URL
myDisplay = Display.getDisplay(this);
mainScreen = new Form("Type in a string:");
requestField =
new TextField(null, "GREAT ARTICLE", 100, TextField.ANY);
mainScreen.append(requestField);
mainScreen.addCommand(sendCommand);
mainScreen.setCommandListener(this);
}

public void startApp() {
myDisplay.setCurrent(mainScreen);
}

public void pauseApp() {
}

public void destroyApp(boolean unconditional) {
}

public void commandAction(Command c, Displayable s) {
if (c == sendCommand) {
// retrieving the String that user entered
String requeststring = requestField.getString();
// sending a POST request to Web server
String resultstring = sendPostRequest(requeststring);
// displaying the response back from Web server
resultScreen = new Form("Result String:");
resultField = new StringItem(null, resultstring);
resultScreen.append(resultField);
resultScreen.addCommand(backCommand);
resultScreen.setCommandListener(this);
myDisplay.setCurrent(resultScreen);
} else if (c == backCommand) {
// do it all over again
requestField.setString("SOMETHING GOOD");
myDisplay.setCurrent(mainScreen);
}
}

// send a POST request to Web server
public String sendPostRequest(String requeststring) {
HttpConnection hc = null;
DataInputStream dis = null;
DataOutputStream dos = null;
StringBuffer messagebuffer = new StringBuffer();
try
{
// Open up a http connection with the Web server
// for both send and receive operations
hc = (HttpConnection)
Connector.open(defaultURL, Connector.READ_WRITE);
// Set the request method to POST
hc.setRequestMethod(HttpConnection.POST);
// Send the string entered by user byte by byte
dos = hc.openDataOutputStream();
byte[] request_body = requeststring.getBytes();
for (int i = 0; i <>
{dos.writeByte(request_body[i]); }
dos.flush();
dos.close();
// Retrieve the response back from the servlet
dis = new DataInputStream(hc.openInputStream());
int ch;
// Check the Content-Length first
long len = hc.getLength();
if(len!=-1)
{
for(int i = 0;i
if((ch = dis.read())!= -1)
messagebuffer.append((char)ch);
} else
{
// if the content-length is not available
while ((ch = dis.read()) != -1)
messagebuffer.append((char) ch);
}
}
dis.close();
} catch (IOException ioe)
{ messagebuffer = new StringBuffer("ERROR!"); }
finally {
// Free up i/o streams and http connection
try {
if (hc != null) hc.close();
}
catch (IOException ignored) {}
try
{ if (dis != null) dis.close(); }
catch (IOException ignored) {}
try
{ if (dos != null) dos.close(); }
catch (IOException ignored) {} }
return messagebuffer.toString();} }
sumber:
www.wirelessdevnet.com/channels/ java/features/j2me_http.phtml




Tuesday, June 27, 2006

Menggambar Grafik Yang Terbebas Dari Efek Flicker Dengan Menggunakan MIDP

Yuanita Susana
202114736


Dalam pembuatan grafik sebaiknya hindarilah terjadinya flicker yang mana dapat mengakibatkan tampilan grafik yang buruk. Untuk menghilangkan efek flicker ini digunakan teknik “double buffering”. Teknik ini merupakan teknik yang umum digunakan dalam computer graphis.

Dengan menggunakan MIDP maka penggunaan teknik “double buffering” dapat dilakukan dengan mudah. Gunakan class Image ( semua class yang digunakan dalam artikel ini terdapat dalam javax.microedition.lcdui package ) untuk membuat sebuah buffer memori offscreen. Gunakan class Graphics untuk menggambar buffer offscreen. Gunakan juga class Graphics untuk meng-copy isi dari buffer offscreen ke display. Double Buffering dapat diimplementasikan hanya dengan sedikit penyesuaian pada rutin painting.

Langkah pertama yang dilakukan adalah menentukan apakah double buffering penting untuk dilakukan atau tidak. Pada beberapa implementasi, double buffering sudah didukung oleh sistem secara otomatis. Dengan kata lain, ketika sistem memanggil method paint dari object Canvas, object Graphics yang diberikan pada method adalah sebuah buffer offscreen yang diatur oleh sistem, object bukan berasal dari buffer display. Kemudian sistem menangani peng-copy-an buffer offscreen ke display. Memeriksa apakah double buffering didukung atau tidak adalah hal yang mudah, hanya tinggal memanggil method isDoubleBuffered seperti berikut ini :
public class MyCanvas extends Canvas {

private Image offscreen = null;
private int height;
private int width;

public MyCanvas(){
height = getHeight();
width = getWidth();

if( !isDoubleBuffered() ){
offscreen = Image.createImage( width, height );
}

..... // other initialization as appropriate
}

...... // other code, including paint method
}

Pada segmen program diatas, bila isDoubleBuffered menghasilkan nilai false, constructor akan membentuk sebuah buffer offscreen dengan panjang dan lebar yang sama dengan canvas. Jika display telah mendukung double buffered maka isDoubleBuffered akan menghasilkan nilai true dan buffer offscreen tidak akan terbentuk.

Buffer offscreen terbentuk dengan memanggil salah satu dari method Image.createImage. Terdapat empat method yang masing-masing mengerjakan sebagai berikut :
· Load image dari file JAR MIDlet suite.
· Membuat copy dari image yang telah ada.
· Membentuk sebuah image dari raw binary data.
· Membentuk sebuah image kosong dengan panjang dan lebar yang spesifik.
Method terakhir dari method-method diatas digunakan untuk double buffering. Sedangkan ketiga method yang lain tidak dapat digunakan untuk double buffering karena membentuk image yang tidak dapat diubah. Hanya method createImage yang terakhir, dengan mengambil parameter panjang dan lebar, dapat digunakan untuk membentuk image yang dapat diubah. Sekali mempunyai image yang dapat diubah, maka dapat memanggil method getGraphics untuk mendapatkan object Graphics yang dapat digunakan untuk menggambar pada buffer image.

Tentu saja penggambaran yang sesungguhnya terdapat pada method paint. Berikut ini adalah rutin paint yang sederhana :

protected void paint( Graphics g ){
g.setColor( 255, 255, 255 );
g.fillRect( 0, 0, width, height );
}

untuk mengimplementasikan double buffering, tambahkan beberapa baris code sebelum dan sesudah code paint yang telah ada, seperti berikut ini :
protected void paint( Graphics g ){
Graphics saved = g;

if( offscreen != null ){
g = offscreen.getGraphics();
}

g.setColor( 255, 255, 255 );
g.fillRect( 0, 0, width, height );

if( g != saved ){
saved.drawImage( offscreen, 0, 0,
Graphics.LEFT Graphics.TOP );
}
}


Kesimpulan :
Pada dasarnya semua yang dilakukan adalah memperoleh object Graphics untuk buffer offscreen dan menggunakannya untuk melakukan painting. Pada akhirnya, keseluruhan isi dari buffer offscreen di-copy-kan ke display. Hal ini hanya dapat dilakukan bila double buffering tidak didukung secara otomatis. Jika double buffering telah didukung secara otomatis maka dapat langsung menggambar pada display seperti biasanya.

Jika hanya membuat perubahan yang kecil pada display, penggunaan double buffering akan membuat lebih lambat. Pada beberapa peng-copy-an image sistem tidak selalu cepat dan flicker dapat terjadi meskipun telah menggunakan double buffering. Untuk penggunaan double buffering ini juga harus mengorbankan memori karena buffer memori offscreen dapat menghabiskan sejumlah besar memori. Untuk menjaga buffer offscreen menjadi minimum, dapat dilakukan dengan cara melepaskan buffer offscreen, contohnya seperti ketika canvas hidden dan mengalokasikan kembali ketika canvas ditampilkan kembali. Hal ini dapat dilakukan dengan mudah, caranya : gunakan overriding method hideNotify dan showNotify dari canvas.

Sumber :
http://java.sun.com/developer/J2METechTips/2001/tt0725.html
http://www.javaperformancetuning.com/tips/j2me.shtml#REF10
http://www.developer.com/java/j2me/article.php/10934_1561591_8

Saturday, June 24, 2006

J2ME Polish

Yenny Setiadewi
202114727

.:: J2ME Polish ::.

J2ME Polish merupakan seperangkat tools yang digunakan untuk memudahkan dalam membuat aplikasi game dengan J2ME. Tools tersebut dilengkapi dengan komponen user interface, game-engine, dan kumpulan utility yang lainnya.
Pada artikel ini akan dijelaskan langkah-langkah untuk membuat sebuah aplikasi MIDP/2.0 khususnya game, dimana aplikasi yang dibuat juga dengan meng-include class javax.microedition.lcdui.game. Dengan menggunakan J2ME Polish dapat dibuat sebuah project tunggal untuk berbagai macam peralatan dalam waktu yang sama hanya dengan mengubah sedikit program.

Instalasi J2ME Polish
Untuk dapat menginstall J2ME Polish minimum membutuhkan Java SDK dan Wireless Toolkit. Selain itu juga membutuhkan program command line Ant versi 1.5 atau keatas. Installer J2ME Polish dapat didownload secara gratis di http://www.j2mepolish.org. Instalasi dapat dilakukan dengan cara men-double klik installer yang telah terdownload atau dapat juga dengan mengetik perintah “java -jar j2mepolish-1.1.jar” pada command line Ant untuk memulai proses instalasi.

Pembuatan Aplikasi dengan J2ME Polish
Pertama-tama untuk membuat aplikasi dibutuhkan peng-copyan file build.xml yang berada di subdirectory “sample” dari instalasi file J2ME Polish yang terbentuk ke root directory aplikasi game yang akan dibuat. File build.xml berisi informasi penting tentang project seperti class MIDlet, target peralatan, versi dari game, dan yang lainnya. File build.xml dapat di-edit dengan menggunakan text editor seperti TextPad. File build.xml dibagi menjadi tiga bagian, yaitu <info>, <deviceRequirements> dan <build>.

- Bagian <info> berisi informasi secara umum tentang project. Berikut adalah contoh isi dari bagian <info>:
<info
license="GPL"
name="J2ME Polish"
version="1.3.4"
description="A sample project"
vendorName="Enough Software"
infoUrl="http://www.j2mepolish.org"
icon="dot.png"
jarName="${polish.vendor}-${polish.name}-example.jar"
jarUrl="${deploy-url}${polish.jarName}"
copyright="Copyright 2004 Enough Software. All rights reserved."
deleteConfirm="Do you really want to kill me?"
/
>
Informasi yang ada dapat di-edit, seperti nama aplikasi dapat mengandung nama dan vendor dari target peralatan. Pada contoh diatas ${polish.vendor}-${polish.name}-example.jar” dapat diganti dengan “Nokia-6600-example.jar”, yang artinya aplikasi tersebut dibuat untuk handphone Nokia/6600.

- Bagian <deviceRequirements> berisi target peralatan yang dipilih, misalnya jika ingin membuat aplikasi MIDP versi 2.0 dan untuk handphone series 60 maka pada bagian requirement diisi “Nokia/6600” atau “Nokia/Series60Midp2”. Berikut adalah contoh isi dari bagian <deviceRequirements>:
<deviceRequirements>
<requirement name="Identifier" value="Nokia/Series60Midp2" />
</deviceRequirements>

- Bagian <build> yang mengontrol proses build yang sesungguhnya. Berikut adalah contoh isi dari bagian <build>:
<build
usePolishGui="false"
resDir="resources"
workDir="${dir.work}"
> <!-- midlets definition -->
<MIDLET class="de.enough.polish.example.MenuMidlet" name="Example" />
</build>
Jika ingin menggunakan GUI dari J2ME Polish dapat dengan cara men-set nilai dari
usePolishGui menjadi true. Selain itu juga harus mendefinisikan class MIDlet sesuai dengan aplikasi yang dibuat.

Setelah semua setting selesai, dilakukan proses compile, obfuscate, preverify, dan package secara otomatis. Hasil package disimpan dalam folder dist dari suatu project dan dapat dicoba pada emulator atau peralatan yang sesungguhnya.

Contoh Program Menu dengan J2ME Polish
public class MenuMidlet extends MIDlet {

List menuScreen;

public MenuMidlet() {
super();
System.out.println("starting MenuMidlet");
this.menuScreen = new List("J2ME Polish", List.IMPLICIT);
this.menuScreen.append("Start game", null);
this.menuScreen.append("Load game", null);
this.menuScreen.append("Help", null);
this.menuScreen.append("Quit", null);
this.menuScreen.setCommandListener(this);
System.out.println("intialisation done.");
}

protected void startApp() throws MIDletStateChangeException {
System.out.println("setting display.");
Display.getDisplay(this).setCurrent( this.menuScreen );
}
[...]

Contoh Menu dengan J2ME Polish


Sumber
http://www.j2mepolish.org/
http://www.mobilegd.com/article77.html
http://www.j2mepolish.org/docs/tutorial.html#extending
http://today.java.net/pub/n/J2MEPolish

Tips dan Trik mengetahui sisa energi baterai pada PocketPC

Aristian Wikarsa
203114795

Mobilitas adalah salah satu kunci utama kenapa banyak orang memilih menggunakan Notebook, PocketPC dan device lain sejenisnya. Sayangnya, sampai sekarang mobilitas masih terhalang masalah penggunaan energi yang terbatas (memakai baterai). Sebagai programmer yang memperhatikan aspek mobilitas dalam program-program yang dibuat, hendaknya kita patut pula memperhatikan masalah keterbatasan energi. Bagaimana jika seorang user kehabisan energi baterai saat sedang bekerja dengan aplikasi yang kita buat (sebut saja word processing atau aplikasi spreadsheet). Bagaimana jika saat user bermain game atau menggunakan kamera baterai tiba-tiba habis. Apakah data-data seperti dokumen yang sedang terbuka itu dapat terselamatkan, atau apakah game yang sedang dimainkan oleh user tiba-tiba mati padahal user tersebut sudah masuk level yang sulit dan lupa men-save game tersebut. Oleh karena itu sudah sepatutnya kita memberikan informasi seperti status atau kondisi baterai kepada user. Dengan mengetahui status dan kondisi baterai, kita dapat mencegah hal-hal yang tidak diinginkan seperti melakukan auto-save ketika sisa energi baterai sudah mencapai level tertentu. Dengan demikian tentu saja user yang menggunakan aplikasi kita akan menjadi lebih nyaman dengan fitur yang kita berikan ini.

Dalam .NET Framework 2.0 untuk mendapatkan informasi sisa energi baterai dapat dilakukan dengan sangat mudah seperti berikut:

PowerStatus ps = SystemInformation.PowerStatus;
BatteryLifePercentTextBox.Text = (ps.BatteryLifePercent * 100) + "%";


Property PowerStatus dari Class SystemInformation dapat digunakan untuk mendapatkan semua informasi mengenai keadaan baterai. Ada 5 property dari PowerStatus yaitu BatteryChargeStatus, BatteryFullLifetime, BatteryLifePercent, BatteryLifeRemaining dan PowerLineStatus. Berikut ini akan dijelaskan kegunaan dan sifat dari masing-masing property.
BatteryChargeStatus dapat berisi 6 kemungkinan nilai yaitu: Charging, Critical, High, Low, NoSystemBattery, Unknown. Nilai kembalian NoSystemBattery menandakan bahwa tidak ada baterai yang terdapat dalam sistem (seperti pada komputer desktop).
PowerLineStatus dapat berisi Online (menggunakan power AC), Offline (menggunakan power baterai) dan Unknown.
Untuk BatteryFullLifetime dan BatteryLifeRemaining digunakan untuk mendapatkan waktu sisa hidup baterai dalam satuan detik (BatteryLifeRemaining) dan berapa waktu yang dibutuhkan untuk menghabiskan baterai dari kondisi baterai penuh (BatteryFullLifetime) dalam hitungan detik.
BatteryLifePercent digunakan untuk mengetahui sisa kapasitas baterai yang memiliki nilai kembalian antara 0 sampai dengan 1. Cukup kalikan saja dengan 100 untuk mendapatkan nilai dalam satuan persen (%).
Berikut ini akan diberikan potongan source code procedure untuk mengupdate informasi baterai untuk ditampilkan kepada user.

private void UpdatePowerInfo()
{
  PowerStatus ps = SystemInformation.PowerStatus;

  BatteryChargeStatusTextBox.Text = ps.BatteryChargeStatus.ToString();
  
  BatteryLifePercentTextBox.Text = (ps.BatteryLifePercent * 100) + "%";
  PowerLineStatusTextBox.Text = ps.PowerLineStatus.ToString();

  TimeSpan ts = new TimeSpan(0, 0, ps.BatteryLifeRemaining);
  if (ps.BatteryLifeRemaining > 0)
    BatteryLifeRemainingTextBox.Text = ts.ToString();
  else BatteryLifeRemainingTextBox.Text = "Unknown";

  ts = new TimeSpan(0, 0, ps.BatteryFullLifetime);
  if (ps.BatteryFullLifetime > 0)
    BatteryFullLifetimeTextBox.Text = ts.ToString();
  else BatteryFullLifetimeTextBox.Text = "Unknown";

  PowerModeToolStripStatusLabel.Text = ((ps.PowerLineStatus ==   PowerLineStatus.Online) ? "AC" : "Battery");
}

Sebagai tambahan kita dapat menambahkan event PowerModeChanged untuk dapat merespon langsung terhadap perubahan power pada device (intermesso sedikit: barusan saja lampu saya mati dan kemudian auto-recover nya Microsoft Word dan Visual Studio 2005 bekerja. Selain itu browser Opera juga menawarkan untuk membuka session browsing terakhir. Sungguh ngga bohong. Beginilah seharusnya setiap aplikasi dibuat!!! Saya jadi penasaran apakah Delphi ada fitur recovery seperti ini atau tidak). Dengan digunakannya event ini maka anda dapat langsung merespon tindakan apa yang harus dilakukan jika level energi baterai sudah menipis, misalnya membuat save-copy dari dokumen yang terbuka, men-save sesi sebuah web browser (seperti fitur save session nya browser Opera) atau menurunkan kualitas gambar game untuk mengurangi penggunaan energi baterai. Untuk penggunaan event tersebut dapat langsung dilihat pada potongan source code berikut ini.

// Pada Main Entry Program Anda
SystemEvents.PowerModeChanged += new PowerModeChangedEventHandler(SystemEvents_PowerModeChanged);

// Pada Class Utama Anda
void SystemEvents_PowerModeChanged(object sender, PowerModeChangedEventArgs e)
{
  UpdatePowerInfo();

  // atau tambahkan penanganan event lainnya seperti misalnya auto-save
}
Dengan demikian mulai sekarang semua aplikasi yang anda buat dapat ditambahkan fitur auto-recovery atau berbagai macam fitur lainnya sesuai imajinasi dan kreatifitas masing-masing. Untuk source code VB dari contoh program yang sesungguhnya dapat anda download di URL: http://download.microsoft.com/download/4/1/e/41e8f2c1-1bf7-419f-b31b-06122d090a49/TakeItWithYouVB.msi . Satu lagi catatan terakhir bahwa trik ini bukan cuma bisa dilakukan pada PocketPC saja tetapi bisa juga diterapkan pada Desktop PC maupun Notebook. Sekian. Terima Kasih.

Source:
www.pocketpcdn.com
http://msdn.microsoft.com/coding4fun/inthebox/mobile1/default.aspx
http://msdn2.microsoft.com/en-us/library/microsoft.win32.systemevents.powermodechanged.aspx




 

Friday, June 23, 2006

Koneksi GPRS dengan TcpClient

201114333 - Slamet Adi Wiyono
========================
dotNET Compact Framework

HttpWebRequest pada NETCF (dotnet Compact Framework) secara otomatis membuat hubungan GPRS untuk request web/web servis ketika koneksi wired/wi-fi tidak tersedia. Oleh karena itu, ketika melakukan web request atau menggunakan sebuah web servis, para developer tidak membutuhkan kode khusus untuk menangani kasus koneksi GPRS. Hal ini tidak diaplikasikan ke level class socket yang lebih rendah seperti TcpClient dan UdpClient. Class-class di bawah ini akan diperlukan untuk Connection Manager API sebagai koneksi menggunakan GPRS.

Untuk dapat memungkinkan user agar lebih mudah membuat koneksi GPRS, dibawah telah dituliskan untuk merepresentasikan dari Connection Manager API yang dibutuhkan ketika akan membuat suatu koneksi GPRS dengan TcpClient

sourcec code :

/*--------------------------------------------------------*/
public class GPRSConnection{
const int S_OK = 0;
const uint CONNMGR_PARAM_GUIDDESTNET = 0x1;
const uint CONNMGR_FLAG_PROXY_HTTP = 0x1;
const uint CONNMGR_PRIORITY_USERINTERACTIVE = 0x08000;
const uint INFINITE = 0xffffffff;
const uint CONNMGR_STATUS_CONNECTED = 0x10;
static Hashtable ht = new Hashtable();

static GPRSConnection()
{
ManualResetEvent mre = new ManualResetEvent(false);
mre.Handle = ConnMgrApiReadyEvent();
mre.WaitOne();
CloseHandle(mre.Handle);
}

~GPRSConnection(){
ReleaseAll();
}

public static bool Setup(Uri url){
return Setup(url.ToString());
}

public static bool Setup(string urlStr)
{
ConnectionInfo ci = new ConnectionInfo();
IntPtr phConnection = IntPtr.Zero;
uint status = 0;
if (ht[urlStr] != null)
return true;
if (ConnMgrMapURL(urlStr, ref ci.guidDestNet,
IntPtr.Zero) != S_OK)
return false;

ci.cbSize = (uint) Marshal.SizeOf(ci);
ci.dwParams = CONNMGR_PARAM_GUIDDESTNET;
ci.dwFlags = CONNMGR_FLAG_PROXY_HTTP;
ci.dwPriority = CONNMGR_PRIORITY_USERINTERACTIVE;
ci.bExclusive = 0;
ci.bDisabled = 0;
ci.hWnd = IntPtr.Zero;
ci.uMsg = 0;
ci.lParam = 0;
if (ConnMgrEstablishConnectionSync
(ref ci,ref phConnection,INFINITE,ref status)!=S_OK &&

status != CONNMGR_STATUS_CONNECTED)
return false;
ht[urlStr] = phConnection;
return true;
}

public static bool Release(Uri url){
return Release(url.ToString());
}

public static bool Release(string urlStr)
{
return Release(urlStr, true);
}

private static bool Release(string urlStr, bool removeNode)
{
bool res = true;
IntPtr ph = IntPtr.Zero;
if (ht[urlStr] == null)
return true;
ph = (IntPtr)ht[urlStr];
if (ConnMgrReleaseConnection(ph, 1) != S_OK)
res = false;
CloseHandle(ph);
if (removeNode)
ht.Remove(urlStr);
return res;
}

public static void ReleaseAll(){
foreach(DictionaryEntry de in ht){
Release((string)de.Key, false);
}
ht.Clear();
}

[StructLayout(LayoutKind.Sequential)]
public struct ConnectionInfo
{
public uint cbSize;
public uint dwParams;
public uint dwFlags;
public uint dwPriority;
public int bExclusive;
public int bDisabled;
public Guid guidDestNet;
public IntPtr hWnd;
public uint uMsg;
public uint lParam;
public uint ulMaxCost;
public uint ulMinRcvBw;
public uint ulMaxConnLatency;
}
 [DllImport("cellcore.dll")]
private static extern int ConnMgrMapURL
(string pwszURL, ref Guid pguid, IntPtr pdwIndex);

[DllImport("cellcore.dll")]
private static extern int ConnMgrEstablishConnectionSync
(ref ConnectionInfo ci, ref IntPtr phConnection,
uint dwTimeout, ref uint pdwStatus);
 [DllImport("cellcore.dll")]
private static extern IntPtr ConnMgrApiReadyEvent();
 [DllImport("cellcore.dll")]
private static extern int ConnMgrReleaseConnection
(IntPtr hConnection, int bCache);
 [DllImport("coredll.dll")]
private static extern int CloseHandle(IntPtr hObject);
}

/*--------------------------------------------------------------------*/

Menggunakan class GPRSConnection sangat mudah yakni memanggil method setup sebelum membuat koneksi dengan class TcpClient. Anda bisa menggunakan contoh dibawah sebagai referensi untuk melihat bagaimana class tersebut digunakan.

/*============================================================*/
public void DoTcpConnection(){
string url = "www.msn.com";
bool res = GPRSConnection.Setup("http://" + url + "/");
if (res){
TcpClient tc = new TcpClient(url, 80);
NetworkStream ns = tc.GetStream();
byte[] buf = new byte[100];
ns.Write(buf, 0, 100);
tc.Client.Shutdown(SocketShutdown.Both);
ns.Close();
tc.Close();
MessageBox.Show("Wrote 100 bytes");
}
else{
MessageBox.Show("Connection establishment failed");
}
}

/*======================================================*/

Sebagai tambahan, struktur dibawah adalah cara yang biasa dilakukan untuk koneksi General Packet Radio Service (GPRS) yang digunakan pada saat awal dari pemanggilan GPRS. Hal dibawah ini adalah profile khusus yang digunakan untuk koneksi GPRS. Untuk membuat sebuah koneksi, karakter dalam string GPRS_DEST_ADDRESS harus merupakan bagian dari string yang dikirimkan untuk lineMakeCall. Hal ini akan memulai koneksi GPRS, aplikasikan parameter-parameter dalam struktur dibawah. String untuk dial digunakan dan disesuaikan berdasarkan aplikasi yang memiliki control yang lengkap melalui parameter GPRS.

typedef struct cellgprsconnectioninfo_tag {
DWORD dwProtocolType;
DWORD dwL2ProtocolType
WCHAR wszAccessPointName[CELLDEVCONFIG_MAXLENGTH_GPRSACCESSPOINTNAME];
WCHAR wszAddress[CELLDEVCONFIG_MAXLENGTH_GPRSADDRESS;
DWORD dwDataCompression;
DWORD dwHeaderCompression;
char szParameters[CELLDEVCONFIG_MAXLENGTH_GPRSPARAMETERS;
BOOL bRequestedQOSSettingsValid;
CELLGPRSQOSSETTINGS cgqsRequestedQOSSettings;
BOOL bMinimumQOSSettingsValid;
CELLGPRSQOSSETTINGS cgqsMinimumQOSSettings;
} CELLGPRSCONNECTIONINFO, *LPCELLGPRSCONNECTIONINFO;

Keterangan :

dwProtocolType
Identitas tipe protocol untuk koneksi GPRS. Gunakan salah satu nilai dari nilai yang terdapat pada tabel.

dwL2ProtocolType
Identitas dari tipe protocol level-2 untuk koneksi GPRS.

wszAccessPointName
Nama yang spesifik yang digunakan untuk memilih gateway GPRS

wszAddress
Menentukan alamat address yang dipakai untuk koneksi. Jika strirng ini empty/kosong, akan digunakan sebuah alamat yang dynamic/random.

dwDataCompression
Identitas setting kompresi data untuk pesan yang akan dikirim dan diterima.

dwHeaderCompression
Identitas setting kompresi data untuk pesan yang dikirm dan diterima. Untuk daftar nilai yang mungkin, dapat melihat daftar nilai untuk dwDataCompression

szParameters
Identitas parameter protocol-spesifik. Harus diisi dengan NULL untuk terminated

bRequestedQOSSettingsValid
TRUE jika dan hanya jika cgqsRequestedQOSSettings adalah valid

cgqsRequestedQOSSettings
Struktur setting kualitas servis (QOS) dari GPRS.
Jika bRequestedQOSSettingsValid adalah TRUE, cgqsRequestedQOSSettings yang digunakan;
Jika bRequestedQOSSettingsValid bernilai FALSE, cgqsRequestedQOSSettings tidak digunakan.

bMinimumQOSSettingsValid
TRUE jika dan hanya jika cgqsMinimumQOSSettings adalah valid

cgqsMinimumQOSSettings
Struktur setting QOS GPRS.
Jika bMinimumQOSSettingsValid bernilai TRUE, maka cgqsMinimumQOSSettings yang digunakan;
Jika bMinimumQOSSettingsValid bernilai FALSE, maka cgqsMinimumQOSSettings tidak digunakan.

Sumber :
1.http://blogs.msdn.com/anthonywong/archive/2006/03/13/550686.aspx
2.http://msdn.microsoft.com/library/default.asp?url=/library/en-us/apisp/html/sp_tsp_cellgprsconnectioninfo.asp

Wednesday, June 21, 2006

Mengambil Gambar dengan J2ME MMAPI

Nama: Adi Kurniawan
NRP: 203114763

Mengambil Gambar dengan J2ME MMAPI

Kesuksesan dari MP3 player dan handphone dengan kamera telah membuktikan bahwa
multimedia merupakan nilai penting dalam aplikasi mobile. Para penggunanya tidak hanya
menggunakannya untuk memutar suatu musik atau film saja tetapi mereka kebanyakan juga
membagikan pengalaman mereka sehari-hari baik melalui audio maupun video. J2ME Mobile Media API (MMAPI) memungkinkan untuk membuat aplikasi multimedia pada peralatan yang mempunyai berbasiskan Java.

Mula-mula untuk memulai dalam membuat aplikasi MMAPI, kita harus mengetahui tools-tools yang akan dipakai, yaitu J2ME Wireless Toolkit 2.0 yang sudah mendukung MIDP 2.0, MMAPI 1.0, dan WMA 1.1.

Langkah pertama dalam mengambil gambar dalam MIDlet adalah mengambil video. Pertama mengambil Player dari Manager. Untuk memberitahu bahwa kita akan mengambil gambar dari kamera dengan menggunakan ukuran default, kita perlu menambahkan tempat khusus yaitu capture://video

mPlayer = Manager.createPlayer("capture://video");

Jika peralatan yang digunakan tidak mendukung pengambilan video, MediaException akan dikeluarkan. Untuk mengecek apakah peralatan mendukung pengambilan video atau tidak dapat digunakan supports.video.capture yang akan bernilai true jika support pengambilan video.

Kemudian Player butuh "disadarkan" untuk mengambil bahan-bahan yang dibutuhkan untuk
mengambil gambar.

mPlayer.realize();

Kemudian video yang didapat dari kamera dapat ditampilkan pada layar dalam bentuk Item
pada Form atau sebagai bagian dari Canvas. Hal ini mungkin karena adanya VideoControl.

mVideoControl = (VideoControl)mPlayer.getControl("VideoControl");

Setelah kita berhasil menampilkan video pada peralatan yang kita gunakan, mengambil
gambar menjadi mudah. Yang perlu kita lakukan hanyalah memanggil metode getSnapShot() dari class VideoControl. Disini kita harus memasingkan tipe gambar yang diinginkan atau null untuk tipe defaultnya yaitu PNG.

Metode getSnapShot() mengembalikan array of byte, yang berisi gambar dalam format yang
diinginkan. Kemudian apa yang akan digunkana pada saat ini adalah terserah pada kita sendiri, apakah ingin mengirim ke server, atau membuat Image dari array tersebut sehingga hasil gambar tersebut dapat dilihat.

byte[] raw = mVideoControl.getSnapShot(null);
Image image = Image.createImage(raw,0,raw.length);

Source:
http://developers.sun.com/techtopics/mobility/midp/articles/picture/
http://www.awprofessional.com/articles/article.asp?p=375708