Lorsque vous effectuez des tests de routeur, vous devez contrôler la carte réseau sans fil pour lui permettre de se déconnecter automatiquement et d'autres opérations. Pywifi peut réaliser cette fonction. À cette époque, seules la fenêtre et les plates-formes Linux étaient disponibles, et la plate-forme mac n'était pas disponible.
installer pip pywifi
pip installer les comtypes
1. Obtenez l'interface de la carte réseau sans fil
Parfois, il y a plusieurs cartes réseau sur un ordinateur, pour le moment, nous devons sélectionner la carte réseau dont nous avons besoin pour la liaison SSID.
Lorsque vous utilisez l' pywifi.PyWiFi
interface pour créer une instance, il sera de retour que nous avons détecté quelques cartes réseau, puis nous wifi.interfaces.name()
pouvons obtenir le nom de chaque carte réseau , puis nous choisirons la carte réseau correspondante en fonction de nos propres besoins.
def get_wifi_interfaces():
wifi = pywifi.PyWiFi() # 创建一个无限对象
num = len(wifi.interfaces())
if num <= 0:
logging.info("未找到无线网卡接口!\n")
exit()
if num == 1:
wifi_iface = wifi.interfaces()[0] # 取一个无限网卡
logging.info(u"无线网卡接口: %s\n" % (wifi_iface.name()))
return wifi_iface
else:
logging.info('%-4s %s\n' % (u'序号', u'网卡接口名称'))
for i, w in enumerate(wifi.interfaces()):
logging.info('%-4s %s' % (i, w.name()))
while True:
iface_no = input('请选择网卡接口序号:'.encode('utf-8').decode('gbk'))
no = int(iface_no)
if no >= 0 and no < num:
return wifi.interfaces()[no]
2. Scannez le SSID existant autour
Après avoir sélectionné la carte réseau, nous lierons le SSID du point chaud. À ce stade, nous devons généralement analyser l'environnement environnant d'abord pour confirmer l'existence du SSID que nous voulons lier.
# 扫描周围wifi
def scan_wifi(self):
self.scan() # 扫描
time.sleep(3)
wifi_info = self.scan_results()
wifi_list = []
for i in wifi_info:
if i.signal > -90: # 信号强度<-90的wifi几乎连不上
wifi_list.append((i.ssid, i.signal, i.freq, i.bssid, i.akm)) # 添加到wifi列表
logging.info("ssid: %s, 信号: %s, freq: %s, mac: %s, 加密方式: %s",
i.ssid.encode('raw_unicode_escape', 'strict').decode('utf-8'), i.signal, i.freq, i.bssid, i.akm)
return sorted(wifi_list, key=lambda x: x[1], reverse=True) # 按信号强度由高到低排序
Utilisez la fonction scan () pour numériser, attendez quelques secondes, utilisez scan_results () pour obtenir les résultats de la numérisation, puis enregistrez les informations sur le périphérique pour notre correspondance.
3. Connectez le SSID WIFI
Après avoir trouvé le SSID WIFI correspondant, vous pouvez utiliser le mot de passe correspondant au SSID et la méthode de cryptage pour vous connecter (méthode de cryptage, nous pouvons l'obtenir dans les résultats de l'analyse ci-dessus)
Après la connexion, vous pouvez utiliser l'interface status () pour déterminer si la connexion a réussi.
# 连接wifi
def connect_wifi(self):
profile_info = pywifi.profile.Profile() # 配置文件
profile_info.ssid = "TEST_24G" # wifi名称
profile_info.key = "12345678" # wifi密码
profile_info.auth = pywifi.const.AUTH_ALG_OPEN
profile_info.akm.append(pywifi.const.AKM_TYPE_WPA2PSK) # 加密类型
profile_info.cipher = pywifi.const.CIPHER_TYPE_CCMP # 加密单元
self.remove_all_network_profiles() # 删除其他配置文件
logging.info("删除其他配置文件")
time.sleep(2) # 删除其他配置文件
tmp_profile = self.add_network_profile(profile_info) # 加载配置文件
self.connect(tmp_profile) # 连接
time.sleep(10) # 尝试10秒能否成功连接
logging.info(self.status())
if self.status() == pywifi.const.IFACE_CONNECTED:
logging.info("成功连接")
return True
else:
logging.info("失败")
self.disconnect() # 断开连接
time.sleep(2)
return False
4. Déconnectez
La déconnexion est relativement simple, comme suit:
# 断开无线网卡已连接状态
def disconnect_wifi(self):
self.disconnect()
time.sleep(2)
if self.status() in [pywifi.const.IFACE_DISCONNECTED, pywifi.const.IFACE_INACTIVE]:
logging.info(u'无线网卡:%s 已断开。' % self.name())
return True
else:
logging.info(u'无线网卡:%s 未断开。' % self.name())
return False
5. Exemple complet
En utilisant l'interface ci-dessus, vous pouvez écrire la logique de connexion approximative:
def start_connect_wifi(info):
wifi = get_wifi_interfaces()
if check_interfaces(wifi):
disconnect_wifi(wifi)
scan_i = 0
scan_result = False
while scan_i < 5:
wifi_list = scan_wifi(wifi)
scan_i += 1
for wifi_i in wifi_list:
if wifi_i[0] == info["ssid"]:
logging.info("find ssid:%s", info["ssid"])
scan_result = True
scan_i = 5
break
if not scan_result:
logging.info("find ssid:%s fail", info["ssid"])
return False
conn_result = connect_wifi(wifi)
time.sleep(2)
if check_interfaces(wifi):
disconnect_wifi(wifi)
return conn_result
https://github.com/awkman/pywifi
API WLAN:
https://www.cnblogs.com/gaidao/p/4086850.html
https://blog.csdn.net/qq_38882327/article/details/89349399