Kamis, 28 Mei 2009

PENGUJIAN DAN IMPLEMENTASI WIRELESS SENSOR NETWORK

Desain Pengujian
Pengujian dilakukan pada 3 buah komputer dengan susunan sbb :

HOST A :
Merupakan Wireless Sensor yang membaca data analog dan mengirimkan data pada HOST B.
HOST B :
Menerima data dari HOST A dan memberikan datanya pada HOST C dengan protokol yang berbeda.
HOST C :
Menerima data dari HOST B dan menuliskannya pada database.

Pemrograman
Beberapa bahasa pemrograman yang digunakan untuk pengujian ini diantaranya adalah Dynamic C dan Perl. Dynamic C digunakan untuk memprogram microcontroller dan Perl digunakan sebagai bahasa pemprograman yang digunakan untuk menerima data dari microcontroller, mengirim data pada concentrator database server dengan protokol SOAP, dan menampilkannya dalam bentuk tampilan grafik. Sementara untuk menerima data dengan protokol SOAP dan menuliskannya pada database, digunakan bahasa pemrograman PHP.
Dynamic C adalah sebuah bahasa pemprograman yang dibuat oleh Rabbit , inc yang khusus digunakan untuk memprogram microcontroller RCM 3700. Dynamic C ini dilengkapi beberapa library dan dilengkapi sebuah IDE (integrated development environment) sehingga coding, debugging, compiling, flashing, dan downloading sebuah microcontroller RCM 3700 dapat dilakukan cukup pada sebuah software saja.
Pada dasarnya, garis besar program yang dibuat adalah sebagai berikut :
1. Menerima data masukkan dari input analog
Kode yang digunakan :
float read_analog_input ()
{
dataRaw = anaIn(inputnum, SINGLE, GAINSET);
return (dataRaw*20/2048) ;
}


2. Secara aktif membuka koneksi soket ke komputer penerima data (tidak harus merupakan sebuah database server)
Kode yang digunakan :
if (!tcp_open(&my_socket, 0, host, port, NULL))
{
printf("Failed to open\n");
return -1 ;
}
else while (!sock_established(&my_socket))
{
if(!tcp_tick(&my_socket))
{
printf("Failed to Establish\n"); break ;
}
}


3. Secara aktif mengirimkan data hasil pembacaan input analog yang telah dikonversi menjadi besaran biner kepada komputer penerima melalui soket TCP/IP yang sama dengan nomor 2.
Kode yang digunakan :
if(sock_established(&my_socket))
{
char * buff;
sprintf(buff,"%d",mesg);
if((sock_write(&my_socket, buff, sizeof(buff)))< 0 )
{
printf("Error Sending Data...");
return -1 ;
}
sock_close(&my_socket);
return 1 ; //return ok
}

4. Menampilkan pesan error ketika pembukaan socket tidak berhasil dilakukan, atau pengiriman data tidak berhasil, atau ketika pembacaan analog input gagal dilakukan.

Perl adalah bahasa scripting yang secara resmi keluar pada tahun 1987. Kode perl tidak perlu dicompile agar bisa dijalankan, itulah mengapa perl disebut bahasa scripting, bukan bahasa pemrograman. Dokumentasi dan informasi mengenai perl dapat diperoleh dari http://www.perl.org/ .
Pada Dasarnya, program perl yang dibuat pada pengujian ini mempunyai garis besar perilaku sbb :
Pada Host Penerima (HOST B) :
1. Secara Pasif membuka dan me-Listen socket TCP/IP pada port tertentu.
Kode yang digunakan :
my $sock = IO::Socket::INET->new(
LocalHost => $host,
LocalPort => $port,
Proto => 'tcp',
Listen =>1,
ReuseAddr => 1
);

2. Secara Pasif menerima input data dari koneksi socket TCP/IP dari komputer pengirim, kemudian mengirimkannya pada database server menggunakan protokol SOAP secara aktif.
Kode yang digunakan :
while(1) {
my $sockAccept = $sock->accept();
while ($pesan = <$sockAccept>)
{
$rrd -> update (temp => $pesan);
# updating database MS SQL melalui web services
my $soapRes = $soap->insertData($pesan);
unless ($soapRes->fault)
{
print "$pesan berhasil ditulis" ;
}
else
{
print join ', ',
$soapRes->faultcode,
$soapRes->faultstring,
$soapRes->faultdetail;
}

}
}


3. Menuliskan data pada sebuah grafik PNG sehingga terlihat grafik besaran suhu vs waktu.
Kode yang digunakan :
while(1) {
$rrd -> graph(
destination => "/var/www/netmon.tf.itb.ac.id",
basename => "temperature",
timestamp => "both",
periods => [qw(hour)],
sources => [qw(temp)],
source_colors => [qw(ff0000)],
source_labels => [("Temperatur")],
source_drawtypes => [qw(AREA)],
line_thickness => 2,
extended_legend => 1,
title => "Water Temperature",
vertical_label => "Kelvin",
interlaced => ""
);
print "graph updated\n";
# wait for 200 seconds
sleep(200);
}

Php adalah bahasa pemrograman web / scripting web yang sangat terkenal. Secara umum, program php yang dibuat mempunyai behaviour sbb :
Pada Host Database server (HOST C) :
1. Secara Pasif menerima input data dari HOST B dengan metode SOAP.
Kode yang digunakan :
require_once('lib/nusoap.php');

$server = new soap_server;

$server->register('insertData');
……..

$HTTP_RAW_POST_DATA = isset($HTTP_RAW_POST_DATA) ? $HTTP_RAW_POST_DATA : '';
$server->service($HTTP_RAW_POST_DATA);

?>

