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)
Другие примеры использования функций, входящих в класс сканирования, ищите по [ссылка этой ссылке].