Coding4ever’s Blog

Just coding… coding… and coding… because coding should be fun :)

SMS Gateway Edisi .NET Part 1

| Comments

Postingan pertama di domain yang baru :), saya ingin membahas lagi tentang pembuatan aplikasi SMS Gateway. Alasannya sederhana karna salah satu artikel yang paling banyak dibaca di blog ini adalah artikel Membuat Sms Gateway Itu Gampang, Jangan Dipersulit !!!.

Jika pada artikel Membuat Sms Gateway Itu Gampang, Jangan Dipersulit !!!, kita menggunakan bahasa pemrograman VB 6, untuk postingan kali ini kita akan menggunakan bahasa pemrograman C#.

Untuk membaca dan mengirim sms kita akan menggunakan library GSMComm, yang bisa diinstall via NuGet.

Sebelum lanjut kita lihat dulu fitur dari library GSMComm :

  • Manage SMS messages: Send, read, delete, store, import and export messages, get memory status, get/set SMSC.
  • Manage the phonebook: Create, find, delete, read, import and export phonebook entries, get memory status.
  • Manage the phone: Read general info, reset configuration, enter PIN
  • Supports notifications about new messages as well as forwarding them directly to the application.
  • Detect phone connection/disconnection.
  • Other SMS message variants also possible, such as alerts and notifications.
  • Support for Smart Messaging and related messages to create, locate and recombine concatenated text messages, and also to create operator logo messages.
  • Logging support with 4 levels to assist in troubleshooting.
  • Support for GSM 7-bit default alphabet and Unicode for the message text.
  • Supports some operator functions.
  • Remoting support for sending SMS messages.
  • SMS batch mode for faster sending of multiple messages.
  • Execution of custom commands that are not directly supported.

Keren bukan untuk ukuran library gratis :)

Pada postingan bagian pertama ini kita hanya akan membahas perintah-perintah dasar yang dibutuhkan untuk membuat aplikasi SMS Gateway, seperti koneksi ke device modem atau hp, membaca sms masuk, dan mengirim sms.

Membuat Project

Project yang kita gunakan adalah project berbasis Windows Form.

Menambahkan Library GSMComm via NuGet

  • Klik kanan node References -> Manage NuGet Packages …

  • Pada tab Online pilih nuget.org, pada kotak pencarian ketik gsm, kemudian klik tombol Install.

kemudian tunggu sampai proses instalasi selesai.

Tutup dialog NuGet package, Kemudian cek node references, seharusnya ada empat library baru yang sudah ditambahkan yaitu GSMCommServer, GSMCommShared, GSMCommunication dan PDUConverter.

Library PDUConverter bertanggung jawaban untuk melakukan proses decoding pesan sms, sedangkan yang bertugas untuk melakukan komunikasi ke modem atau hp adalah library GSMCommunication.

Untuk library GSMCommServer dan GSMCommShared hanya digunakan jika kita ingin mengaktifkan fitur .NET Remoting untuk mengirim sms.

Setelah semua persiapan selesai, kita bisa langsung mencoba perintah-perintah dasar yang diperlukan untuk pembuatan aplikasi sms gateway.

1. Konek ke device modem atau hp

Untuk melakukan koneksi ke modem atau hp, ada beberapa tahapan yang harus kita lakukan :

  • Membuat objek dari class GsmCommMain
  • Mendaftarkan method ke event MessageReceived, yang dikenal dengan istilah delegate method.
  • Memanggil method Open.

Membuat objek dari class GsmCommMain

Misal kita akan membuat sebuah objek dari class GsmCommMain dengan nama comm, maka perintahnya yang digunakan adalah :

1
2
3
4
5
var port = "COM1"; // port yang digunakan menyesuaikan
var baudRate = 9600;
var timeout = 150;

var comm = new GsmCommMain(port, baudRate, timeout);

Mendaftarkan method ke event MessageReceived yang dikenal dengan istilah delegate method

Salah satu fitur keren yang dimiliki oleh library GSMComm adalah Event MessageReceived. Dengan adanya event ini kita tidak perlu menggunakan objek timer untuk mengecek apakah ada sms yang masuk.

Event ini tidak bisa kita akses secara langsung, yang perlu kita lakukan adalah membuat sebuah method kemudian mendaftarkannya ke event ini.

Contoh kita membuat sebuah method dengan nama comm_MessageReceived, method ini hanya akan menampilkan notifikasi sms masuk. Untuk selanjutnya method ini bisa kita kembangkan lagi, misal ketika ada sms masuk datanya langsung kita simpan ke database.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
private void comm_MessageReceived(object sender, MessageReceivedEventArgs e)
{
    var obj = e.IndicationObject;

    if (obj is MemoryLocation)
    {
        var loc = (MemoryLocation)obj;

        var msg = string.Format("New message received in storage \"{0}\", index {1}.",
                                loc.Storage, loc.Index);
        MessageBox.Show(msg);

        return;
    }

    if (obj is ShortMessage)
    {
        var msg = (ShortMessage)obj;
        var pdu = comm.DecodeReceivedMessage(msg);

        MessageBox.Show("New message received");
    }
}

