IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Discussion :

Développer une application capable lister des réseaux Wifi disponibles


Sujet :

Windows

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Mai 2006
    Messages : 6
    Points : 3
    Points
    3
    Par défaut Développer une application capable lister des réseaux Wifi disponibles
    Bonjour ! Nouveau sur ce forum

    Je dois développer une application sous WindowsXP capable de lister les réseaux wifi qu'un poste de travail peut capter. Je réalise cette appli en VisualBasic mais je peux bien sûr développer des petits modules en C ou Java à coté.

    Après de longues recherche, j'ai trouvé une solution du côté du système WMI (une sorte de base de données d'informations sur l'ordinateur), qui permet, via une certaine requête, d'obtenir cette fameuse liste de réseaux wifi disponibles.

    Mais premièrement cette solution est buggée : un bug windows ne permet pas de récupérer une liste correcte lorsque il y a plus de 1 réseau wifi disponible.
    Deuxièmement, le WMI n'est pas vraiment fait pour ça...

    Des collègues développeurs m'ont conseillé d'aller creuser du côté des API windows. Mais malgré mes recherches (MSDN, support microsoft, etc) impossible de trouver la moindre info sur une API me permettant de lister les réseaux wifi disponibles.

    En conclusion, quelqu'un aurait il de l'info sur une API windows permettant de lister les réseaux wifi ?
    (Si, en plus de lister, on peut également se connecter, ce serait top)

    Merci bcp de vos réponses

    Benoit

  2. #2
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Salut,
    Citation Envoyé par benoit colin
    Deuxièmement, le WMI n'est pas vraiment fait pour ça...
    Que le provider ne soit pas adapté à ton besoin peut être, qu'il soit buggé possible (mais d'après quel sources?) mais que WMI ne soit pas fait pour ça je pense pas.
    Désolé je ne connais pas suffisament les API pour te proposer une piste.
    Justement WMI permet de se concentrer sur l'information à récupérer et pas sur comment la récupérer

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Mai 2006
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    Merci Laurent pour tes réponses.
    Pour moi le WMI sur WinXP SP2 est buggé pour détecter le wifi car 1° Je le constate moi-même avec mes dévs, dès que j'ai plus de 1 réseau visible, mes requêtes WMI retournent des données qui ne veulent rien dire (et avec un WMI Explorer, ca fait pareil) et 2° J'ai trouvé deux trois cas comme moi (par exemple ici).
    Mais si tu penses que c'est "propre" de détecter les réseaux Wifi en WMI, je vais peux être persister dans cette voie...

  4. #4
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par benoit colin
    Mais si tu penses que c'est "propre" de détecter les réseaux Wifi en WMI, je vais peux être persister dans cette voie...
    WMI c'est une solution, ce ni mieux ni pire cela dépend des contraires qu'on a et des objectif à atteindre.
    De toutes façons les providers WMI utilisent des API

  5. #5
    mat.M
    Invité(e)
    Par défaut
    Citation Envoyé par benoit colin
    Des collègues développeurs m'ont conseillé d'aller creuser du côté des API windows. Mais malgré mes recherches (MSDN, support microsoft, etc) impossible de trouver la moindre info sur une API me permettant de lister les réseaux wifi disponibles.

    En conclusion, quelqu'un aurait il de l'info sur une API windows permettant de lister les réseaux wifi ?
    (Si, en plus de lister, on peut également se connecter, ce serait top)

    Merci bcp de vos réponses

    Benoit
    Regarder autour de DeviceIoControl et CreateFile.
    Tout ce qui est matériel bas-niveau a déja été abordé


    Regarder cette exemple

    http://msdn.microsoft.com/library/de...ed_devices.asp

    Si j'ai un moment je regarderais
    Dernière modification par mat.M ; 09/05/2006 à 19h48.

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Mai 2006
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    Merci Mat.M, je creuse la piste du DeviceIOControl.
    Il semble qu'un fichier d'exemple nommé wzctool.c fourni avec MS Development Platform donne de bonnes idées d'utilisation de ces fonctions. Mais je n'ai pas MS DP installé. Quelqu'un qui dispose de ce fichier pourrait-il me l'envoyer sur benoit.colin1 AT free.fr
    Merci

  7. #7
    Futur Membre du Club
    Inscrit en
    Décembre 2005
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 10
    Points : 9
    Points
    9
    Par défaut
    Bonjour tout le monde,

    J 'ai un petit problème a vous soumettre et comme ce post (qui commence à dater , je sais) correspond bien à mon problème je me permet de le faire ressurgir des profondeurs.

    J'ai besoin de récupérer les informations sur des points d'accés Wifi (BSSID,SSID,RSSI,WEP, DataRates, etc) et j'ai commencé a chercher vers la base WMI.
    Pour ce faire j'interroge la classe MSNdis_80211_BSSIList qui me renvoi le nombre d'instance en cours (nombre d'AP vu) et un tableau d'objet (MSNdis_80211_WLanBssId) contenant les données de chaque AP.
    Jusque là sur le papier tout va bien.

    Voici le code de la Sub qui me récupère les données :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
        Private Sub GetWifiInfo()
            ListView.Items.Clear()
    
            Dim query As String = "SELECT * FROM MSNDis_80211_BSSIList   WHERE Active='True'"
            Dim searcher As Management.ManagementObjectSearcher = New Management.ManagementObjectSearcher("root/WMI", query)
            Dim moc As Management.ManagementObjectCollection = searcher.Get()
            Dim moe As Management.ManagementObjectCollection.ManagementObjectEnumerator = moc.GetEnumerator()
            moe.MoveNext()
    
    
            Dim Ndis80211BSSIList() As Management.ManagementBaseObject = CType(moe.Current.Properties("Ndis80211BSSIList").Value, Management.ManagementBaseObject())
            Dim nbrAP As Integer = moe.Current.Properties("NumberOfItems").Value
            Dim i As Integer = 0
    
            ' *********     datas issues de Ndis80211BSSIList      *********
            Dim Config As Management.ManagementBaseObject ' donnée issue de Ndis80211BSSIList
            Dim ATIMWindow As String 'donnée issue de Config
            Dim BeaconPeriod As String 'donnée issue de Config
            Dim DSConfig As String 'donnée issue de Config
    
            Dim FHConfig As Management.ManagementBaseObject 'donnée issue de Config
            Dim DwellTime As String 'donnée issue de FHConfig
            Dim FHLenght As String 'donnée issue de FHConfig
            Dim HopPattern As String 'donnée issue de FHConfig
            Dim HopSet As String 'donnée issue de FHConfig
    
    
            Dim InfraMode As Management.ManagementBaseObject
            Dim NetInfra As String 'donnée issue de InfraMode
    
            Dim NetInUse As Management.ManagementBaseObject
            Dim NetworkType As String 'donnée issue de NetInUse
    
            Dim MacAdress() As Byte ' adresse Mac BSSID
            Dim Privacy As Boolean ' Open ou non
            Dim RSSI As String ' Niveau de signal
            Dim SSID() As Byte ' Nom de l'AP
            Dim SupportedRate() As Byte ' Vitesses suportées
            '*****************************************************
    
            For i = 0 To nbrAP - 1
                Dim AP As Management.ManagementBaseObject
                AP = Ndis80211BSSIList(i)
    
                Config = AP.Properties("Ndis80211Configuration").Value
                ATIMWindow = Config.Properties("ATIMWindow").Value
                BeaconPeriod = Config.Properties("BeaconPeriod").Value
                DSConfig = Config.Properties("DSConfig").Value
                FHConfig = Config.Properties("FHConfig").Value
                DwellTime = FHConfig.Properties("DwellTime").Value
                FHLenght = FHConfig.Properties("FHLength").Value
                HopPattern = FHConfig.Properties("HopPattern").Value
                HopSet = FHConfig.Properties("HopSet").Value
    
                InfraMode = AP.Properties("Ndis80211InfrastructureMode").Value
                NetInfra = InfraMode.Properties("Ndis80211NetworkInfrastructure").Value
    
                NetInUse = AP.Properties("Ndis80211NetworkTypeInUse").Value
                NetworkType = NetInUse.Properties("Ndis80211NetworkType").Value
    
                MacAdress = AP.Properties("Ndis80211MacAddress").Value
                Privacy = AP.Properties("Ndis80211Privacy").Value
                RSSI = AP.Properties("Ndis80211Rssi").Value
                SSID = AP.Properties("Ndis80211SsId").Value
                SupportedRate = AP.Properties("Ndis80211SupportedRate").Value
    
                Dim SSID_str As String = System.Text.Encoding.ASCII.GetString(SSID)
                Dim MacAdress_Str As String = ByteArray2HexaString(MacAdress)
                Dim SupportedRate_str As String = ByteArray2HexaString(SupportedRate)
                Dim NetInfra_str As String = GetNetInfraType(NetInfra) 'renvoi AdHoc, Infra, AUtoUnknow ou non référencé + la valeur
                Dim NetwokType_str As String = GetNetworkType(NetworkType) ' renvoi DS, FH , OFDM24, OFDM5 ou non référencé + la valeur
    
    
                Dim StringItem() As String = {SSID_str, MacAdress_Str, RSSI, NetInfra_str, NetwokType_str, Privacy, _
                SupportedRate_str, ATIMWindow, BeaconPeriod, DSConfig, DwellTime, FHLenght, HopPattern, HopSet}
                Dim LVI As New ListViewItem(StringItem)
    
                Me.ListView.Items.Add(LVI)
            Next
        End Sub
    J'ai fait les tests avec deux types de carte WIFI :

    - une carte PCI D-Link AirPlus XtremeG+ DWL-G520+ (TNET1130)
    - un clef USB ASUS WL-167G TR2500USB)

    Avec la carte PCI tout fonctionne à merveille (si si je vous assure )
    par contre avec la clef USB...
    J'ai exactement les mêmes symptômes que < benoit colin >
    Le premier 'Ndis80211BSSIList(0)' contient toujours les bonnes valeurs, par contre les suivantes sont toujours fausses


    J'ai vérifié les données dans la base WMI avec 'Window Management Instrumentation Tools' (WMI Object Brower)
    et je retrouve bien les mêmes valeurs (fausses aussi ).

    D'ou viens le problème ?
    - Hardware ? (carte PCI, USB WLAN ...)
    - ou software (Drivers)

    Franchement je séche et un début de piste serai le bienvenue .

    Je ne suis pas super a l'aise avec le C/C++, je tenterai bien le DeviceIOControl mais , pour bosser en C il me faut un bon exemple pour pouvoir suivre

  8. #8
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Mai 2006
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    Haa, je suis pas seul au monde ! Tu as exactement les même symptomes que moi

    Depuis le temps, j'ai conclu que le problème provient du driver wifi, lorsque il est requété par WMI !
    En effet sur certaines configs je récupére bien les toutes infos (avec le WMI explorer ou alors en vb.net ou vbs). Sur d'autres, il n'y a que la premiere entrée qui est bonne, le reste est complétement aléatoire. Enfin sur d'autres configs la classe MSNdis_80211_BSSIList n'existe carrément pas.

    Bien dommage tout ca. Je crois bien qu'il n'y a pas d'issue car le problème est à la source. (Peut-être installer un nouveau driver peut solutionner ? Je peux pas me le permettre sur les postes de l'entreprise)

    Je me suis tourné par désespoir vers la base de registre qui contient quelques infos mais impossible de trouver une régle fiable pour récupérer les infos wifi à tous les coups.

    Bon, si windows est capable de le faire, on doit bien être capable de le faire. Un bon code hardware en C peut être, mais il faut le temps...

  9. #9
    Futur Membre du Club
    Inscrit en
    Décembre 2005
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 10
    Points : 9
    Points
    9
    Par défaut
    Microsoft n'a malheureusement pas documenté l'API de la dll Wireless Zero Config" , je ne trouve pas grand chose dans cette direction, il y a bien une librairie managé pour Windows Mobile 5 (cf OpenNetCF.Net) mais j'ai besoin de faire tourner mon appli sous XP SP2 sur PC portable ou sur UMPC (donc plutôt orienté USB ou Mini PCI).

    Apparemment CACE technologie (AirPCap) à une solution complète(à base de clef USB) , il fournisse le soft (les sources sont dispo) le driver et la clef USB.

    J'ai déja compilé le code source et installé le driver mais je n'ai pour le moment trouvé aucune clef avec le même chipset qui veuille bien démarrer avec ce driver (je pense qu'ils ont du modifier le firmware de la clef)

    Le PID/VID de la clef attendu par le driver (information trouvé dans le fichier .INF) est de ce type PID_CACE/VID_0001 (CACE étant exactement le nom de la société , je ne pense pas que ce sois dù au hasard).

    Pour en revenir à XP, je pense qu'il s'appuie sur le service WZC pour fournir les informations sur les AP, je vais essayer de trouver le moyen de faire des P/invoke en important les fonctions de la/les DLL (wzcsapi.dll, wzcsvc.dll ou wzcdlg.dll).


    Si quelqu'un a des informations la dessus je suis preneur


    EDIT : Je viens de me rendre compte que Wlanapi.dll est enfin documenté sur MSDN surement depuis l'arrivée de VISTA

    Et la fonction WlanGetAvailableNetworkListhttp://msdn2.microsoft.com/en-us/library/ms706749.aspx à l'air de correspondre à mon besoin, je vais creuser.

  10. #10
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Mai 2006
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    Merci pour ces infos

    ... et regarde également ce lien, le titre de la page est éloquent :
    http://support.microsoft.com/kb/918997/fr

    S'y trouve un lien "Télécharger le package API de réseau local sans fil"... prometteur. Je suis pas au boulot donc je peux pas tester tout de suite mais la dll Wlanapi.dll semble pouvoir répondre à ces problèmes (regarder aussi la fonction WlanScan sur http://msdn2.microsoft.com/en-us/library/ms706783.aspx

    Cool, des nouvelles pistes

  11. #11
    Futur Membre du Club
    Inscrit en
    Décembre 2005
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 10
    Points : 9
    Points
    9
    Par défaut
    J'ai commencé aujourd'hui,
    J'ai commencé à P/Invoke depuis un programme en VB.NET sous VS2005. Je récupère pas mal de donné avec la commande WlanGetAvailableNetworkList (RSSI, SSID , type d'authentification , type de chiffrement, etc) par contre elle ne renvoie pas le BSSID. Je vais devoir utiliser WlanGetNetworkBssList qui elle renvoie un pointeur vers une struture de type PWLAN_BSS_LIST qui elle contient tout ce qu'il faut connaitre sur un AP (access point).
    Je vais regarder aussi WlanScan , mais j'ai du mal à voir comment récupérer les informations avec la structure renvoyé

    Mais une chose est sure ça change du WMI.

    Dès que j'ai fini je mettrai le code ici pour l'instant c'est encore un peu brouillon.

  12. #12
    Membre éprouvé

    Profil pro
    Inscrit en
    Août 2003
    Messages
    878
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 878
    Points : 1 067
    Points
    1 067
    Par défaut
    Un petit truc générique qui peut aider dans ce genre de cas...

    Si une application fournie avec Windows arrive à retrouver des informations que vous n'arrivez pas à retrouver dans vos propres applications parce-que vous ne savez pas quelles fonctions appeler, vous pouvez jeter un oeil à la table d'importation de l'exécutable (ex. : avec dumpbin.exe) : si la liaison n'est pas faite dynamiquement (i.e. : à coups de LoadLibrary()/GetProcAddress()), cela vous donnera déjà la liste des fonctions utilisées par l'application qui fonctionne.

    Ensuite, si vous ne savez pas dans quel ordre et avec quels paramètres elles sont appelées, vous pouvez utiliser un outil équivalent à strace sous Windows (ex. : straceNT, bien qu'il soit lent).
    La sortie sera peut-être un peu fastidieuse à étudier (qui a dit "multi-threading" ?) mais cela peut donner des pistes supplémentaires (ex. : "tiens, le pointeur retourné par la fonction trucmuche() est le premier paramètre transmis à machinchose() !?!?").

    Si cela peut aider, tant mieux (sinon, tant pis).
    Un problème bien exposé
    est, pour moitié, solutionné. / La connaissance s'accroît quand on la partage, pas quand on l'impose. / La violence est le langage des faibles.

  13. #13
    Futur Membre du Club
    Inscrit en
    Décembre 2005
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 10
    Points : 9
    Points
    9
    Par défaut
    Merci David.Schris pour ces informations,
    tu ne m'en voudras pas si pour le moment je laisse ça un peu de cotés avant d'utiliser dumpbin.exe, je vais finir d'épuiser la piste précédente ( cf WLANAPI.dll). Je vais éviter de trop me disperser .

    J'ai fini de "Marshaler" la fonctionWlanGetAvailableNetworkList qui donne des informations utilies mes incomplètes (voir la struture : WLAN_AVAILABLE_NETWORK).
    Malheureusement elle ne ne renvoie pas l'adresse mac du point d'accés Wifi (BSSID) ni les vitesses supportés.
    Je me suis donc tourné vers la fonctions WlanGetNetworkBssList qui à priori complète bien la première puisque la structure renvoyé contient la Mac Adresse et les vitesses supportées(voir la struture : WLAN_BSS_ENTRY), mais... il y a un MAIS

    n'est supporté que sur un seul type d'OS client ... VISTA

    J'ai regardé de plus prés WLANSCAN , cette fonction sert juste a faire un refresh des AP, elle ne prend que des paramètres [In] et ne renvoie qu'un code d'erreur.

    Je suis de nouveau dans une impasse mais j'espère encore trouver LA fonction (bien que je sois plutôt pessimiste)
    je vais de nouveau regarder vers les anciennne DLL (WZCsapi.dll WSCcfg.dll , etc) bien qu'elle soit trés peu documenté.

  14. #14
    Futur Membre du Club
    Inscrit en
    Décembre 2005
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 10
    Points : 9
    Points
    9
    Par défaut
    Je met comme promis le code pour le marshaling d'une ou deux fonctions Native WIFI

    Imports des fonctions :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    Imports System.Runtime.InteropServices
    
    
    
    Public Class NativeMethods
    
        Private Sub New()
    
        End Sub
    
        <DllImport("wlanapi.dll", setlasterror:=True)> _
        Public Shared Function WlanOpenHandle( _
          ByVal clientVersion As UInteger, _
          ByVal reserved As IntPtr, _
          ByRef negotiatedVersion As Integer, _
          ByRef clientHandle As IntPtr) As UInteger
        End Function
    
        <DllImport("wlanapi", setlasterror:=True)> _
        Public Shared Function WlanCloseHandle( _
          ByVal clientHandle As IntPtr, _
          ByVal reserved As IntPtr) As UInteger
        End Function
    
        <DllImport("wlanapi", setlasterror:=True)> _
          Public Shared Sub WlanFreeMemory(ByVal pMemory As IntPtr)
        End Sub
    
    
    #Region " WlanGetAvailableNetworkList "
    
        <DllImport("wlanapi", setlasterror:=True, CharSet:=CharSet.Unicode)> _
            Public Shared Function WlanGetAvailableNetworkList( _
            <[In]()> ByVal clientHandle As IntPtr, _
            <[In]()> ByRef InterfaceGUID As Guid, _
            <[In]()> ByVal Flags As UInt32, _
            ByVal reserved As IntPtr, _
            <Out()> ByRef WlanNetworkList As IntPtr) As UInteger
        End Function
    
        Public Structure WLAN_AVAILABLE_NETWORK_LIST
            Public NumberOfItems As UInt32
            Public Index As UInt32
            ' Public WlanInterfaceInfo() As WLAN_INTERFACE_INFO 
        End Structure
    
        Public Structure WLAN_AVAILABLE_NETWORK
            <MarshalAs(UnmanagedType.ByValTStr, sizeconst:=512)> Public ProfileName As String '512 octets
            Public Dot11Ssid As DOT11_SSID ' 4 + 32 octets
            Public Dot11BssType As DOT11_BSS_TYPE ' 4 octets
            Public NbrOfBSSID As UInt32 ' 4 octets
            Public NetworkConnectable As Boolean ' 4 octets
            Public NotConnectableReason As UInt32 'WLAN_REASON_CODE' 4 octets
            Public NbrOfPhyType As UInt32 ' 4 octets
            <MarshalAs(UnmanagedType.ByValArray, sizeconst:=8)> Public Dot11PhyTypes() As DOT11_PHY_TYPE '8 * 4 octets
            Public MorePhyTypes As Boolean ' 4 octets
            Public SignalQuality As UInt32 ' 4 octets
            Public SecurityEnabled As Boolean ' 4 octets
            Public Dot11DefaultAlgo As DOT11_AUTH_ALGORITHM ' 4 octets
            Public Dot11DefaultCypher As DOT11_CIPHER_ALGORITHM ' 4 octets
            Public Flags As UInt32 ' 4 octets
            Public Reserved As UInt32 ' 4 octets
        End Structure 'WLAN_AVAILABLE_NETWORK longueur = 628
    
        Public Structure DOT11_SSID
            Public SSIDLenght As UInt32
            <MarshalAs(UnmanagedType.ByValTStr, sizeconst:=32)> Public SSID As String
        End Structure
    
        Public Enum DOT11_BSS_TYPE As UInt32
            dot11_BSS_type_infrastructure = 1 'Specifies an infrastructure BSS network. 
            dot11_BSS_type_independent = 2 'Specifies an independent BSS (IBSS) network. 
            dot11_BSS_type_any = 3 'Specifies either infrastructure or IBSS network. 
        End Enum
    
        Public Enum DOT11_PHY_TYPE As UInt32
            dot11_phy_type_unknown = 0 'Specifies an unknown or uninitialized PHY type. 
            dot11_phy_type_any = dot11_phy_type_unknown 'Specifies any PHY type. 
            dot11_phy_type_fhss = 1 'Specifies a frequency-hopping spread-spectrum (FHSS) PHY. Bluetooth devices can use FHSS or an adaptation of FHSS. 
            dot11_phy_type_dsss = 2 'Specifies a direct sequence spread spectrum (DSSS) PHY. 
            dot11_phy_type_irbaseband = 3 'Specifies an infrared (IR) baseband PHY. 
            dot11_phy_type_ofdm = 4 'Specifies an orthogonal frequency division multiplexing (OFDM) PHY. 802.11a devices can use OFDM. 
            dot11_phy_type_hrdsss = 5 'Specifies a high-rate DSSS (HRDSSS) PHY. 
            dot11_phy_type_erp = 6 'Specifies an extended rate PHY (ERP). 802.11g devices can use ERP. 
            dot11_phy_type_IHV_start = 2147483648 'Specifies the start of the range that is used to define PHY types that are developed by an independent hardware vendor (IHV). 
            dot11_phy_type_IHV_end = 4294967295 'Specifies the start of the range that is used to define PHY types that are developed by an independent hardware vendor (IHV).
        End Enum
    
        Public Enum DOT11_AUTH_ALGORITHM As UInt32
            DOT11_AUTH_ALGO_80211_OPEN = 1
            DOT11_AUTH_ALGO_80211_SHARED_KEY = 2
            DOT11_AUTH_ALGO_WPA = 3
            DOT11_AUTH_ALGO_WPA_PSK = 4
            DOT11_AUTH_ALGO_WPA_NONE = 5           ' used in NatSTA only
            DOT11_AUTH_ALGO_RSNA = 6
            DOT11_AUTH_ALGO_RSNA_PSK = 7
            DOT11_AUTH_ALGO_IHV_START = 2147483648
            DOT11_AUTH_ALGO_IHV_END = 4294967295
        End Enum
    
        Public Enum DOT11_CIPHER_ALGORITHM As UInt32
            DOT11_CIPHER_ALGO_NONE = 0
            DOT11_CIPHER_ALGO_WEP40 = 1
            DOT11_CIPHER_ALGO_TKIP = 2
            DOT11_CIPHER_ALGO_CCMP = 4
            DOT11_CIPHER_ALGO_WEP104 = 5
            DOT11_CIPHER_ALGO_WPA_USE_GROUP = 256
            DOT11_CIPHER_ALGO_RSN_USE_GROUP = 256
            DOT11_CIPHER_ALGO_WEP = 257
            DOT11_CIPHER_ALGO_IHV_START = 2147483648
            DOT11_CIPHER_ALGO_IHV_END = 4294967295
        End Enum
    #End Region
    
    #Region " WlanEnumInterfaces  "
    
        <DllImport("wlanapi", setlasterror:=True, CharSet:=CharSet.Unicode)> _
        Public Shared Function WlanEnumInterfaces( _
          ByVal clientHandle As IntPtr, _
          ByVal reserved As IntPtr, _
          ByRef InterfaceList As IntPtr) As UInteger
        End Function
    
        Public Structure WLAN_INTERFACE_INFO_LIST
            Public NumberOfItems As Integer
            Public Index As UInteger
            ' Public InterfaceInfo() as WLAN_INTERFACE_INFO 
        End Structure
    
    
        Public Structure WLAN_INTERFACE_INFO
            Public InterfaceGuid As Guid
            Public InterfaceDescription As String
            Public state As WLAN_INTERFACE_STATE
        End Structure
    
    
        Public Enum WLAN_INTERFACE_STATE As Integer
    
            not_ready = 0
            connected = 1
            ad_hoc_network_formed = 2
            disconnecting = 3
            disconnected = 4
            associating = 5
            discovering = 6
            authenticating = 7
    
        End Enum
    #End Region
    
    End Class
    Comment les appeler en VB :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    Option Strict On
    Option Explicit On
    
    
    
    Imports System.Runtime.InteropServices
    Imports WIFI_WlanAPI.NativeMethods  
    Imports System.ComponentModel
    
    
    
    Public Class Form1 ' button1, textbox1
    
        Private clientVers As ClientVersion
        Private hClient As IntPtr
        Private pList As IntPtr 'pointeur vers la liste de WLAN_INTERFACE_INFO_LIST
        Private pInfos As IntPtr ' pointeur vers une struture WLAN_INTERFACE_INFO
        Private AdapterInfo As WLAN_INTERFACE_INFO
        Private result As UInteger
        Private pNetList As New IntPtr
        Private pNetInfos As New IntPtr ' pointeur vers une struture WLAN_AVAILABLE_NETWORK
    
        Private pBSSIList As New IntPtr
        Private pBSSIInfos As New IntPtr
    
        Private NetworkInfo As WLAN_AVAILABLE_NETWORK
        Private infos As New List(Of NativeMethods.WLAN_INTERFACE_INFO)
    
        Private Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click
    
            clientVers = GetClientVersion()
            hClient = IntPtr.Zero
            Dim negotiatedversion As Integer
    
           ' récupération du Handle de la carte Wifi
            result = WlanOpenHandle(clientVers, _
                    Nothing, _
                    negotiatedversion, _
                    hClient)
    
            If result <> 0 Then Throw New Win32Exception()
    
            ' récupération du pointeur vers la structure 
            pList = Nothing
            result = WlanEnumInterfaces(hClient, Nothing, pList)
    
            If result <> 0 Then Throw New Win32Exception()
    
            ' extraction des données
            Dim list As WLAN_INTERFACE_INFO_LIST = _
                DirectCast(Marshal.PtrToStructure(pList, _
                GetType(WLAN_INTERFACE_INFO_LIST)), _
                WLAN_INTERFACE_INFO_LIST)
    
            If list.NumberOfItems = 0 Then
                MessageBox.Show("nothing found")
                CloseHClient(hClient)
                FreeMemory(pList)
                Exit Sub
            End If
    
            pInfos = New IntPtr(pList.ToInt32 + 8) ' 2 DWORDS  
    
            
            For i As Integer = 0 To list.NumberOfItems - 1
    
                ' TODO récupérer les données en utilisant (Marshal.PtrToStructure)
                AdapterInfo = New WLAN_INTERFACE_INFO
                AdapterInfo.InterfaceGuid = DirectCast(Marshal.PtrToStructure(pInfos, GetType(Guid)), Guid)
                pInfos = New IntPtr(pInfos.ToInt32 + Marshal.SizeOf(GetType(Guid)))
                AdapterInfo.InterfaceDescription = Marshal.PtrToStringUni(pInfos)
                pInfos = New IntPtr(pInfos.ToInt32 + 512)
                AdapterInfo.state = DirectCast(Marshal.ReadInt32(pInfos), WLAN_INTERFACE_STATE)
                pInfos = New IntPtr(pInfos.ToInt32 + 4)
    
                Me.TextBox1.Text &= AdapterInfo.InterfaceDescription
                Me.TextBox1.Text &= Environment.NewLine
                Me.TextBox1.Text &= AdapterInfo.InterfaceGuid.ToString
                Me.TextBox1.Text &= Environment.NewLine
                Me.TextBox1.Text &= AdapterInfo.state.ToString
                Me.TextBox1.Text &= Environment.NewLine
                infos.Add(AdapterInfo)
    
    
            Next ' TODO :pour lire la carte suivante il faut déplacer le pointeur de la longueur de la structure
    
        End Sub
    
        Private Sub CloseHClient(ByVal hClient As IntPtr)
            If hClient <> IntPtr.Zero Then
                If NativeMethods.WlanCloseHandle(hClient, Nothing) <> 0 Then
                    Throw New System.ComponentModel.Win32Exception()
                End If
            End If
        End Sub
    
        Private Sub FreeMemory(ByVal ptr As IntPtr)
            If ptr <> IntPtr.Zero Then
                NativeMethods.WlanFreeMemory(ptr)
            End If
        End Sub
    
        Public Enum ClientVersion As UInteger
            XPSP2 = 1
            Vista = 2
        End Enum
    
        Public Function GetClientVersion() As ClientVersion
    
            Select Case Environment.OSVersion.Version.Major
                Case 5
                    Return clientVersion.XPSP2
                Case 6
                    Return clientVersion.Vista
                Case Else
                    Throw New System.NotSupportedException( _
                                       "Get a newer or older OS!")
    
            End Select
        End Function
    
    
        Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    
            Dim i As UInt32 = 0
    
            pNetList = Nothing
            result = WlanGetAvailableNetworkList(hClient, infos(0).InterfaceGuid, 0, Nothing, pNetList) 'pNetList pointe vers une structure du type WLAN_AVAILABLE_NETWORK
    
            If result <> 0 Then
                Throw New Win32Exception(Convert.ToInt32(result), " result=" & result.ToString)
                Exit Sub
            End If
    
                    Dim Netlist As WLAN_AVAILABLE_NETWORK_LIST = _
                DirectCast(Marshal.PtrToStructure(pNetList, _
                GetType(WLAN_AVAILABLE_NETWORK_LIST)), _
                WLAN_AVAILABLE_NETWORK_LIST)
    
            If Netlist.NumberOfItems = 0 Then
                MessageBox.Show("nothing found")
                CloseHClient(hClient)
                FreeMemory(pList)
                Exit Sub
            End If
    
            pNetInfos = New IntPtr(pNetList.ToInt32 + 8) ' 2 DWORDS  
    
            For i = 0 To CUInt(Netlist.NumberOfItems - 1)
    
                Dim APinfo As WLAN_AVAILABLE_NETWORK = _
                DirectCast(Marshal.PtrToStructure(pNetInfos, _
                GetType(WLAN_AVAILABLE_NETWORK)), _
                WLAN_AVAILABLE_NETWORK)
    ' APinfo contient ici l'ensemble des données.
    
                Dim StrutureLength As Integer = Marshal.SizeOf(APinfo)
                pNetInfos = New IntPtr(pNetInfos.ToInt32 + StrutureLength) ' on déplace le pointeur vers le début de la structure suivante (AP suivant)
    
            Next
    
        End Sub
    
        Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
            FreeMemory(pList)
            FreeMemory(pNetList)
            CloseHClient(hClient)
        End Sub
    
    
    End Class

    Voila c'est un début mais ca ne suffira pas
    si ca peut servir à quelqu'un tant mieux

Discussions similaires

  1. Réponses: 1
    Dernier message: 18/05/2014, 17h20
  2. Réponses: 53
    Dernier message: 28/08/2011, 18h15
  3. Réponses: 0
    Dernier message: 07/02/2010, 13h18
  4. Réponses: 1
    Dernier message: 16/03/2008, 10h00
  5. [D7] Développer une application avec des paquets
    Par aityahia dans le forum Delphi
    Réponses: 3
    Dernier message: 17/04/2007, 10h38

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo