栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

如何使用Python在Windows上检索附近的无线LAN网络的信号强度?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

如何使用Python在Windows上检索附近的无线LAN网络的信号强度?

如果您使用的是 Windows ,则可能要 使用WLAN API ,该 API 提供了“
WlanGetAvailableNetworkList()”功能(有关用法,请参阅API文档)。我不知道有任何python包装器,

WLANAPI.DLL
因此您可能必须使用ctypes自己包装它。我有一个初步的脚本可以做到这一点(“
为我工作” ),但这可能很麻烦。您将需要阅读文档以了解所有字段的含义:

from ctypes import *from ctypes.wintypes import *from sys import exitdef customresize(array, new_size):    return (array._type_*new_size).from_address(addressof(array))wlanapi = windll.LoadLibrary('wlanapi.dll')ERROR_SUCCESS = 0class GUID(Structure):    _fields_ = [        ('Data1', c_ulong),        ('Data2', c_ushort),        ('Data3', c_ushort),        ('Data4', c_ubyte*8),        ]WLAN_INTERFACE_STATE = c_uint(wlan_interface_state_not_ready, wlan_interface_state_connected, wlan_interface_state_ad_hoc_network_formed, wlan_interface_state_disconnecting, wlan_interface_state_disconnected, wlan_interface_state_associating, wlan_interface_state_discovering, wlan_interface_state_authenticating) = map(WLAN_INTERFACE_STATE, range(0, 8))class WLAN_INTERFACE_INFO(Structure):    _fields_ = [        ("InterfaceGuid", GUID),        ("strInterfaceDescription", c_wchar * 256),        ("isState", WLAN_INTERFACE_STATE)        ]class WLAN_INTERFACE_INFO_LIST(Structure):    _fields_ = [        ("NumberOfItems", DWORD),        ("Index", DWORD),        ("InterfaceInfo", WLAN_INTERFACE_INFO * 1)        ]WLAN_MAX_PHY_TYPE_NUMBER = 0x8DOT11_SSID_MAX_LENGTH = 32WLAN_REASON_CODE = DWORDDOT11_BSS_TYPE = c_uint(dot11_BSS_type_infrastructure, dot11_BSS_type_independent, dot11_BSS_type_any) = map(DOT11_BSS_TYPE, range(1, 4))DOT11_PHY_TYPE = c_uintdot11_phy_type_unknown      = 0dot11_phy_type_any          = 0dot11_phy_type_fhss         = 1dot11_phy_type_dsss         = 2dot11_phy_type_irbaseband   = 3dot11_phy_type_ofdm         = 4dot11_phy_type_hrdsss       = 5dot11_phy_type_erp          = 6dot11_phy_type_ht= 7dot11_phy_type_IHV_start    = 0x80000000dot11_phy_type_IHV_end      = 0xffffffffDOT11_AUTH_ALGORITHM = c_uintDOT11_AUTH_ALGO_80211_OPEN         = 1DOT11_AUTH_ALGO_80211_SHARED_KEY   = 2DOT11_AUTH_ALGO_WPA     = 3DOT11_AUTH_ALGO_WPA_PSK = 4DOT11_AUTH_ALGO_WPA_NONE= 5DOT11_AUTH_ALGO_RSNA    = 6DOT11_AUTH_ALGO_RSNA_PSK= 7DOT11_AUTH_ALGO_IHV_START          = 0x80000000DOT11_AUTH_ALGO_IHV_END = 0xffffffffDOT11_CIPHER_ALGORITHM = c_uintDOT11_CIPHER_ALGO_NONE = 0x00DOT11_CIPHER_ALGO_WEP40= 0x01DOT11_CIPHER_ALGO_TKIP = 0x02DOT11_CIPHER_ALGO_CCMP = 0x04DOT11_CIPHER_ALGO_WEP104          = 0x05DOT11_CIPHER_ALGO_WPA_USE_GROUP   = 0x100DOT11_CIPHER_ALGO_RSN_USE_GROUP   = 0x100DOT11_CIPHER_ALGO_WEP  = 0x101DOT11_CIPHER_ALGO_IHV_START       = 0x80000000DOT11_CIPHER_ALGO_IHV_END         = 0xffffffffWLAN_AVAILABLE_NETWORK_ConNECTED = 1WLAN_AVAILABLE_NETWORK_HAS_PROFILE = 2WLAN_AVAILABLE_NETWORK_INCLUDE_ALL_ADHOC_PROFILES = 0x00000001WLAN_AVAILABLE_NETWORK_INCLUDE_ALL_MANUAL_HIDDEN_PROFILES = 0x00000002class DOT11_SSID(Structure):    _fields_ = [        ("SSIDLength", c_ulong),        ("SSID", c_char * DOT11_SSID_MAX_LENGTH)        ]class WLAN_AVAILABLE_NETWORK(Structure):    _fields_ = [        ("ProfileName", c_wchar * 256),        ("dot11Ssid", DOT11_SSID),        ("dot11BssType", DOT11_BSS_TYPE),        ("NumberOfBssids", c_ulong),        ("NetworkConnectable", c_bool),        ("wlanNotConnectableReason", WLAN_REASON_CODE),        ("NumberOfPhyTypes", c_ulong),        ("dot11PhyTypes", DOT11_PHY_TYPE * WLAN_MAX_PHY_TYPE_NUMBER),        ("MorePhyTypes", c_bool),        ("wlanSignalQuality", c_ulong),        ("SecurityEnabled", c_bool),        ("dot11DefaultAuthAlgorithm", DOT11_AUTH_ALGORITHM),        ("dot11DefaultCipherAlgorithm", DOT11_CIPHER_ALGORITHM),        ("Flags", DWORD),        ("Reserved", DWORD)        ]class WLAN_AVAILABLE_NETWORK_LIST(Structure):    _fields_ = [        ("NumberOfItems", DWORD),        ("Index", DWORD),        ("Network", WLAN_AVAILABLE_NETWORK * 1)        ]WlanOpenHandle = wlanapi.WlanOpenHandleWlanOpenHandle.argtypes = (DWORD, c_void_p, POINTER(DWORD), POINTER(HANDLE))WlanOpenHandle.restype = DWORDWlanEnumInterfaces = wlanapi.WlanEnumInterfacesWlanEnumInterfaces.argtypes = (HANDLE, c_void_p,          POINTER(POINTER(WLAN_INTERFACE_INFO_LIST)))WlanEnumInterfaces.restype = DWORDWlanGetAvailableNetworkList = wlanapi.WlanGetAvailableNetworkListWlanGetAvailableNetworkList.argtypes = (HANDLE, POINTER(GUID), DWORD, c_void_p,        POINTER(POINTER(WLAN_AVAILABLE_NETWORK_LIST)))WlanGetAvailableNetworkList.restype = DWORDWlanFreeMemory = wlanapi.WlanFreeMemoryWlanFreeMemory.argtypes = [c_void_p]if __name__ == '__main__':    NegotiatedVersion = DWORd()    ClientHandle = HANDLE()    ret = WlanOpenHandle(1, None, byref(NegotiatedVersion), byref(ClientHandle))    if ret != ERROR_SUCCESS:        exit(FormatError(ret))    # find all wireless network interfaces    pInterfaceList = pointer(WLAN_INTERFACE_INFO_LIST())    ret = WlanEnumInterfaces(ClientHandle, None, byref(pInterfaceList))    if ret != ERROR_SUCCESS:        exit(FormatError(ret))    try:        ifaces = customresize(pInterfaceList.contents.InterfaceInfo,        pInterfaceList.contents.NumberOfItems)        # find each available network for each interface        for iface in ifaces: print("Interface: {}".format(iface.strInterfaceDescription)) pAvailableNetworkList = pointer(WLAN_AVAILABLE_NETWORK_LIST()) ret = WlanGetAvailableNetworkList(ClientHandle,        byref(iface.InterfaceGuid),       0,       None,       byref(pAvailableNetworkList)) if ret != ERROR_SUCCESS:     exit(FormatError(ret)) try:     avail_net_list = pAvailableNetworkList.contents     networks = customresize(avail_net_list.Network,        avail_net_list.NumberOfItems)     for network in networks:         print("SSID: {}, quality: {:2d}%".format(  network.dot11Ssid.SSID[:network.dot11Ssid.SSIDLength].depre(),  network.wlanSignalQuality)) finally:     WlanFreeMemory(pAvailableNetworkList)    finally:        WlanFreeMemory(pInterfaceList)

linux上 ,您有两种选择:

标准选项是解析的输出

iwlist -scan
。但是,如果您当前连接到无线局域网并且没有以root身份运行,则它仅返回当前连接的无线局域网。

如果您还需要更多,最好的方法是查询无线管理器守护程序。在现代linux上,这通常是NetworkManager,尽管wicd变得越来越流行。可以使用查询这两个管理器

dbus
。除非您可以控制客户端在其系统上拥有的内容,否则可能需要同时支持这两个选项或至少一个选项,并具有的后备功能
iwlist



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/624761.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号