ESP8266:Прошивки/Arduino/Библиотеки/Библиотека ESP8266WiFi/Класс сканирования

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску

Перевод: Максим Кузьмин
Проверка/Оформление/Редактирование: Мякишев Е.А.



Класс сканирования в библиотеке ESP8266WiFi[1]

Этот класс представлен в Arduino-библиотеке для WiFi в виде функции scanNetworks(). Но разработчики аддона ESP8266 для IDE Arduino расширили его функционал за счет дополнительных функций и свойств.

Эта статья состоит из двух частей. Первая рассказывает о функциях для сканирования доступных сетей, а вторая – о том, какая информация собирается во время сканирования и как ее извлечь.

Сканирование сетей

На сканирование сетей уходят сотни миллисекунд. Сканирование можно выполнить за один раз – путем запуска процесса сканирования, ожидания выполнения и показа результатов. То есть все действия при помощи одной функции. Другой вариант – это разбить эти действия на несколько шагов, для каждого выделив отдельную функцию. В результате мы сможем делать сканирование, а попутно выполнять какие-то другие задачи. Это называется «асинхронным сканированием». Ниже описаны оба метода сканирования.

scanNetworks()

Это функция «все в одном». Она сканирует доступные WiFi-сети, а затем возвращает количество обнаруженных сетей.

WiFi.scanNetworks()

У этой функции есть и другая версия, имеющая два опциональных параметра – для асинхронного сканирования и поиска скрытых сетей.

WiFi.scanNetworks(async, show_hidden)

Оба параметра имеют тип данных boolean и означают следующее:

  • async – если установить в этом параметре true, сканирование запустится фоновым процессом, а сама функция завершится, не дожидаясь результата. Чтобы узнать результат, воспользуйтесь функцией scanComplete(), подробнее о которой будет рассказано ниже.
  • show_hidden – если установить в этом параметре true, в результатах сканирования будут также показаны скрытые SSID

scanComplete()

Проверяет результаты асинхронного сканирования.

WiFi.scanComplete()

После завершения сканирования возвращает количество обнаруженных сетей. Если сканирование не выполнено, функция вернет одно из этих значений:

  • «-1» – если сканирование еще выполняется
  • «-2» – если сканирование не было запущено

scanDelete()

Удаляет из памяти результаты последнего сканирования.

WiFi.scanDelete()

scanNetworksAsync()

Запускает сканирование доступных WiFi-сетей. После завершения запускает другую функцию.

WiFi.scanNetworksAsync(onComplete, show_hidden)

Параметры означают следующее:

  • onComplete – обработчик события, запускаемый после завершения сканирования
  • show_hidden – опциональный булев параметр; если выставить его на true, ESP8266 просканирует скрытые сети

Пример кода:

#include "ESP8266WiFi.h"

void prinScanResult(int networksFound)
{
  Serial.printf("%d network(s) found\n", networksFound);
  for (int i = 0; i < networksFound; i++)
  {
    Serial.printf("%d: %s, Ch:%d (%ddBm) %s\n", i + 1, WiFi.SSID(i).c_str(), WiFi.channel(i), WiFi.RSSI(i), WiFi.encryptionType(i) == ENC_TYPE_NONE ? "open" : "");
  }
}


void setup()
{
  Serial.begin(115200);
  Serial.println();

  WiFi.mode(WIFI_STA);
  WiFi.disconnect();
  delay(100);

  WiFi.scanNetworksAsync(prinScanResult);
}

void loop() {}

Пример данных, показываемых в мониторе порта:

5 network(s) found
1: Tech_D005107, Ch:6 (-72dBm)
2: HP-Print-A2-Photosmart 7520, Ch:6 (-79dBm)
3: ESP_0B09E3, Ch:9 (-89dBm) open
4: Hack-4-fun-net, Ch:9 (-91dBm)
5: UPC Wi-Free, Ch:11 (-79dBm)

Показ результатов

Функции, описанные ниже, предоставляют доступ к результатам сканирования. Не важно, какой именно способ сканирования использовался, синхронный или асинхронный, т.к. результаты сканирования доступны через одни и те же API.

Доступ к результатам об отдельной сети осуществляется при помощи параметра networkItem, который означает индекс (с отсчетом от нуля) обнаруженной сети.

