LISHUZUOXUN_yangjiang/LSZXNetWork/NetworkDriverWin32/wifi.py

121 lines
3.8 KiB
Python
Raw Normal View History

2024-09-23 14:54:15 +08:00
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