首页 > 代码库 > 使用Python检索Windows附近的无线局域网网络的信号强度RSSI

使用Python检索Windows附近的无线局域网网络的信号强度RSSI

 

 

 

1. 如果你是在Windows上,你可能想使用WLAN 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, xrange(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, xrange(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  = 0xffffffff DOT11_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   = 0xffffffff WLAN_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: %s" % (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: %s, quality: %02d%%" % (      network.dot11Ssid.SSID[:network.dot11Ssid.SSIDLength],       network.wlanSignalQuality)   finally:    WlanFreeMemory(pAvailableNetworkList) finally:  WlanFreeMemory(pInterfaceList)

 

在Linux上,你有两个选择: 标准选项是解析的输出iwlist -scan。但是,如果你当前连接到WLAN并没有作为root运行,它只返回当前连接的无线局域网。 如果你需要比这更多,最好的办法是查询无线管理器守护程序。在现代,Linux版本,这NetworkManager的,虽然WICD更受欢迎。这两个经理可以dbus。除非你可以控制哪些客户对他们的系统,你可能需要支持这两个选项,或者至少有一个选项,有一个后备iwlist。 

2. 那么你可以调用来获得(Linux的=iwlist),解析结果,并显示它。 

3. @FMARK我只想说非常感谢你为这个职位。在我的工作中,我一直在试图从连接的AP在Windows中得到的RSSI,以及你应得千恩万谢终于得到了实现。目前,我列出了所有的接入点,但我正在修改它。我想提供一个对你的代码。我不是很有经验的C或Python的ctypes的模块,但我想我可能已经找到一个可能的错误。我真的不知道它有什么不同,但我注意到: 你定义的枚举是这样的:

DOT11_BSS_TYPE = c_uint(dot11_BSS_type_infrastructure, dot11_BSS_type_independent, dot11_BSS_type_any) = map(DOT11_BSS_TYPE, xrange(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  = 0xffffffff 

我觉得第二snippit应仿照喜欢这一首,但我可能是错的。这里是我的主意:

DOT11_PHY_TYPE = c_uint(dot11_phy_type_unknown, dot11_phy_type_any, dot11_phy_type_fhss, dot11_phy_type_dsss, dot11_phy_type_irbaseband, dot11_phy_type_ofdm, dot11_phy_type_hrdsss, dot11_phy_type_erp, dot11_phy_type_ht, dot11_phy_type_IHV_start, dot11_phy_type_IHV_end) = map(DOT11_PHY_TYPE,        [0,0,1,2,3,4,        5,6,7,0x80000000,        0xffffffff])

这样这些值会得到正确映射到DOT11_PHY_TYPE。也许我错了,但对于未来的乡亲像我这样的,我只是想无论是偶然在这里是正确的:) 再次感谢,@FMARK。 

4. 所以..我根据自己的@fmarks代码(这是一个活更安全,你应该添加WlanScan功能,否则的RSSI值不会刷新。 这里是我的扩展代码! 所有道具@fmarks!

# -*- coding:utf-8 -*- import timefrom 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, xrange(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, xrange(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)    ]DOT11_MAC_ADDRESS = c_ubyte * 6DOT11_CIPHER_ALGORITHM = c_uintDOT11_CIPHER_ALGO_NONE   = 0x00DOT11_CIPHER_ALGO_WEP40   = 0x01DOT11_CIPHER_ALGO_TKIP   = 0x02DOT11_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  = 0XFFFFFFFFclass WLAN_RATE_SET(Structure):    _fields_ = [     ("uRateSetLength", c_ulong),     ("usRateSet", c_ushort * 126)    ]class WLAN_BSS_ENTRY(Structure):    _fields_ = [     ("dot11Ssid",DOT11_SSID),     ("uPhyId",c_ulong),     ("dot11Bssid", DOT11_MAC_ADDRESS),     ("dot11BssType", DOT11_BSS_TYPE),     ("dot11BssPhyType", DOT11_PHY_TYPE),     ("lRssi", c_long),     ("uLinkQuality", c_ulong),     ("bInRegDomain", c_bool),     ("usBeaconPeriod",c_ushort),     ("ullTimestamp", c_ulonglong),     ("ullHostTimestamp",c_ulonglong),     ("usCapabilityInformation",c_ushort),     ("ulChCenterFrequency", c_ulong),     ("wlanRateSet",WLAN_RATE_SET),     ("ulIeOffset", c_ulong),     ("ulIeSize", c_ulong)]class WLAN_BSS_LIST(Structure):    _fields_ = [     ("TotalSize", DWORD),     ("NumberOfItems", DWORD),     ("NetworkBSS", WLAN_BSS_ENTRY * 1)    ]class WLAN_AVAILABLE_NETWORK_LIST_BSS(Structure):    _fields_ = [     ("TotalSize", DWORD),     ("NumberOfItems", DWORD),     ("Network", WLAN_BSS_ENTRY * 1)    ]WlanOpenHandle = wlanapi.WlanOpenHandleWlanOpenHandle.argtypes = (DWORD, c_void_p, POINTER(DWORD), POINTER(HANDLE))WlanOpenHandle.restype = DWORDWlanCloseHandle = wlanapi.WlanCloseHandleWlanCloseHandle.argtypes = (HANDLE, c_void_p)WlanCloseHandle.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 = DWORDWlanGetNetworkBssList = wlanapi.WlanGetNetworkBssListWlanGetNetworkBssList.argtypes = (HANDLE, POINTER(GUID),POINTER(GUID),POINTER(GUID), c_bool, c_void_p,         POINTER(POINTER(WLAN_BSS_LIST)))WlanGetNetworkBssList.restype = DWORDWlanFreeMemory = wlanapi.WlanFreeMemoryWlanFreeMemory.argtypes = [c_void_p]WlanScan = wlanapi.WlanScanWlanScan.argtypes = (HANDLE, POINTER(GUID),c_void_p,c_void_p, c_void_p)WlanScan.restype = DWORDdef get_interface():    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: %s" % (iface.strInterfaceDescription)            interface = iface.strInterfaceDescription    finally:        WlanFreeMemory(pInterfaceList)    return interfaceclass MAC_BSSID_POWER:    """Classe para os valores retirados"""    def __init__(self, mac, bssid):        self.mac = str(mac)        self.bssid = str(bssid)        self.valores = []    def addPower(self,power):        self.valores.append(int(power))    def getBssid(self):        return self.bssid    def getPowers(self):        return self.valores    def getMac(self):        return self.macdef get_BSSI():    BSSI_Values={}        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: %s" % (iface.strInterfaceDescription)                pAvailableNetworkList2 = pointer(WLAN_BSS_LIST())            ret2 = WlanGetNetworkBssList(ClientHandle,                    byref(iface.InterfaceGuid),                    None,                    None,True,None,                    byref(pAvailableNetworkList2))        if ret2 != ERROR_SUCCESS:            exit(FormatError(ret2))        try:            retScan = WlanScan(ClientHandle,byref(iface.InterfaceGuid),None,None,None)            if retScan != ERROR_SUCCESS:                exit(FormatError(retScan))            avail_net_list2 = pAvailableNetworkList2.contents            networks2 = customresize(avail_net_list2.NetworkBSS,                                  avail_net_list2.NumberOfItems)                for network in networks2:                    SSID = str(network.dot11Ssid.SSID[:network.dot11Ssid.SSIDLength])                BSSID = :.join(%02x % b for b in network.dot11Bssid).upper()                signal_strength = str(network.lRssi)                    # print "SSID: " + SSID + " BSSID: "+ BSSID+ " SS: "+signal_strength                    BSSI_Values[BSSID] = [SSID,signal_strength]                    #print "Total "+str(len(networks2))                #print BSSI_Values            finally:            WlanFreeMemory(pAvailableNetworkList2)            WlanCloseHandle(ClientHandle,None)    finally:        WlanFreeMemory(pInterfaceList)    return BSSI_Values    def get_BSSI_times_and_total_seconds(times,seconds):    BSSI_to_return = {}    for i in range(0,seconds*times):        time_to_sleep = float(1.0/times)        time.sleep(time_to_sleep)        got_bssi_temp = get_BSSI()            for bssi in got_bssi_temp:            if not BSSI_to_return.get(bssi):                BSSI_to_return[bssi] = MAC_BSSID_POWER(bssi,got_bssi_temp[bssi][0])                BSSI_to_return[bssi].addPower( got_bssi_temp[bssi][1] )                    #BSSI_to_return[bssi] = [got_bssi_temp[bssi][1]]                else:                BSSI_to_return[bssi].addPower( got_bssi_temp[bssi][1] )                #BSSI_to_return[bssi].append(got_bssi_temp[bssi][1])        print "Medicao "+str(i)+" de "+str(seconds*times)    print BSSI_to_return    return BSSI_to_returnif __name__ == __main__:    #print get_interface()    import time    test = get_BSSI()    for i in range(0,10):        time.sleep(0.5)        oldTest = test        test = get_BSSI()        print "Teste: "+str(i)        if oldTest == test:            print "IGUAL"        else:            print "DIFERENTE"        for item in test.items():            print item    print "End"

 




本文标题 :使用Python我怎样才能检索Windows附近的无线局域网网络的信号强度?
本文地址 :CodeGo.net/156320/ 

使用Python检索Windows附近的无线局域网网络的信号强度RSSI