2. Menuliskan data pada database server. Software Database Server yang digunakan adalah MySQL
Kode yang digunakan :
function insertData($temperature)
{
$timeStamp = date('Y-m-d H-i-s');
mysql_connect('localhost','username','password') or die(mysql_error());
mysql_select_db('coba') or die(mysql_error());
mysql_query('INSERT INTO test VALUES ("'.$timeStamp.'","'.$temperature.'")') or die(mysql_error());
return 'berhasil'.$temperature ;
}


Keseluruhan Kode yang dibuat adalah sbb :
Kode Dynamic C yang dibuat :
#define RCM3700_PROTOBOARD
#define TCPCONFIG 9
#use "dcrtcp.lib"
#define ADDRESS "167.205.44.10"
#define PORT "8989"
#define inputnum 0
#define GAINSET GAIN_1

int send_packet(char * mesg)
{
tcp_Socket my_socket ;
word status ;
word port ;
longword host ;
if(!(host=resolve(ADDRESS)))
{
printf("Could not resolve host\n");
return -1;
}
port = atoi (PORT);
sock_init();
if (!tcp_open(&my_socket, 0, host, port, NULL))
{
printf("Failed to open\n");
return -1 ;
}
else while (!sock_established(&my_socket))
{
if(!tcp_tick(&my_socket))
{
printf("Failed to Establish\n"); break ;
}
}
if(sock_established(&my_socket))
{
char * buff;
sprintf(buff,"%d",mesg);
if((sock_write(&my_socket, buff, sizeof(buff)))< 0 )
{
printf("Error Sending Data...");
return -1 ;
}
sock_close(&my_socket);
return 1 ; //return ok
}
}
float read_analog_input ()
{
dataRaw = anaIn(inputnum, SINGLE, GAINSET);
return (dataRaw*20/2048) ;
}
main()
{
float dataInputFlt ;
char [8] dataInputStr ;
while(1)
{
costate
{
dataInputFlt = read_analog_input();
sprintf(dataInputStr,"%d", dataInputFlt);
//send_packet(&dataInputStr);
}
}
}

Kode Perl pada komputer penerima data (HOST B) yang dibuat :
#!/usr/local/bin/perl -w
# program untuk membuat daemon sederhana yang melisten di port 8989
# input program : data stream dari microcontroller
# output program : file rrd
# ditambahkan fungsi untuk mengupdate database melalui webservice
# load required modules

use strict;
use POSIX qw(setsid);
use LWP::Simple;
use RRD::Simple ();
use IO::Socket ;
use SOAP::Lite ;

# set costants

my $host = '167.205.44.10';
my $port = '8989';
my $png = '/var/www/netmon.tf.itb.ac.id';
my $rrdfile = '/var/tmp/temperature.rrd';
my $log = '/var/tmp/coba.log';
my $soap = SOAP::Lite
-> uri('http://netmon.tf.itb.ac.id/coba/server.php')
-> proxy('http://netmon.tf.itb.ac.id/coba/server.php');

# flush the buffer
$| = 1;

# daemonize the program
&daemonize;

# rrd initialization
my $rrd = RRD::Simple->new (file => "$rrdfile");

$rrd -> create ($rrdfile, temp => "GAUGE");

# creating listen socket
my $sock = IO::Socket::INET->new(
LocalHost => $host,
LocalPort => $port,
Proto => 'udp',
Listen =>1,
ReuseAddr => 1
);
die "socket listening failed" unless $sock ;
my $pesan ;
# our daemon process
while(1) {
my $sockAccept = $sock->accept();
while ($pesan = <$sockAccept>)
{
$rrd -> update (temp => $pesan);
# updating database MS SQL melalui web services
my $soapRes = $soap->insertData($pesan);
unless ($soapRes->fault)
{
print "$pesan berhasil ditulis" ;
}
else
{
print join ', ',
$soapRes->faultcode,
$soapRes->faultstring,
$soapRes->faultdetail;
}

}
}

sub daemonize {
chdir "/var/tmp" or die "Can't chdir to /: $!";
open STDIN, '/dev/null' or die "Can't read /dev/null: $!";
open STDOUT, ">>$log" or die "Can't write to $log: $!";
open STDERR, ">>$log" or die "Can't write to $log: $!";
defined(my $pid = fork) or die "Can't fork: $!";
exit if $pid;
setsid or die "Can't start a new session: $!";
umask 0;
}

Kode PHP untuk menulis ke database pada HOST C yang dibuat :
require_once('lib/nusoap.php');

$server = new soap_server;
// Register the method to expose

$server->register('insertData');
// Define the method as a PHP function

function insertData($temperature)
{
$timeStamp = date('Y-m-d H-i-s');
mysql_connect('localhost','username','password') or die(mysql_error());
mysql_select_db('coba') or die(mysql_error());
mysql_query('INSERT INTO test VALUES ("'.$timeStamp.'","'.$temperature.'")') or die(mysql_error());
return 'berhasil'.$temperature ;
}
// Use the request to (try to) invoke the service
$HTTP_RAW_POST_DATA = isset($HTTP_RAW_POST_DATA) ? $HTTP_RAW_POST_DATA : '';
$server->service($HTTP_RAW_POST_DATA);

?>



Output yang diperoleh adalah sbb:
Pada database :


Pada Grafik :

Referensi: http://en.wikipedia.org/wiki/Sensor_node
http://en.wikipedia.org/wiki/IEEE_802.15.4
http://en.wikipedia.org/wiki/ZigBee
http://en.wikipedia.org/wiki/802.11
http://en.wikipedia.org/wiki/IEEE_802.11b-1999
Dokumentasi wireless sensor fakultas teknologi industri ITB

Tidak ada komentar:

Posting Komentar