From 4646b9c5135e99e06fc3417d57a041afcdeaba46 Mon Sep 17 00:00:00 2001 From: "s.galanskiy" Date: Wed, 11 Jun 2025 11:52:56 +0500 Subject: [PATCH] =?UTF-8?q?=D0=90=D0=B3=D1=80=D0=B5=D0=B3=D0=B8=D1=80?= =?UTF-8?q?=D1=83=D0=B5=D1=82=20=D0=BF=D0=BE=D0=B4=D0=BA=D0=BB=D1=8E=D1=87?= =?UTF-8?q?=D0=B0=D0=B5=D0=BC=D1=8B=D0=B5=20=D1=81=D0=B5=D1=82=D0=B8=20?= =?UTF-8?q?=D0=BF=D0=BE=20=D1=81=D0=B0=D0=BC=D0=BE=D0=B9=20=D1=81=D0=B8?= =?UTF-8?q?=D0=BB=D1=8C=D0=BD=D0=BE=D0=B9=20=D1=82=D0=BE=D1=87=D0=BA=D0=B5?= =?UTF-8?q?=20=D0=B4=D0=BE=D1=81=D1=82=D1=83=D0=BF=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- SRV/services/wifi_service.py | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) 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)