diff --git a/ajax/networking/wifi_stations.php b/ajax/networking/wifi_stations.php index a867b6b5..7d9bb82e 100644 --- a/ajax/networking/wifi_stations.php +++ b/ajax/networking/wifi_stations.php @@ -13,5 +13,6 @@ $ssid = null; knownWifiStations($networks); nearbyWifiStations($networks, !isset($_REQUEST["refresh"])); connectedWifiStations($networks); +sortNetworksByRSSI($networks); echo renderTemplate('wifi_stations', compact('networks')); diff --git a/includes/configure_client.php b/includes/configure_client.php index 4e0b001f..07715388 100755 --- a/includes/configure_client.php +++ b/includes/configure_client.php @@ -94,6 +94,7 @@ function DisplayWPAConfig() nearbyWifiStations($networks); connectedWifiStations($networks); + sortNetworksByRSSI($networks); echo renderTemplate("configure_client", compact("status")); } diff --git a/includes/wifi_functions.php b/includes/wifi_functions.php index d8a8ce20..248cbda0 100755 --- a/includes/wifi_functions.php +++ b/includes/wifi_functions.php @@ -52,7 +52,8 @@ function nearbyWifiStations(&$networks, $cached = true) } $scan_results = cache( - $cacheKey, function () { + $cacheKey, + function () { exec('sudo wpa_cli -i ' . RASPI_WIFI_CLIENT_INTERFACE . ' scan'); sleep(3); @@ -63,16 +64,30 @@ function nearbyWifiStations(&$networks, $cached = true) } ); + // get the name of the AP. Should be excluded from nearby networks + exec('cat '.RASPI_HOSTAPD_CONFIG.' | sed -rn "s/ssid=(.*)\s*$/\1/p" ', $ap_ssid); + $ap_ssid = $ap_ssid[0]; + foreach (explode("\n", $scan_results) as $network) { $arrNetwork = preg_split("/[\t]+/", $network); // split result into array + if (!array_key_exists(4, $arrNetwork) || + trim($arrNetwork[4]) == $ap_ssid) { + continue; + } + + $ssid = trim($arrNetwork[4]); + // filter SSID string: anything invisible in 7bit ASCII or quotes -> ignore network + if (preg_match('[\x00-\x1f\x7f-\xff\'\`\´\"]', $ssid)) { + continue; + } // If network is saved - if (array_key_exists(4, $arrNetwork) && array_key_exists($arrNetwork[4], $networks)) { - $networks[$arrNetwork[4]]['visible'] = true; - $networks[$arrNetwork[4]]['channel'] = ConvertToChannel($arrNetwork[1]); + if (array_key_exists($ssid, $networks)) { + $networks[$ssid]['visible'] = true; + $networks[$ssid]['channel'] = ConvertToChannel($arrNetwork[1]); // TODO What if the security has changed? } else { - $networks[$arrNetwork[4]] = array( + $networks[$ssid] = array( 'configured' => false, 'protocol' => ConvertToSecurity($arrNetwork[3]), 'channel' => ConvertToChannel($arrNetwork[1]), @@ -82,9 +97,11 @@ function nearbyWifiStations(&$networks, $cached = true) ); } - // Save RSSI - if (array_key_exists(4, $arrNetwork)) { - $networks[$arrNetwork[4]]['RSSI'] = $arrNetwork[2]; + // Save RSSI, if the current value is larger than the already stored + if (array_key_exists(4, $arrNetwork) && array_key_exists($arrNetwork[4], $networks)) { + if (! array_key_exists('RSSI', $networks[$arrNetwork[4]]) || $networks[$ssid]['RSSI'] < $arrNetwork[2]) { + $networks[$ssid]['RSSI'] = $arrNetwork[2]; + } } } } @@ -98,3 +115,21 @@ function connectedWifiStations(&$networks) } } } + +function sortNetworksByRSSI(&$networks) +{ + $valRSSI = array(); + foreach ($networks as $SSID => $net) { + if (!array_key_exists('RSSI', $net)) { + $net['RSSI'] = -1000; + } + $valRSSI[$SSID] = $net['RSSI']; + } + $nets = $networks; + arsort($valRSSI); + $networks = array(); + foreach ($valRSSI as $SSID => $RSSI) { + $networks[$SSID] = $nets[$SSID]; + $networks[$SSID]['RSSI'] = $RSSI; + } +} diff --git a/templates/wifi_stations.php b/templates/wifi_stations.php index 1769cc9e..d6705628 100755 --- a/templates/wifi_stations.php +++ b/templates/wifi_stations.php @@ -16,41 +16,46 @@ } ?>
-
+
- - - - - - - + + + + + +
-
+
- - - - X - + + + + X +
-
+
- = -50) { - echo 100; - } elseif ($network['RSSI'] <= -100) { - echo 0; - } else { - echo 2*($network['RSSI'] + 100); - } - echo "%)"; - ?> + = -200) { + echo htmlspecialchars($network['RSSI'], ENT_QUOTES); + echo "dB ("; + if ($network['RSSI'] >= -50) { + echo 100; + } elseif ($network['RSSI'] <= -100) { + echo 0; + } else { + echo 2*($network['RSSI'] + 100); + } + echo "%)"; + } else { + echo " not found "; + } + ?>
@@ -58,35 +63,35 @@ -
+
-
-
+
+
- - - - -
- -
- -
-
+ + + + +
+ +
+ +
+ -
- - " id="update" name="update" /> - - - " id="update" name="update" /> - - " name="delete" /> -
+
+ + " id="update" name="update" /> + + + " id="update" name="update" /> + + " name="delete" /> +
- - + +