C#でネットワークを見つけてWi-Fiに接続する

私のプログラムからWI-Fiネットワークに接続する機会を探していたら、問題にならないかもしれませんが、私にとっては大きな道のりでした。



理解を深めるために、プロジェクトを条件付きで2つの部分に分割します。

最初に、Visual StudioでC#-WindowsFormsApplicationのプロジェクトを作成し、名前を付けます。最も気に入っているので、「Wifi」と呼びます。



パート1:利用可能なネットワークを見つける



したがって、2つのコントローラーをフォームにスローします。



必要なのはこれだけです。私のウィンドウは次のようになります。

画像

その後、プロジェクトに2つの新しいファイルを追加します。これはネイティブWifiライブラリです。インターネット上のどこかで見つけました。

ソースはここで取得できます



必要な名前空間を宣言します

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using NativeWifi;
      
      







ボタンのクリックを処理するプロシージャを作成し、そこにこのコードを追加します。

 WlanClient client = new WlanClient(); foreach (WlanClient.WlanInterface wlanIface in client.Interfaces) { Wlan.WlanAvailableNetwork[] wlanBssEntries = wlanIface.GetAvailableNetworkList( 0 ); // ,          istNet.Items.Clear(); foreach (Wlan.WlanAvailableNetwork network in wlanBssEntries) { //     ListViewItem listItemWiFi = new ListViewItem(); //       ,      - Trim((char)0) listItemWiFi.Text = System.Text.ASCIIEncoding.ASCII.GetString(network.dot11Ssid.SSID).Trim((char)0); //            ,        . listItemWiFi.SubItems.Add(network.wlanSignalQuality.ToString() + "%"); //     listItemWiFi.SubItems.Add(network.dot11DefaultAuthAlgorithm.ToString().Trim((char)0)); //   listItemWiFi.SubItems.Add(network.dot11DefaultCipherAlgorithm.ToString().Trim((char)0)); //   //       listNet.Items.Add(listItemWiFi); } }
      
      







これで、アプリケーションを実行して、必要なすべてのネットワークが見つかったことを確認できます。次のようになります。私のように見えます。右側の暗いバーは、Windows 8でネットワークに接続するためのフィールドです。

画像



パート2:接続



そして、最も簡単な方法で完了です。 ここで、必要なネットワークに接続する必要があります。ネットワークに接続する例を考えます。これはプログラムのリストの最初です。

別のボタンを作成し、このコードをそこに追加します。

 try { WlanClient client = new WlanClient(); foreach (WlanClient.WlanInterface wlanIface in client.Interfaces) { Wlan.WlanAvailableNetwork[] wlanBssEntries = wlanIface.GetAvailableNetworkList(0); foreach (Wlan.WlanAvailableNetwork network in wlanBssEntries) { String profileName = System.Text.ASCIIEncoding.ASCII.GetString(network.dot11Ssid.SSID).Trim((char)0); //      if (listNet.SelectedItems[0].Text.Equals(profileName)) { String strTemplate=""; String authentication=""; switch ((int)network.dot11DefaultAuthAlgorithm) { case 1: // Open break; case 3: // WEP break; case 4: // WPA_PSK strTemplate = Properties.Resources.WPAPSK; authentication = "WPAPSK"; String encryption = network.dot11DefaultCipherAlgorithm.ToString().Trim((char)0); //    String key = "0000000000"; String profileXml = String.Format(strTemplate, profileName, authentication, encryption, key); wlanIface.SetProfile(Wlan.WlanProfileFlags.AllUser, profileXml, true); wlanIface.Connect(Wlan.WlanConnectionMode.Profile, Wlan.Dot11BssType.Any, profileName); break; default: break; } } } } } catch (Exception ex) { MessageBox.Show(ex.Message); }
      
      





最も重要なこと、この行のみを説明します。

 String profileXml = String.Format(strTemplate, profileName, authentication, encryption, key);
      
      





ここで、接続用のプロファイルを作成します。テンプレート(strTemplate)は次のようになります。

 <?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> <connectionMode>manual</connectionMode> <MSM> <security> <authEncryption> <authentication>{1}</authentication> <encryption>{2}</encryption> <useOneX>false</useOneX> </authEncryption> <sharedKey> <keyType>passPhrase</keyType> <protected>false</protected> <keyMaterial>{3}</keyMaterial> </sharedKey> </security> </MSM> </WLANProfile>
      
      





私が持っているネットワークを前もって知っているので、私はそれを選んだ。 さまざまなオプションの詳細については、こちらをご覧ください。

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



簡単に言えば、XMLドキュメントに既知のデータ(ネットワークキー)と以前に見つかったデータ(名前、セキュリティ、暗号化)を入力し、プロファイルを追加して接続します。

プロジェクトを開始し、ネットワークのリストを更新し、ネットワークを選択して接続します。



この例は確かに普遍的ではありませんが、ネットワークが使用する暗号化をチェックし、プロファイルに必要なテンプレートを選択することを妨げるものです。

このリンクから Visual Studio 2012のプロジェクトをダウンロードできます。

ご清聴ありがとうございました。



All Articles