Wednesday, August 27, 2008

WAP Push lewat protokol SMPP

Seperti sudah dijelaskan di posting sebelumnya dan sebelumnya, WAP push biasanya dikirimkan dalam bentunk XML ke PPG (Push Proxy Gateway) dengan menggunakan prokol PAP (Push Application Protocol). Contoh sebuah body message pada PAP untuk mengirimkan WAP push ke ponsel adalah seperti ini:
          
<si>
<indication href="http://cp.com/dl/javagames.php">
Klik untuk download konten
</indication>
</si>


Kita perlu ingat juga bahwa WAP push didesain agar "bearer independent" artinya dapat dikirimkan dari jaringan operator ke ponsel lewat bearer apapun yaitu SMS, USSD, circuit switch atau packet switch (GPRS). WAP push paling sering dikirimkan lewat bearer SMS dengan cara mengirimkan ke SMSC menggunakan protokol SMPP. Lalu bagaimana WAP push dapat dikirimkan lewat SMPP?

WAP push dikirimkan menggunakan submit_sm request ke SMSC, ada beberapa parameter yang harus diset pada submit_sm yaitu ESM_CLASS, DATA_CODING dan message (payload). Nilai untuk ESM_CLASS dan DATA_CODING adalah sebagai berikut

ESM_CLASS = 0x40
DATA_CODING = 0xF5

Sedangkan parameter message yang biasa kita isi teks dari SMS harus kita isi dengan kode WAP push XML yang disederhanakan dengan cara dibuat dalam bentuk biner. Hal ini dilakukan agar data menjadi lebih kecil. Penjelasan yang lebih detail dapat dibaca dari spesifikasi WBXML (WAP Binary XML) yaitu standar representasi XML dalam bentuk biner. WBXML dispesifikasikan oleh WAP Forum atau Open Mobile Alliance.

Sekarang coba kita encode XML diatas menjadi kode hexa WAP push. Setiap tag XML maupun atribut memiliki kode tertentu, sedangkan untuk teks yang merupakan nilai dari element atau attribute kita ubah menjadi string hexa dengan diawali dengan kode 03 yang berarti awal dari sebuah string ASCII dan diakhiri dengan 00.

Bagian XML Kode hexa
------------------------------------------------ -----------------------------------------------------------
<si> 45
<indication C6
href='http:// 0C
Tanda awal untuk string ASCII 03
cp.com/dl/javagames.php 63702E636F6D2F646C2F6A61766167616D65732E706870
Tanda akhir string 00
> (Penutup tag indication) 01
Tanda awal untuk string ASCII 03
Klik untuk download konten 4B6C696B20756E74756B20646F776E6C6F6164206B6F6E74656E74
Tanda akhir string 00
</indication> 01
</si> 01

Jadi sekerang kita telah memiliki kode hexa dari XML WAP push yaitu 45C60C0363702E636F6D2F646C2F6A61766167616D65732E7068700001034B6C696B20756E74756B20646F776E6C6F6164206B6F6E74656E74000101


Sebelum memasukan kode tersebut dalam payload message di submit_sm request, kita memerlukan bagian UDH (User Data Header) sebagai berikut


Header parameter Value
------------------------------------------------------------------------- ---------
UDH lenght 06
0504
Destination port 0B84
Source port 23F0

Transaction ID: Push ID DC
PDU Type: Push 06
Headers lenght: 1 01
Content type: application/vnd.wap.sic (0x80 | 0x2E) AE

Version: 1.2 02
Public identifier: -//WAPFORUM//DTD SI 1.0//EN (Service Indication 1.0) 05
Character Set: utf-8 6A
String table: 0 bytes 00


Sekarang kita telah memiliki header yaitu 0605040B8423F0DC0601AE02056A00,header ini harus disimpan selum kode binary XML dari message.

Contoh lengkap bagaimana membuat WAP push dengan menggunakan Java SMPP library atau library versi aslinya dari Logica, saya tulis dibawah ini:


// Create submit_sm request
SubmitSM request = new SubmitSM();

// Set binary message specific params
request.setEsmClass((byte)(Data.SM_UDH_GSM)); //0x40
request.setDataCoding((byte)0x0f5);
...

// Create hexa code for WAP push
String hexMessage = "0605040B8423F0DC0601AE02056A0045C60C03"
+ byteArrayToHexString("cp.com/dl/javagames.php".getBytes()).toUpperCase()
+ "000103"
+ byteArrayToHexString("Klik untuk download konten".getBytes()).toUpperCase()
+ "000101";

// Set WAP push as short message data
request.setShortMessageData(hexToByteArray(hexMessage));

//Send submit_sm request to SMSC
session.submit(request);


Kode diatas menggunakan dua method utilitas byteArrayToHexString syaitu untuk mengubah string byte array menjadi hexadesimal byte yang direpresentasikan dalam string dan method hexToByteArray yang melakukan hal kebalikannya.

Kedua method tersebut saya tuliskan dibawah

public static String byteArrayToHexString(byte[] b) {

int len = b.length;
char[] s = new char[len * 2]; // + 2 ];
//s[0] = '\'';
int j = 0;
for (int i = 0; i < len; i++) {
int c = ((int) b[i]) & 0xff;

s[j++] = (char) HEXBYTES[c >> 4 & 0xf];
s[j++] = (char) HEXBYTES[c & 0xf];
}

//s[j] = '\'';

return new String(s);
}

public static byte[] hexToByteArray(String s) throws IOException {

int l = s.length() / 2;
byte[] data = new byte[l];
int j = 0;

if (s.length() % 2 != 0) {
throw new IOException(
"hexadecimal string with odd number of characters"); //NOI18N
}

for (int i = 0; i < l; i++) {
char c = s.charAt(j++);
int n, b;

n = HEXINDEX.indexOf(c);

if (n == -1) {
throw new IOException(
"hexadecimal string contains non hex character"); //NOI18N
}

b = (n & 0xf) << 4;
c = s.charAt(j++);
n = HEXINDEX.indexOf(c);
b += (n & 0xf);
data[i] = (byte) b;
}

return data;
}

Jika kita lihat secara keseluruhan paket (PDU) dari sebuah submit_sm untuk WAP push adalah seperti contoh berikut ini:

3 comments:

Unknown said...

mas javanensis.. kalo sms gateway dengan smpp pake java itu konsepnya gmana ya mas.. trus kalo bisa ada tutorial nya gak ya.. mohon bantuan nya mas.. trima kasih..

Unknown said...

lagi iseng liat topik sms gateway pake java dan API.. nah saya liat2 ada jsmpp, open smpp, smpp.. dan smuanya bermuara ke smpp.. maap mas kalo banyak komen dan minta help nya.. trima kasih..

My hollywood Feed said...

Nice integration..SMPP Client

Followers