SW 개발

winCE / WM / wifi 의 정보 얻어오기 / 예제코드

. . . 2012. 3. 31. 10:28
반응형

windows CE / windows mobile 에서 wzc api 를 이용하여 무선랜의 거의 모든 정보를 얻어올 수 있다.


하지만,

여기서 주의할 점은 wifi 의 rssi 정보와 같이 실시간으로 변하는 정보의 경우 wzc 에서 올라오는 데이터 자체가 정확하지 않다는 것이다. 

(정확하지 않다는 것은 올라온 데이터 들이 실시간데이터가 아니라 약간 시간이지난 데이터라는 것이다;;)


그래서 네트워크 관련 프로그래밍을 할때 wzc 와 NDIS 인터페이스를 적절하게 섞어가면서 코딩하면 좋은것 같다.


예를들면... 주변 AP 의 RSSI 정보를 얻기위해서 NDIS 로 rescan 명령을 보낸후에 wzc를 이용하여 주변 AP 의 RSSI 를 얻는다.


#include <windows.h>
#include <windef.h>
#include <stdio.h>
#include <stdarg.h>
#include <eapol.h>
#include <wzcsapi.h>
#include <ntddndis.h>

#include <commctrl.h>
#include <winioctl.h> 
#include <stdlib.h>
#include <nuiouser.h>

#pragma comment(lib, "wzcsapi.lib")

void 
GetWirelessDriverName(WCHAR* szBuff)
{
    INTFS_KEY_TABLE IntfsTable;
    IntfsTable.dwNumIntfs = 0;
    IntfsTable.pIntfs = NULL;

    DWORD dwStatus = WZCEnumInterfaces(NULL, &IntfsTable);

    if(dwStatus != ERROR_SUCCESS)
    {
        RETAILMSG(1,(L"WZCEnumInterfaces() error 0x%08X\r\n", dwStatus));
        return;        
    }

    if(!IntfsTable.dwNumIntfs)
    {
        RETAILMSG(1,(L"system has no wireless card.\r\n"));
        wcscpy(szBuff, (L"has no Wlan card.\r\n"));
        return;
    }

    wcscpy(szBuff, IntfsTable.pIntfs[0].wszGuid);

    // need to free memory allocated by WZC for us.
    LocalFree(IntfsTable.pIntfs);
}   // GetFirstWirelessNetworkCard


void PrintWifiInfo()
{
    WCHAR szBuff[128];
    GetWirelessDriverName(szBuff);

    WCHAR *szWiFiCard = szBuff;
        
    INTF_ENTRY_EX Intf;
    DWORD dwOutFlags;
    memset(&Intf, 0x00, sizeof(INTF_ENTRY_EX));
    Intf.wszGuid = szWiFiCard;
    
    DWORD dwStatus = WZCQueryInterfaceEx(
                        NULL,
                        INTF_ALL,
                        &Intf,
                        &dwOutFlags);

    if (dwStatus != ERROR_SUCCESS)
    {
        RETAILMSG(1,(L"WZCQueryInterfaceEx() error 0x%08X\r\n", dwStatus));
        return;
    }


    //==========================================
    // 현재 연결된 AP의 SSID의 정보를 표시
    //==========================================
    PRAW_DATA prdSSID = &Intf.rdSSID;  // RAW SSID data
    WCHAR szSsid[33];
    if (prdSSID == NULL || prdSSID->dwDataLen == 0)
        RETAILMSG(1,(L"<NULL>"));
    else
    {
        
        for (UINT i = 0; i < prdSSID->dwDataLen; i++)
            szSsid[i] = prdSSID->pData[i];
        szSsid[i] = L'\0';
        // !!!! 이곳에서 SSID의 정보를 보낸다!!
    }
    

    //==========================================
    // wifi 의 MAC 정보를 표시
    //==========================================
    PRAW_DATA prdMAC = &Intf.rdBSSID;
    WCHAR szMacBuff[128];
    if (prdMAC == NULL || prdMAC->dwDataLen == 0)
        ;
    else if(prdMAC->dwDataLen != 6)
        ;
    else
    {
        
        // !!!! 이곳에서 Mac 정보를 보낸다!!!
        swprintf(szMacBuff,(TEXT("%02X:%02X:%02X:%02X:%02X:%02X")),
            //swprintf(szBuff,(TEXT("%02X:%02X:%02X:%02X:%02X:%02X")),
            prdMAC->pData[0],
            prdMAC->pData[1],
            prdMAC->pData[2],
            prdMAC->pData[3],
            prdMAC->pData[4],
            prdMAC->pData[5]);
    }
    
    //==========================================
    // 주변에 이용가능한 모든 AP검색!!
    //==========================================    
    PRAW_DATA prdBSSIDList = &Intf.rdBSSIDList;

    if (!(prdBSSIDList == NULL || prdBSSIDList->dwDataLen == 0))
    {
        PWZC_802_11_CONFIG_LIST pConfigList = (PWZC_802_11_CONFIG_LIST)prdBSSIDList->pData;

        for (UINT i = 0; i < pConfigList->NumberOfItems; i++)
        {
            PWZC_WLAN_CONFIG pConfig = &(pConfigList->Config[i]);
        }
    }
    
//    &Intf.rdBSSIDList   // 이곳에는 현재 사용가능한 AP의 List
    WZCDeleteIntfObjEx(&Intf);
}


위의 코드는 wzctools에서 필요한 부분만 잘라서 코딩하였다.

반응형