3-python库之-pywifi无线网卡控制

在做路由器测试的时候,需要控制无线网卡,让其自动连接断开等操作,pywifi可以实现该功能,当时现在只有window和Linux平台的,mac平台没办法用。

pip install pywifi

pip install comtypes

1.获取无线网卡接口

有时候一台电脑上有多张网卡,这时候我们需要选择自己需要的网卡进行SSID链接。

使用pywifi.PyWiFi接口创建实例的时候,就会返回我们一共检测到几张网卡,然后通过wifi.interfaces.name()可以获取到每个网卡的名字,我们再根据自己的需求,选择对应的网卡。

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.扫描周围存在的SSID

我们在选择网卡之后就要链接热点的SSID,这时候我们一般 需要先扫描一遍周围的环境,确认存在我们要链接的这个SSID。

# 扫描周围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)  # 按信号强度由高到低排序

使用scan()函数扫描,等待几秒后使用scan_results()获取扫描结果,再将设备信息保存起来,供我们匹配用。

3.连接WIFI SSID

找到对应的WIFI SSID后,就可以用SSID对应的密码,加密方式进行连接(加密方式,我们在上面的扫描结果里面可以获取到)

连接后可以使用status()接口判断是否连接成功。

# 连接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.断开连接

断开连接比较简单,如下:

# 断开无线网卡已连接状态
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.综合实例

使用上面的接口就可以写出大概的连接逻辑:

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

WLAN API:
https://www.cnblogs.com/gaidao/p/4086850.html

https://blog.csdn.net/qq_38882327/article/details/89349399

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,137评论 6 511
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,824评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,465评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,131评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,140评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,895评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,535评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,435评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,952评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,081评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,210评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,896评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,552评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,089评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,198评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,531评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,209评论 2 357

推荐阅读更多精彩内容