Агрегирует подключаемые сети по самой сильной точке доступа

This commit is contained in:
parent 090cbcd477
commit 4646b9c513

View file

@ -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)