Получение статуса подключения Wi-Fi из диспетчера подключений

У меня есть код, который успешно перебирает список сетей Wi-Fi и предоставляет обратную связь о доступных сетях. Основные звонки, показанные здесь …

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

Все это работает нормально, и во внутреннем цикле я могу получить доступ ко всем необходимым атрибутам, таким как уровень сигнала, флаги безопасности и т. Д., Через структуру сетевых данных.

Одна вещь, которую я не могу получить — это информация о состоянии соединения, такая как AUTHENTICATING или AUTHENTICATION_FAILED и т. Д., Поэтому я попытался ввести еще один вызов внутри цикла следующим образом …

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

После вызова функции CmGetConnectionDetailsByName () детали в структуре CM_CONNECTION_DETAILS выглядят корректно (имя и версия), но функция возвращается с CMRE_INVALID_CONNECTION, и структура не заполняется.

Я не смог найти никаких примеров того, как этот вызов был успешным (только пара ссылок на вызов, возвращающий тот же код CMRE_INVALID_CONNECTION).

Есть ли у кого-нибудь опыт успешного использования вызова или, в качестве альтернативы, предлагается лучший способ выяснить состояние подключения к сети (т. Е. Если выполняется АУТЕНТИФИКАЦИЯ или Сбой АУТЕНТИФИКАЦИИ и т. Д.)?

[Я использую Visual Studio 2013 C ++ (собственное приложение Windows, а не MFC), цель — 32-разрядная и Unicode, работающая в Windows Compact 2013]

1

Решение

Приведенная ниже функция не дает мне точного контроля, который я искал, но, по крайней мере, дает мне возможность узнать состояние определенного интерфейса. Это означает, что я могу узнать, находится ли интерфейс в данный момент в процессе или проходит аутентификацию, и в зависимости от того, подключено или отключено конечное состояние, я могу узнать, была ли аутентификация успешной или нет.

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

Ограничением этой проверки является то, что она не поддерживает несколько подключений на одном интерфейсе. Этот запрос не позволяет нам запрашивать, к какому из подключений относится статус.

Если я найду лучшее решение, я сообщу об этом здесь.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]