added button function
[led-wall.git] / sniffer.pl
1 #!/usr/bin/perl
2
3 use strict;
4 use POSIX;
5 use Net::Pcap;
6 use NetPacket::Ethernet;
7 use NetPacket::IP;
8 use NetPacket::TCP;
9 use NetPacket::UDP;
10 use Socket;
11 use IO::Socket;
12
13 my $server = IO::Socket::INET->new(
14   Proto     => 'udp',
15   PeerPort => 10000,
16   PeerAddr    => 'led-wall' )
17 or die "can't setup server";
18
19 my @led_timer;
20
21 my $err;
22
23 my $dev = "eth1";
24 unless (defined $dev) {
25     $dev = Net::Pcap::lookupdev(\$err);
26     if (defined $err) {
27         die 'Unable to determine network device for monitoring - ', $err;
28     }
29 }
30
31 my ($address, $netmask);
32 my $object = Net::Pcap::open_live($dev, 1500, 0, 0, \$err);
33
34 my $filter;
35 Net::Pcap::compile(
36     $object, 
37     \$filter,
38     #make your private network range in the filter below
39     '(not src net 192.168.0.0/16)',
40     0, 
41     $netmask
42 ) && die 'Unable to compile packet capture filter';
43
44 Net::Pcap::setfilter($object, $filter) &&
45   die 'Unable to set packet capture filter';
46
47 unless (defined $object) {
48   die 'Unable to create packet capture on device ', $dev, ' - ', $err;
49 }
50
51 #print $server "ticklex";
52
53 Net::Pcap::loop($object, -1, \&packets, $server) ||
54   die 'Unable to perform packet capture';
55
56 sub led_timeout {
57   my ($user_data, $pixel) = @_;
58   $led_timer[$pixel] = time() + 30;
59
60   for (my $i=0; $i<1024; $i++) {
61     if (($led_timer[$i] < time()) && ($led_timer[$i]>0)) {
62       print $user_data "R:$i,0";
63       print $user_data "G:$i,0";
64       print $user_data "B:$i,0";
65       $led_timer[$i] = 0;
66     }
67   }
68 }
69
70 sub ip2dec ($) {
71     unpack N => pack CCCC => split /\./ => shift;
72 }
73
74 sub packets {
75   my ($user_data, $header, $packet) = @_;
76   my $ether_data = NetPacket::Ethernet::strip($packet);
77   my $ip = NetPacket::IP->decode($ether_data);
78   my $num;
79   my $pixel;
80   my $intensity;
81   if($ip->{proto} == 6) {
82     my $tcp = NetPacket::TCP->decode($ip->{'data'});
83     if ($tcp) {
84       $num = $tcp->{'src_port'} / 64;
85       $pixel = floor($num);
86       $intensity = floor((((sprintf("%.2f",($num-$pixel))*100)) * 256) / 100);
87       print $user_data "R:$pixel,$intensity";
88     }
89   } elsif ($ip->{proto} == 17) {
90     my $udp = NetPacket::UDP->decode($ip->{'data'});
91     if ($udp) {
92       $num = $udp->{'src_port'} / 64;
93       $pixel = floor($num);
94       $intensity = floor((((sprintf("%.2f",($num-$pixel))*100)) * 256) / 100);
95       print $user_data "G:$pixel,$intensity";
96     }
97   } else {
98     $num = ip2dec($ip->{'src_ip'}) / 4194304;
99     $pixel = floor($num);
100     $intensity = floor((((sprintf("%.2f",($num-$pixel))*100)) * 256) / 100);
101     print $user_data "B:$pixel,$intensity";
102   }
103   led_timeout($user_data, $pixel);
104 }