无法在 Python 中使用 WlanGetAvailableNetworkList 获取所有可用网络
Unable to get all available networks using WlanGetAvailableNetworkList in Python
我正在尝试使用 WlanGetAvailableNetworkList
获取所有可用网络的列表。扫描 returns 个包含 NumberOfItems
的对象。当我遍历基于 NumberOfItems
的网络数组时,它只显示第一个网络,除此之外的任何内容都会显示 IndexError: invalid index
。
这是我的代码
from win32wifi.Win32Wifi import WlanScan, WlanOpenHandle, WlanGetProfileList, WlanEnumInterfaces, WlanGetAvailableNetworkList, WlanCloseHandle, WlanConnect
handle =WlanOpenHandle()
interfaces = WlanEnumInterfaces(handle).contents
g= interfaces.InterfaceInfo[0].InterfaceGuid
WlanScan(handle, g)
networks= WlanGetAvailableNetworkList(handle, g).contents
print("Number of networks : ", networks.NumberOfItems)
for i in range(networks.NumberOfItems):
print('Network : ', networks.Network[i].dot11Ssid.SSID )
WlanCloseHandle(handle)
这个问题与
相关
我在评论中说得太早了(所以我删除了它)。显然,win32wifi.Win32Wifi 提供了许多包装 CTypes 的功能,但命名空间因 from win32wifi.Win32NativeWifiApi import *
等语句而受到污染。无论如何,这是一个例子。
code00.py:
#!/usr/bin/env python3
import sys
from win32wifi import Win32Wifi as ww
def main():
interfaces = ww.getWirelessInterfaces()
print("WLAN Interfaces: {:d}".format(len(interfaces)))
for idx0, interface in enumerate(interfaces):
print("\n {:d}\n GUID: [{:s}]\n Description: [{:s}]\n State: [{:s}]".format(idx0, interface.guid_string, interface.description, interface.state_string))
networks = ww.getWirelessAvailableNetworkList(interface)
print("\n Networks: {:d}".format(len(networks)))
for idx1, network in enumerate(networks):
print("\n {:d}\n SSID: [{:s}]\n Profile: [{:}]\n Connectable: {:}\n Signal quality: {:d}\n Flags: {:d}\n Security: {:}\n Auth: {:}".format(
idx1, network.ssid.decode(), network.profile_name, network.connectable, network.signal_quality, network.flags, network.security_enabled, network.auth))
if __name__ == "__main__":
print("Python {0:s} {1:d}bit on {2:s}\n".format(" ".join(item.strip() for item in sys.version.split("\n")), 64 if sys.maxsize > 0x100000000 else 32, sys.platform))
main(*sys.argv[1:])
print("\nDone.")
输出:
[cfati@CFATI-5510-0:e:\Work\Dev\Whosebug\q056703966]> "e:\Work\Dev\VEnvs\py_pc064_03.07.06_test0\Scripts\python.exe" code00.py
Python 3.7.6 (tags/v3.7.6:43364a7ae0, Dec 19 2019, 00:42:30) [MSC v.1916 64 bit (AMD64)] 64bit on win32
WLAN Interfaces: 1
0
GUID: [{0C58E048-BC0B-4D5F-A21F-FCD4E4B31806}]
Description: [Intel(R) Dual Band Wireless-AC 8260]
State: [wlan_interface_state_connected]
Networks: 4
0
SSID: [D****l Software]
Profile: [D****l Software]
Connectable: True
Signal quality: 91
Flags: 3
Security: True
Auth: DOT11_AUTH_ALGO_RSNA_PSK
1
SSID: []
Profile: []
Connectable: True
Signal quality: 85
Flags: 0
Security: True
Auth: DOT11_AUTH_ALGO_RSNA_PSK
2
SSID: [sec]
Profile: []
Connectable: True
Signal quality: 33
Flags: 0
Security: True
Auth: DOT11_AUTH_ALGO_RSNA_PSK
3
SSID: [D****l Software]
Profile: []
Connectable: True
Signal quality: 91
Flags: 0
Security: True
Auth: DOT11_AUTH_ALGO_RSNA_PSK
Done.
更新#0
虽然与这个问题无关,但我在处理 [SO]: How to connect to WiFi network using Python 3? (@CristiFati's answer) 时发现(并修复)了一些 Win32WiFi 错误。可能想看看。
我正在尝试使用 WlanGetAvailableNetworkList
获取所有可用网络的列表。扫描 returns 个包含 NumberOfItems
的对象。当我遍历基于 NumberOfItems
的网络数组时,它只显示第一个网络,除此之外的任何内容都会显示 IndexError: invalid index
。
这是我的代码
from win32wifi.Win32Wifi import WlanScan, WlanOpenHandle, WlanGetProfileList, WlanEnumInterfaces, WlanGetAvailableNetworkList, WlanCloseHandle, WlanConnect
handle =WlanOpenHandle()
interfaces = WlanEnumInterfaces(handle).contents
g= interfaces.InterfaceInfo[0].InterfaceGuid
WlanScan(handle, g)
networks= WlanGetAvailableNetworkList(handle, g).contents
print("Number of networks : ", networks.NumberOfItems)
for i in range(networks.NumberOfItems):
print('Network : ', networks.Network[i].dot11Ssid.SSID )
WlanCloseHandle(handle)
这个问题与
我在评论中说得太早了(所以我删除了它)。显然,win32wifi.Win32Wifi 提供了许多包装 CTypes 的功能,但命名空间因 from win32wifi.Win32NativeWifiApi import *
等语句而受到污染。无论如何,这是一个例子。
code00.py:
#!/usr/bin/env python3
import sys
from win32wifi import Win32Wifi as ww
def main():
interfaces = ww.getWirelessInterfaces()
print("WLAN Interfaces: {:d}".format(len(interfaces)))
for idx0, interface in enumerate(interfaces):
print("\n {:d}\n GUID: [{:s}]\n Description: [{:s}]\n State: [{:s}]".format(idx0, interface.guid_string, interface.description, interface.state_string))
networks = ww.getWirelessAvailableNetworkList(interface)
print("\n Networks: {:d}".format(len(networks)))
for idx1, network in enumerate(networks):
print("\n {:d}\n SSID: [{:s}]\n Profile: [{:}]\n Connectable: {:}\n Signal quality: {:d}\n Flags: {:d}\n Security: {:}\n Auth: {:}".format(
idx1, network.ssid.decode(), network.profile_name, network.connectable, network.signal_quality, network.flags, network.security_enabled, network.auth))
if __name__ == "__main__":
print("Python {0:s} {1:d}bit on {2:s}\n".format(" ".join(item.strip() for item in sys.version.split("\n")), 64 if sys.maxsize > 0x100000000 else 32, sys.platform))
main(*sys.argv[1:])
print("\nDone.")
输出:
[cfati@CFATI-5510-0:e:\Work\Dev\Whosebug\q056703966]> "e:\Work\Dev\VEnvs\py_pc064_03.07.06_test0\Scripts\python.exe" code00.py Python 3.7.6 (tags/v3.7.6:43364a7ae0, Dec 19 2019, 00:42:30) [MSC v.1916 64 bit (AMD64)] 64bit on win32 WLAN Interfaces: 1 0 GUID: [{0C58E048-BC0B-4D5F-A21F-FCD4E4B31806}] Description: [Intel(R) Dual Band Wireless-AC 8260] State: [wlan_interface_state_connected] Networks: 4 0 SSID: [D****l Software] Profile: [D****l Software] Connectable: True Signal quality: 91 Flags: 3 Security: True Auth: DOT11_AUTH_ALGO_RSNA_PSK 1 SSID: [] Profile: [] Connectable: True Signal quality: 85 Flags: 0 Security: True Auth: DOT11_AUTH_ALGO_RSNA_PSK 2 SSID: [sec] Profile: [] Connectable: True Signal quality: 33 Flags: 0 Security: True Auth: DOT11_AUTH_ALGO_RSNA_PSK 3 SSID: [D****l Software] Profile: [] Connectable: True Signal quality: 91 Flags: 0 Security: True Auth: DOT11_AUTH_ALGO_RSNA_PSK Done.
更新#0
虽然与这个问题无关,但我在处理 [SO]: How to connect to WiFi network using Python 3? (@CristiFati's answer) 时发现(并修复)了一些 Win32WiFi 错误。可能想看看。