Saturday, May 25, 2013

Raspberry pi remote control Perl script source code, server


This code is from project: Raspberry pi and android simple remote control

server.xml

<homeControl>
   <B1 name="On/OFF">
      <get>echo "OFF"</get>
      <set>
         <on>i2cset -y 1 0x10 3 ; echo "OFF"</on>
         <off>echo "OFF"</off>
      </set>
   </B1>

   <B2 name="VolUp">
      <get>echo "OFF"</get>
      <set>
         <on>i2cset -y 1 0x10 1 ; echo "OFF"</on>
         <off>echo "OFF"</off>
      </set>
   </B2>

   <B3 name="VolDown">
      <get>echo "OFF"</get>
      <set>
         <on>i2cset -y 1 0x10 2 ; echo "OFF"</on>
         <off>echo "OFF"</off>
      </set>
   </B3>

   <B4 name="Mute">
      <get>echo "OFF"</get>
      <set>
         <on>i2cset -y 1 0x10 0 ; echo "OFF"</on>
         <off>echo "OFF"</off>
      </set>
   </B4>

   <B5 name="Play">
      <get>echo "OFF"</get>
      <set>
         <on>i2cset -y 1 0x10 4 ; echo "OFF"</on>
         <off>echo "OFF"</off>
      </set>
   </B5>

   <B6 name="Next">
      <get>echo "OFF"</get>
      <set>
         <on>i2cset -y 1 0x10 5 ; echo "OFF"</on>
         <off>echo "OFF"</off>
      </set>
   </B6>

   <B7 name="Prev">
      <get>echo "OFF"</get>
      <set>
         <on>i2cset -y 1 0x10 6 ; echo "OFF"</on>
         <off>echo "OFF"</off>
      </set>
   </B7>

   <B8 name="Stop">
      <get>echo "OFF"</get>
      <set>
         <on>i2cset -y 1 0x10 7 ; echo "OFF"</on>
         <off>echo "OFF"</off>
      </set>
   </B8>

   <B9 name="Portable">
      <get>echo "OFF"</get>
      <set>
         <on>i2cset -y 1 0x10 8 ; echo "OFF"</on>
         <off>echo "OFF"</off>
      </set>
   </B9>

   <B10 name="CD">
      <get>echo "OFF"</get>
      <set>
         <on>i2cset -y 1 0x10 9 ; echo "OFF"</on>
         <off>echo "OFF"</off>
      </set>
   </B10>

   <B11 name="USB">
      <get>echo "OFF"</get>
      <set>
         <on>i2cset -y 1 0x10 10 ; echo "OFF"</on>
         <off>echo "OFF"</off>
      </set>
   </B11>

   <B12 name="Tuner">
      <get>echo "OFF"</get>
      <set>
         <on>i2cset -y 1 0x10 11 ; echo "OFF"</on>
         <off>echo "OFF"</off>
      </set>
   </B12>

   <B13 name="PstPrev">
      <get>echo "OFF"</get>
      <set>
         <on>i2cset -y 1 0x10 12 ; echo "OFF"</on>
         <off>echo "OFF"</off>
      </set>
   </B13>

   <B14 name="PstNext">
      <get>echo "OFF"</get>
      <set>
         <on>i2cset -y 1 0x10 13 ; echo "OFF"</on>
         <off>echo "OFF"</off>
      </set>
   </B14>

   <B15 name="FldUp">
      <get>echo "OFF"</get>
      <set>
         <on>i2cset -y 1 0x10 14 ; echo "OFF"</on>
         <off>echo "OFF"</off>
      </set>
   </B15>

   <B16 name="FldDown">
      <get>echo "OFF"</get>
      <set>
         <on>i2cset -y 1 0x10 15 ; echo "OFF"</on>
         <off>echo "OFF"</off>
      </set>
   </B16>

   <B17 name="Shuffle">
      <get>echo "OFF"</get>
      <set>
         <on>i2cset -y 1 0x10 16 ; echo "OFF"</on>
         <off>echo "OFF"</off>
      </set>
   </B17>

   <B18 name="Repeat">
      <get>echo "OFF"</get>
      <set>
         <on>i2cset -y 1 0x10 17 ; echo "OFF"</on>
         <off>echo "OFF"</off>
      </set>
   </B18>

   <!-- B19 -->

   <!-- B20 -->

   <B21 name="Raspberry Halt">
      <get>echo "OFF"</get>
      <set>
         <on>sudo halt ; echo "OFF"</on>
         <off>echo "OFF"</off>
      </set>
   </B21>


   <default name="None">
      <get>echo "OFF"</get>
   </default>
</homeControl>

server.pl

#!/usr/bin/perl

use strict;
use warnings;
use IO::Socket;
use XML::Simple;
use Data::Dumper;

$|++;


# load xml configuration into hash '$hc'
my $hc = XMLin('server.xml');

# create and bind socket to IP/PORT
my $sock = new IO::Socket::INET (
   LocalHost => '192.168.1.104',
   LocalPort => '8000',
   Proto => 'tcp',
   Listen => 1, 
   Reuse => 1,
   ) or  die "Could not create socket: $!\n";


# set sock options
$sock->autoflush(1); 


while(1) {

   # if client arrives
   my $con = $sock->accept();


   # if client send some data (parse line by line)
   while( defined ( my $data = <$con>) ) {

      # cut out carriage return and new line sign
      $data =~ s/\r|\n//g;

      print "\n" if ($data=~/GET PING/);

      # print on stdout what was received from android
      print "DEBUG: ", $data, "\n";

      # split into variables
      my ($cmd, $mod, $obj, $val) = split(/ /, $data);

      # if it's PING, send PONG
      if ($cmd=~/GET/) {
         if ($mod=~/PING/) {
            print $con "PONG";
            next;
         }
      }
   
      # button found in configuration (XML) found flag
      my $found = 0;

      # step through all defined butons
      foreach my $button ( keys $hc) {

         # $rec holds all info about desired button
         my $rec = $hc->{$button};

         # match object (from android) with button name
         # (from XML config)
         if ($obj eq $button) {

            # set button found flag
            $found = 1;

            # if action is GET data, then
            if ($cmd=~/GET/) {
               # action is get name (description)
               if ($mod=~/NAME/) {
                  # send name to socket (to android)
                  print $con $rec->{name};
                  next; 
               }

               # action is get state
               if ($mod=~/STATE/) {
                  # run command from config (XML) and
                  # fetch its result (not return code) to scket
                  print $con `$rec->{get}`;
                  next; 
               }
            }

            # if actionis SET data from android
            if ($cmd=~/SET/) {

               # we'll be setting stae of the button
               if ($mod=~/STATE/) {

                  # button-on request
                  if ($val=~/true/) {
                     # run command from config (XML) and
                     # fetch its result (not return code) to scket
                     print $con `$rec->{set}->{on}`;
                     # button will change its state as is 
                     # in command result
                     next;
                  }

                  # button-on request
                  if ($val=~/false/) {
                     # like above
                     print $con `$rec->{set}->{off}`;
                     next;
                  }
               }
            }
         }
      }

      # button not found in config, so we fetch
      # default desciptin and states from config (XML)
      if ($found == 0) {
         if ($cmd=~/GET/) {
            if ($mod=~/NAME/) {
               print $con $hc->{default}->{name};
               next; 
            }

            if ($mod=~/STATE/) {
               print $con `$hc->{default}->{get}`;
               next; 
            }
         }

         if ($cmd=~/SET/) {
            if ($mod=~/STATE/) {
               print $con `$hc->{default}->{get}`;
               next; 
            }
         }
      }
   } 
}

close($sock);

No comments:

Post a Comment