복붙노트

[PYTHON] 어떻게하면 파이썬을 사용하여 Windows에서 가까운 무선 LAN 네트워크의 신호 강도를 검색 할 수 있습니까?

PYTHON

어떻게하면 파이썬을 사용하여 Windows에서 가까운 무선 LAN 네트워크의 신호 강도를 검색 할 수 있습니까?

어떻게하면 파이썬을 사용하여 Windows에서 가까운 무선 LAN 네트워크의 신호 강도를 검색 할 수 있습니까?

나는 값을 보여 주거나 그래프로 나타내기를 원한다.

해결법

  1. ==============================

    1.Windows 사용자 인 경우 'WlanGetAvailableNetworkList ()'기능을 제공하는 WLAN API를 사용하고 싶을 것입니다 (사용 방법은 API 문서를 참조하십시오). 내가 WLANAPI.DLL에 대한 파이썬 래퍼를 인식하지 못하기 때문에 ctypes를 사용하여 직접 래핑해야 할 수도 있습니다. 이 작업을 수행하는 예비 스크립트가 있지만 작업이 힘들 수 있습니다. 모든 필드의 의미를 이해하기 위해 문서를 읽는 것이 좋습니다.

    Windows 사용자 인 경우 'WlanGetAvailableNetworkList ()'기능을 제공하는 WLAN API를 사용하고 싶을 것입니다 (사용 방법은 API 문서를 참조하십시오). 내가 WLANAPI.DLL에 대한 파이썬 래퍼를 인식하지 못하기 때문에 ctypes를 사용하여 직접 래핑해야 할 수도 있습니다. 이 작업을 수행하는 예비 스크립트가 있지만 작업이 힘들 수 있습니다. 모든 필드의 의미를 이해하기 위해 문서를 읽는 것이 좋습니다.

    from ctypes import *
    from ctypes.wintypes import *
    from sys import exit
    
    
    def customresize(array, new_size):
        return (array._type_*new_size).from_address(addressof(array))
    
    wlanapi = windll.LoadLibrary('wlanapi.dll')
    
    ERROR_SUCCESS = 0
    
    class 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 = 0x8
    DOT11_SSID_MAX_LENGTH = 32
    WLAN_REASON_CODE = DWORD
    DOT11_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_uint
    dot11_phy_type_unknown      = 0
    dot11_phy_type_any          = 0
    dot11_phy_type_fhss         = 1
    dot11_phy_type_dsss         = 2
    dot11_phy_type_irbaseband   = 3
    dot11_phy_type_ofdm         = 4
    dot11_phy_type_hrdsss       = 5
    dot11_phy_type_erp          = 6
    dot11_phy_type_ht           = 7
    dot11_phy_type_IHV_start    = 0x80000000
    dot11_phy_type_IHV_end      = 0xffffffff 
    
    DOT11_AUTH_ALGORITHM = c_uint
    DOT11_AUTH_ALGO_80211_OPEN         = 1
    DOT11_AUTH_ALGO_80211_SHARED_KEY   = 2
    DOT11_AUTH_ALGO_WPA                = 3
    DOT11_AUTH_ALGO_WPA_PSK            = 4
    DOT11_AUTH_ALGO_WPA_NONE           = 5
    DOT11_AUTH_ALGO_RSNA               = 6
    DOT11_AUTH_ALGO_RSNA_PSK           = 7
    DOT11_AUTH_ALGO_IHV_START          = 0x80000000
    DOT11_AUTH_ALGO_IHV_END            = 0xffffffff
    
    DOT11_CIPHER_ALGORITHM = c_uint
    DOT11_CIPHER_ALGO_NONE            = 0x00
    DOT11_CIPHER_ALGO_WEP40           = 0x01
    DOT11_CIPHER_ALGO_TKIP            = 0x02
    DOT11_CIPHER_ALGO_CCMP            = 0x04
    DOT11_CIPHER_ALGO_WEP104          = 0x05
    DOT11_CIPHER_ALGO_WPA_USE_GROUP   = 0x100
    DOT11_CIPHER_ALGO_RSN_USE_GROUP   = 0x100
    DOT11_CIPHER_ALGO_WEP             = 0x101
    DOT11_CIPHER_ALGO_IHV_START       = 0x80000000
    DOT11_CIPHER_ALGO_IHV_END         = 0xffffffff 
    
    WLAN_AVAILABLE_NETWORK_CONNECTED = 1
    WLAN_AVAILABLE_NETWORK_HAS_PROFILE = 2
    
    WLAN_AVAILABLE_NETWORK_INCLUDE_ALL_ADHOC_PROFILES = 0x00000001
    WLAN_AVAILABLE_NETWORK_INCLUDE_ALL_MANUAL_HIDDEN_PROFILES = 0x00000002
    
    class 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.WlanOpenHandle
    WlanOpenHandle.argtypes = (DWORD, c_void_p, POINTER(DWORD), POINTER(HANDLE))
    WlanOpenHandle.restype = DWORD
    
    WlanEnumInterfaces = wlanapi.WlanEnumInterfaces
    WlanEnumInterfaces.argtypes = (HANDLE, c_void_p, 
                                   POINTER(POINTER(WLAN_INTERFACE_INFO_LIST)))
    WlanEnumInterfaces.restype = DWORD
    
    WlanGetAvailableNetworkList = wlanapi.WlanGetAvailableNetworkList
    WlanGetAvailableNetworkList.argtypes = (HANDLE, POINTER(GUID), DWORD, c_void_p, 
                                            POINTER(POINTER(WLAN_AVAILABLE_NETWORK_LIST)))
    WlanGetAvailableNetworkList.restype = DWORD
    
    WlanFreeMemory = wlanapi.WlanFreeMemory
    WlanFreeMemory.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].decode(),
                            network.wlanSignalQuality))
                finally:
                    WlanFreeMemory(pAvailableNetworkList)
        finally:
            WlanFreeMemory(pInterfaceList)
    

    리눅스에서는 몇 가지 선택을 할 수 있습니다 :

    표준 옵션은 iwlist -scan의 출력을 구문 분석하는 것입니다. 그러나 현재 wlan에 연결되어 있고 루트로 실행 중이 지 않으면 현재 연결된 wlan 만 반환합니다.

    이보다 더 많은 정보가 필요하다면 가장 좋은 방법은 무선 관리자 데몬을 쿼리하는 것입니다. 현대 리눅스에서는 wicd가 점점 대중화되고 있지만 보통 NetworkManager입니다. 이 두 관리자는 모두 dbus를 사용하여 질의 할 수 있습니다. 클라이언트가 자신의 시스템에 가지고있는 것을 제어 할 수 없다면,이 두 옵션 모두를 지원하거나 적어도 하나의 옵션을 지원해야하며 iwlist를 대체해야 할 수도 있습니다.

  2. ==============================

    2.Windows API를 다루지 않으려면 여기에 표시된 메소드를 약간 수정하면됩니다.

    Windows API를 다루지 않으려면 여기에 표시된 메소드를 약간 수정하면됩니다.

    이 명령을 사용할 수 있습니다 :

    netsh wlan show networks mode=Bssid
    

    이 코드를 사용하여

    import subprocess
    results = subprocess.check_output(["netsh", "wlan", "show", "network", "mode=Bssid"])
    

    그러면 추가 "신호"정보가 백분율로 표시됩니다. 이 방법을 사용하여 RSSI로 변환 할 수 있습니다.

  3. ==============================

    3.시스템 명령을 호출하여 해당 정보 (Linux = iwlist)를 가져 와서 결과를 파싱하고 표시 할 수 있습니다.

    시스템 명령을 호출하여 해당 정보 (Linux = iwlist)를 가져 와서 결과를 파싱하고 표시 할 수 있습니다.

  4. ==============================

    4.@fmark이 멋진 게시물에 대해 감사 드리고 싶습니다. 제 작품에서 저는 Windows에서 연결된 AP로부터 RSSI를 얻으려고 노력했습니다. 현재 모든 AP를 나열하고 있지만 수정 중이 야. 나는 당신의 코드에 대한 권고안을 제시하고자했다. 나는 C 나 파이썬 CTypes 모듈에 대해서는 경험이별로 없지만 가능한 버그를 발견했을지도 모른다. 나는 그것이 무슨 차이가 있는지 정말로 모르지만 나는 알아 차렸다 :

    @fmark이 멋진 게시물에 대해 감사 드리고 싶습니다. 제 작품에서 저는 Windows에서 연결된 AP로부터 RSSI를 얻으려고 노력했습니다. 현재 모든 AP를 나열하고 있지만 수정 중이 야. 나는 당신의 코드에 대한 권고안을 제시하고자했다. 나는 C 나 파이썬 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_uint
    dot11_phy_type_unknown      = 0
    dot11_phy_type_any          = 0
    dot11_phy_type_fhss         = 1
    dot11_phy_type_dsss         = 2
    dot11_phy_type_irbaseband   = 3
    dot11_phy_type_ofdm         = 4
    dot11_phy_type_hrdsss       = 5
    dot11_phy_type_erp          = 6
    dot11_phy_type_ht           = 7
    dot11_phy_type_IHV_start    = 0x80000000
    dot11_phy_type_IHV_end      = 0xffffffff 
    

    나는 두 번째 스 니핏이 첫 번째 모델처럼 만들어 져야한다고 생각하지만 잘못 될 수 있습니다. 여기 내 생각이 들었다.

    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.

  5. ==============================

    5.그래서 .. 나는 자신을 @fmarks 코드 (나에게 더 안전했다)에 기반을 두었고 WlanScan 함수를 추가해야한다. 그렇지 않으면 RSSI 값이 새로 고쳐지지 않는다.

    그래서 .. 나는 자신을 @fmarks 코드 (나에게 더 안전했다)에 기반을 두었고 WlanScan 함수를 추가해야한다. 그렇지 않으면 RSSI 값이 새로 고쳐지지 않는다.

    여기 확장 코드가 있습니다!

    @fmarks의 모든 소품!

    __author__ = 'Pedro Gomes'
    
    import time
    from ctypes import *
    from ctypes.wintypes import *
    from sys import exit
    
    def customresize(array, new_size):
        return (array._type_*new_size).from_address(addressof(array))
    
    wlanapi = windll.LoadLibrary('wlanapi.dll')
    
    ERROR_SUCCESS = 0
    
    class 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 = 0x8
    DOT11_SSID_MAX_LENGTH = 32
    WLAN_REASON_CODE = DWORD
    
    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_uint
    dot11_phy_type_unknown      = 0
    dot11_phy_type_any          = 0
    dot11_phy_type_fhss         = 1
    dot11_phy_type_dsss         = 2
    dot11_phy_type_irbaseband   = 3
    dot11_phy_type_ofdm         = 4
    dot11_phy_type_hrdsss       = 5
    dot11_phy_type_erp          = 6
    dot11_phy_type_ht           = 7
    dot11_phy_type_IHV_start    = 0x80000000
    dot11_phy_type_IHV_end      = 0xffffffff
    
    DOT11_AUTH_ALGORITHM = c_uint
    DOT11_AUTH_ALGO_80211_OPEN         = 1
    DOT11_AUTH_ALGO_80211_SHARED_KEY   = 2
    DOT11_AUTH_ALGO_WPA                = 3
    DOT11_AUTH_ALGO_WPA_PSK            = 4
    DOT11_AUTH_ALGO_WPA_NONE           = 5
    DOT11_AUTH_ALGO_RSNA               = 6
    DOT11_AUTH_ALGO_RSNA_PSK           = 7
    DOT11_AUTH_ALGO_IHV_START          = 0x80000000
    DOT11_AUTH_ALGO_IHV_END            = 0xffffffff
    
    DOT11_CIPHER_ALGORITHM = c_uint
    DOT11_CIPHER_ALGO_NONE            = 0x00
    DOT11_CIPHER_ALGO_WEP40           = 0x01
    DOT11_CIPHER_ALGO_TKIP            = 0x02
    DOT11_CIPHER_ALGO_CCMP            = 0x04
    DOT11_CIPHER_ALGO_WEP104          = 0x05
    DOT11_CIPHER_ALGO_WPA_USE_GROUP   = 0x100
    DOT11_CIPHER_ALGO_RSN_USE_GROUP   = 0x100
    DOT11_CIPHER_ALGO_WEP             = 0x101
    DOT11_CIPHER_ALGO_IHV_START       = 0x80000000
    DOT11_CIPHER_ALGO_IHV_END         = 0xffffffff
    
    WLAN_AVAILABLE_NETWORK_CONNECTED = 1
    WLAN_AVAILABLE_NETWORK_HAS_PROFILE = 2
    
    WLAN_AVAILABLE_NETWORK_INCLUDE_ALL_ADHOC_PROFILES = 0x00000001
    WLAN_AVAILABLE_NETWORK_INCLUDE_ALL_MANUAL_HIDDEN_PROFILES = 0x00000002
    
    class 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 * 6
    
    DOT11_CIPHER_ALGORITHM = c_uint
    DOT11_CIPHER_ALGO_NONE            = 0x00
    DOT11_CIPHER_ALGO_WEP40           = 0x01
    DOT11_CIPHER_ALGO_TKIP            = 0x02
    
    DOT11_PHY_TYPE = c_uint
    DOT11_PHY_TYPE_UNKNOWN  = 0
    DOT11_PHY_TYPE_ANY         = 0
    DOT11_PHY_TYPE_FHSS        = 1
    DOT11_PHY_TYPE_DSSS        = 2
    DOT11_PHY_TYPE_IRBASEBAND  = 3
    DOT11_PHY_TYPE_OFDM        = 4
    DOT11_PHY_TYPE_HRDSSS      = 5
    DOT11_PHY_TYPE_ERP         = 6
    DOT11_PHY_TYPE_HT          = 7
    DOT11_PHY_TYPE_IHV_START   = 0X80000000
    DOT11_PHY_TYPE_IHV_END     = 0XFFFFFFFF
    
    class 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.WlanOpenHandle
    WlanOpenHandle.argtypes = (DWORD, c_void_p, POINTER(DWORD), POINTER(HANDLE))
    WlanOpenHandle.restype = DWORD
    
    WlanCloseHandle = wlanapi.WlanCloseHandle
    WlanCloseHandle.argtypes = (HANDLE, c_void_p)
    WlanCloseHandle.restype = DWORD
    
    WlanEnumInterfaces = wlanapi.WlanEnumInterfaces
    WlanEnumInterfaces.argtypes = (HANDLE, c_void_p,
                                   POINTER(POINTER(WLAN_INTERFACE_INFO_LIST)))
    WlanEnumInterfaces.restype = DWORD
    
    WlanGetAvailableNetworkList = wlanapi.WlanGetAvailableNetworkList
    WlanGetAvailableNetworkList.argtypes = (HANDLE, POINTER(GUID), DWORD, c_void_p,
                                            POINTER(POINTER(WLAN_AVAILABLE_NETWORK_LIST)))
    WlanGetAvailableNetworkList.restype = DWORD
    
    WlanGetNetworkBssList = wlanapi.WlanGetNetworkBssList
    WlanGetNetworkBssList.argtypes = (HANDLE, POINTER(GUID),POINTER(GUID),POINTER(GUID), c_bool, c_void_p,
                                      POINTER(POINTER(WLAN_BSS_LIST)))
    WlanGetNetworkBssList.restype = DWORD
    
    
    WlanFreeMemory = wlanapi.WlanFreeMemory
    WlanFreeMemory.argtypes = [c_void_p]
    
    
    WlanScan = wlanapi.WlanScan
    WlanScan.argtypes = (HANDLE, POINTER(GUID),c_void_p,c_void_p, c_void_p)
    WlanScan.restype = DWORD
    
    
    
    
    def 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 interface
    
    class 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.mac
    
    
    def 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_return
    
    
    
    if __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"
            print test
        print "End"
    
  6. from https://stackoverflow.com/questions/2851233/how-can-i-retrieve-the-signal-strength-of-nearby-wireless-lan-networks-on-window by cc-by-sa and MIT license