Bagaimana jika sms yang akan dikirim melebihi 160 karakter ? Ya kita pecah aja SMS nya...dikirimnya 3 bagian. Tapi ntar yg baca bingung mana yg no 1 2 3 dst ...tenang, para engineer GSM menciptakan system SMS long / concatenate / bersambung , dimana tiap sms tetap dikirim perbagian dengan tambahan header "UDH" yang menyatakan sms yg dikirim ini merupakan bagian dari ke berapa dari SMS yg panjang tadi.
Hal yg paling pertama menandakan bahwa SMS ini long sms adalah pada octet ke -2, yang pada sms biasa bernilai "11" dan pada long sms memiliki type "41". Kemudian 2 octet setelah nomer tujuan terdapat octet UDL (userdata length) dilanjutkan octet UDHL (header length, nilai selalu "05") + UDH sebanyak 5 octet
UDL adalah jumlah karakter(septet) yg dikirim, tapi karena ada 7 octet tambahan maka maksimum karakter adalah 153 ( 160 = 153septet karakter + 7 header)
UDH terdiri dari 5 octet sebagai berikut :
00 | IEI - Information element identifier , nilainya selalu 00 |
03 | IEDL - Information element data length, nilainya selalu 03 |
AB | Reference number, dimana SMS yg dipotong memiliki nilai yg sama, akan tetapi tidak boleh sama dengan bagian LONG SMS yang lainnya, sehingga sebaiknya nilainya di random untuk sms lainnya |
02 | Octet yang menyatakan jumlah pemotongan SMS . 02 berarti sms ini memiliki 2 bagian |
01 | Octet yang menunjukkan bagian / nomer urutan dari SMS. 01 berarti sms ini merupakan sms ke-1 |
selanjutnya diikuti oleh OCTET user data / SMS
Karena terjadi nilai start septet user data yg tidak genap pada bit ke 49 / 56 akibat jumlah octet dari UDHL+UDH = 6 * 8bit = 48 bit , maka perlu dilakukan proses PADDING 1 BIT ....nah loo ribet lagi nehh...tenang .... POLA nya seragam juga kok ....
Masih ingat dengan "hellohello" diubah menjadi bentuk PDU : E8 32 9B FD 46 97 D9 EC 37
Kemudian kita padding 1 bit ....apaan sih padding ? pokoknya geser2 deh..liat yang berikut :
(klik biar jelas)
Jadi logikanya seperti ini :
1. Ambil nilai dari konversi septet gsm 7-bit ke Octet
2. Pasangan Octet pertama diambil bit ke 6 - 0 dan turunkan kebawah, karena octet pertama maka tambahkan dengan "0" pada akhir octet
3. Bit ke 7 (MSB) pasangan pertama kemudian digunakan sebagai "EKOR" pada hasil "pergeseran" pasangan berikutnya ...begitu selanjutnya sampai selesai.
4. Jika sisa MSB pasangan terakhir =1, maka tambahkan octet "01" diakhir deretan octet. Jika sisa MSB pasangan terakhir adalah 0 dan jumlah SEPTET / KARAKTER/HURUF habis dibagi 8 (kelipatan 8) maka rangkaian octet perlu ditutup dengan octet "00". Tujunnya untuk menggenapkan perhitungan septet-octet
Action scriptnya seperti berikut :
function konversi(textnya:String, tipe:Number):String{var textbaru:String = new String; // sms < 160 karaktervar textbaru2:String = new String; //long smsvar hasil:Number;var hasil2:Number;var char1:Number;var char2:Number;var septet:Number=1;var sisa:Number=0; //sisa = MSB / bit ke 7for(b=0 ; b< textnya.length ; b++){char1=textnya.charCodeAt(b+1);char2=textnya.charCodeAt(b);//rumus mencari PDU SMS biasahasil=( ((0x7F >> (7 - septet)) & char1 ) <<(8 - septet) ) + (char2 >> (septet - 1)) ;if(hasil< 16 ) textbaru+="0";textbaru+=hasil.toString(16).toUpperCase();
if(sisa == 1) textbaru2+="01";// rumus padding 1 bit untuk long SMShasil2=sisa + ( (hasil & 0x7F) << 1) ;sisa= hasil >> 7;if(hasil2< 16 ) textbaru2+="0";textbaru2+=hasil2.toString(16).toUpperCase();trace("sisa= "+ sisa + " b= " + b + "septetne :" + septet);// rumus untuk sms biasa, di skip septet ke 8if(septet == 7) {septet = 1;b++;}else septet++;}//rumus penggenap sisa diakhir octet
if(sisa == 0 && ( (textnya.length) % 8) == 0)textbaru2+="00";
if(tipe == 0) return textbaru;//tipe 0= sms biasa, 1= LONG/CONCATENATE SMS
Jika ingin kirim SMS Proklamasi Indonesia 17 agustus ....else return textbaru2;}
Kami bangsa Indonesia dengan ini menjatakan kemerdekaan Indonesia.
Hal-hal jang mengenai pemindahan kekoeasaan d.l.l., diselenggarakan
dengan tjara seksama dan dalam tempo jang sesingkat-singkatnja.
Djakarta, hari 17 boelan 8 tahoen 05
Atas nama bangsa Indonesia.
Soekarno/Hatta
bagian pertama:
AT+CMGS=153<enter>
0041000B818051757367F60000A0050003BF020196E1761A240EBBCFF33028E926BFDDE5793A0C2297DDE7B01B9476A741EDB25B1DA687D76137685D6E97E5E4F23A1C7683926EF2DB5D9EA7C3AE0632CC6EA1C36C903AEC3E83DA65F7B9EC0EA741F0723BED2687D16137685D5EBFCBE17938EC06915D6C17DBC50291D3F332BBEC3E9FC3F2F03AEC6E90CBEE73D80DA2ABC3F230685E5ECFC3<ctrl+z>
bagian kedua:
AT+CMGS=129<enter>
0041010B818051757367F6000084050003BF0202DA611039EC0691C3EC701B442FB7E16F903AEC3E83E6E579DA7D5E87E9AD79DA7D5E87E96E75D8D520AAC3EBB09C1E6681D061791A14BB81C4EF323BEC06E140F430FA5D768360B546901E9E83DCE17618240EBBCFF33028E926BFDDE5793AEC6A4CDFE57558EE7EBF90613A3D0C<ctrl+z>
Ingat...jika mencoba, harap nomer telpon tujuan diganti, dan nilai yg highlight warna merah harus sama di kedua bagian, tapi jika ingin mengirim sms yg sama ke nomer yg sama pula, maka nilainya harus berbeda.
Bagian UDL (userdata length) yang warna merah backgound biru merupakan jumlah karakter yg dikirim + 7 header, sehingga jika karakter sms /spetet = 153 maka nilainya adalah 153+7 = 160 = 0xA0.
Untuk mempermudah proses belajar AT COMMAND - LONG SMS, saya telah buatkan konverter yg dapat diunduh di :
http://www.4shared.com/document/pl1jcZJw/pdu.html
SELAMAT MENCOBA
gan mau tanya, sy coba kirim long sms hasil PDU bagian pertamanya seperti ini:
BalasHapus0041000C818065427182460000A00500034F020197E1761A240EBBCFF33028E926BFDDE5793A0C2297DDE7B01B9476A741EDB25B1DA687D76137685D6E97E5E4F23A1C7683926EF2DB5D9EA7C3AE86021966B7D06136481D769F41EDB2FB5C7687D32078B99D7693C3E8B01BB42EAFDFE5F03C1C7683C82EB68BED6281C8E979995D769FCF6179781D7683C865F739EC06D1D5617918342FAFE71CD
pada bagian setelah UDL+UDHL(0500034F0201) menunjukan angka 97....padahal di contoh yg agan tampilkan angka 96, dan hingga akhir teks PDU nya berbeda.
SMS yang berhasil terkirim persis sama dengan teks proklamasi diatas. Menurut agan apa yg menyebabkan kode PDU nya berbeda terutama angka 97 (PDU saya) dan 96(PDU Anda) padahal sms yang diterima persis sama? sy heran.
thx
berbeda karena jumlah digit nomer tujuan yang agan punya itu GENAP 085624172864 (12) , sedangkan di contoh 11 digit sehingga saya harus menambahkan digit F didigit paling belakang, setelah dipadding hasilnya berbeda untuk jumlah karakter. Ini tidak masalah pemotongannya jumlah berapa, semisal dipotong 50 karakter per bagian sms pun akan sampe juga... yang penting hitungannya bener dan begitu juga aturan paddingnya
BalasHapusMas itu pke bhsa pemrograman apa mas??
BalasHapusbahasa nya actionscript 2, tapi dasarnya sama dengan java/C++
BalasHapusmkasih mas..
BalasHapusoh iya mas, untuk GSM pdu konverter itu scriptnya boleh di share ngk mas.. pas kita klik konversi lngsung mecah kalo lebih dri 160 character.. soale saya udah nyoba buat sms pke at command itu cman max 160.. kalo lebih dr itu harus dipecah pake PDU mode..
tolong y mas..
itu scriptnya untuk PDU concenate atau sms banyak kok...coba deh dicek lagii
BalasHapusiya mas, tapi bngung ku tu, d scriptnya ngk ada encode untuk no HP mas..
BalasHapusskalian mas tnya lgi mas.hehehe
sy kan pkek VB.net buatnya, trus sya tiru scriptnya nah pas script ini mas
char1=textnya.charCodeAt(b+1);
char2=textnya.charCodeAt(b);
//rumus mencari PDU SMS biasa
hasil=( ((0x7F >> (7 - septet)) & char1 ) <<(8 - septet) ) + (char2 >> (septet - 1)) ;
bingungnya tu;
1. charCodeAt kalo di VB.net itu pke printah ap y mas?? soale di VB.net ngk ad.
2. mksd dri ""0x7F" itu apa ya mas?? itu tipe string ato ap mas??
sorry mas, klo bnyak tnya, soale ws mumet mas nyari long SMS at command..hehehe :)
duhhh masih aja pake VB ....sampah itu bahasa broo
BalasHapusiyo mas.. bnyak yang g ktmu tutorialnya..
BalasHapustp bgmna lgi bisa e itu e.. sbnere sdah blajar JAVA sih mas, tp msih awal2..hehehe
jadi ngk bisa ya mas klo pkek VB.net bwat kyak gtu.?
trus yang untuk encode No Hp nya itu dmana mas yg di scrriptnya?? saya akan coba bwat pkek Java ntar mas..