目录:
pywifi 模块允许开发者管理和操作无线网络连接,包括扫描附近的 Wi-Fi 网络、连接到指定网络、断开当前连接以及监控连接状态等。
相关名词介绍:
$ pip3 install pywifi
所有操作都始于获取无线网卡接口对象。通常,一个设备只有一个无线网卡,因此我们使用索引 0。
import pywifi
def init_wifi_interface():
# 创建PyWiFi对象
wifi = pywifi.PyWiFi()
# 获取第一个无线网卡接口
iface = wifi.interfaces()[0]
print(f"无线网卡名称: {iface.name()}")
return iface
iface = init_wifi_interface()
执行代码后输出:
无线网卡名称: en0
运行代码可能会报错 NotImplementedError,可以查看 解决方法。
使用接口的 scan() 方法触发扫描,并通过 scan_results() 获取结果列表。扫描需要一定时间,因此建议等待几秒。
import pywifi
import time
def init_wifi_interface():
# 创建PyWiFi对象
wifi = pywifi.PyWiFi()
# 获取第一个无线网卡接口
iface = wifi.interfaces()[0]
print(f"无线网卡名称: {iface.name()}")
return iface
iface = init_wifi_interface()
def scan_wifi_networks(iface):
# 触发扫描
iface.scan()
# 等待扫描完成,建议2-5秒
time.sleep(5)
# 获取扫描结果
scan_results = iface.scan_results()
print("发现以下Wi-Fi网络:")
for network in scan_results:
# 注意:某些网络可能隐藏SSID,此时network.ssid可能为空
ssid = network.ssid if network.ssid else "<隐藏网络>"
print(f" SSID: {ssid:<20} | 信号强度: {network.signal:>4} dBm | BSSID: {network.bssid}")
return scan_results
networks = scan_wifi_networks(iface)
连接需要创建一个 Profile 对象来配置目标网络的参数,包括 SSID、密码、认证和加密类型。
import pywifi
from pywifi import const
import time
def init_wifi_interface():
# 创建PyWiFi对象
wifi = pywifi.PyWiFi()
# 获取第一个无线网卡接口
iface = wifi.interfaces()[0]
print(f"无线网卡名称: {iface.name()}")
return iface
iface = init_wifi_interface()
def create_wifi_profile(ssid, password):
"""创建Wi-Fi连接配置文件"""
profile = pywifi.Profile()
profile.ssid = ssid # 目标网络名称
profile.auth = const.AUTH_ALG_OPEN # 认证算法:开放
profile.akm.append(const.AKM_TYPE_WPA2PSK) # 密钥管理类型:WPA2-PSK (最常见的家用网络类型)
profile.cipher = const.CIPHER_TYPE_CCMP # 加密类型:CCMP (即AES,WPA2的标准加密)
profile.key = password # 网络密码
return profile
def connect_to_wifi(iface, target_ssid, password, timeout=10):
"""尝试连接到指定的Wi-Fi网络"""
# 1. 断开当前连接
iface.disconnect()
time.sleep(1)
# 2. 移除所有已保存的配置文件(避免冲突)
iface.remove_all_network_profiles()
# 3. 创建并添加新的配置文件
profile = create_wifi_profile(target_ssid, password)
tmp_profile = iface.add_network_profile(profile)
# 4. 尝试连接
print(f"正在尝试连接到 '{target_ssid}'...")
iface.connect(tmp_profile)
# 5. 等待连接完成
start_time = time.time()
while time.time() - start_time < timeout:
current_status = iface.status()
if current_status == const.IFACE_CONNECTED:
print(f"连接成功!")
return True
elif current_status == const.IFACE_CONNECTING:
time.sleep(1) # 仍在连接中,继续等待
continue
else:
# 连接失败或处于其他状态
break
print(f"连接失败。当前接口状态码: {iface.status()}")
return False
# 使用示例
target_ssid = "HUAWEI-5G"
password = "xxxx"
connect_to_wifi(iface, target_ssid, password)
状态码说明:
import pywifi
from pywifi import const
def init_wifi_interface():
# 创建PyWiFi对象
wifi = pywifi.PyWiFi()
# 获取第一个无线网卡接口
iface = wifi.interfaces()[0]
print(f"无线网卡名称: {iface.name()}")
return iface
iface = init_wifi_interface()
def check_connection_status(iface):
"""检查并打印当前连接状态"""
status = iface.status()
status_map = {
const.IFACE_DISCONNECTED: "未连接",
const.IFACE_SCANNING: "正在扫描",
const.IFACE_INACTIVE: "接口未激活",
const.IFACE_CONNECTING: "正在连接",
const.IFACE_CONNECTED: "已连接"
}
print(f"当前连接状态: {status_map.get(status, '未知状态')}")
return status
check_connection_status(iface)
# 输出: 当前连接状态: 已连接
import time
import pywifi
from pywifi import const
def init_wifi_interface():
# 创建PyWiFi对象
wifi = pywifi.PyWiFi()
# 获取第一个无线网卡接口
iface = wifi.interfaces()[0]
print(f"无线网卡名称: {iface.name()}")
return iface
iface = init_wifi_interface()
def check_connection_status(iface):
"""检查并打印当前连接状态"""
status = iface.status()
status_map = {
const.IFACE_DISCONNECTED: "未连接",
const.IFACE_SCANNING: "正在扫描",
const.IFACE_INACTIVE: "接口未激活",
const.IFACE_CONNECTING: "正在连接",
const.IFACE_CONNECTED: "已连接"
}
print(f"当前连接状态: {status_map.get(status, '未知状态')}")
return status
def disconnect_wifi(iface):
"""断开当前Wi-Fi连接"""
iface.disconnect()
time.sleep(5) # 确保断开操作完成
print(f'status = {iface.status()}')
if iface.status() == const.IFACE_DISCONNECTED:
print("已断开Wi-Fi连接。")
else:
print("断开操作可能未完全生效。")
disconnect_wifi(iface)
check_connection_status(iface)
# 输出: 当前连接状态: 接口未激活
在网络不稳定的场景下,可以实现自动重连逻辑。
def auto_reconnect(iface, ssid, password, max_retries=3):
for attempt in range(1, max_retries + 1):
print(f"连接尝试 ({attempt}/{max_retries})...")
if connect_to_wifi(iface, ssid, password, timeout=8):
return True
time.sleep(2) # 重试前等待
print("自动重连失败。")
return False
运行代码可能会报错 NotImplementedError,原因是 pywifi 在 macOS 上的官方支持有限,其标准版本可能未完全实现 macOS 所需的底层接口,导致初始化时抛出此错误。
卸载已安装的标准版:
$ pip3 uninstall pywifi
克隆并安装专为 macOS 修复的分支版本:
$ git clone git@github.com:awkman/pywifi.git
$ cd pywifi
# 切到 macos_dev 分支
$ git fetch origin macos_dev
$ git checkout -b macos_dev origin/macos_dev
# 安装
$ pip3 install .
再次运行初始化 wifi 接口代码,又报错 ModuleNotFoundError: No module named ‘objc’。
原因是:pywifi 库在 macOS 上的运行依赖于 PyObjC 项目,这是一个连接 Python 与 Objective-C 编程语言的桥梁。objc 模块是 PyObjC 的核心组件,用于访问 macOS 底层的 CoreWLAN 等网络框架。
安装 objc 模块:
$ pip3 install pyobjc
安装成功后再次运行初始化 wifi 接口代码,问题解决。
↶ 返回首页 ↶