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 karakter
var textbaru2:String = new String; //long sms
var hasil:Number;
var hasil2:Number;
var char1:Number;
var char2:Number;
var septet:Number=1;
var sisa:Number=0; //sisa = MSB / bit ke 7
for(b=0 ; b< textnya.length ; b++)
{
char1=textnya.charCodeAt(b+1);
char2=textnya.charCodeAt(b);
//rumus mencari PDU SMS biasa
hasil=( ((0x7F >> (7 - septet)) & char1 ) <<(8 - septet) ) + (char2 >> (septet - 1)) ;
if(hasil< 16 ) textbaru+="0";
textbaru+=hasil.toString(16).toUpperCase();
// rumus padding 1 bit untuk long SMS
hasil2=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 8
if(septet == 7) {
septet = 1;
b++;
}
else septet++;
}
//rumus penggenap sisa diakhir octet
if(sisa == 1) textbaru2+="01";
if(sisa == 0 && ( (textnya.length) % 8) == 0)textbaru2+="00";
//tipe 0= sms biasa, 1= LONG/CONCATENATE SMS
if(tipe == 0) return textbaru;
else return textbaru2;
}
Jika ingin kirim SMS Proklamasi Indonesia 17 agustus ....
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