SSID()

Возвращает данные о SSID сети, обнаруженной во время сканирования.

WiFi.SSID(networkItem)

Возвращаемое значение имеет тип String. Параметр networkItem – это индекс сети (с отсчетом от нуля), найденной в процессе сканирования.

encryptionType()

Возвращает данные о типе шифрования, который используется для сети, найденной в процессе сканирования.

WiFi.encryptionType(networkItem)

Функция может вернуть следующие значения:

  • «5» (ENC_TYPE_WEP) – WEP
  • «2» (ENC_TYPE_TKIP) – WPA / PSK
  • «4» (ENC_TYPE_CCMP) – WPA2 / PSK
  • «7» (ENC_TYPE_NONE) – открытая сеть
  • «8» (ENC_TYPE_AUTO) – WPA / WPA2 / PSK

Параметр networkItem – это индекс сети networkItem, найденной в процессе сканирования.

RSSI()

Возвращает данные о RSSI (от «received signal strength indication», что значит «показатель уровня принимающего сигнала») сети, найденной в процессе сканирования.

WiFi.RSSI(networkItem)

Возвращаемое значение имеет тип int32_t. Параметр networkItem – это индекс сети networkItem, найденной в процессе сканирования.

BSSID()

Возвращает данные о BSSID (от «basic service set identifier», что значит «идентификатор базового служебного устройства»), т.е. о MAC-адресе сети, найденной в процессе сканирования.

WiFi.BSSID(networkItem)

Функция возвращает указатель на участок памяти (массив uint8_t из 6 элементов), в котором хранится BSSID.

Если вы не любите работать с указателями, у этой функции есть другая версия, которая возвращает данные типа String.

WiFi.BSSIDstr(networkItem)

Параметр networkItem – это индекс (отсчет идет от нуля) сети, найденной во время сканирования.

channel()

Возвращает информацию о канале сети, найденной во время сканирования.

WiFi.channel(networkItem)

Возвращаемое значение имеет тип данных int32_t. Параметр networkItem – это индекс (отсчет идет от нуля) сети, найденной во время сканирования.

isHidden()

Возвращает информацию о том, является ли скрытой сеть, найденная во время сканирования.

WiFi.isHidden(networkItem)

Возвращаемое значение имеет тип boolean, и значение true будет значить, что сеть скрыта. Параметр networkItem – это индекс (отсчет идет от нуля) сети, найденной в процессе сканирования.

getNetworkInfo()

Возвращает за один раз всю информацию, о которой рассказывалось в этой главе.

WiFi.getNetworkInfo(networkItem, &ssid, &encryptionType, &RSSI, *&BSSID, &channel, &isHidden)

Параметр networkItem – это индекс (отсчет идет от нуля) сети, найденной при сканировании. Все остальные параметры передаются функции в виде указателей к памяти. В дальнейшем все они будут обновлены значениями, соответствующими сети, заданной параметром networkItem. Кроме того, функция вернет true или false – в зависимости от того, успешно ли была извлечена информация или нет.

Пример кода:

int n = WiFi.scanNetworks(false, true);

String ssid;
uint8_t encryptionType;
int32_t RSSI;
uint8_t* BSSID;
int32_t channel;
bool isHidden;

for (int i = 0; i < n; i++)
{
  WiFi.getNetworkInfo(i, ssid, encryptionType, RSSI, BSSID, channel, isHidden);
  Serial.printf("%d: %s, Ch:%d (%ddBm) %s %s\n", i + 1, ssid.c_str(), channel, RSSI, encryptionType == ENC_TYPE_NONE ? "open" : "", isHidden ? "hidden" : "");
}

Пример данных, которые будут показаны в мониторе порта:

6 network(s) found
1: Tech_D005107, Ch:6 (-72dBm)
2: HP-Print-A2-Photosmart 7520, Ch:6 (-79dBm)
3: ESP_0B09E3, Ch:9 (-89dBm) open
4: Hack-4-fun-net, Ch:9 (-91dBm)
5: , Ch:11 (-77dBm)  hidden
6: UPC Wi-Free, Ch:11 (-79dBm)

Другие примеры использования функций, входящих в класс сканирования, ищите по [ссылка этой ссылке].

См.также

Внешние ссылки