ルーターのテストを行うときは、ワイヤレスネットワークカードを制御して、カードの自動切断やその他の操作を許可する必要があります。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