Агрегирует подключаемые сети по самой сильной точке доступа
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")
|
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)
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue