Raymond-p

wifiScan.pl

Nov 29th, 2015
67
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Perl 2.25 KB | None | 0 0
  1. #!/usr/bin/perl -w
  2. use strict;
  3. use HTTP::Tiny;
  4.  
  5.  
  6. my $settings = {
  7.     iw      => '/sbin/iw',          #iw
  8.     dev     => 'wlan0',         # your network device
  9.     findMac     => '88:dc:96:1f:b3:1a',     # mac address to check
  10.     awayAfter   => 5000,            # don't match if not seen for x milliseconds
  11.     domoAddr    => '192.168.0.111',     # domoticz web address
  12.     domoUser    => 'testUser',          # domoticz username
  13.     domoPasswd  => 'testPass',          # domoticz password
  14.     domoUserVar => 'autoWifi',          # domoticz variable name
  15.     domoVarID   => 99,              # domoticz variable id
  16. };
  17.  
  18.  
  19. my $networks = {};
  20.  
  21. my $skeleton = {
  22.     'BSS' => '',
  23.     'SSID' => '',
  24.     'lastSeen' => '',
  25.     'signal' => ''
  26. };
  27.  
  28. &scanWifi;
  29. &findMyNetwork;
  30.  
  31. sub findMyNetwork{
  32.  
  33.     if(defined $networks->{$settings->{findMac}}){
  34.         # network found
  35.  
  36.         if($networks->{$settings->{findMac}}->{lastSeen} < $settings->{awayAfter}){
  37.             #wifi seems to be within reach.
  38.             updateDomo(time);
  39.             return;
  40.         }
  41.  
  42.     }
  43.  
  44.     updateDomo(0);
  45.    
  46. }
  47.  
  48. sub updateDomo{
  49.     my ($sendToDomo,$url, $varValue);
  50.  
  51.     $varValue = shift;
  52.  
  53.     $url = sprintf(
  54.         'http://%s:%s@%s/json.htm?type=command&param=updateuservariable&idx=%s&vname=%s&vtype=0&vvalue=%s',
  55.         $settings->{domoUser},
  56.         $settings->{domoPasswd},
  57.         $settings->{domoAddr},
  58.         $settings->{domoVarID},
  59.         $settings->{domoUserVar},
  60.         $varValue
  61.  
  62.     );
  63.  
  64.     $sendToDomo = HTTP::Tiny->new->get($url);
  65.  
  66.     if($sendToDomo->{success}){
  67.         print "Domo updated\n";
  68.     }else{
  69.         print "Domo failed to update\n";
  70.  
  71.         #printf("%s \n\n %s\n", $sendToDomo->{status}, $sendToDomo->{content});
  72.     }
  73.  
  74. }
  75.  
  76. sub scanWifi{
  77.  
  78.     my ($network, $cmd);
  79.  
  80.     $cmd = sprintf('%s dev %s scan', $settings->{iw}, $settings->{dev});
  81.  
  82.     open(READ, $cmd, '-|') or die("couldn't open iw");
  83.  
  84.  
  85.     foreach my $line (<READ>) {
  86.  
  87.         if($line =~ /^BSS ((?:[0-9a-f]{2}[:-]){5}[0-9a-f]{2})/i){
  88.  
  89.             if(defined $network->{'BSS'}){
  90.                 $networks->{$network->{'BSS'}} = $network;
  91.                
  92.             }
  93.  
  94.             $network = { %$skeleton };
  95.             $network->{'BSS'} = $1;
  96.  
  97.         }elsif ($line =~ /\sSSID: (.+)/) {
  98.  
  99.             $network->{'SSID'} = $1;
  100.  
  101.  
  102.         }elsif ($line =~ /\slast seen: (\d+)/) {
  103.  
  104.            $network->{'lastSeen'} = $1;
  105.  
  106.         }elsif ($line =~ /\ssignal: (.+)/) {
  107.             $network->{'signal'} = $1;
  108.         }
  109.  
  110.     }
  111.     $networks->{$network->{'SSID'}} = $network;
  112.  
  113.  
  114.     close(READ);
  115.  
  116. }
Advertisement
Add Comment
Please, Sign In to add comment