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

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