Wifi api что это
В процессе работы над одной из своих программ столкнулся с необходимостью получения списка доступных беспроводных сетей. В процессе поиска информации выяснилось, что, начиная с Windows XP SP2 появился Wifi API, который может помочь решить данную задачу.
В этой статье я хочу рассказать о том, как написать простую программу, которая отображает список доступных беспроводных сетей.
Работать этот пример будет начиная с Windows XP SP2, только для SP2 придется скачать и установить Wireless LAN API package. Если у Вас Windows XP SP3 и выше (Windows Vista, Windows 7), то качать Вам ничего не нужно, все для работы на Вашей машине уже есть.
Для начала в проект необходимо включить заголовочный файл Wlanapi, и добавить библиотеку
Все начинается с создания клиентской сессии путем вызова WlanOpenHandle
DWORD WINAPI WlanOpenHandle(
__in DWORD dwClientVersion,
__reserved PVOID pReserved,
__out PDWORD pdwNegotiatedVersion,
__out PHANDLE phClientHandle
);
Вы можете либо проверить версию операционной системы и передавать в качестве версии (dwClientVersion) 1 для Windows XP, 2 для Windows Vista и выше, либо всегда передавать 2. Даже в Windows XP вызов функции будет успешным, а pdwNegotiatedVersion укажет нам на выбранную ОС версию клиента.
Клиент создан, хэндл на него получен, теперь необходимо выбрать интерфейс, с которым мы будем работать. Список доступных интерфейсов мы получим вызвав WlanEnumInterfaces
DWORD WINAPI WlanEnumInterfaces(
__in HANDLE hClientHandle,
__reserved PVOID pReserved,
__out PWLAN_INTERFACE_INFO_LIST *ppInterfaceList
);
Здесь hClientHandle это хэндл полученный нами в результате вызова WlanOpenHandle, а ppInterfaceList указатель на список доступных интерфейсов.
О количестве доступных интерфейсов нам расскажет член структуры WLAN_INTERFACE_INFO_LIST — dwNumberOfItems.
Теперь мы можем вызвать WlanGetAvailableNetworkList и получить список доступных сетей.
DWORD WINAPI WlanGetAvailableNetworkList(
__in HANDLE hClientHandle,
__in const GUID *pInterfaceGuid,
__in DWORD dwFlags,
__reserved PVOID pReserved,
__out PWLAN_AVAILABLE_NETWORK_LIST *ppAvailableNetworkList
);
Здесь pInterfaceGuid это указатель на GUID интерфейса, получить мы его можем из структуры WLAN_INTERFACE_INFO, список которых мы уже имеем после вызова WlanEnumInterfaces.
Параметр dwFlags может принимать следующие значения: WLAN_AVAILABLE_NETWORK_INCLUDE_ALL_ADHOC_PROFILES и WLAN_AVAILABLE_NETWORK_INCLUDE_ALL_MANUAL_HIDDEN_PROFILES.
Конечная цель ppAvailableNetworkList — указатель на структуру WLAN_AVAILABLE_NETWORK_LIST, которая в свою очередь содержит массив структур WLAN_AVAILABLE_NETWORK, которые в свою очередь описывают параметры каждой найденной сети.
После того, как мы получили, то, что хотели, необходимо освободить все указатели и закрыть все хэндлы. Указатели на список интерфейсов и список сетей освобождаем путем вызова WlanFreeMemory
Клиентскую сессию закрываем используя WlanCloseHandle
DWORD WINAPI WlanCloseHandle(
__in HANDLE hClientHandle,
__reserved PVOID pReserved
);
Как видно из статьи — ничего сложного, чтобы стало еще проще я написал класс-обертку, который имеет следующие методы:
// Создать клиентскую сессию
BOOL OpenClient();
// Закрыть клиентскую сессию
BOOL CloseClient();
// Клиентская сессия создана?
BOOL IsClientOpen();
// Получить список доступных сетей
BOOL GetAvialableNetworks(GUID interfaceGuid, vector<WLAN_AVAILABLE_NETWORK> &networks);
// Получить список доступных интерфейсов
BOOL GetInterfacesList(vector<WLAN_INTERFACE_INFO> &interfaces);
Читайте также: