Rabbit Microprocessor Basic Tutorial [Bagian 6 – Selesai]

TCP Socket Programming

Pada Dynamic C versi 6.57 ke atas, masing-masing socket harus mempunyai tcp_Socket sebanyak 145 bytes atau sebuah udp_Socket sebanyak 62 bytes. I/O buffers disimpan pada extended memory.

Pada Dynamic C versi sebelumnya, masing-masing socket harus mempunyai sebuah struktur data  tcp_Socket yang menyimpan status socket dan I/O buffer. Struktur ini pada keadaan default masing-masing sekitar 4200 bytes. Sebagian besar space digunakan untuk buffer input dan output.

Ada dua cara untuk membuka TCP socket yaitu secara aktif atau pasif.

Active Open

Ketika browser anda membuka sebuah halaman web server kemungkinan telah terjadi lebih dari satu koneksi yang terhubung pada server yang soketnya dibuka secara pasif. Untuk membuka soket secara aktif, dapat digunakan fungsi tcp_open() dengan menggunakan parameter-parameter yang sama dengan pemanggilan fungsi tcp_listen().

Ketika memanggil fungsi tcp_open(), Dynamic C mencoba mengontak device lain untuk membangun koneksi. Fungsi tcp_open akan fail dan mengembalikan nilai return nol apabila koneksi tidak dapat dibuka akibat kesulitan-kesulitan routing seperti ketidakmampuan membuka remote host hardware address dengan ARP.

Lab 5.1 TCP Socket Active Open

  • Ketikan listing program berikut ini :
/*****************************************************
     latih5.c
     www.teknikpersinyalan.com
     TCP Socket Active Open
     Basic Tutorial Rabbit Microprocessor
******************************************************/ 

#define TCPCONFIG 1   //Default TCPCONFIG has been changed
#define _PRIMARY_STATIC_IP "192.168.2.142"
#define _PRIMARY_NETMASK "255.255.255.0"
#define MY_GATEWAY     "192.168.2.1"
#define MY_NAMESERVER  "192.168.2.1"

#define TARGET_IP    "192.168.2.140" //Ubah dengan IP komputer anda 
#define DS1    0
#define S1  1

#memmap xmem
#use "dcrtcp.lib"
#define PORT 200 

//routine 
tcp_Socket vcmsock;
 

void sleep()
{
  long t;
  t = SEC_TIMER;                   //Warming up delay...
   while((long)(SEC_TIMER - t) <= 10)
 } 

main()
{
   auto char buffer[255];
   auto char tcpoutbuffer[255];
   auto int portstat=0,status;
   auto longword ip;
   auto int runflag; 

   printf("Inisialisasi...\n");

   sock_init(); 

   runflag=0;
   buffer[0]='0';

   BitWrPortI(PDDDR,&PDDDRShadow,1,DS1); //Port D0 sebagai output
   BitWrPortI(PDDDR,&PDDDRShadow,0,S1);  //Port D1 sebagai input
   BitWrPortI(PDDR,&PDDRShadow,1,DS1);   //LED indikator = off

   sleep();

   while(1)

   {

//IndicatorsIndicatorsIndicatorsIndicators 

costate
{
    if(runflag==0)
         {
         BitWrPortI(PDDR, &PDDRShadow,0,DS1);
         waitfor(DelayMs(500));
         runflag=1;
      } 
    else
         {
         BitWrPortI(PDDR, &PDDRShadow,1,DS1);
         waitfor(DelayMs(500));
         runflag=0;
      }
}

 costate
   {
      tcp_tick(NULL);
      printf("\n\nMembuka Port...\n");
      ip=resolve(TARGET_IP);
      tcp_open(&vcmsock,0,ip,PORT,NULL); 

while(!sock_established(&vcmsock)&& sock_bytesready(&vcmsock)==-1) 
      {
         tcp_tick(NULL);
         yield;
      }

      printf("Tersambung...\n");
      sock_mode(&vcmsock,TCP_MODE_ASCII); 
      while(tcp_tick(&vcmsock)) 
      { 
         portstat=BitRdPortI(PDDR,S1);   //Membaca switch S1
         waitfor(DelayMs(100));
            if (buffer[0]=='1')
               {
                 strcpy(tcpoutbuffer,"YES, I'm the number one...\n");
                 sock_awrite(&vcmsock,tcpoutbuffer,27);
                 buffer[0]='0';
               }

             if (portstat==0)
               {
                 printf("Tombol S1 ditekan...\n");
                 strcpy(tcpoutbuffer,"Tombol S1 ditekan...\n");
                 sock_awrite(&vcmsock,tcpoutbuffer,22);
                 portstat=1;
               }

               if (sock_bytesready(&vcmsock)>=0)
                {
                  sock_gets(&vcmsock,buffer,1);
                  printf("Isi buffer : %s\n",buffer);
                }
        } 
            status=sock_alive(&vcmsock);
            if (status==0)
               printf("User menutup koneksi \n");
            else
               printf("Koneksi tidak tertutup \n"); 
   }

   } 
}
  • Save pekerjaan anda pada folder :\RabbitTraining\ dengan nama file: latih5.c.
  • Sesuaikan IP komputer anda dan subnet mask-nya dengan IP pada Rabbit.
  • Jalankan program Hercules.exe yang ada pada folder :\RabbitTraining\
  • Klik tab TCP server, sesuaikan port-nya dengan Rabbit (dalam hal ini port 200).
  • Klik tombol Listen.
  • Pasang jumper SMODE pada konektor JP1.
  • Debug dan Compile program tersebut di RAM tunggu sampai Rabbit terkoneksi ke PC.
  • Perhatikan Stdio dan window Client connection status pada Hercules.
  • Tunggu sampai soket terkoneksi.
  • Tekan switch S1 pada Interface Board perhatikan yang terjadi pada Stdio dan Hercules.
  • Ketikkan 3100 pada window send Hercules dan centang list Hex –nya.
  • Matikan debug dengan mengubah Dynamic C ke mode edit (tekan tombol F4) perhatikan yang terjadi pada Hercules.

