У меня есть код, который успешно перебирает список сетей 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]Приведенная ниже функция не дает мне точного контроля, который я искал, но, по крайней мере, дает мне возможность узнать состояние определенного интерфейса. Это означает, что я могу узнать, находится ли интерфейс в данный момент в процессе или проходит аутентификацию, и в зависимости от того, подключено или отключено конечное состояние, я могу узнать, была ли аутентификация успешной или нет.
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;
}
Ограничением этой проверки является то, что она не поддерживает несколько подключений на одном интерфейсе. Этот запрос не позволяет нам запрашивать, к какому из подключений относится статус.
Если я найду лучшее решение, я сообщу об этом здесь.
Других решений пока нет …