From 121c17086ecc9f9d13af14e992ba9d24963ee36f Mon Sep 17 00:00:00 2001 From: PatrickR <> Date: Thu, 16 Apr 2020 19:19:22 +0000 Subject: [PATCH] lepresenced: V0.92: Restart hcitool on HCI Command (forum #75559). git-svn-id: https://svn.fhem.de/fhem/trunk/fhem@21704 2b470e98-0d58-463d-a4d8-8e2adae1ed80 --- contrib/PRESENCE/deb/lepresenced-0.92-1.deb | Bin 0 -> 7568 bytes contrib/PRESENCE/lepresenced | 55 ++++++++++++-------- 2 files changed, 33 insertions(+), 22 deletions(-) create mode 100644 contrib/PRESENCE/deb/lepresenced-0.92-1.deb diff --git a/contrib/PRESENCE/deb/lepresenced-0.92-1.deb b/contrib/PRESENCE/deb/lepresenced-0.92-1.deb new file mode 100644 index 0000000000000000000000000000000000000000..3a0eb10de1856f825bc6849311346707a621797c GIT binary patch literal 7568 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 10; use constant RSSI_WINDOW => 10; use constant ME => 'lepresenced'; -use constant VERSION => '0.9'; +use constant VERSION => '0.92'; use constant PIDFILE => '/var/run/' . ME . '.pid'; @@ -75,6 +75,7 @@ my @clients = (); my ($log_level, $log_target); my $debug; my ($beacons_hcitool, $beacons_hcidump) : shared = (0, 0); +my $restart_hcitool :shared; sub syslogw { return if (scalar(@_) < 2); @@ -207,9 +208,15 @@ sub update_device($$$) { sub bluetooth_scan_thread($$) { my ($device, $legacy_mode) = @_; my $hcitool; + $restart_hcitool = 0; for(;;) { + ($beacons_hcitool, $beacons_hcidump) = (0, 0); my $pid = open($hcitool, "-|", "stdbuf -oL hcitool -i " . $device . " lescan --duplicates 2>&1") || die('Unable to start scanning. Please make sure hcitool and stdbuf are installed!'); while (<$hcitool>) { + if ($restart_hcitool) { + $restart_hcitool = 0; + last(); + } chomp($_); if ($_ eq 'LE Scan ...') { syslogw(LOG_INFO, "Received '%s'.", $_); @@ -249,7 +256,12 @@ sub bluetooth_dump_thread($) { while (<$hcidump>) { chomp($_); - if ($_ =~ m/^>/) { + if ($_ =~ m/^< HCI Command: / && $beacons_hcitool > 0) { # Ignore initial settings, i. e. before first beacon + # https://forum.fhem.de/index.php/topic,75559.msg1007719.html#msg1007719 + syslogw(LOG_WARNING, "Received '%s', telling hcidump to restart...", $_); + $state = HCIDUMP_STATE_NONE; + $restart_hcitool = 1; + } elsif ($_ =~ m/^>/) { if ($current_mac) { #printf("DEBUG: mac: %s, name: '%s', rssi: %s\n", $current_mac, $current_name, $current_rssi); @@ -334,20 +346,20 @@ sub handle_command($$) { $client->{'next_check'} = 0; #now } print $current_client "command accepted\n" - } elsif ($buf =~ m/^\s*ping\s*$/) { - syslogw(LOG_DEBUG, "Received ping command from client %s:%i.", $current_client->peerhost(), $current_client->peerport()); - my ($min_age, $max_age, $devices) = gather_stats(); - print $current_client sprintf("pong [clients=%i;devices=%i;min_age=%s;max_age=%s;beacons_hcitool=%i;beacons_hcidump=%i;beacons_diff=%i]\n", - scalar(@clients), $devices, $min_age // '%', $max_age // '%', $beacons_hcitool, $beacons_hcidump, abs($beacons_hcitool - $beacons_hcidump)); - return(1); - } elsif ($buf =~ m/^\s*stop\s*$/) { + } elsif ($buf =~ m/^\s*ping\s*$/) { + syslogw(LOG_DEBUG, "Received ping command from client %s:%i.", $current_client->peerhost(), $current_client->peerport()); + my ($min_age, $max_age, $devices) = gather_stats(); + print $current_client sprintf("pong [clients=%i;devices=%i;min_age=%s;max_age=%s;beacons_hcitool=%i;beacons_hcidump=%i;beacons_diff=%i]\n", + scalar(@clients), $devices, $min_age // '%', $max_age // '%', $beacons_hcitool, $beacons_hcidump, abs($beacons_hcitool - $beacons_hcidump)); + return(1); + } elsif ($buf =~ m/^\s*stop\s*$/) { # Stop does not make sense when scanning permanently syslogw(LOG_DEBUG, "Received stop command from client %s:%i. Pretending to care and ignoring...", $current_client->peerhost(), $current_client->peerport()); print $current_client "no command running\n" # ToDo: Does the FHEM module even care? } else { syslogw(LOG_WARNING, "Received unknown command: '%s'.", $buf); } - return(0); + return(0); } sub gather_stats() { @@ -361,11 +373,11 @@ sub gather_stats() { $max_age = $age if (!defined($max_age) || $age > $max_age); } } - return($min_age, $max_age, $devices); + return($min_age, $max_age, $devices); } sub stats_task() { - my ($min_age, $max_age, $devices) = gather_stats(); + my ($min_age, $max_age, $devices) = gather_stats(); syslogw(LOG_INFO, "Active clients: %i, known devices: %i (min/max age: %s/%s), received beacons (hcitool/hcidump/difference): %i/%i/%i", scalar(@clients), $devices, $min_age // '%', $max_age // '%', $beacons_hcitool, $beacons_hcidump, abs($beacons_hcitool - $beacons_hcidump)); } @@ -404,15 +416,15 @@ sub cleanup_task() { openlog(ME, 'pid', LOG_USER); (my $device, my $daemonize, my $listen_address, my $listen_port, $log_level, $log_target, $debug, my $legacy_mode, my $rssi_threshold) = parse_options(); - local $SIG{INT} = local $SIG{TERM} = local $SIG{HUP} = sub { - syslogw(LOG_NOTICE, "Caught signal, cleaning up and exiting..."); - unlink(PIDFILE) if (-e PIDFILE); - closelog(); - exit(1); - }; +local $SIG{INT} = local $SIG{TERM} = local $SIG{HUP} = sub { + syslogw(LOG_NOTICE, "Caught signal, cleaning up and exiting..."); + unlink(PIDFILE) if (-e PIDFILE); + closelog(); + exit(1); +}; syslogw(LOG_NOTICE, "Version %s started (device: %s, listen addr: %s, listen port: %s, daemonize: %i, legacy mode: %i, rssi threshold: %i, log level: %i, debug: %i).", - VERSION, $device, $listen_address, $listen_port, $daemonize, $legacy_mode, $rssi_threshold, $log_level, $debug); + VERSION, $device, $listen_address, $listen_port, $daemonize, $legacy_mode, $rssi_threshold, $log_level, $debug); sanity_check($legacy_mode); daemonize('root', 'root', PIDFILE) if $daemonize; @@ -449,13 +461,12 @@ for(;;) { syslogw(LOG_INFO, "Connection from %s:%s. Connected clients: %i.", $client_socket->peerhost(), $client_socket->peerport(), $select->count()-1); } else { sysread ($current_client, my $buf, INET_RECV_BUFFER); - - my $disconnect; + my $disconnect; if ($buf) { chomp($buf); $disconnect = handle_command($buf, $current_client); } - if (!$buf || $disconnect) { + if (!$buf || $disconnect) { $select->remove($current_client); @clients = grep {$_->{'handle'} != $current_client} @clients; syslogw(LOG_INFO, "Client %s:%s disconnected. Connected clients: %i.", $current_client->peerhost(), $current_client->peerport(), $select->count()-1);