前言
-
命令行输入:
netsh wlan show networks mode=bssid
可查询到如下信息:接口名称 : WLAN 当前有 1 个网络可见。 SSID 1 : nova 4 Network type: 结构 身份验证: WPA2 - 个人 加密: CCMP BSSID 1: 24:da:33:6a:46:3a 信号: 92% 无线电类型: 802.11n 波段: 2.4 GHz 频道: 11 Bss 负载: 连接的电台:1 频道利用率:0 (0% ) 中可用容量:0 (0 us/s) 基本速率(Mbps: 1 2 5.5 11 其他速率(Mbps): 6 9 12 18 24 36 48 54
-
命令行输入:
netsh wlan show interfaces
可查询到如下信息:系统上有 1 个接口: 名称: WLAN 说明: Qualcomm Atheros QCA9377 Wireless Network Adapter GUID: bb8d6c2b-87ff-4435-a033-731a6d972ba4 物理地址: 3c:91:80:43:b0:b1 界面类型: 主要 状态: 已连接 SSID: nova 4 BSSID: 24:da:33:6a:46:3a 网络类型: 结构 无线电类型: 802.11n 身份验证: WPA2 - 个人 密码: CCMP 连接模式: 配置文件 频带: 2.4 GHz 通道: 11 接收速率(Mbps): 72.2 传输速率 (Mbps): 72.2 信号: 92% 配置文件: nova 4 承载网络状态 : 不可用
-
命令行输入:
netsh interface set interface WLAN disabled
关闭wifi -
命令行输入:
netsh interface set interface WLAN enabled
打开wifi
模块安装 Install
pip install pywifi
pip install comtype
导入 Import
import pywifi
配置 Profile
是指我们所要操作的wifi的一些基本设置
类Profile
模块包含的一个类
类源码
class Profile():
def __init__(self):
self.id = 0
self.auth = AUTH_ALG_OPEN
self.akm = [AKM_TYPE_NONE]
self.cipher = CIPHER_TYPE_NONE
self.ssid = None
self.bssid = None
self.key = None
def process_akm(self):
if len(self.akm) > 1:
self.akm = self.akm[-1:]
从源码可以看出,Profile应包含以下属性:
1. id 和 bssid
基本不会用到,源码也未说明。
bssid
:MAC地址
2. auth
认证算法类型
。有以下值:
pywifi.const.AUTH_ALG_OPEN == 0 == 'open'
pywifi.const.AUTH_ALG_SHARED == 1 == 'shared'
正常情况下,几乎所有的都设置为'open'
。
3. akm
密码管理类型
,也即安全类型
或身份验证
。从源码可以看出akm
为一个列表类型
,且当含有多个元素时,由于方法process_akm
被调用,只会保留列表最后一项。可包含以下值:
pywifi.const.AKM_TYPE_NONE == 0 == 'NONE'
pywifi.const.AKM_TYPE_WPA == 1 == 'WPA'
pywifi.const.AKM_TYPE_WPAPSK == 2 == 'WPAPSK'
pywifi.const.AKM_TYPE_WPA2 == 3 == 'WPA2'
pywifi.const.AKM_TYPE_WPA2PSK == 4 == 'WPA2PSK'
pywifi.const.AKM_TYPE_UNKNOWN == 5 == 'OTHER'
4. cipher
密码类型
。如果akm
不是'NONE'
,则cipher
需要设置。有以下值:
pywifi.const.CIPHER_TYPE_NONE == 0 == 'NONE'
pywifi.const.CIPHER_TYPE_WEP == 1 == 'WEP'
pywifi.const.CIPHER_TYPE_TKIP == 2 == 'TKIP'
pywifi.const.CIPHER_TYPE_CCMP == 3 == 'AES'
pywifi.const.CIPHER_TYPE_UNKNOWN == 4 == 'UNKNOWN'
5. ssid
wifi名称
。
6. key
wifi密码
。如果cipher
不是‘NONE’
,则key
需要设置。
设置示例
profile = pywifi.Profile()
profile.ssid = 'testap'
profile.auth = pywifi.const.AUTH_ALG_OPEN
profile.akm.append(pywifi.const.AKM_TYPE_WPA2PSK)
profile.cipher = pywifi.const.CIPHER_TYPE_CCMP
profile.key = '12345678'
接口 Interface
是指用于执行wifi操作的wifi接口
获取接口
wifi = pywifi.PyWiFi()
iface = wifi.interfaces()[0]
-
类
PyWiFi
是模块包含的一个类,
提供操作方法来操作wlan设备
-
类方法
interfaces
是类里边定义的唯一一个方法,目的是
收集可用的wlan接口
,该方法调用的返回结果是接口列表
由于,一般情况下系统只有一个wlan接口,所以通过索引返回的接口列表的
[0]
来获得接口。
接口信息
1. iface.name()
获取当前wifi接口名称(不是wifi名称)。
2. iface.status()
获取当前wifi接口状态。有以下值:
IFACE_DISCONNECTED == 0
IFACE_SCANNING == 1
IFACE_INACTIVE == 2
IFACE_CONNECTING == 3
IFACE_CONNECTED == 4
接口操作
1. iface.scan()
触发接口扫描wifi。
2. iface.scan_results()
获取上一次扫描获得的结果,返回Profile列表
。
由于扫描时间的问题,一般在调用scan()
后2~8s 再调用scan_results()
更安全。
3. iface.add_network_profile(profile)
添加配置好的wifi Profile到当前电脑接口,为连接做准备。
4. iface.remove_network_profile(profile)
移除电脑中保存的指定的wifi Profile。
5. iface.remove_all_network_profiles()
移除所有电脑保存的wifi Profiles。
6. iface.network_profiles()
获取电脑上保存的所有wifi Profiles(即连接过的wifi),返回Profile列表
。
7. iface.connect(profile)
通过指定配置好的Profile连接wifi。在此之前,如果电脑从未连接过该wifi时,必须先调用add_network_profile(profile)
,把该wifi的Profile添加到电脑保 存的Profile列表中
8. iface.disconnect()
断开当前wifi连接。
如何连接wifi
# 导入模块
import time
import pywifi
# 获取接口
wifi = pywifi.PyWiFi()
iface = wifi.interfaces()[0]
# 指定连接的wifi Profile
profile = pywifi.Profile()
profile.ssid = 'NJMU_WLAN'
profile.auth = pywifi.const.AUTH_ALG_OPEN
profile.akm.append(pywifi.const.AKM_TYPE_NONE)
profile.cipher = pywifi.const.CIPHER_TYPE_NONE
profile.key = None
# 通过Profile连接
iface.disconnect() # 断开当前连接
iface.remove_all_network_profiles() # 清除电脑保存的所有Profile
iface.add_network_profile(profile) # 把指定的Profile添加到电脑
iface.connect(profile) # 通过添加的Profile 连接指定wifi
time.sleep(3) # 休眠3s
print(iface.status()) # 获取接口连接状态