Entwickler-Ecke

Netzwerk - WLan Netzwerke auflisten


Delete - Sa 21.06.08 20:56
Titel: WLan Netzwerke auflisten
Hallo,

ich versuche gerade ein Programm zu schreiben, welches einem die umliegenden WLan Netzwerke mit SSID und vielleicht auch Signalstärke (in dB) anzeigt. Ich habe im Internet nach irgendwelchen Codesnippets betreffend WLan und C# gesucht aber bin leider auf nichts brauchbares gefunden.
Hat schon irgendjemand hier erfahrung damit gemacht oder weiss wo man sich eventuell schlau darüber machen könnte?

Grüsse,
Gachl


Greenberet - Sa 21.06.08 22:57

ich glaub mit .NET selbst wirst du da nicht weit kommen( auch wenn ich mich mit wlan und .net noch nicht auseinander gesetzt hab )
schau dir mal die WlanScan [http://msdn.microsoft.com/en-us/library/ms706783(VS.85).aspx] Funktion an und bind sie mit PInvoke ein


Delete - So 22.06.08 12:52

Danke für die Antwort, ich bin mir sicher, dass das funktionieren würde, wenn ich irgendwie die pInterfaceGuid rausbekommen würde.
Ich hab mir auch überlegt eine c++-Dll zu schreiben, die mir quasi die WlanAPI Funktionen ein wenig C# freundlicher macht, aber bevor ich mich da zu doll reinsteiger wollt ich nochmal nachfragen ob das eine intelligente Lösung ist oder ob es da andere, vielleicht einfachere Lösungen gibt, wie z.B. schon vorhandene DLLs die man verwenden kann?


Greenberet - So 22.06.08 13:02

user profile iconGachl hat folgendes geschrieben:
Danke für die Antwort, ich bin mir sicher, dass das funktionieren würde, wenn ich irgendwie die pInterfaceGuid rausbekommen würde.

schau dir dazu mal WMI an
Zitat:
Ich hab mir auch überlegt eine c++-Dll zu schreiben, die mir quasi die WlanAPI Funktionen ein wenig C# freundlicher macht, aber bevor ich mich da zu doll reinsteiger wollt ich nochmal nachfragen ob das eine intelligente Lösung ist oder ob es da andere, vielleicht einfachere Lösungen gibt, wie z.B. schon vorhandene DLLs die man verwenden kann?

ich würd auf die dll komplett vergessen und wirklich auf die einzelnen funktionen über PInvoke zugreifen


Delete - So 22.06.08 14:25

Okay, ich hab mich versucht, leider habe ich noch recht wenig Erfahrung im Umgang mit pInvokes... Ich hab mir mal folgende Funktion zusammencopypasted:


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
public string GetNetworks()
{
    IntPtr x, pInfoList, clientHandle;
    UInt32 a, b, c;

    a = WlanOpenHandle(1, IntPtr.Zero, out x, out clientHandle); // Wlan handle öffnen
    b = WlanEnumInterfaces(clientHandle, IntPtr.Zero, out pInfoList); // Interfaces holen
    c = WlanCloseHandle(clientHandle, IntPtr.Zero); // Handle schliessen


    Console.WriteLine("WlanOpenHandle return code: " + a); // 0 = Okay, kein Fehler
    Console.WriteLine("Client handle: " + clientHandle.ToString());
    Console.WriteLine("WlanEnumInterfaces return code: " + b); // 0 = Okay, kein Fehler
    Console.WriteLine("WlanCloseHandle return code: " + c); // 0 = Okay, kein Fehler

    // offset reading of the structure
    int c_dwNumberOfItems = Marshal.ReadInt32(pInfoList, 0);
    Console.WriteLine("WLAN_INTERFACE_INFO_LIST.dwNumberOfItems: {0}", c_dwNumberOfItems);
    int c_dwIndex = Marshal.ReadInt32(pInfoList, 4);
    Console.WriteLine("WLAN_INTERFACE_INFO_LIST.dwIndex: {0}", c_dwIndex);

    int ifListStartOffset = 8;
    int ifListItemSize = IntPtr.Size + 512 + 4// IntPtr + WCHAR[256] + Int32

    // GUID
    IntPtr c_InterfaceGuid = Marshal.ReadIntPtr(pInfoList, ifListStartOffset);

    Int32 c_isState = Marshal.ReadInt32(pInfoList, ifListStartOffset + IntPtr.Size + 512);
    Console.WriteLine("Interface state: {0}", c_isState);

    return "Success?";
}

// WlanAPI pInvokes
[StructLayout(LayoutKind.Sequential)]
public struct WLAN_INTERFACE_INFO_LIST
{
    [MarshalAs(UnmanagedType.I4)]
    public int dwNumberOfItems;
    [MarshalAs(UnmanagedType.I4)]
    public int dwIndex;
    [MarshalAs(UnmanagedType.ByValArray)]
    public WLAN_INTERFACE_INFO[] InterfaceInfo;
}

[StructLayout(LayoutKind.Sequential)]
public struct WLAN_INTERFACE_INFO
{
    public IntPtr InterfaceGuid;
    [MarshalAs(UnmanagedType.LPWStr, SizeConst = 256)]
    public String strInterfaceDescription;
    public int isState;
}

[DllImport("wlanapi.dll", SetLastError = true)]
public static extern uint WlanOpenHandle(int dwClientVersion, IntPtr pReserved, out IntPtr pdwNegotiatedVersion, out IntPtr phClientHandle);

[DllImport("wlanapi.dll", SetLastError = true)]
public static extern uint WlanCloseHandle(IntPtr hClientHandle, IntPtr pReserved);

[DllImport("wlanapi.dll", SetLastError = true)]
public static extern uint WlanEnumInterfaces(IntPtr hClientHandle, IntPtr pReserverd, out IntPtr ppInterfaceList);

[DllImport("wlanapi.dll", SetLastError = true)]
private static extern int WlanScan(IntPtr hClientHandle,IntPtr pInterfaceGuid,IntPtr pDot11Ssid, IntPtr pIeData, IntPtr pReserved);

Funktioniert erstaunlicher Weise, es kommt das richtige Interface und die return codes sind 0, daraus schliesse ich mal, dass kein Fehler entstanden ist. Aber ich hab noch Probleme die Funktion WlanScan [http://msdn.microsoft.com/en-us/library/ms706783(VS.85).aspx] einzubinden. Mittlerweile habe ich ja die richtige GUID für das Interface (c_InterfaceGuid), dass ich jetzt wenigstens den Teil richtig füllen kann, aber wo bekomm ich die PWLAN_RAW_DATA pIeData her?
Bin da ein wenig hilflos :(