zoukankan      html  css  js  c++  java
  • c# 如何使用wlanapi连接电脑到wifi

    http://www.codeproject.com/Articles/72105/Manage-WiFi-with-Native-API-WIFI-on-Windows-XP-SP

    Introduction

    This article will demonstrate the ability to establish and operate a WiFi connection from a C# program using the Wireless LAN API on a Windows XP Embedded SP2 Windows XP Pro SP2.

    Step 1

    The first step was to create a function that returns the WiFi networks available for connection. Using the WLANOpenHandle, you create the client to use for the session:

    Wlan.WlanOpenHandle( 
    Wlan.WLAN_CLIENT_VERSION_XP_SP2, <--- (Wireless LAN API for Windows XP with SP2) 
    IntPtr.Zero, 
    ref negotiatedVersion, 
    ref clientHandle)
    

      

    Step 2

    Then list all the wireless LAN interfaces visible from our PC:

    Wlan.WlanEnumInterfaces( 
    clientHandle, <--- (clientHandle precedentemente istanziato) 
    IntPtr.Zero, 
    ref pInterfaceList) 
    

      

    Step 3

    Using the pointer to the list of available interfaces, we will populate the structure that will contain all Wlan.WLAN_INTERFACE_INFO_LIST NIC interface information:

    Wlan.WLAN_INTERFACE_INFO_LIST interfaceList = 
    		new Wlan.WLAN_INTERFACE_INFO_LIST(pInterfaceList); 
    

      

    Step 4

    What we are still missing at this point and guidance of our interface to be passed to the function Wlan.WlanGetAvailableNetworkList, we get through this passage:

    Guid InterfaceGuid = 
    	((Wlan.WLAN_INTERFACE_INFO)interfaceList.InterfaceInfo[0]).InterfaceGuid; 
    

    Step 5

    Now we have all the elements to call the API Wlan.WlanGetAvailableNetworkList; declare that we will return the pointer function and proceed:

    IntPtr pAvailableNetworkList = IntPtr.Zero; 
    Wlan.WlanGetAvailableNetworkList( clientHandle, 
                                      InterfaceGuid, 
                                      Wlan.WlanGetAvailableNetworkFlags.
    				IncludeAllManualHiddenProfiles,
                                      IntPtr.Zero, 
                                      out ppAvailableNetworkList)
    

    Scroll through the list of connections:

    Wlan.WLAN_AVAILABLE_NETWORK_LIST wlanAvailableNetworkList = 
        new Wlan.WLAN_AVAILABLE_NETWORK_LIST(pAvailableNetworkList); 
    Wlan.WlanFreeMemory(pAvailableNetworkList); 
    for (int j = 0; j < wlanAvailableNetworkList.dwNumberOfItems; j++) 
    { 
       Wlan.WLAN_AVAILABLE_NETWORK network = wlanAvailableNetworkList.Networks[j]; 
       string SSId = GetStringForSSID(network.dot11Ssid); 
       if(ssid != "") 
       { 
          //Connessione 
          Wifi_SetProfile(network.dot11DefaultAuthAlgorithm, SSId); 
       }  
    }
    

    Depending on the type of connection configured for my Access Point imposed the correct profile and I connect:

    static void Wifi_SetProfile(Wlan.DOT11_AUTH_ALGORITHM connType, string sNetSSId) 
    { 
       switch (connType) 
       { 
          //WEP - OPen 
          case Wlan.DOT11_AUTH_ALGORITHM.DOT11_AUTH_ALGO_80211_OPEN: 
          profileXml = string.Format(
              "<?xml version="1.0"?>
              <WLANProfile xmlns="http://www.microsoft.com/networking/WLAN/profile/v1">
              <name>{0}</name><SSIDConfig><SSID><name>{0}</name></SSID></SSIDConfig>
              <connectionType>ESS</connectionType><MSM><security><authEncryption>
              <authentication>open</authentication><encryption>WEP</encryption>
              <useOneX>false</useOneX></authEncryption><sharedKey>
              <keyType>networkKey</keyType><protected>false</protected>
              <keyMaterial>{1}</keyMaterial></sharedKey><keyIndex>0</keyIndex>
              </security></MSM></WLANProfile>", 
          profileName, key); 
     
          Wlan.WlanSetProfile( clientHandle, 
    			InterfaceGuid, 
    			Wlan.WlanProfileFlags.AllUser, 
    			profileXml, 
    			null, 
    			true, 
    			IntPtr.Zero, 
    			out reasonCode); 
     
         if(reasonCode==Wlan.WlanReasonCode.Success) 
         { 
            //Connect!!! 
            ... 
         } 
         else 
         { 
            //Return usually 1168 – Error is on profile Xml or on key 
         } 
         break;
     
         //WPA_PSK 
         case Wlan.DOT11_AUTH_ALGORITHM.DOT11_AUTH_ALGO_WPA_PSK: 
         profileXml = string.Format("<?xml version="1.0" encoding="US-ASCII"?>
             <WLANProfile xmlns="http://www.microsoft.com/networking/WLAN/profile/v1">
             <name>{0}</name><SSIDConfig><SSID><name>{0}</name></SSID></SSIDConfig>
             <connectionType>ESS</connectionType><connectionMode>auto</connectionMode>
             <autoSwitch>false</autoSwitch><MSM><security><authEncryption>
             <authentication>WPAPSK</authentication><encryption>TKIP</encryption>
             <useOneX>false</useOneX></authEncryption><sharedKey>
             <keyType>passPhrase</keyType><protected>false</protected>
             <keyMaterial>{1}</keyMaterial></sharedKey></security></MSM></WLANProfile>", 
             profileName, key);
     
     		 Wlan.WlanSetProfile( clientHandle, 
                              InterfaceGuid, 
                              Wlan.WlanProfileFlags.AllUser, 
                              profileXml, 
                              null, 
                              true, 
                              IntPtr.Zero, 
                              out reasonCode);
     
     		 if(reasonCode == Wlan.WlanReasonCode.Success) 
         { 
             //Connect!!! 
             ... 
         } 
         else 
         { 
            //Return usually 1168 – Error is on profile Xml or on key 
         } 
         break; 
    } 
    

      

    补充参考:

    http://stackoverflow.com/questions/6318575/connect-to-a-wireless-network-in-c-sharp 

    http://msdn.microsoft.com/en-us/library/windows/desktop/aa370032(v=vs.85).aspx

    http://msdn.microsoft.com/en-us/library/windows/desktop/aa369853(v=vs.85).aspx

  • 相关阅读:
    Android开发:《Gradle Recipes for Android》阅读笔记(翻译)5.2——使用Android Testing Support Library进行测试
    Android开发:《Gradle Recipes for Android》阅读笔记(翻译)5.1——单元测试
    Android开发:《Gradle Recipes for Android》阅读笔记(翻译)4.5——使用Android Libraries
    Android开发:《Gradle Recipes for Android》阅读笔记(翻译)4.4——自定义代码集合
    Android开发:《Gradle Recipes for Android》阅读笔记(翻译)4.3——排除任务
    10.13总结
    10.7号解题报告
    no zuo no die
    发誓!
    NOIP2016天天爱跑步
  • 原文地址:https://www.cnblogs.com/Tommy-Yu/p/3958047.html
Copyright © 2011-2022 走看看