Oleh: ekoyw | Oktober 2, 2012

Koneksi Telnet Sederhana Dengan C#.NET

Ceritanya pengin buat program software sederhana yang bisa connect ke BSC melalui Telnet, kemudian mengambil alarm BTS Faulty dan mengirim alarm tersebut lewat sebuah SMS Gateway.

Problem pertama adalah koneksi telnet ke BSC. Setelah browsing dan googling sana sini dan dipermak beberapa bagian akhirnya didapat hasil class C# untuk Telnet sebagai berikut :

=======================

using System;
using System.Collections.Generic;
using System.Text;
using System.Net.Sockets;
using System.Net.NetworkInformation;
using System.Windows.Forms;

namespace mySMSGateway
{
enum Verbs {
WILL = 251,
WONT = 252,
DO = 253,
DONT = 254,
IAC = 255
}

enum Options
{
SGA = 3
}

class TelnetConnection
{
TcpClient tcpSocket;

int TimeOutMs = 100;
string myStatus;
bool koneksi;
public TelnetConnection(string Hostname, int Port)
{
try
{
Ping myPing = new Ping();
PingReply reply = myPing.Send(Hostname);
if (reply.Status == IPStatus.Success)
{
tcpSocket = new TcpClient(Hostname, Port);
this.myStatus = “Anda terhubung ke IP Address ” + Hostname;
koneksi = true;
}
else
{
this.myStatus = “Koneksi anda ke IP Address ” + Hostname + ” terputus”;
koneksi = false;
}
}
catch (Exception err)
{
tcpSocket = null;
}
}

public string ConnStatus
{
get
{
return this.myStatus;
}
set
{
this.myStatus = value;
}
}

public bool Connected
{
get
{
return this.koneksi;
}
set
{
this.koneksi = value;
}
}

public string Login(string Username,string Password,int LoginTimeOutMs)
{
int oldTimeOutMs = TimeOutMs;
TimeOutMs = LoginTimeOutMs;
string s = null;
s = Read();
s.TrimStart();
if (!s.TrimEnd().EndsWith(“\b”))
throw new Exception(“Failed to connect : no login prompt”);
WriteLine(Username);

s += Read();
if (!s.TrimEnd().EndsWith(“\b”))
throw new Exception(“Failed to connect : no password prompt”);
WriteLine(Password);

s += Read();
TimeOutMs = oldTimeOutMs;
return s;
}

public void WriteLine(string cmd)
{
Write(cmd + “\r\n”);
}

public void Write(string cmd)
{
if (!tcpSocket.Connected) return;
byte[] buf = System.Text.ASCIIEncoding.ASCII.GetBytes(cmd.Replace(“xFF”,”xFFxFF”));
tcpSocket.GetStream().Write(buf, 0, buf.Length);
}

public string Read()
{
if (!tcpSocket.Connected) return null;
StringBuilder sb=new StringBuilder();
do
{
ParseTelnet(sb);
System.Threading.Thread.Sleep(TimeOutMs);
} while (tcpSocket.Available > 0);
return sb.ToString();
}

public bool IsConnected
{
get { return tcpSocket.Connected; }
}

public void DisConnect()
{
tcpSocket.Client.Disconnect(true);
}

void ParseTelnet(StringBuilder sb)
{
//tcpSocket.GetStream().Flush();
while (tcpSocket.Available > 0)
{
int input = tcpSocket.GetStream().ReadByte();
switch (input)
{
case -1 :
break;
//case 10 :
//    break;
case (int)Verbs.IAC:
// interpret as command
int inputverb = tcpSocket.GetStream().ReadByte();
if (inputverb == -1) break;
switch (inputverb)
{
case (int)Verbs.IAC:
//literal IAC = 255 escaped, so append char 255 to string
sb.Append(inputverb);
break;
case (int)Verbs.DO:
case (int)Verbs.DONT:
case (int)Verbs.WILL:
case (int)Verbs.WONT:
// reply to all commands with “WONT”, unless it is SGA (suppres go ahead)
int inputoption = tcpSocket.GetStream().ReadByte();
if (inputoption == -1) break;
tcpSocket.GetStream().WriteByte((byte)Verbs.IAC);
if (inputoption == (int)Options.SGA )
tcpSocket.GetStream().WriteByte(inputverb == (int)Verbs.DO ? (byte)Verbs.WILL:(byte)Verbs.DO);
else
tcpSocket.GetStream().WriteByte(inputverb == (int)Verbs.DO ? (byte)Verbs.WONT : (byte)Verbs.DONT);
tcpSocket.GetStream().WriteByte((byte)inputoption);
break;
default:
break;
}
break;
default:
sb.Append( (char)input );
break;
}
}
System.Threading.Thread.Sleep(1000);
}
}
}

===================

Beberapa penjelasan sebagai berikut :

  • Procedure TelnetConnection aku tambahi keterangan ‘myStatus’ serta status koneksi agar saat tidak ada koneksi, tidak keluar window exception atau error lainnya serta program tetap berjalan.
  • Procedure ParseTelnet aku tambahi delay 1 detik lewat  “System.Threading.Thread.Sleep(1000)”. Ini belum tahu error dimana, hanya ketika baris ini belum ditambahkan, seringnya respons yang diterima dari server Telnet lebih lambat dibanding input yang akan dimasukkan program.  Misalnya mau input username “Aaaa” kemudian secara otomatis diinputkan password “Bbbb”. Nah input username-nya bisa pas dimasukkan “Aaaa” saat prompt username keluar. Tetapi prompt password belum keluar ke layar, program sudah keluarkan juga input “Bbbb” disamping username-nya “Aaaa”. Tentu saja akan keluar error. Nah maksud dibuat delay yaaa untuk memberi waktu ke system menerima respons dari server Telnet terlebih dahulu.
  • Procedure Login, untuk code “if (!s.TrimEnd().EndsWith(“\b”))” akhiran “\b” bisa disesuaikan sesuai akhiran saat login. Aslinya di sumber asal ini “\n” tapi aku lihat di-telnetku berakhiran “\b”
  • Beberapa procedure aku tambahkan dari sumber aslinya misalnya “Disconnected” untuk memutus koneksi dan “Connected” untuk mendapatkan status koneksi.

Untuk menggunakannya, contoh sederhananya seperti berikut :

================

this.Host = “10.243.124.81”;
this.BSC = “BSCku”;
this.myTC = new TelnetConnection(this.Host, 23);
this.myStatus = this.myTC.ConnStatus;
if (this.myTC.Connected)
{
string myLogin = myTC.Login(this.Username, this.passwd, 100);  // Login
this.txtRespons.Text = myLogin; //Tampilkan hasil login
string Command = “ZEOL::NR=7767;” //Contoh command

this.myTC.WriteLine(Command); //Kirim command lewat telnet
string myResponse = this.myTC.Read(); //Baca respons atau hasil dari command yang dikirim
this.txtRespons.Text = myResponse;  //Tampilkan hasil command
this.myTC.DisConnect();
}

======================

Yaa kurang lebih itu yang aku pakai. Sederhana memang, sebab yang dibutuhkan juga nggak terlalu kompleks…

Semoga bermanfaat dan bisa dikembangkan lebih baik lagi.

I’m not a software developer anymore.


Tinggalkan Balasan

Isikan data di bawah atau klik salah satu ikon untuk log in:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout / Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout / Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout / Ubah )

Foto Google+

You are commenting using your Google+ account. Logout / Ubah )

Connecting to %s

Kategori

%d blogger menyukai ini: