使用的指令wpa_cli和iwlist, nmcli,详细请看这篇文章
https://www.cnblogs.com/hotwater99/p/12760261.html
先建立两个文件
第一个文件:向conf文件添加wifi,必须使用终端执行,博主是添加多个wifi,为了从办公室到实验室自动切换连接使用
做了微调,不知道为啥树莓派安装network-manager以后会变成动态ip,就只好写了两个版本,Ubuntu和Raspi各一个
def add_wifi_to_config(ssid, password):
config = (
f'\nnetwork={{\n' +
f'\tssid="{ssid}"\n' +
f'\tpsk="{password}"\n' + '}')
print(config)
with open("/etc/wpa_supplicant/wpa_supplicant.conf", "a+") as wifi:
wifi.write(config)
wifi.close()
print("Wifi config added")
return True
if __name__ == '__main__':
ssids = ['11', '222', '333', '444', '555']
passwords = ['1', '2', '3', '4', '5']
for idx, _ssid in enumerate(ssids):
result = add_wifi_to_config(_ssid, passwords[idx])
print(result)
第二个文件:自动连接wifi
import os
import time
import threading
# 树莓派需要先把账号密码存入conf文件中 /etc/wpa_supplicant/wpa_supplicant.conf
class RaspWifi(object):
def __init__(self, interface_name, interval_frequency=1):
self._interface_name = interface_name
# THREAD
self._interval_frequency = interval_frequency
self._thread = threading.Thread(target=self._working)
self._thread.daemon = True
self._thread.start()
def _working(self):
while 1:
if not self._is_wifi_connected():
print('Connecting....')
wifi_id = self._get_target_wifi_id()
os.system(f'wpa_cli -i wlan0 select_network {wifi_id}')
time.sleep(self._interval_frequency)
def _get_target_wifi_id(self):
# 把conf文件中存储的wifi和wifi_id拿出来
wifi_in_conf = os.popen('wpa_cli -i wlan0 list_network')
lines = [x for x in wifi_in_conf.read().split('\n') if x != '']
wifi = dict()
for line in lines[1:]:
one_wifi_info = line.split('\t')
wifi[one_wifi_info[1]] = one_wifi_info[0]
for key in wifi.keys():
# 扫描wifi并把和conf文件中一直的wifi名字提取出来
print('Scanning....')
command = """iwlist {} scan | grep -ioE 'ssid:"(.*{}.*)'"""
wifi_in_scan = os.popen(command.format(self._interface_name, key))
wifi_in_scan = list(wifi_in_scan)
if 'Device or resource busy' in wifi_in_scan:
return None
else:
wifi_list = [item.lstrip('SSID:').strip('"\n') for item in wifi_in_scan]
if wifi_list:
return wifi[key]
def _is_wifi_connected(self):
result = os.popen('iw {} link'.format(self._interface_name))
if 'Connected to ' in result.read():
print('success')
wifi_connected = True
else:
print('failed')
wifi_connected = False
return wifi_connected
if __name__ == '__main__':
_test = RaspWifi('wlan0')
三、Ubuntu
import os
import time
import threading
wifi = {'111': '111',
'222': '222',
'333': '333',
'444': '444'}
class UbuntuWifi(object):
def __init__(self, interface_name, interval_frequency=1):
self._interface_name = interface_name
# THREAD
self._interval_frequency = interval_frequency
self._thread = threading.Thread(target=self._working)
self._thread.daemon = True
self._thread.start()
def _working(self):
while 1:
if not self._is_wifi_connected():
print('Connecting....')
wifi_name = self._scan()
os.system(f'nmcli dev wifi connect {wifi_name} password {wifi[wifi_name]}')
time.sleep(self._interval_frequency)
def _scan(self):
print('Scanning....')
for wifi_name in wifi.keys():
command = """iwlist {} scan | grep -ioE 'ssid:"(.*{}.*)'"""
wifi_in_scan = os.popen(command.format(self._interface_name, wifi_name))
wifi_in_scan = list(wifi_in_scan)
if 'Device or resource busy' in wifi_in_scan:
return None
else:
wifi_list = [item.lstrip('SSID:').strip('"\n') for item in wifi_in_scan]
if wifi_list:
return wifi_name
def _is_wifi_connected(self):
result = os.popen('iw {} link'.format(self._interface_name))
if 'Connected to ' in result.read():
print('success')
wifi_connected = True
else:
print('failed')
wifi_connected = False
return wifi_connected
if __name__ == '__main__':
_test = UbuntuWifi('wlp3s0')
while 1:
time.sleep(1)
完成,从楼上到楼下测试无问题,转载请注明出处
三、大家可以看看pywifi这个库,也贴一下博主自己之前写的把,封装好的库使用起来比较简单
import pywifi
from time import sleep, time
wifi = {'222': '1',
'111 P30': '2',
'2223': '3'}
class WiFi(object):
def __init__(self):
super().__init__()
# WIFI
self._interface = None
for interface in pywifi.PyWiFi().interfaces():
if interface.name() == 'wlan0':
self._interface = interface
def is_connect(self):
wifi_state = False
if self._interface.status() == pywifi.const.IFACE_DISCONNECTED: # 0
# print('Wifi is disconnect')
wifi_state = False
elif self._interface.status() == pywifi.const.IFACE_CONNECTED: # 1
# print('Wifi is connected')
wifi_state = True
return wifi_state
def scan(self):
print('Scanning...')
result = list()
self._interface.scan()
sleep(1)
wifi_names = self._interface.scan_results()
for wifi_name in wifi_names:
if wifi_name.ssid in wifi.keys():
result = [wifi_name.ssid, wifi[wifi_name.ssid]]
break
return result
def connect(self, ssid, key, timeout=10):
# CONNECT
profile = pywifi.Profile() # 配置文件
profile.ssid = ssid # wifi名称
profile.auth = pywifi.const.AUTH_ALG_OPEN # 需要密码
profile.akm.append(pywifi.const.AKM_TYPE_WPA2PSK) # 加密类型
profile.cipher = pywifi.const.CIPHER_TYPE_CCMP # 加密单元
profile.key = key # wifi密码
self._interface.remove_all_network_profiles()
tmp_profile = self._interface.add_network_profile(profile)
self._interface.connect(tmp_profile)
# CHECK CONNECT
ts_start = time()
while time() - ts_start < timeout:
print('connecting...{:.1f}'.format(time() - ts_start))
if self._interface.status() == pywifi.const.IFACE_CONNECTED:
print('Successful connect')
break
sleep(1)
if __name__ == '__main__':
__wifi = WiFi()
while 1:
if not __wifi.is_connect():
_result = __wifi.scan()
__wifi.connect(ssid=_result[0], key=_result[1], timeout=10)
sleep(2)
编程快一年了,有时候就不想学了,有没有小伙伴一起交流的,可以留个微信