ESP8266:Прошивки/Arduino/Библиотеки/Библиотека ESP8266WiFi/Класс сканирования: различия между версиями
Myagkij (обсуждение | вклад) (Новая страница: «{{ESP8266 панель перехода}} {{Перевод от Сubewriter}} {{Myagkij-редактор}} {{Черновик}} =Класс сканирован…») |
Нет описания правки |
||
(не показана 1 промежуточная версия этого же участника) | |||
Строка 3: | Строка 3: | ||
{{Myagkij-редактор}} | {{Myagkij-редактор}} | ||
=Класс сканирования в библиотеке ESP8266WiFi<ref>[http://arduino-esp8266.readthedocs.io/en/latest/esp8266wifi/scan-class.html arduino-esp8266.readthedocs.io - Scan Class]</ref>= | =Класс сканирования в библиотеке ESP8266WiFi<ref>[http://arduino-esp8266.readthedocs.io/en/latest/esp8266wifi/scan-class.html arduino-esp8266.readthedocs.io - Scan Class]</ref>= | ||
Строка 19: | Строка 19: | ||
Это функция '''«все в одном»'''. Она сканирует доступные [[WiFi]]-сети, а затем возвращает количество обнаруженных сетей. | Это функция '''«все в одном»'''. Она сканирует доступные [[WiFi]]-сети, а затем возвращает количество обнаруженных сетей. | ||
<syntaxhighlight lang="c | <syntaxhighlight lang="c"> | ||
WiFi.scanNetworks() | WiFi.scanNetworks() | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Строка 25: | Строка 25: | ||
У этой функции есть и другая версия, имеющая два опциональных параметра – для асинхронного сканирования и поиска скрытых сетей. | У этой функции есть и другая версия, имеющая два опциональных параметра – для асинхронного сканирования и поиска скрытых сетей. | ||
<syntaxhighlight lang="c | <syntaxhighlight lang="c"> | ||
WiFi.scanNetworks(async, show_hidden) | WiFi.scanNetworks(async, show_hidden) | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Строка 37: | Строка 37: | ||
Проверяет результаты асинхронного сканирования. | Проверяет результаты асинхронного сканирования. | ||
<syntaxhighlight lang="c | <syntaxhighlight lang="c"> | ||
WiFi.scanComplete() | WiFi.scanComplete() | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Строка 49: | Строка 49: | ||
Удаляет из памяти результаты последнего сканирования. | Удаляет из памяти результаты последнего сканирования. | ||
<syntaxhighlight lang="c | <syntaxhighlight lang="c"> | ||
WiFi.scanDelete() | WiFi.scanDelete() | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Строка 57: | Строка 57: | ||
Запускает сканирование доступных [[WiFi]]-сетей. После завершения запускает другую функцию. | Запускает сканирование доступных [[WiFi]]-сетей. После завершения запускает другую функцию. | ||
<syntaxhighlight lang="c | <syntaxhighlight lang="c"> | ||
WiFi.scanNetworksAsync(onComplete, show_hidden) | WiFi.scanNetworksAsync(onComplete, show_hidden) | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Строка 67: | Строка 67: | ||
==== Пример кода: ==== | ==== Пример кода: ==== | ||
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS | <syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS"> | ||
#include "ESP8266WiFi.h" | #include "ESP8266WiFi.h" | ||
Строка 97: | Строка 97: | ||
Пример данных, показываемых в мониторе порта: | Пример данных, показываемых в мониторе порта: | ||
<syntaxhighlight lang="c | <syntaxhighlight lang="c"> | ||
5 network(s) found | 5 network(s) found | ||
1: Tech_D005107, Ch:6 (-72dBm) | 1: Tech_D005107, Ch:6 (-72dBm) | ||
Строка 116: | Строка 116: | ||
Возвращает данные о [[SSID]] сети, обнаруженной во время сканирования. | Возвращает данные о [[SSID]] сети, обнаруженной во время сканирования. | ||
<syntaxhighlight lang="c | <syntaxhighlight lang="c"> | ||
WiFi.SSID(networkItem) | WiFi.SSID(networkItem) | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Строка 126: | Строка 126: | ||
Возвращает данные о типе шифрования, который используется для сети, найденной в процессе сканирования. | Возвращает данные о типе шифрования, который используется для сети, найденной в процессе сканирования. | ||
<syntaxhighlight lang="c | <syntaxhighlight lang="c"> | ||
WiFi.encryptionType(networkItem) | WiFi.encryptionType(networkItem) | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Строка 143: | Строка 143: | ||
Возвращает данные о [[RSSI]] (от '''«received signal strength indication»''', что значит '''«показатель уровня принимающего сигнала»''') сети, найденной в процессе сканирования. | Возвращает данные о [[RSSI]] (от '''«received signal strength indication»''', что значит '''«показатель уровня принимающего сигнала»''') сети, найденной в процессе сканирования. | ||
<syntaxhighlight lang="c | <syntaxhighlight lang="c"> | ||
WiFi.RSSI(networkItem) | WiFi.RSSI(networkItem) | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Строка 153: | Строка 153: | ||
Возвращает данные о [[BSSID]] (от '''«basic service set identifier»''', что значит '''«идентификатор базового служебного устройства»'''), т.е. о [[MAC-адрес]]е сети, найденной в процессе сканирования. | Возвращает данные о [[BSSID]] (от '''«basic service set identifier»''', что значит '''«идентификатор базового служебного устройства»'''), т.е. о [[MAC-адрес]]е сети, найденной в процессе сканирования. | ||
<syntaxhighlight lang="c | <syntaxhighlight lang="c"> | ||
WiFi.BSSID(networkItem) | WiFi.BSSID(networkItem) | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Строка 161: | Строка 161: | ||
Если вы не любите работать с указателями, у этой функции есть другая версия, которая возвращает данные типа String. | Если вы не любите работать с указателями, у этой функции есть другая версия, которая возвращает данные типа String. | ||
<syntaxhighlight lang="c | <syntaxhighlight lang="c"> | ||
WiFi.BSSIDstr(networkItem) | WiFi.BSSIDstr(networkItem) | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Строка 171: | Строка 171: | ||
Возвращает информацию о канале сети, найденной во время сканирования. | Возвращает информацию о канале сети, найденной во время сканирования. | ||
<syntaxhighlight lang="c | <syntaxhighlight lang="c"> | ||
WiFi.channel(networkItem) | WiFi.channel(networkItem) | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Строка 181: | Строка 181: | ||
Возвращает информацию о том, является ли скрытой сеть, найденная во время сканирования. | Возвращает информацию о том, является ли скрытой сеть, найденная во время сканирования. | ||
<syntaxhighlight lang="c | <syntaxhighlight lang="c"> | ||
WiFi.isHidden(networkItem) | WiFi.isHidden(networkItem) | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Строка 191: | Строка 191: | ||
Возвращает за один раз всю информацию, о которой рассказывалось в этой главе. | Возвращает за один раз всю информацию, о которой рассказывалось в этой главе. | ||
<syntaxhighlight lang="c | <syntaxhighlight lang="c"> | ||
WiFi.getNetworkInfo(networkItem, &ssid, &encryptionType, &RSSI, *&BSSID, &channel, &isHidden) | WiFi.getNetworkInfo(networkItem, &ssid, &encryptionType, &RSSI, *&BSSID, &channel, &isHidden) | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Строка 199: | Строка 199: | ||
====Пример кода:==== | ====Пример кода:==== | ||
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS | <syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS"> | ||
int n = WiFi.scanNetworks(false, true); | int n = WiFi.scanNetworks(false, true); | ||
Строка 218: | Строка 218: | ||
Пример данных, которые будут показаны в мониторе порта: | Пример данных, которые будут показаны в мониторе порта: | ||
<syntaxhighlight lang="bash | <syntaxhighlight lang="bash"> | ||
6 network(s) found | 6 network(s) found | ||
1: Tech_D005107, Ch:6 (-72dBm) | 1: Tech_D005107, Ch:6 (-72dBm) |
Текущая версия от 12:51, 18 июня 2023
Класс сканирования в библиотеке 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)
Другие примеры использования функций, входящих в класс сканирования, ищите по [ссылка этой ссылке].