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のプロジェクトをダウンロードできます。
ご清聴ありがとうございました。

Source: https://habr.com/ru/post/J181251/


All Articles