从连接管理器中获取Wi-Fi连接状态

Obtaining wi-fi connection status from Connection Manager

本文关键字:连接 Wi-Fi 状态 获取 管理器 连接管      更新时间:2023-10-16

我有一些代码,可以在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];
        :
    }
}

这一切都很好,在内部循环中,我可以通过网络数据结构访问我需要的所有属性,例如信号强度,安全标志等。

我无法获得的一件事是有关连接状态的信息,例如身份验证或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 App,而不是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;
}

此检查的一个限制是,它不容易支持同一接口上的多个连接,此查询不允许我们查询状态所指的哪个连接。

如果我得出更好的解决方案,我将在此处报告。