1

J'ai du code qui parcourt avec succès une liste de réseaux Wi-Fi et fournit des informations sur les réseaux disponibles. Les appels essentiels présentés ici ...Obtention de l'état de la connexion Wi-Fi à partir de Connection Manager

WlanOpenHandle(WLAN_API_VERSION, NULL, &dwVersion, &hSession); 

PWLAN_INTERFACE_INFO_LIST pInterfaceInfoList = NULL; 
WlanEnumInterfaces(hSession, NULL, &pInterfaceInfoList); 

for(int i ...) 
{ 
    PWLAN_AVAILABLE_NETWORK_LIST pAvailableNetworkList = NULL; 
    WlanGetAvailableNetworkList(hSession, &interfaceGUID, 
      WLAN_AVAILABLE_NETWORK_INCLUDE_ALL_ADHOC_PROFILES | 
      WLAN_AVAILABLE_NETWORK_INCLUDE_ALL_MANUAL_HIDDEN_PROFILES, 
      NULL, &pAvailableNetworkList); 
    for(int j ...) 
    { 
     WLAN_AVAILABLE_NETWORK network = pAvailableNetworkList->Network[j]; 
     : 
    } 
} 

Tout cela fonctionne très bien, et à l'intérieur de la boucle intérieure que je suis en mesure d'accéder à tous les attributs que j'ai besoin, tels que la puissance du signal, drapeaux de sécurité, etc via structure de données de réseau.

Une chose que je ne suis pas en mesure d'obtenir des informations sur l'état est de connexion, telles que l'authentification ou AUTHENTICATION_FAILED, etc, j'ai donc essayé d'introduire un autre appel à l'intérieur de la boucle comme suit ...

CM_CONNECTION_DETAILS connectionDetails; 
memset(&connectionDetails, 0, sizeof(CM_CONNECTION_DETAILS)); 

connectionDetails.Version = CM_CURRENT_VERSION; 
const char* ccp = reinterpret_cast<const char*>(network.dot11Ssid.ucSSID); 
mbstowcs(connectionDetails.szName, &ccp[0], network.dot11Ssid.uSSIDLength); 

DWORD dwCount = sizeof(CM_CONNECTION_DETAILS); 

CM_RESULT cmr = CmGetConnectionDetailsByName(connectionDetails.szName, 
      &connectionDetails, &dwCount); 

if (cmr == CMRE_SUCCESS) 
{ 
    : 
} 

Lors de l'appel de la fonction CmGetConnectionDetailsByName(), les détails dans la structure CM_CONNECTION_DETAILS semblent corrects (nom et version), mais la fonction retourne avec CMRE_INVALID_CONNECTION et la structure n'est pas remplie.

Je n'ai pas pu trouver d'exemples de réussite de cet appel (seulement quelques références à l'appel retournant le même code CMRE_INVALID_CONNECTION). Quelqu'un a-t-il l'expérience de l'utilisation réussie de l'appel ou suggère-t-il un meilleur moyen de connaître l'état de connexion d'un réseau (si AUTHENTIFICATION est en cours ou si l'AUTHENTIFICATION a échoué, etc.)?

[Je suis en utilisant Visual Studio 2013 C++ (application native de Windows, pas MFC), la cible est de 32 bits et Unicode, fonctionnant sous Windows Compact 2013]

Répondre

0

La fonction ci-dessous ne me donne pas tout à fait le contrôle fin que je cherchais, mais il me donne au moins l'occasion de découvrir l'état d'une interface particulière. Cela signifie que je peux savoir si l'interface est actuellement en cours de traitement ou d'authentification, et selon que l'état final est connecté ou déconnecté, je peux savoir si l'authentification a réussi ou non.

WLAN_INTERFACE_STATE getNetworkState(HANDLE hSession, GUID* pGUID, std::wstring& wsState, bool bReportState=true) 
{ 
    WLAN_INTERFACE_STATE result = wlan_interface_state_not_ready; 
    DWORD dwDataSize; 
    void* pData; 
    DWORD dwErrorCode = WlanQueryInterface(hSession, pGUID, wlan_intf_opcode_interface_state, NULL, &dwDataSize, &pData, NULL); 
    if (dwErrorCode == ERROR_SUCCESS && pData != NULL) 
    { 
     WLAN_INTERFACE_STATE* pState = reinterpret_cast<WLAN_INTERFACE_STATE*>(pData); 
     if (pState != NULL) 
     { 
      switch (*pState) 
      { 
      case wlan_interface_state_not_ready:    wsState = L"NOT_READY"; break; 
      case wlan_interface_state_connected:    wsState = L"CONNECTED"; break; 
      case wlan_interface_state_ad_hoc_network_formed: wsState = L"AD_HOC_NETWORK_FORMED"; break; 
      case wlan_interface_state_disconnecting:   wsState = L"DISCONNECTING"; break; 
      case wlan_interface_state_disconnected:    wsState = L"DISCONNECTED"; break; 
      case wlan_interface_state_associating:    wsState = L"ASSOCIATING"; break; 
      case wlan_interface_state_discovering:    wsState = L"DISCOVERING"; break; 
      case wlan_interface_state_authenticating:   wsState = L"AUTHENTICATING"; break; 
      } 
      result = *pState; 
     } 
     WlanFreeMemory(pData); 
    } 
    return result; 
} 

Une limitation de ce contrôle, est qu'il ne supporte pas facilement plusieurs connexions sur la même interface, cette requête ne nous permet pas de requête à laquelle des connexions de l'état fait référence.

Si j'arrive à une meilleure solution, je vais le signaler ici.