Pengiriman dan Penerimaan Data Pada Desktop Via TCP Socket dengan C#

Posted: January 17, 2013 by Nila Novita Sari in C Sharp, socket programming
Tags: ,

Pada tulisan sebelumnya sudah dijelaskan bagaimana proses pengiriman dan penerimaan data pada c# untuk console. Disini akan dijelaskan bagaimana proses tersebut dilakukan pada sebuah desktop via TCP Socket menggunakan c#.

Apakah itu Socket???

Socket adalah salah satu layer application yang menghubungkan aplikasi dengan network card dengan computer, melalui socket ini kita dapat berkomunikasi dengan komputer atau device lain.

Untuk  kasus ini data yang diterima dari arduino, yaitu berupa data heartrate dan suhu tubuh nantinya akan ditampilkan pada sebuah windows yang selanjutnya akan diteruskan untuk dikirim ke server sebagai proses update data.

Berikut ini adalah gambar dari tampilan aplikasi yang akan dibuat, ketika ada data yang dikirim dari arduino maka nilainya akan keluar pada textbox heartrate ataupun suhu tubuh.

1

Setelah dibuat sebuah Project baru untuk Windows Form Aplication dengan menggunakan tools-tools seperti yang terlihat pada gambar diatas, selajutnya lakukan proses codingan. Pertama-tama deklarasikan terlebih dahulu sebuah Serial Port pada sebuah variable didalam public partial class.

    public partial class Form1 : Form
{
    SerialPort _serialPort;

}

Port. C# …

Kemudian pada Form_Load nya inisialisasikan nilai-nilai yang kita butuhkan seperti portname, baudRate dan lain-lain. DataReceived untuk membaca semua data yang tersedia yang diterima pada COM1 DataReceived disini berfungsi untuk membaca semua data yang tersedia yang diterima pada COM7.

    private void Form1_Load(object sender, EventArgs e)
{
     _serialPort = new SerialPort("COM7", 9600, Parity.None, 8, StopBits.One);
     _serialPort.Handshake = Handshake.None;
     _serialPort.DataReceived += new SerialDataReceivedEventHandler(sp_DataReceived);
     _serialPort.ReadTimeout = 1000;
     _serialPort.WriteTimeout = 1000;
     _serialPort.Open();
}

Pada contoh ini data akan dikirim dari sebuah arduino, untuk kodingan arduino nantinya bisa dilihat lebih lanjut pada postingan dari saudari Rinanda Febriani. Yang perlu diperhatikan disini adalah penulisan header sebagai parameter untuk mengenal apakah data yang masuk berupa HeartRate ataukan suhu tubuh. Pola header pada pengiriman dari arduino harus sama dengan pola penerimaan pada kodingan di desktop. Sebagai contoh arduino mengirim string dengan pola *H87#*S35.3# , bintang (*) sebagai header awal dan pagar (#) sebagai header akhir sebuah data, H untuk heartrate dan S untuk suhu sedangkan 87 dan 35.3 adalah nilai dari masing-masingnya.

Nilai dari heart rate dan suhu yang diterima oleh desktop akan diketahui dengan mengenali header awal dan akhir sebagai tanda bahwa nilai yang akan dibaca terdapat diantara kedua header tersebut. Kemudian untuk mengetahui apakah itu suhu atau heartrate bias dilihat pada nilai berikutnya setelah tanda bintang (*) yaitu H atau S. Setelah langkah-langkah tadi dilakukan maka nilai yang dicari dilooping satu persatu karakter dengan tanda # sebagai batasan pembacaan nilai (header akhir). Setelah didapat, nilai tersebut diinisialisasikan pada sebuah objek dengan nama “tampil”.

Berikut kodingannya:

void sp_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            Thread.Sleep(0);
            String tampil;
            String item = _serialPort.ReadExisting();

            if (item.Contains("*") && item.Contains("#") && (item.IndexOf('*') < item.IndexOf('#')))
            {
                char[] buff;

                int batas = item.IndexOf('#') - item.IndexOf('*') - 1;
                buff = item.ToCharArray(item.IndexOf('*') + 1, batas);
                tampil = "";
                if (buff[0] == 'H')
                {
                    for (int i = 1; i < batas; i++)
                    {
                        tampil += Convert.ToString(buff[i]);
                    }
                    this.BeginInvoke(new SetTextDeleg(si_HeartRate_DataReceived), new object[] { tampil});
                }
                else if (buff[0] == 'S')
                {
                    for (int i = 1; i < batas; i++)
                    {
                        tampil += Convert.ToString(buff[i]);
                    }
                    this.BeginInvoke(new SetTextDeleg(si_Suhu_DataReceived), new object[] { tampil });

                }
            }
        }

