Агрегирует подключаемые сети по самой сильной точке доступа
This commit is contained in:
parent
090cbcd477
commit
4646b9c513
1 changed files with 10 additions and 6 deletions
|
|
@ -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)
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue