반응형
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에서 필요한 부분만 잘라서 코딩하였다.
반응형