Saturday, August 21, 2010

Mengirim Long SMS dengan Gammu

gammu menyediakan file gammu-smsd-inject.exe untuk mengirimkan sms panjang (lebih dari 160 karakter). sangat praktis digunakan. akan tetapi, beberapak kali saya coba hasilnya kurang memuaskan, karena butuh waktu yang lama untuk mengirimkan sms dengan cara ini. entah ini karena versi gammu yang saya gunakan (1.28.0) belum stabil atau memang seperti itu adanya.

setelah beberapa kali mengunjungi situs http://cihar.com/gammu/ dan http://en.wikipedia.org/wiki/Concatenated_SMS akhirnya saya mendapat petunjuk untuk mengirimkan sms panjang dengan metode memasukkan record ke dalam database gammu yang jauh lebih cepat.

caranya adalah memecah sms tersebut ke dalam variable array dan menginsert setiap value array tersebut ke dalam tabel inbox.

berikut script yang saya copy dari http://cihar.com/gammu/ :

INSERT INTO outbox (
    CreatorID,
    MultiPart,
    DestinationNumber,
    UDH,
    TextDecoded,
    Coding
) VALUES (
    'Gammu 1.23.91',
    'true',
    '123465',
    '050003D30201',
    'Mqukqirip ya konej eqniu rejropocejor hugiygydewl tfej nrupxujob
xuemymiyliralj.
Te tvyjuh qaxumur ibewfoiws zuucoz tdygu gelum L ejqigqesykl kya jdytbez',
    'Default_No_Compression'
)
 
INSERT INTO outbox_multipart (
    SequencePosition,
    UDH,
    Class,
    TextDecoded,
    ID,
    Coding
) VALUES (
    2,
    '050003D30202',
    'u xewz qisubevumxyzk ufuylehyzc. Nse xobq dfolizygqysj t
bvowsyhyhyemim ovutpapeaempye giuuwbib.', 
    ,
    'Default_No_Compression'
)

yang perlu kita perhatikan adalah field 'multipart' dan 'UDH'. kita perlu menyisipkan nilai 'true' ke dalam field 'multipart'. UDH (User Data Header) adalah berupa bilangan hexa yang menyimpan informasi mengenai pesan yang dikirim (panjang pesan, urutan pesan)

dari situs http://cihar.com/gammu/ didapat informasi bahwa UDH diawali oleh '050003', nilai dari 'D3' bisa diganti dengan bebas. kemudian 4 digit di belakang menyimpan informasi mengenai

banyaknya jumlah sms dan urutan sms.

dari contoh di atas, 4 digit terakhir UDH tertulis 02xx. 02 adalah jumlah panjang sms yang dikirim, kemudian nilai

xx adalah urutan dari sms tersebut.

jadi kita bisa mengartikan kode '050003D30202' di atas sebagai pesan lanjutan kedua dari

'050003D30201'

lalu, bagaimana kita mengimplementasikan ke dalam VB 6?

saya ingin mengirimkan pesan 'mengirimkan sms panjang dengan gammu, butuh beberapa penyesuaian agar

bisa terkirim dengan sempurna. berikut ini script sederhana untuk melakukannya. pecah sms masing-masing

sepanjang 153 karakter kemudian insert ke database gammu'

semisal sms tersebut saya simpan dalam variabel pesan.

hitung jumlah panjang pesan dengan cara :

panjang_isi = len(pesan)
If panjang_isi > 160 Then 
 banyak_sms = (panjang_isi \ 153) + 1
 Else
         banyak_sms = 1     
End If 

cari nilai ID pada tabel sentitems gammu dengan script (sesuaikan dengan kondisi koneksi anda) :

rs.Open "select max(ID) as NumID from sentitems", con, adOpenDynamic, adLockOptimistic
NumID = rs.Fields("NumID") + 1
rs.Close

generate kode UDH dengan script :

ReDim ArraySMS(banyak_sms)
For i = 1 To banyak_sms
If i = 1 Then
ArraySMS(i - 1) = Left(panjang_isi_text, 153)
isi_UDH = "050003D3" & Format(banyak_sms, "00") & Format(i, "00")
rs.Open "select * from outbox", con, adOpenDynamic, adLockOptimistic
rs.AddNew
rs!DestinationNumber = no_tujuan
rs!TextDecoded = ArraySMS(i - 1)
rs!UDH = isi_UDH
rs!ID = NumID
rs!MultiPart = "true"
rs!CreatorID = "Cahjoe"
rs.Update
rs.Close
Else
ArraySMS(i - 1) = Mid(panjang_isi_text, ((i - 1) * 153) + 1, 153)
isi_UDH = "050003D3" & Format(banyak_sms, "00") & Format(i, "00")
rs.Open "select * from outbox_multipart", con, adOpenDynamic, adLockOptimistic
rs.AddNew
rs!UDH = isi_UDH
rs!TextDecoded = ArraySMS(i - 1)
rs!ID = NumID
rs!SequencePosition = i
rs.Update
rs.Close
End If
Next

selamat mencoba...

:)

3 comments: