Semua Tentang Belajar Teknologi Digital Dalam Kehidupan Sehari - Hari

Senin, 27 Agustus 2012

SMS via AT COMMAND - Long (concatenate) SMS



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 :

00IEI -  Information element identifier , nilainya selalu 00
03IEDL - Information element data length, nilainya selalu 03
ABReference 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
02Octet yang menyatakan jumlah pemotongan SMS . 02 berarti sms ini memiliki 2 bagian
01Octet 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
Share:

9 komentar:

  1. gan mau tanya, sy coba kirim long sms hasil PDU bagian pertamanya seperti ini:

    0041000C818065427182460000A00500034F020197E1761A240EBBCFF33028E926BFDDE5793A0C2297DDE7B01B9476A741EDB25B1DA687D76137685D6E97E5E4F23A1C7683926EF2DB5D9EA7C3AE86021966B7D06136481D769F41EDB2FB5C7687D32078B99D7693C3E8B01BB42EAFDFE5F03C1C7683C82EB68BED6281C8E979995D769FCF6179781D7683C865F739EC06D1D5617918342FAFE71CD

    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

    BalasHapus
  2. 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

    BalasHapus
  3. Mas itu pke bhsa pemrograman apa mas??

    BalasHapus
  4. bahasa nya actionscript 2, tapi dasarnya sama dengan java/C++

    BalasHapus
  5. mkasih mas..
    oh 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..

    BalasHapus
  6. itu scriptnya untuk PDU concenate atau sms banyak kok...coba deh dicek lagii

    BalasHapus
  7. iya mas, tapi bngung ku tu, d scriptnya ngk ada encode untuk no HP mas..
    skalian 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 :)

    BalasHapus
  8. duhhh masih aja pake VB ....sampah itu bahasa broo

    BalasHapus
  9. iyo mas.. bnyak yang g ktmu tutorialnya..
    tp 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..

    BalasHapus

Kontak Penulis



12179018.png (60×60)
+628155737755

Mail : ahocool@gmail.com

Site View

Categories

555 (8) 7 segmen (3) adc (4) amplifier (2) analog (19) android (14) antares (11) arduino (28) artikel (11) attiny (3) attiny2313 (19) audio (5) baterai (5) blog (1) bluetooth (1) chatgpt (2) cmos (2) crypto (2) dasar (46) digital (11) dimmer (5) display (3) esp8266 (26) euro2020 (13) gcc (1) gsm (1) iklan (1) infrared (2) Input Output (3) iot (76) jam (7) jualan (12) kereta api (1) keyboard (1) keypad (3) kios pulsa (2) kit (6) komponen (17) komputer (3) komunikasi (1) kontrol (8) lain-lain (8) lcd (2) led (14) led matrix (6) line tracer (1) lm35 (1) lora (11) lorawan (2) MATV (1) memory (1) metal detector (4) microcontroller (70) micropython (6) mikrokontroler (2) mikrokontroller (14) mikrotik (5) modbus (9) mqtt (3) ninmedia (5) ntp (1) paket belajar (19) palang pintu otomatis (1) parabola (88) pcb (2) power (1) praktek (2) project (33) proyek (1) python (8) radio (28) raspberry pi (9) remote (1) revisi (1) rfid (1) robot (1) rpm (2) rs232 (1) script break down (3) sdcard (3) sensor (2) sharing (3) signage (1) sinyal (1) sms (6) software (18) solar (1) solusi (1) tachometer (2) technology (1) teknologi (2) telegram (2) telepon (9) televisi (167) television (28) telkomiot (5) transistor (2) troubleshoot (3) tulisan (94) tutorial (108) tv digital (6) tvri (2) vu meter (2) vumeter (2) wav player (3) wayang (1) wifi (3) yolo (7)

Arsip Blog

Diskusi


kaskus
Forum Hobby Elektronika