다음을 통해 공유


WLAN_REALTIME_CONNECTION_QUALITY 구조체(wlanapi.h)

중요

일부 정보는 상용 출시 전에 실질적으로 수정될 수 있는 시험판 제품과 관련이 있습니다. Microsoft는 여기에 제공된 정보에 대해 어떠한 명시적이거나 묵시적인 보증도 하지 않습니다.

지정된 인터페이스의 연결 품질을 설명하는 특성을 나타냅니다.

구문

typedef struct _WLAN_REALTIME_CONNECTION_QUALITY {
  DOT11_PHY_TYPE                             dot11PhyType;
  ULONG                                      ulLinkQuality;
  ULONG                                      ulRxRate;
  ULONG                                      ulTxRate;
  BOOL                                       bIsMLOConnection;
  ULONG                                      ulNumLinks;
  WLAN_REALTIME_CONNECTION_QUALITY_LINK_INFO linksInfo[1];
} WLAN_REALTIME_CONNECTION_QUALITY, *PWLAN_REALTIME_CONNECTION_QUALITY;

멤버

dot11PhyType

연결의 물리적 형식을 나타내는 DOT11_PHY_TYPE 값입니다.

ulLinkQuality

연결의 신호 품질을 나타내는 ULONG 백분율 값입니다. 이 멤버는 0에서 100 사이의 값을 포함합니다. 값 0은 -100 dbm의 실제 RSSI 신호 강도를 의미합니다. 값이 100이면 실제 RSSI 신호 강도가 -50dbm인 것을 의미합니다. 선형 보간을 사용하여 1에서 99 사이의 ulLinkQuality 값에 대한 RSSI 신호 강도 값을 계산할 수 있습니다.

ulRxRate

연결의 수신 속도를 포함합니다.

ulTxRate

연결의 전송 속도를 포함합니다.

bIsMLOConnection

MLO(다중 연결 작업) 연결인지 여부를 나타냅니다.

ulNumLinks

연결된 링크 수입니다.

linksInfo[1]

ulNumLinks 크기의 WLAN_REALTIME_CONNECTION_QUALITY_LINK_INFO. 각 요소에는 서로 다른 연결된 링크에 대한 정보가 포함됩니다.

설명

예제

DWORD IsWLANLinkSpeedSufficient(
    GUID* interfaceGuid,
    const ULONG minRequiredLinkQuality,
    const ULONG requiredRxRate,
    const ULONG requiredTxRate,
    bool* isSufficient)
{
    wil::unique_wlan_handle clientHandle;
    DWORD maxClientVersion = 2;
    DWORD currentClientVersion = 0;
    DWORD result = WlanOpenHandle(maxClientVersion, nullptr, &currentClientVersion, &clientHandle);
    if (result != ERROR_SUCCESS) 
    {
        wprintf(L"WlanOpenHandle failed with error: %u\n", result);
        return result;
    }

    DWORD connectionQualitySize = 0;
    wil::unique_wlan_ptr<WLAN_REALTIME_CONNECTION_QUALITY> connectionQuality;
    result = WlanQueryInterface(
        clientHandle.get(), 
        interfaceGuid,
        wlan_intf_opcode_realtime_connection_quality,
        nullptr,
        &connectionQualitySize,
        wil::out_param_ptr<void**>(connectionQuality),
        nullptr);
    if (result != ERROR_SUCCESS) 
    {
        wprintf(L"WlanQueryInterface failed with error: %u\n", result);
        return result;
    }

    if (connectionQuality->ulLinkQuality < minRequiredLinkQuality || 
        connectionQuality->ulRxRate < requiredRxRate ||
        connectionQuality->ulTxRate < requiredTxRate)
    {
        *isSufficient = false;
    }
    else
    {
        *isSufficient = true;
    }
    return ERROR_SUCCESS;
}

DWORD GetCenterChannelFrequencyOfLinkWithBestRSSI(GUID* interfaceGuid, ULONG* channelFrequency)
{
    wil::unique_wlan_handle clientHandle;
    DWORD maxClientVersion = 2;
    DWORD currentClientVersion = 0;
    DWORD result = WlanOpenHandle(maxClientVersion, nullptr, &currentClientVersion, &clientHandle);
    if (result != ERROR_SUCCESS) 
    {
        wprintf(L"WlanOpenHandle failed with error: %u\n", result);
        return result;
    }

    DWORD connectionQualitySize = 0;
    wil::unique_wlan_ptr<WLAN_REALTIME_CONNECTION_QUALITY> connectionQuality;
    result = WlanQueryInterface(
        clientHandle.get(), 
        interfaceGuid,
        wlan_intf_opcode_realtime_connection_quality,
        nullptr,
        &connectionQualitySize,
        wil::out_param_ptr<void**>(connectionQuality),
        nullptr);
    if (result != ERROR_SUCCESS) 
    {
        wprintf(L"WlanQueryInterface failed with error: %u\n", result);
        return result;
    }

    auto linkWithBestRssi = std::min_element(
        connectionQuality->linksInfo,
        connectionQuality->linksInfo + connectionQuality->ulNumLinks,
        [](const WLAN_REALTIME_CONNECTION_QUALITY_LINK_INFO& lhs, const WLAN_REALTIME_CONNECTION_QUALITY_LINK_INFO& rhs) {
            return lhs.lRssi > rhs.lRssi; // `Greater than` because RSSI is negative.
        });

    *channelFrequency = linkWithBestRssi->ulChannelCenterFrequencyMhz;
    return ERROR_SUCCESS;
}

요구 사항

요구 사항
헤더 wlanapi.h