Pasive Open

Pada saat menunggu seseorang mengontak device kita, soket dapat dibuka dengan memanggil fungsi tcp_listen(). Cara membuka soket seperti ini lazim digunakan oleh internet server pada penggunaan port yang sangat terkenal seperti port 80 untuk HTTP. Apabila kita ingin mengkoneksikan dengan sembarang port maka set salah satu port (lokal port atau remote port) menjadi nol.

Fungsi tcp_listen() dapat segera mengembalikan nilai (return) dan kita harus melakukan polling untuk mengecek koneksi dengan memanggil makro sock_wait_established atau menggunakan sock_established.

Lab 5.2 TCP Socket Pasive Open

  • Modifikasi program latih5.c menjadi listing program sebagai berikut.
/*****************************************************
     latih6.c
     www.teknikpersinyalan.com
     TCP Socket Pasive Open
     Basic Tutorial Rabbit Microprocessor 
******************************************************/

#define TCPCONFIG 1   //Default TCPCONFIG has been changed
#define _PRIMARY_STATIC_IP "192.168.2.142"
#define _PRIMARY_NETMASK "255.255.255.0"
#define MY_GATEWAY     "192.168.2.1"
#define MY_NAMESERVER  "192.168.2.1" 
#define DS1    0
#define S1  1

#memmap xmem
#use "dcrtcp.lib"
#define PORT 200
 
//routine 
tcp_Socket vcmsock; 

void sleep()
{
  long t;
  t = SEC_TIMER;                   //Warming up delay...
  while((long)(SEC_TIMER - t) <= 10)
  }
 
main() 

{
   auto char buffer[255];
   auto char tcpoutbuffer[255];
   auto int portstat=0,status;
   auto longword ip;
   auto int runflag; 

   printf("Inisialisasi...\n");

   sock_init(); 

   runflag=0;
   buffer[0]='0';

   BitWrPortI(PDDDR,&PDDDRShadow,1,DS1); //Port D0 sebagai output
   BitWrPortI(PDDDR,&PDDDRShadow,0,S1);  //Port D1 sebagai input
   BitWrPortI(PDDR,&PDDRShadow,1,DS1);   //LED indikator = off 

   sleep(); 

   while(1)
   { 

costate
{
    if(runflag==0)
         {
            BitWrPortI(PDDR, &PDDRShadow,0,DS1);
            waitfor(DelayMs(500));

            runflag=1;

         } 

    else
         {
            BitWrPortI(PDDR, &PDDRShadow,1,DS1);
            waitfor(DelayMs(500));
            runflag=0;
         }
}

costate
   {
      //tcp_tick(NULL);
      printf("\n\nMenunggu Koneksi\n");
      tcp_listen(&vcmsock,PORT,0,0,NULL,0);
      while(!sock_established(&vcmsock)&&sock_bytesready(&vcmsock)==-1)
      {
         tcp_tick(NULL);
         yield;
      } 

      printf("Tersambung...\n");
      sock_mode(&vcmsock,TCP_MODE_ASCII);

      while(tcp_tick(&vcmsock)) 
      { 

         portstat=BitRdPortI(PDDR,S1);  //Membaca switch S1
         waitfor(DelayMs(100));

                  if (buffer[0]=='1')
               {
                 strcpy(tcpoutbuffer,"YES, I'm the number one...\n");
                 sock_awrite(&vcmsock,tcpoutbuffer,27);
                 buffer[0]='0';
               }

             if (portstat==0)
               {
                 printf("Tombol S1 ditekan...\n");
                 strcpy(tcpoutbuffer,"Tombol S1 ditekan...\n");
                 sock_awrite(&vcmsock,tcpoutbuffer,22);
                 portstat=1;
               }

               if (sock_bytesready(&vcmsock)>=0)
                {
                  sock_gets(&vcmsock,buffer,1);
                  printf("Isi buffer : %s\n",buffer);
                }
        }

            status=sock_alive(&vcmsock);
            if (status==0)
               printf("User menutup koneksi \n");
            else
               printf("Koneksi tidak tertutup \n");
   } 

   }

}
  • Save as pekerjaan anda pada folder :\RabbitTraining\ dengan nama file: latih5.c.
  • Sesuaikan IP komputer anda dan subnet mask-nya dengan IP pada Rabbit.
  • Jalankan program Hercules.exe yang ada pada folder :\RabbitTraining\
  • Klik tab TCP Client, Isi window TCP Module IP dengan IP target (Rabbit). sesuaikan port-nya dengan Rabbit (dalam hal ini port 200).
  • Pasang jumper SMODE pada konektor JP1.
  • Debug dan Compile program tersebut di RAM tunggu sampai Rabbit terkoneksi ke PC.
  • Tekan tombol Connect pada Hercules.
  • Tunggu sampai soket terkoneksi.
  • Tekan switch S1 pada Interface Board perhatikan yang terjadi pada Stdio dan Hercules.
  • Ketikkan 3100 pada window send Hercules dan centang list Hex –nya.
  • Matikan debug dengan mengubah Dynamic C ke mode edit (tekan tombol F4) perhatikan yang terjadi pada Hercules.

Leave a Reply

Your email address will not be published. Required fields are marked *