Objek tampil yang sudah dibuat sebelumnya dengan isi sebuah nilai heartrate ataupun suhu dibaca pada sebuah textbox dengan kodingan sebagai berikut:

        private void si_HeartRate_DataReceived(string tampil)
        {
            textBox1.Text = tampil.Trim();
        }
        private void si_Suhu_DataReceived(string tampil)
        {
            textBox2.Text = tampil.Trim();
        }

Untuk pengiriman data ke server pertama-tama tentukan terlebih dahulu protocol yang akan digunakan, disini digunakan protocol TCP karena dengan menggunakan TCP data bisa dipastikan sampai ke server dengan baik. Pada proses pengiriman data ini inisialisasikan terlebih dahulu socket yang digunakan, kemudian langkah selanjutnya tinggal mengirimkan string dengan pola yang disesuaikan dengan pola penerimaan data pada server. Sebelum dikirim, nilai tersebut dijadikan kedalam sebuah byte array dan dicodingkan ke dalam bentuk ASCII baru kemudian data dikirimkan ke server.

        private void send_Data()
        {
            timer1.Enabled = false;
            Socket sck = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            IPEndPoint localEndPoint = new IPEndPoint(IPAddress.Parse("167.205.56.186"), 8080);
            label3.Text = "sending data....";
            try
            {
                sck.Connect(localEndPoint);

            }
            catch
            {
                label3.Text="Unable to connect to remote end point !\r\n";
            }

            string nilai = "*H" + textBox1.Text + "#" + "*S" + textBox2.Text + "#";
            byte[] data = Encoding.ASCII.GetBytes(nilai);
            sck.Send(data);
            label3.Text = "data has been send";
            textBox1.Text = "";
            textBox2.Text = "";

            timer1.Enabled = true;
            sck.Close();
        }

Berikut kodingannya lengkapnya:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO.Ports;
using System.Threading;
using System.Net.Sockets;
using System.Net;

namespace WindowsApplication14
{
    public partial class Form1 : Form
    {

        SerialPort _serialPort;
        private delegate void SetTextDeleg(string text);

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            _serialPort = new SerialPort("COM7", 9600, Parity.None, 8, StopBits.One);
            _serialPort.Handshake = Handshake.None;
            _serialPort.DataReceived += new SerialDataReceivedEventHandler(sp_DataReceived);
            _serialPort.ReadTimeout = 1000;
            _serialPort.WriteTimeout = 1000;
            _serialPort.Open();

        }

        void sp_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            Thread.Sleep(0);
            String tampil;
            String item = _serialPort.ReadExisting();

            if (item.Contains("*") && item.Contains("#") && (item.IndexOf('*') < item.IndexOf('#')))
            {
                char[] buff;

                int batas = item.IndexOf('#') - item.IndexOf('*') - 1;
                buff = item.ToCharArray(item.IndexOf('*') + 1, batas);
                tampil = "";
                if (buff[0] == 'H')
                {
                    for (int i = 1; i < batas; i++)
                    {
                        tampil += Convert.ToString(buff[i]);
                    }
                    this.BeginInvoke(new SetTextDeleg(si_HeartRate_DataReceived), new object[] { tampil});
                }
                else if (buff[0] == 'S')
                {
                    for (int i = 1; i < batas; i++)
                    {
                        tampil += Convert.ToString(buff[i]);
                    }
                    this.BeginInvoke(new SetTextDeleg(si_Suhu_DataReceived), new object[] { tampil });

                }
            }
        }

        private void si_HeartRate_DataReceived(string tampil)
        {
            textBox1.Text = tampil.Trim();
        }
        private void si_Suhu_DataReceived(string tampil)
        {
            textBox2.Text = tampil.Trim();
        }

        private void send_Data()
        {
            timer1.Enabled = false;
            Socket sck = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            IPEndPoint localEndPoint = new IPEndPoint(IPAddress.Parse("167.205.56.186"), 8080);
            label3.Text = "sending data....";
            try
            {
                sck.Connect(localEndPoint);

            }
            catch
            {
                label3.Text="Unable to connect to remote end point !\r\n";
            }

            string nilai = "*H" + textBox1.Text + "#" + "*S" + textBox2.Text + "#";
            byte[] data = Encoding.ASCII.GetBytes(nilai);
            sck.Send(data);
            label3.Text = "data has been send";
            textBox1.Text = "";
            textBox2.Text = "";

            timer1.Enabled = true;
            sck.Close();
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            label3.Text = "time";
            if(textBox1.Text!="" && textBox2.Text!="")
                send_Data();
        }

    }
}

 ^_^

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s