2012-05-31 5 views

답변

0

이러한 구조 정의 및 생성자는 내 코드에서 작동합니다. WlanGetAvailableNetworkList에서 작동합니다. 불완전하며 구조를 완전히 구문 분석하지는 않지만 RSSI를 얻습니다. WLAN_AVAILABLE_NETWORK

  [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] 
    public struct WLAN_AVAILABLE_NETWORK //size = 628 
    { 
     [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)] 
     public string strProfileName;//size 512 
     public dot11_SSID SSID;//size 36 
     public DOT11_BSS_TYPE dot11BssType; // size 4 
     public UInt32 uNumberOfBssids; // 4 
     //public bool bNetworkConnectable; // 4 
     //public UInt32 wlanNotConnectableReason; // 4 
     //public UInt32 uNumberOfPhyTypes; // 4 
     ////public DOT11_PHY_TYPE[] dot11PhyTypes; // max is 8, size is 8*4 = 32 
     //public UInt32[] dot11PhyTypes; // max is 8, size is 8*4 = 32 
     //public bool bMorePhyTypes;// 4 
     public UInt32 wlanSignalQuality; // size 4 
        //A percentage value that represents the signal quality of the network. WLAN_SIGNAL_QUALITY is of type ULONG. This member contains a value between 0 and 100. A value of 0 implies an actual RSSI signal strength of -100 dbm. A value of 100 implies an actual RSSI signal strength of -50 dbm. You can calculate the RSSI signal strength value for wlanSignalQuality values between 1 and 99 using linear interpolation. 
     //public bool bSecurityEnabled;// 4 
     ////public DOT11_AUTH_ALGORITHM dot11DefaultAuthAlgorithm;// 4 
     ////public DOT11_CIPHER_ALGORITHM dot11DefaultCipherAlgorithm;// 4 
     //public UInt32 dot11DefaultAuthAlgorithm;// 4 
     //public UInt32 dot11DefaultCipherAlgorithm;// 4 
     //public UInt32 dwFlags;// 4 
     //public UInt32 dwReserved;// 4 
     } 

에 대한

[StructLayout(LayoutKind.Sequential)] 
    public struct WLAN_AVAILABLE_NETWORKS_LIST 
    { 
     public UInt32 NumberOfNetworks; 
     //Current Not used by Native System, can be used to indicate desired network 
     public UInt32 CurrentNetwork; 

     //one per network found 
     public WLAN_AVAILABLE_NETWORK[] Available_Network; 

     //input for constructor 
     private IntPtr p; 
     public WLAN_AVAILABLE_NETWORKS_LIST(IntPtr _p) 
      { 
       IntPtr pn = new IntPtr(); 
       // TODO: Complete member initialization 
       this.p = _p; 
       this.NumberOfNetworks = (UInt32)Marshal.ReadInt32(p); 
       this.CurrentNetwork = (UInt32)Marshal.ReadInt32(p, 4); 
       this.Available_Network = new WLAN_AVAILABLE_NETWORK[NumberOfNetworks]; 
       for (int i = 0; i < NumberOfNetworks; i++) 
       { 
        pn = (IntPtr)(p.ToInt32() + 8 + (628 * i)); 
        //Available_Network[i] = (WLAN_AVAILABLE_NETWORK)Marshal.PtrToStructure(pn, typeof(WLAN_AVAILABLE_NETWORK)); 
        Available_Network[i].strProfileName = Marshal.PtrToStringUni(pn); 
        Available_Network[i].SSID = new dot11_SSID(new IntPtr(pn.ToInt32() + 512)); 
        Available_Network[i].dot11BssType = (DOT11_BSS_TYPE)Marshal.ReadInt32(pn, 512 + 36); 
        Available_Network[i].uNumberOfBssids = (UInt32)Marshal.ReadInt32(pn, 512+36+4); 
        Available_Network[i].wlanSignalQuality = (UInt32)Marshal.ReadInt32(pn, 512 + 36 + 5*4+32+4); 
       } 
      }   
    } 

구조는 내가 Marshal.PtrToStructure 작업을 만들 수 없습니다. 여기

는 WlanGetAvailableNetworkList

 public static WLAN_AVAILABLE_NETWORKS_LIST GetAvailNetworkList() 
    { 
     UInt32 _dwflags = 3; 
     IntPtr handle = GetClientHandle(); 
     IntPtr pGuid = GetCurrentInterfaceGuidPointer(); 
     IntPtr _ppAvailNetworkList = new IntPtr(); 
     uint error = WlanGetAvailableNetworkList(handle, pGuid, _dwflags, IntPtr.Zero, out _ppAvailNetworkList); 
     if (error != 0) 
     { 
      Console.WriteLine("WlanEnumerated function in GetAvailNetworkPointer() failed... inspect error number" + error); 
     } 
     else 
     { 
      // It worked  
     } 
     WLAN_AVAILABLE_NETWORKS_LIST TempNetworkList = new WLAN_AVAILABLE_NETWORKS_LIST(_ppAvailNetworkList); 
     WlanFreeMemory(pGuid); 
     CloseClientHandle(handle); 
     return TempNetworkList; 
    } 

및 RSSI 값이 존재 NUINT 확인하는 테스트를 호출하는 함수이다.

 [Test] 
    public void GetAvailNetworkReturnsRSSI() 
    { 
     WiFiApi.WLAN_AVAILABLE_NETWORKS_LIST networklist = WiFiApi.GetAvailNetworkList(); 
     for (int i = 0; i < networklist.NumberOfNetworks; i++) 
     { 
      string SSIDstr = new string(networklist.Available_Network[i].SSID.SSID); 
      Console.Write("Network " + i + " "); 
      Console.Write(SSIDstr); 
      Console.Write(" RSSI = " + networklist.Available_Network[i].wlanSignalQuality); 
      Console.Write(" dbM = " + ((int)(networklist.Available_Network[i].wlanSignalQuality/2)-100)); 
      Console.WriteLine(" "); 
      if (0 != networklist.Available_Network[i].SSID.SSID_Length) 
      { 
       Assert.LessOrEqual((int)networklist.Available_Network[i].wlanSignalQuality, 100); 
       Assert.Greater((int)networklist.Available_Network[i].wlanSignalQuality, 0); 
      } 
     } 
    } 
관련 문제