CE获取Wifi的设备名、连接状态和信号强度

    技术2025-12-02  5

     

     

    CE 获取 Wifi 的设备名、连接状态和信号强度  

    CE获取Wifi的设备名、连接状态和信号强度

    Note:需CE4.0或更高版本(兼容NDIS5.1)支持 一、加入头文件 #include <winioctl.h> #include <ntddndis.h> #include <nuiouser.h> 二、Attach to NDISUIO HANDLE hNdis = ::CreateFile( NDISUIO_DEVICE_NAME, GENERIC_ALL, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED, (HANDLE)INVALID_HANDLE_VALUE );

    三、获取设备名称

    UCHAR cbQueryBuffer[ 1024 ]; PNDISUIO_QUERY_BINDING pQueryBinding; DWORD dwBytesReturned = 0; pQueryBinding = (PNDISUIO_QUERY_BINDING)&cbQueryBuffer[ 0 ]; pQueryBinding->BindingIndex = 0; if ( ::DeviceIoControl( hNdis, IOCTL_NDISUIO_QUERY_BINDING, (LPVOID)&cbQueryBuffer[ 0 ], sizeof(NDISUIO_QUERY_BINDING), (LPVOID)&cbQueryBuffer[ 0 ], sizeof(cbQueryBuffer), &dwBytesReturned, NULL ) == TRUE ) { TCHAR* pDeviceName = (TCHAR*)( cbQueryBuffer + pQueryBinding->DeviceNameOffset ); }

     

    四、检测连接状态

    NIC_STATISTICS nicStatistics = { 0 }; DWORD dwBytesReturned = 0; BOOL bConnected = FALSE; nicStatistics.ptcDeviceName = pDeviceName; if ( ::DeviceIoControl( hNdis, IOCTL_NDISUIO_NIC_STATISTICS, NULL, 0, &nicStatistics, sizeof(NIC_STATISTICS), &dwBytesReturned, NULL ) == TRUE ) { bConnected = ( nicStatistics.MediaState == MEDIA_STATE_CONNECTED ); }

    五、获取信号强度

    // example. // < -90 : No Signal // < -81 : Very Low // < -71 : Low // < -67 : Good // < -57 : Very Good // ... : Excellent NDISUIO_QUERY_OID ndisQueryOid = { 0 }; DWORD dwBytesReturned = 0; int nDb = 0; ndisQueryOid.Oid = OID_802_11_RSSI; ndisQueryOid.ptcDeviceName = pDeviceName; if ( ::DeviceIoControl( hNdis, IOCTL_NDISUIO_QUERY_OID_VALUE, (LPVOID)&ndisQueryOid, sizeof(ndisQueryOid), (LPVOID)&ndisQueryOid, sizeof(ndisQueryOid), &dwBytesReturned, NULL ) == TRUE ) { ::CopyMemory( &nDb, &ndisQueryOid.Data[ 0 ], sizeof(ULONG) ); }   又一篇文章获取信号强度:

    void OnBnClickedButtonWifi(){    HANDLE hNdis = ::CreateFile( NDISUIO_DEVICE_NAME, GENERIC_ALL, 0, NULL, OPEN_EXISTING,                             FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED,                             (HANDLE)INVALID_HANDLE_VALUE );    //DEVICE NAME    UCHAR                  cbQueryBuffer[ 1024 ];    PNDISUIO_QUERY_BINDING pQueryBinding;    DWORD                  dwBytesReturned = 0;    TCHAR* pDeviceName;    pQueryBinding = (PNDISUIO_QUERY_BINDING)&cbQueryBuffer[ 0 ];    pQueryBinding->BindingIndex = 0;    if ( ::DeviceIoControl( hNdis,                            IOCTL_NDISUIO_QUERY_BINDING,                            (LPVOID)&cbQueryBuffer[ 0 ],                            sizeof(NDISUIO_QUERY_BINDING),                            (LPVOID)&cbQueryBuffer[ 0 ],                            sizeof(cbQueryBuffer),                            &dwBytesReturned,                            NULL ) == TRUE )    {        pDeviceName = (TCHAR*)( cbQueryBuffer + pQueryBinding->DeviceNameOffset );    }#if 0    //CONNECT STATUS    NIC_STATISTICS nicStatistics = { 0 };        BOOL bConnected = FALSE;    nicStatistics.ptcDeviceName = pDeviceName;    if ( ::DeviceIoControl( hNdis,                            IOCTL_NDISUIO_NIC_STATISTICS,                            NULL,                            0,                            &nicStatistics,                            sizeof(NIC_STATISTICS),                            &dwBytesReturned,                            NULL ) == TRUE )    {        if( nicStatistics.MediaState == MEDIA_STATE_CONNECTED )            m_edit1.SetWindowTextW(L"Connected");            else            m_edit1.SetWindowTextW(L"not connect");    }#endif    NDISUIO_QUERY_OID ndisQueryOid = { 0 };    int nDb = 0;    ndisQueryOid.Oid = OID_802_11_RSSI;    ndisQueryOid.ptcDeviceName = pDeviceName;    if ( ::DeviceIoControl( hNdis,                            IOCTL_NDISUIO_QUERY_OID_VALUE,                            (LPVOID)&ndisQueryOid,                            sizeof(ndisQueryOid),                            (LPVOID)&ndisQueryOid,                            sizeof(ndisQueryOid),                            &dwBytesReturned,                            NULL ) == TRUE )    {        ::CopyMemory( &nDb, &ndisQueryOid.Data[ 0 ], sizeof(ULONG) );    }    CString str;    str.Format(L"%d",ndisQueryOid.Data[ 0 ]);        m_edit1.SetWindowTextW(str);    CloseHandle(hNdis);}

    最新回复(0)