import os import re import time import psutil import pywifi from pywifi import const from LogRecord.log_recorder import GLOBAL_LOG def get_wifi_name(): echo = os.popen("netsh wlan show interfaces | findstr /C:\"SSID\"").read() wifi_name_re = re.search(r"(?<=:\s).*", echo) if wifi_name_re: return wifi_name_re.group() else: return None class WIFI: def __init__(self) -> None: super().__init__() self.iface = None self.wifi_device_initial() self.log = GLOBAL_LOG # WiFi驱动初始化 def wifi_device_initial(self): while True: try: wifi = pywifi.PyWiFi() self.iface = wifi.interfaces()[0] # acquire the first Wlan card,maybe not break except Exception as e: self.log.write(f"WiFi驱动初始化失败,原因是:{e.args}。") time.sleep(1) continue def get_connected_wifi_name(self): try: if self.wifi_connect_status(): wifi_name = get_wifi_name() return wifi_name except Exception as e: self.log.write(f"获取连接的WiFi出错,原因是:{e.args}。") return None def wifi_connect_status(self): try: if self.iface.status() in [const.IFACE_CONNECTED, const.IFACE_INACTIVE]: return True else: return False except Exception as e: self.log.write(f"获取WiFi状态出错,原因是:{e.args}。") self.wifi_device_initial() return False def disconnect(self): try: while self.wifi_connect_status(): self.iface.disconnect() except Exception as e: self.log.write(f"断开WiFi出错,原因是:{e.args}。") self.wifi_device_initial() return False @staticmethod def get_ip(): dic = psutil.net_if_addrs() container = {} for adapter in dic: snic_list = dic[adapter] ipv4 = '无 ipv4 地址' for snic in snic_list: if snic.family.name == 'AF_INET': ipv4 = snic.address container[str(adapter)] = str(ipv4) return container def scan_wifi(self): try: self.iface.scan() time.sleep(5) base_wifi = self.iface.scan_results() wifi_list = [str(wifi.ssid) for wifi in base_wifi] return wifi_list except Exception as e: self.log.write(f"扫描WiFi出错,原因是:{e.args}。") self.wifi_device_initial() return [] def connect_wifi(self, ssid, password): try: self.disconnect() for i in range(10): time.sleep(1) if not self.wifi_connect_status(): break profile = pywifi.Profile() # 配置文件 profile.ssid = ssid # wifi名称 profile.auth = const.AUTH_ALG_OPEN # 需要密码 profile.akm.append(const.AKM_TYPE_WPA2PSK) # 加密类型 profile.cipher = const.CIPHER_TYPE_CCMP # 加密单元 profile.key = password # wifi密码 # self.iface.remove_all_network_profiles() # 删除其它配置文件 tmp_profile = self.iface.add_network_profile(profile) # 加载配置文件 self.iface.connect(tmp_profile) for i in range(20): time.sleep(1) if self.iface.status() == const.IFACE_CONNECTED: return True return False except Exception as e: self.log.write(f"链接WiFi出错,原因是:{e.args}。") self.wifi_device_initial() return False