[SMS Gateway] Teknik Mengirim Long Text SMS Gammu dengan Query SQL

Pada artikel yang lalu, saya pernah menulis topik Teknik Dasar Mengirim SMS dengan Gammu. Dalam artikel tersebut salah satunya adalah pembahasan tentang teknik mengirim SMS dengan panjang karakter lebih dari 160 karakter (long text SMS) yaitu dengan command “gammu-smsd-inject”. Nah.. pada artikel kali ini saya akan menjelaskan cara mengirim long text SMS Gammu menggunakan query SQL.

Kelemahan mengirim long text SMS dengan command “gammu-smsd-inject” adalah lambatnya proses bila diintegrasikan dengan script PHP. Dari hasil eksperiman sendiri, ceilee… :-) , untuk mengirim long text SMS ke lebih dari 500 nomor dengan menggunakan command “gammu-smsd-inject” yang diintegrasikan dengan script PHP butuh waktu lebih dari 30 detik. Bisa dibayangkan bila digunakan untuk mengirim ke ribuan nomor sekaligus. Tentu running timenya lebih lama.

Sedangkan kelebihan mengirim long text SMS dengan query SQL adalah running time yang jauh lebih cepat dibandingkan command “gammu-smsd-inject”. Namun.. di sisi lain, kekurangannya adalah agak rumitnya membuat script untuk melakukan hal ini. Sedangkan kelebihan dari command “gammu-smsd-inject” adalah perintahnya jauh lebih mudah dibandingkan via script query SQL. Akan tetapi mengingat kelebihannya yang lebih efisien, saya kira kesulitan untuk membuat script pengiriman long text SMS dengan query tak perlu dipermasalahkan, toh… saya akan beberkan caranya di sini :-)

So.. gimana teknik pengiriman long text SMS Gammu dengan query SQL? OK tekniknya adalah kita harus split atau memecah-mecah dahulu text SMS yang akan kita kirimkan. Untuk setiap pecahan terdiri dari text yang panjangnya 153 karakter. Jadi misal kita punya text SMS dengan panjang 400 karakter, maka sebelum dikirim dengan Gammu, kita harus split textnya menjadi 3 bagian, yaitu pecahan pertama terdiri dari 153 karakter, pecahan kedua 153 karakter dan pecahan ketiga 94 karakter.

Mungkin Anda bertanya, gimana caranya memecah-mecah text atau string dengan panjang 153 karakter tsb? Lho… kan sudah pernah saya bahas caranya di artikel Teknik Memecah String Menjadi Substring Dengan Jumlah Karakter Sama.

Setelah kita pecah text SMS asli ke dalam n pecahan dengan panjang maks 153 karakter, selanjutnya pecahan bagian pertama kita masukkan ke dalam tabel OUTBOX, sedangkan pecahan yang lain dimasukkan ke tabel OUTBOX_MULTIPART

Adapun query untuk memasukkan text pecahan pertama ke tabel OUTBOX adalah sbb:

INSERT INTO outbox (DestinationNumber, UDH, TextDecoded, MultiPart, CreatorID)
VALUES ('NO TELP TUJUAN', 'KODE UDH', 'ISI TEXT PECAHAN KE-1', 'true', 'Gammu')

Perhatikan, bahwa khusus untuk long text SMS, kita set nilai ‘true’ pada field ‘MultiPart’, dan ada pula kode UDH. Wah apaan tuh UDH? Nanti saya akan jelaskan.

Selanjutnya perintah query untuk memasukkan text pecahan ke tabel OUTBOX_MULTIPART adalah sbb:

INSERT INTO outbox_multipart(UDH, TextDecoded, ID, SequencePosition)
VALUES ('KODE UDH', 'ISI TEXT PECAHAN', 'NO ID', 'NO URUT PESAN')

Keterangan:

  • NO ID adalah nomor id dari pesan pecahan pertama yang telah disimpan ke tabel OUTBOX. Misal pecahan pertama setelah dimasukkan ke tabel OUTBOX memiliki ID = 100, maka dalam query SQL untuk memasukkan pecahan text ke tabel OUTBOX_MULTIPART juga harus menggunakan NO ID = 100.
  • NO URUT PESAN adalah nomor urutan pesan dari pesan utuhnya.

UDH adalah kode header untuk menunjukkan urutan pecahan text SMS. Kode UDH ini terdiri dari 12 digit yang memiliki format sbb:

1.AAAAAAAA XX YY

dimana AAAAAAAA itu adalah kode random dalam format hexadesimal, XX itu menunjukkan jumlah pecahan SMS, dan YY menunjukkan nomor urutan pecahan.

Salah satu kode random hexadesimal yang bisa digunakan adalah ‘050003A7‘, atau Anda juga bisa memilih sendiri kode random yang lain.

Contoh UDH untuk sebuah pesan adalah sbb:

050003A7 10 02.

Pada kode di atas, nilai 10 menunjukkan bahwa pesan tersebut total terdiri dari 10 pecahan SMS, dan UDH tersebut adalah milik pesan ke 2 (perhatikan nilai ’02′).

