|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Member
Iscritto dal: Jul 2009
Messaggi: 268
|
[C#] Connettersi ad una rete wifi
Salve a tutti,
sto cervcando di creare un programmino in C# che si collegi ad una determinata rete wifi protetta in WPA. In rete ho trovato la libreria "ManagedWifi.dll" e più precisamente sono andato a visitare questa pagina web : http://managedwifi.codeplex.com/ Ho scaricato il codice sorgente che postano come esempio ma non riesco a capire l' ultima parte, quella dove il client si connette alla rete. Posto il codice. Codice:
using NativeWifi; using System; using System.Text; namespace WifiExample { class Program { /// <summary> /// Converts a 802.11 SSID to a string. /// </summary> static string GetStringForSSID(Wlan.Dot11Ssid ssid) { return Encoding.ASCII.GetString( ssid.SSID, 0, (int) ssid.SSIDLength ); } static void Main( string[] args ) { WlanClient client = new WlanClient(); foreach ( WlanClient.WlanInterface wlanIface in client.Interfaces ) { // Lists all networks with WEP security Wlan.WlanAvailableNetwork[] networks = wlanIface.GetAvailableNetworkList( 0 ); foreach ( Wlan.WlanAvailableNetwork network in networks ) { if ( network.dot11DefaultCipherAlgorithm == Wlan.Dot11CipherAlgorithm.WEP ) { Console.WriteLine( "Found WEP network with SSID {0}.", GetStringForSSID(network.dot11Ssid)); } } // Retrieves XML configurations of existing profiles. // This can assist you in constructing your own XML configuration // (that is, it will give you an example to follow). foreach ( Wlan.WlanProfileInfo profileInfo in wlanIface.GetProfiles() ) { string name = profileInfo.profileName; // this is typically the network's SSID string xml = wlanIface.GetProfileXml( profileInfo.profileName ); } // Connects to a known network with WEP security string profileName = "Cheesecake"; // this is also the SSID string mac = "52544131303235572D454137443638"; string key = "hello"; string profileXml = string.Format("<?xml version=\"1.0\"?><WLANProfile xmlns=\"http://www.microsoft.com/networking/WLAN/profile/v1\"><name>{0}</name><SSIDConfig><SSID><hex>{1}</hex><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>{2}</keyMaterial></sharedKey><keyIndex>0</keyIndex></security></MSM></WLANProfile>", profileName, mac, key); wlanIface.SetProfile( Wlan.WlanProfileFlags.AllUser, profileXml, true ); wlanIface.Connect( Wlan.WlanConnectionMode.Profile, Wlan.Dot11BssType.Any, profileName ); } } } } Grazie in anticipo ![]() |
![]() |
![]() |
![]() |
#2 | |
Senior Member
Iscritto dal: Jan 2005
Città: A casa mia
Messaggi: 825
|
Quote:
|
|
![]() |
![]() |
![]() |
#3 |
Member
Iscritto dal: Jul 2009
Messaggi: 268
|
Codice:
string profileXml = string.Format("<?xml version=\"1.0\"?><WLANProfile xmlns=\"http://www.microsoft.com/networking/WLAN/profile/v1\"><name>{0}</name><SSIDConfig><SSID><hex>{1}</hex><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>{2}</keyMaterial></sharedKey><keyIndex>0</keyIndex></security></MSM></WLANProfile>", profileName, mac, key); wlanIface.SetProfile( Wlan.WlanProfileFlags.AllUser, profileXml, true ); wlanIface.Connect( Wlan.WlanConnectionMode.Profile, Wlan.Dot11BssType.Any, profileName ); E il metodo "SetProfile" vorrei sapere cosa fa di preciso e quindi anche il metodo "Connect". Ecco questa è la parte che mi è oscura ![]() |
![]() |
![]() |
![]() |
#4 |
Member
Iscritto dal: Jul 2009
Messaggi: 268
|
Riporto una parte di codice dove mi dà errore.
Codice:
string nomeProfilo = lstNetwork[0].profileName; string mac = Convert.ToString(wlanInterface.InterfaceGuid); string pass = "mia_password"; string profiloXml = 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>", nomeProfilo, pass); wlanInterface.SetProfile(Wlan.WlanProfileFlags.AllUser, profiloXml, true); wlanInterface.Connect(Wlan.WlanConnectionMode.Profile, Wlan.Dot11BssType.Any, nomeProfilo); NativeWifi.WlanClient wlanclient = new NativeWifi.WlanClient(); wlanInterface = wlanClient.Interfaces[index]; L' errore che mi dà è riportato all' interno della libreria "NativeWifi". Posto il metodo dove il compilatore mi trova l' errore. Codice:
public Wlan.WlanReasonCode SetProfile(Wlan.WlanProfileFlags flags, string profileXml, bool overwrite) { Wlan.WlanReasonCode reasonCode; Wlan.ThrowIfError( Wlan.WlanSetProfile(client.clientHandle, info.interfaceGuid, flags, profileXml, null, overwrite, IntPtr.Zero, out reasonCode)); return reasonCode; } Però a me sembra di aver impostato come codice SSID quello giusto e la pass nel foglio XML. Help me! |
![]() |
![]() |
![]() |
#5 |
Senior Member
Iscritto dal: Jan 2005
Città: A casa mia
Messaggi: 825
|
SetProfile fa questo:
Codice:
/// <summary> /// Sets the profile. /// </summary> /// <param name="flags">The flags to set on the profile.</param> /// <param name="profileXml">The XML representation of the profile. On Windows XP SP 2, special care should be taken to adhere to its limitations.</param> /// <param name="overwrite">If a profile by the given name already exists, then specifies whether to overwrite it (if <c>true</c>) or return an error (if <c>false</c>).</param> /// <returns>The resulting code indicating a success or the reason why the profile wasn't valid.</returns> public Wlan.WlanReasonCode SetProfile(Wlan.WlanProfileFlags flags, string profileXml, bool overwrite) { Wlan.WlanReasonCode reasonCode; Wlan.ThrowIfError( Wlan.WlanSetProfile(client.clientHandle, info.interfaceGuid, flags, profileXml, null, overwrite, IntPtr.Zero, out reasonCode)); return reasonCode; } In sostanza passa il profilo del client che si sta collegando e restituisce lo stato, ovvero se è stato accettato o meno il profilo passato al router. Codice:
string profileXml = string.Format("<?xml version=\"1.0\"?><WLANProfile xmlns=\"http://www.microsoft.com/networking/WLAN/profile/v1\"><name>{0}</name><SSIDConfig><SSID><hex>{1}</hex><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>{2}</keyMaterial></sharedKey><keyIndex>0</keyIndex></security></MSM></WLANProfile>", profileName, mac, key); wlanIface.SetProfile( Wlan.WlanProfileFlags.AllUser, profileXml, true ); wlanIface.Connect( Wlan.WlanConnectionMode.Profile, Wlan.Dot11BssType.Any, profileName ); non fa altro che creare una stringa che contiene il testo dell'ipotetico file xml che il router accetta in ingresso con tutti i settaggi. che versione di windows utilizzi? hai almeno windows Xp? se usi Xp ricordati che devi applicare la hotfix KB article 918997 come indicato sul sito che hai linkato. Io purtroppo uso Visual Studio 2010 e il progetto è fatto in unaversione piu vecchia e mettermi a convertirlo per provarlo diventa na rottura di p... ![]() Comuqnue fai un debug e passo passo guarda in che riga ti da errore e l'errore che ti restituisce postalo qua. |
![]() |
![]() |
![]() |
#6 |
Member
Iscritto dal: Jul 2009
Messaggi: 268
|
Devo dire che uso anche io Visual studio 2010 e ho convertito il progetto senza problemi.
Comunque l' errore che mi dà e proprio sulle stringhe di codice che hai postato : Codice:
public Wlan.WlanReasonCode SetProfile(Wlan.WlanProfileFlags flags, string profileXml, bool overwrite) { Wlan.WlanReasonCode reasonCode; Wlan.ThrowIfError( Wlan.WlanSetProfile(client.clientHandle, info.interfaceGuid, flags, profileXml, null, overwrite, IntPtr.Zero, out reasonCode)); return reasonCode; } L' errore è "profilo danneggiato". Come parametri nel foglio XML gli dò : - nomeProfilo = SSID del router ( alice-00000000) - indirizzoMac = indirizzo fisico - key = password del mio router Ciao. |
![]() |
![]() |
![]() |
#7 | |
Senior Member
Iscritto dal: Jan 2005
Città: A casa mia
Messaggi: 825
|
Quote:
Se gli stai passando come passoword del tuo router la frase che hai scelto come password (esempio: AUTOMOBILE), prova a passargli la tua parola chiave tradotta in codice esadecimale tipo: E514D495 |
|
![]() |
![]() |
![]() |
#8 |
Member
Iscritto dal: Jul 2009
Messaggi: 268
|
Niente da fare
|
![]() |
![]() |
![]() |
#9 |
Member
Iscritto dal: Jul 2009
Messaggi: 268
|
Qualcuno sa come usare questa library per collegarsi ad un access point ?
Grazie mille. |
![]() |
![]() |
![]() |
#10 |
Member
Iscritto dal: Aug 2005
Messaggi: 168
|
Questo viene da un programma che avevo fatto tempo fa ( che secondo me faceva la stessa cosa che vuoi far tu visto il router alice
![]() Codice:
String 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>", SSID, password); WlanClient.WlanInterface wlanIface = new WlanClient().Interfaces[0]; Wlan.WlanReasonCode reasonasdasdasd = wlanIface.SetProfile(Wlan.WlanProfileFlags.AllUser, profileXml, true); wlanIface.Connect(Wlan.WlanConnectionMode.Profile, Wlan.Dot11BssType.Any, SSID); |
![]() |
![]() |
![]() |
#11 | |
Member
Iscritto dal: Jul 2009
Messaggi: 268
|
Quote:
Ok, Grazie mille. Lo provo il prima possibile. Per caso sai anche se è possibile costruire una rete ad hoc con questa libreria? |
|
![]() |
![]() |
![]() |
#12 |
Member
Iscritto dal: Jul 2009
Messaggi: 268
|
up
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 05:32.