1

Ich habe einige Code, der erfolgreich über eine Liste von Wi-Fi-Netzwerken iteriert, und gibt Feedback zu verfügbaren Netzwerken. Die wesentlichen Anrufe hier gezeigt ...Erhalten von Wi-Fi-Verbindungsstatus von 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]; 
     : 
    } 
} 

Das alles funktioniert gut, und innerhalb der inneren Schleife Ich bin in der Lage alle Attribute zuzugreifen, die ich brauche, wie Signalstärke, Sicherheit Flaggen, etc. über die Netzwerk-Datenstruktur.

Eine Sache, die ich nicht in der Lage bin zu erhalten, ist Informationen über den Verbindungsstatus, wie Authentifizieren oder AUTHENTICATION_FAILED, usw., also habe ich versucht, einen weiteren Anruf innerhalb der Schleife wie folgt vorstellen ...

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) 
{ 
    : 
} 

Beim Aufrufen der Funktion CmGetConnectionDetailsByName() sehen die Details in der CM_CONNECTION_DETAILS-Struktur korrekt aus (Name und Version), die Funktion kehrt jedoch mit CMRE_INVALID_CONNECTION zurück und die Struktur wird nicht aufgefüllt.

Ich konnte keine Beispiele finden, dass dieser Aufruf erfolgreich war (nur ein paar Referenzen auf den Aufruf, die den gleichen CMRE_INVALID_CONNECTION-Code zurückgeben).

Hat jemand Erfahrung damit, den Anruf erfolgreich zu verwenden, oder schlagen Sie alternativ einen besseren Weg vor, um den Verbindungsstatus eines Netzwerks herauszufinden (zB wenn AUTHENTICATION läuft oder AUTHENTICATION fehlgeschlagen ist, usw.)?

[Ich bin mit Visual Studio 2013 C++ (native Windows-Anwendung, nicht MFC), das Ziel ist 32-Bit und Unicode, auf Windows Compact 2013]

Antwort

0

Die Funktion ziemlich mir nicht unten nicht geben die Feinkontrolle, die ich suchte, aber es gibt mir zumindest die Möglichkeit, den Staat eine bestimmte Schnittstelle zu finden. Das bedeutet, dass ich herausfinden kann, ob sich die Schnittstelle gerade im Prozess befindet oder authentifiziert. Abhängig davon, ob der Endstatus verbunden oder getrennt ist, kann ich herausfinden, ob die Authentifizierung erfolgreich war oder nicht.

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; 
} 

Eine Einschränkung dieser Prüfung ist, dass es nicht ohne weiteres mehrere Verbindungen auf der gleichen Schnittstelle unterstützt das, Diese Abfrage uns nicht erlauben, abzufragen, zu der der Verbindungen der Status bezieht.

Wenn ich zu einer besseren Lösung komme, werde ich es hier melden.

Verwandte Themen