Kemudian kita daftarkan ke event MessageReceived dengan perintah :

1
comm.MessageReceived += new MessageReceivedEventHandler(comm_MessageReceived);

sehingga ketika ada sms yang masuk method comm_MessageReceived akan otomatis dipanggil.

Memanggil method Open

Setelah langkah pertama dan kedua selesai dikerjakan kita bisa langsung memanggil method Open untuk melakukan koneksi ke modem atau hp.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
comm.Open();

while (!comm.IsConnected())
{
    var msgResult = MessageBox.Show(this, "No phone connected.", "Connection setup",
                                        MessageBoxButtons.RetryCancel, MessageBoxIcon.Exclamation);

    if (msgResult == DialogResult.Cancel)
    {
        comm.Close();
        return;
    }
    else
    {
        comm.Close();
        comm.Open();
    }
}

2. Membaca SMS Masuk

Method yang digunakan untuk membaca sms adalah method ReadMessages, method ini mempunyai dua parameter yaitu PhoneMessageStatus dan Storage.

Untuk PhoneMessageStatus pilihannya adalah : ReceivedUnread, ReceivedRead, StoredUnsent, StoredSent dan All. Sedangkan Storage pilihannya hanya dua yaitu : SM dan ME.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

private void btnBacaSMS_Click(object sender, EventArgs e)
{
    var messages = comm.ReadMessages(PhoneMessageStatus.All, PhoneStorageType.Sim);
    foreach (var message in messages)
    {
        var data = (SmsDeliverPdu)message.Data;

        var phoneNumber = data.OriginatingAddress;
        var msg = data.UserDataText;
        var tanggal = string.Format("{0:yyyy/MM/dd}", data.SCTimestamp.ToDateTime());
        var jam = string.Format("{0:HH:mm:ss}", data.SCTimestamp.ToDateTime());

        lstDaftarSMS.Items.Add(string.Format("{0}, {1}, {2}, {3}", tanggal, jam, phoneNumber, msg));
    }
}

3. Mengirim SMS

Untuk mengirim sms kita menggunakan method SendMessage yang membutuhkan objek pdu.

1
2
3
4
5
6
7
8
private void btnKirimSMS_Click(object sender, EventArgs e)
{
    var msg = txtPesan.Text;
    var phoneNumber = txtNoHp.Text;

    var pdu = new SmsSubmitPdu(msg, phoneNumber, string.Empty);
    comm.SendMessage(pdu);
}

Kode di atas hanya bisa mengirim sms dengan jumlah karakter maksimal 160 karakter, jika ingin lebih kita harus merevisi kode di atas dengan menambahkan beberapa method baru yaitu CreateConcatMessage dan SendMultiple.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
private OutgoingSmsPdu[] CreateConcatMessage(string message, string number)
{
    OutgoingSmsPdu[] pdus = null;

    try
    {
        pdus = SmartMessageFactory.CreateConcatTextMessage(message, number);
    }
    catch
    {
        return null;
    }

    return pdus;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
private void SendMultiple(OutgoingSmsPdu[] pdus)
{
    var num = pdus.Length;

    try
    {
        // Send the created messages
        comm.EnableTemporarySmsBatchMode();

        foreach (OutgoingSmsPdu pdu in pdus)
        {
            comm.SendMessage(pdu);
        }
    }
    catch
    {
    }
}

Terakhir kode yang ada di method btnKirimSMS_Click juga harus di revisi :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
private void btnKirimSMS_Click(object sender, EventArgs e)
{
    var msg = txtPesan.Text;
    var phoneNumber = txtNoHp.Text;

    if (msg.Length > 160)
    {
        var pdus = CreateConcatMessage(msg, phoneNumber);
        if (pdus != null) SendMultiple(pdus);
    }
    else
    {
        var pdu = new SmsSubmitPdu(msg, phoneNumber, string.Empty);
        comm.SendMessage(pdu);
    }
}

Yuph akhirnya selesai juga.

Selamat MENCOBA :)

sms gateway, visual c#

Tentang Penulis

Software developer yang fokus mengembangkan aplikasi di atas platform .NET (Desktop, ASP.NET MVC, Web Service, Microservice) dan Android. Senang mempelajari teknologi baru terutama di bidang OOP, Design Pattern, ORM, Database, Continuous Integration & Deployment dan arsitektur Microservice.
Selain mengajar, saat ini penulis juga bekerja sebagai staf IT di salah satu PTS di Yogyakarta sebagai senior software developer. Di waktu luang insya Alloh akan terus berbagi pengalaman di blog ini :)

« Entity Framework Part 7 Manajemen Password Menggunakan KeePass »

Comments