Sebagai gambaran misalkan kita punya teks SMS asli sbb:

Perkenalkan Nama Saya Rosihan Ari Yuana. Saya Memiliki Tiga Anak, Dua Diantaranya Laki-Laki Dan Satu Orang Perempuan. Saya Juga Punya Seorang Istri Yang Saya Cintai. Rumah Saya Di Colomadu Karanganyar. Saya Lahir Di Boyolali Tiga Puluh Tahun Yang Lalu. Sekarang Saya Mengajar Di Salah Satu Perguruan Tinggi Di Kota Solo, Yaitu Universitas Sebelas Maret.

Panjang karakter text SMS di atas adalah 353 buah.

Karena pesan tersebut panjangnya lebih dari 160 karakter, maka langkah pertama kita harus split dahulu menjadi beberapa pecahan string dengan panjang maks 153 untuk setiap pecahannya. Berikut ini hasil pecahannya

Pecahan ke-1 : Perkenalkan Nama Saya Rosihan Ari Yuana. Saya Memiliki Tiga Anak, Dua Diantaranya Laki-Laki Dan Satu Orang Perempuan. Saya Juga Punya Seorang Istri Yang
Pecahan ke-2 : Saya Cintai. Rumah Saya Di Colomadu Karanganyar. Saya Lahir Di Boyolali Tiga Puluh Tahun Yang Lalu. Sekarang Saya Mengajar Di Salah Satu Perguruan Tinggi
Pecahan ke-3 : Di Kota Solo, Yaitu Universitas Sebelas Maret.

Panjang pecahan ke-1 dan ke-2 adalah 153 karakter, dan pecahan ke-3 panjangnya 47 karakter.

Setelah dipecah, selanjutnya kita simpan pecahan ke-1 ke tabel OUTBOX

INSERT INTO outbox (DestinationNumber, UDH, TextDecoded, MultiPart, CreatorID)
VALUES ('NO TELP TUJUAN', '050003A70301', 'Perkenalkan Nama Saya Rosihan Ari Yuana.
Saya Memiliki Tiga Anak, Dua Diantaranya Laki-Laki Dan Satu Orang Perempuan. Saya Juga
Punya Seorang Istri Yang ', 'true', 'Gammu');

Perhatikan nilai UDH dari pecahan pertama di atas, yaitu 050003A70301. Nilai ’03′ dari ’0301′ menunjukkan total pecahan ada 3 buah, dan ’01′ dari ’0301′ menunjukkan urutan pecahan.

Selanjutnya misalkan ID dari record hasil query di atas adalah 200 (lihat field ID record di atas pada tabel OUTBOX), maka kita gunakan ID = 200 ini untuk proses penyimpanan pecahan yang ke-2 dan ke-3 di tabel OUTBOX_MULTIPART nya.

Perintah query untuk menyimpan pecahan ke-2 ke tabel OUTBOX_MULTIPART:

INSERT INTO outbox_multipart(UDH, TextDecoded, ID, SequencePosition)
VALUES ('050003A70302', 'Saya Cintai. Rumah Saya Di Colomadu Karanganyar. Saya Lahir Di
Boyolali Tiga Puluh Tahun Yang Lalu. Sekarang Saya Mengajar Di Salah Satu Perguruan
Tinggi', '200', '2');

Perhatikan nilai UDH dari pecahan kedua di atas, yaitu 050003A70302.

Perintah query untuk menyimpan pecahan ke-3 ke tabel OUTBOX_MULTIPART:

INSERT INTO outbox_multipart(UDH, TextDecoded, ID, SequencePosition)
VALUES ('050003A70303', 'Di Kota Solo, Yaitu Universitas Sebelas Maret.', '200', '3');

Perhatikan nilai UDH dari pecahan kedua di atas, yaitu 050003A70303.

Nah.. dah paham kan konsepnya? OK sekarang saya berikan script khusus untuk mengirim long text SMS sebagaimana ide di atas.

<!--?php

// koneksi ke mysql
mysql_connect("dbhost", "dbuser", "dbpass");
mysql_select_db("dbname");

// pesan asli
$pesan = ".......";

// menghitung jumlah pecahan
$jmlSMS = ceil(strlen($pesan)/153);

// memecah pesan asli
$pecah  = str_split($pesan, 153);

// proses untuk mendapatkan ID record yang akan disisipkan ke tabel OUTBOX
$query = "SHOW TABLE STATUS LIKE 'outbox'";
$hasil = mysql_query($query);
$data  = mysql_fetch_array($hasil);
$newID = $data['Auto_increment'];

// proses penyimpanan ke tabel mysql untuk setiap pecahan
for ($i=1; $i

OK deh.. selamat mencoba ya…

Teknik di atas adalah rahasia yang saya gunakan untuk software SMS gateway sayasupaya mendukung pengiriman long text SMS. Wah… apa gak takut idenya dipakai orang? Apa gak takut pula rejekinya berkurang karena scriptnya gak laku? He.. 3x, masalah rejeki mah dah ada yang ngatur Gan. Insya Allah rejeki tak akan pergi ke mana.