3-python library-pywifiワイヤレスネットワークカードコントロール

ルーターのテストを行うときは、ワイヤレスネットワークカードを制御して、カードの自動切断やその他の操作を許可する必要があります。Pywifiはこの機能を実現できます。その時点では、ウィンドウとLinuxプラットフォームしか利用できず、Macプラットフォームは利用できませんでした。

ピップインストールpywifi

pipインストールcomtypes

1.ワイヤレスネットワークカードインターフェイスを取得する

コンピューターに複数のネットワークカードが存在する場合があります。このとき、SSIDリンクに必要なネットワークカードを選択する必要があります。

使用pywifi.PyWiFi時間のインスタンスを作成するために、我々は、合計を返します。インターフェースは、いくつかのカードを検出し、その後、wifi.interfaces.name()あなたは、各NICの名前を取得することができ、我々は再び彼らのニーズに応じて、対応するネットワークカードを選択します。

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

元の記事を106件公開 賞賛された76件 130,000回の訪問+

おすすめ

転載: blog.csdn.net/Creator_Ly/article/details/104410927