diff --git a/SRV/services/wifi_service.py b/SRV/services/wifi_service.py index 5672c8b..d61b3b9 100644 --- a/SRV/services/wifi_service.py +++ b/SRV/services/wifi_service.py @@ -11,7 +11,6 @@ from models.wifi import WifiAccessPoint, WifiScanResult logging.basicConfig(level=logging.DEBUG, format="%(asctime)s - %(name)s - %(levelname)s - %(message)s") logger = logging.getLogger(__name__) - class WifiService: """Сервис для сканирования текущих Wi-Fi точек доступа""" @@ -32,7 +31,7 @@ class WifiService: for iface in interfaces: iface_name = iface.name() - if 'p2p' in iface_name.lower(): # без p2p, потом в любом случае надо будет исправлять думаю это не точное решение + if 'p2p' in iface_name.lower(): logger.debug(f"Пропущен интерфейс {iface_name} (P2P)") continue try: @@ -178,13 +177,14 @@ class WifiService: try: logger.info(f"Начало сканирования Wi-Fi на интерфейсе {self.interface.name()}") self.interface.scan() - time.sleep(10) # Нативное значение для скана сети (в секундах). Оптимальное для точного сканирования хватает от 5 до 20 секунд + time.sleep(10) py_results = self.interface.scan_results() logger.debug(f"Найдено {len(py_results)} точек через pywifi") iw_results = self._get_iw_scan_data() iw_by_bssid = {ap['bssid']: ap for ap in iw_results if ap.get('bssid')} + best_aps_by_ssid: Dict[str, WifiAccessPoint] = {} for ap in py_results: bssid = ap.bssid.lower() if ap.bssid else None if not bssid: @@ -204,7 +204,7 @@ class WifiService: logger.debug( f"Точка {bssid}: freq={frequency}, channel={channel}, encryption={encryption}, signal={signal}") - ap_data = WifiAccessPoint( + current_ap = WifiAccessPoint( ssid=ssid, bssid=bssid, channel=channel, @@ -214,11 +214,15 @@ class WifiService: vendor=vendor, hidden=hidden ) - aps.append(ap_data) + + if ssid not in best_aps_by_ssid or (current_ap.signal and best_aps_by_ssid[ssid].signal and current_ap.signal > best_aps_by_ssid[ssid].signal): + best_aps_by_ssid[ssid] = current_ap + + aps = list(best_aps_by_ssid.values()) logger.info( f"Сканирование Wi-Fi завершено за {time.time() - start_time:.2f} секунд, " - f"найдено {len(aps)} точек" + f"найдено {len(aps)} уникальных сетей" ) return WifiScanResult(access_points=aps)