Как стать автором
Обновить

Использование Wifi API в Windows. Получение списка доступных беспроводных сетей

Время на прочтение3 мин
Количество просмотров14K
В процессе работы над одной из своих программ столкнулся с необходимостью получения списка доступных беспроводных сетей. В процессе поиска информации выяснилось, что, начиная с Windows XP SP2 появился Wifi API, который может помочь решить данную задачу.
В этой статье я хочу рассказать о том, как написать простую программу, которая отображает список доступных беспроводных сетей.

Работать этот пример будет начиная с Windows XP SP2, только для SP2 придется скачать и установить Wireless LAN API package. Если у Вас Windows XP SP3 и выше (Windows Vista, Windows 7), то качать Вам ничего не нужно, все для работы на Вашей машине уже есть.

Для начала в проект необходимо включить заголовочный файл Wlanapi, и добавить библиотеку

#include <Wlanapi.h>
#pragma comment(lib, "Wlanapi.lib")

Все начинается с создания клиентской сессии путем вызова 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_LISTdwNumberOfItems.

Теперь мы можем вызвать 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

VOID WINAPI WlanFreeMemory(
  __in    PVOID pMemory
);

Клиентскую сессию закрываем используя 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);

Пример использования:

CWiFiManager wifiManager;

if(wifiManager.OpenClient())
{
  vector<WLAN_INTERFACE_INFO>  interfaces;
  vector<WLAN_AVAILABLE_NETWORK>  networks;

  if(wifiManager.GetInterfacesList(interfaces))
  {
    if(wifiManager.GetAvialableNetworks(interfaces[0].InterfaceGuid, networks))
    {
      for(size_t i = 0; i < networks.size(); ++i)
      {
        // Что-то делаем со списком сетей
      }
    }
  }
}

Скачать пример с исходниками можно по этой ссылке
Теги:
Хабы:
Всего голосов 53: ↑43 и ↓10+33
Комментарии9

Публикации

Ближайшие события