Esp wifi localip to string

ESP32: Wi-Fi

Для работы с Wi-Fi понадобится встроенная библиотека WiFi.h (исходники). В большинстве примеров вам надо знать имя сети и пароль от него. После окончания работы желательно вызывать метод WiFi.disconnect(true);.

Базовый минимальный пример

Сначала рассмотрим базовый пример для общего понимания. Все пояснения в комментариях.

 // Подключаем библиотеку #include "WiFi.h" // Указываем идентификатор и пароль от своей WiFi-сети const char* ssid = "yourNetworkName"; const char* password = "yourNetworkPassword"; void setup() < Serial.begin(115200); // Начинаем подключение к сети WiFi.begin(ssid, password); // Проверяем статус. Если нет соединения, то выводим сообщение о подключении while (WiFi.status() != WL_CONNECTED) < delay(1000); Serial.println("Соединяемся к WiFi-сети. "); >Serial.println("Есть подключение к WiFi-сети"); > void loop() <> 

В нашем примере соединение с сетью WiFi происходит лишь в функции setup(), которая активируется только один раз при включении платы. Соответственно, при перезагрузке маршрутизатора или потере WiFi-сигнала соединение не будет восстановлено. Чтобы этого избежать, нужно добавить в функцию loop() проверку на необходимость восстановления соединения.

 while (WiFi.status() != WL_CONNECTED)

Для простых примеров это не требуется, но в реально действующем коде такая проверка желательна.

Теперь можно писать более сложные примеры.

Получить IP-адреса

В пассивном режиме без входа в сеть вы получите IP-адрес, равный 0.0.0.0. Если нужно получить реальный адрес, то скетч нужно переписать. Добавим возможность входа в сеть, используя учётные данные.

 #include "WiFi.h" const char* ssid = "yourNetworkName"; const char* password = "yourNetworkPassword"; void setup() < Serial.begin(115200); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) < delay(1000); Serial.println("Connecting to WiFi.."); >Serial.print("IP address: "); Serial.println(WiFi.localIP()); Serial.print("Hostname: "); Serial.println(WiFi.getHostname()); Serial.print("ESP Mac Address: "); Serial.println(WiFi.macAddress()); Serial.print("Subnet Mask: "); Serial.println(WiFi.subnetMask()); Serial.print("Gateway IP: "); Serial.println(WiFi.gatewayIP()); Serial.print("DNS: "); Serial.println(WiFi.dnsIP()); > void loop() <> 

Теперь вы получите реальный IP-адрес. Узнав адрес через WiFi.localIP(), вы можете в командной строке ввести команду ping ESP_ADDRESS (подставьте ваш адрес), чтобы убедиться, что устройство находится в сети. Пригодится для отладки примеров.

Метод WiFi.getHostname() возвращает имя платы espressif. По идее по этому имени тоже можно обращаться через команду ping espressif, но у меня этот вариант не заработал.

Также привёл другие вызовы функций, которые встречаются в библиотеке.

Другой вариант получения IP-адреса через лямбда-функции.

 #include "WiFi.h" const char* ssid = "yourNetworkName"; const char* password = "yourNetworkPassword"; void setup() < Serial.begin(115200); WiFi.onEvent([](WiFiEvent_t event, WiFiEventInfo_t info) < Serial.println(WiFi.localIP()); Serial.println(WiFi.getHostname()); >, SYSTEM_EVENT_STA_GOT_IP); WiFi.begin(ssid, password); > void loop() <> 

Ещё один пример получения IP-адреса разными способами. На этот раз обойдёмся без лямбда-функции. Как и в предыдущем примере мы отслеживаем событие SYSTEM_EVENT_STA_GOT_IP и при его наступлении вычисляем адрес.

Адрес вычисляем тремя способами. Первый способ самый простой, вызываем функцию localIP() и получаем готовый результат. Второй способ — получаем информацию из WiFiEventInfo_t через его поле got_ip. Третий способ — используем класс IPAddress. Два последних способа даны для общего развития, пользуйтесь первым.

 #include "WiFi.h" const char* ssid = "yourNetworkName"; const char* password = "yourNetworkPassword"; void WiFiStationGotIP(WiFiEvent_t event, WiFiEventInfo_t info) < Serial.println(WiFi.localIP()); // первый способ // второй способ Serial.print(ip4_addr1(&(info.got_ip.ip_info.ip))); Serial.print("."); Serial.print(ip4_addr2(&(info.got_ip.ip_info.ip))); Serial.print("."); Serial.print(ip4_addr3(&(info.got_ip.ip_info.ip))); Serial.print("."); Serial.print(ip4_addr4(&(info.got_ip.ip_info.ip))); Serial.println(); // третий способ Serial.println(IPAddress(info.got_ip.ip_info.ip.addr)); >void setup() < Serial.begin(115200); WiFi.onEvent(WiFiStationGotIP, SYSTEM_EVENT_STA_GOT_IP); WiFi.begin(ssid, password); >void loop() <> 

Узнать настройки Wi-Fi модуля

Для скетча нам не понадобится вводить пароль от Wi-Fi, достаточно просто включить сам Wi-Fi на плате и узнать его Mac-адрес, запустить диагностику, узнать локальный адрес.

 /* ESP-32 Example, start WiFi (without ssid and password) and print the MAC address to Serial. */ #include byte mac[6]; void setup() < Serial.begin(115200); delay(1000); Serial.print("\nRun diagnostic. \n"); WiFi.printDiag(Serial); Serial.println(); Serial.print("Program Start. "); WiFi.enableSTA(true); WiFi.begin(); Serial.println("WiFi began"); WiFi.macAddress(mac); Serial.print("MAC: "); Serial.print(mac[0], HEX); Serial.print(":"); Serial.print(mac[1], HEX); Serial.print(":"); Serial.print(mac[2], HEX); Serial.print(":"); Serial.print(mac[3], HEX); Serial.print(":"); Serial.print(mac[4], HEX); Serial.print(":"); Serial.println(mac[5], HEX); Serial.print("IP address: "); Serial.println(WiFi.localIP()); Serial.print("Hostname: "); Serial.println(WiFi.getHostname()); >void loop() <> 

WiFiScan

Встроенный пример Examples/WiFi/WiFiScan служит для сканирования WiFi-сети. Выводит число найденных точек и их названия.

Читайте также:  Wifi aircrack ng windows

В скетче используются следующие функции:

  • WiFi.mode(WIFI_STA) — устанавливает нужный режим
  • WiFi.disconnect() — завершает соединение
  • WiFi.scanNetworks() — сканирует сети и возвращает число найденных точек доступа
  • WiFi.RSSI(i) — возвращает уровень сигнала по индексу
  • WiFi.SSID(i) — возвращает имя точки доступа по индексу
 #include "WiFi.h" void setup() < Serial.begin(115200); // Set WiFi to station mode and disconnect from an AP if it was previously connected WiFi.mode(WIFI_STA); WiFi.disconnect(); delay(100); Serial.println("Setup done"); >void loop() < Serial.println("scan start"); // WiFi.scanNetworks will return the number of networks found int n = WiFi.scanNetworks(); Serial.println("scan done"); if (n == 0) < Serial.println("no networks found"); >else < Serial.print(n); Serial.println(" networks found"); for (int i = 0; i < n; ++i) < // Print SSID and RSSI for each network found Serial.print(i + 1); Serial.print(": "); Serial.print(WiFi.SSID(i)); Serial.print(" ("); Serial.print(WiFi.RSSI(i)); Serial.print(")"); Serial.println((WiFi.encryptionType(i) == WIFI_AUTH_OPEN)?" ":"*"); delay(10); >> Serial.println(""); // Wait a bit before scanning again delay(5000); > 

Сканируем WiFi-сеть. Расширенный вариант

Чтобы просканировать текущую WiFi-сеть, нам понадобятся учётная запись для входа в неё (идентификатор и пароль). После успешного входа запускаем сканирование через функцию WiFi.scanNetworks(), которая вернёт информацию о всех точках доступа с сопутствующими свойствами.

Для удобства часть кода поместим в отдельные функции: scanNetworks() и connectToNetwork() (её можно использовать при использовании контроллера в качестве веб-клиента.

 #include const char* ssid = "yourNetworkName"; const char* password = "yourNetworkPassword"; String translateEncryptionType(wifi_auth_mode_t encryptionType) < switch (encryptionType) < case (WIFI_AUTH_OPEN): return "Open"; case (WIFI_AUTH_WEP): return "WEP"; case (WIFI_AUTH_WPA_PSK): return "WPA_PSK"; case (WIFI_AUTH_WPA2_PSK): return "WPA2_PSK"; case (WIFI_AUTH_WPA_WPA2_PSK): return "WPA_WPA2_PSK"; case (WIFI_AUTH_WPA2_ENTERPRISE): return "WPA2_ENTERPRISE"; >> void scanNetworks() < int numberOfNetworks = WiFi.scanNetworks(); Serial.print("Number of networks found: "); Serial.println(numberOfNetworks); for (int i = 0; i < numberOfNetworks; i++) < Serial.print("Network name: "); Serial.println(WiFi.SSID(i)); Serial.print("Signal strength: "); Serial.println(WiFi.RSSI(i)); Serial.print("MAC address: "); Serial.println(WiFi.BSSIDstr(i)); Serial.print("Encryption type: "); String encryptionTypeDescription = translateEncryptionType(WiFi.encryptionType(i)); Serial.println(encryptionTypeDescription); Serial.println("-----------------------"); >> void connectToNetwork() < WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) < delay(1000); Serial.println("Соединяемся с Wi-Fi.."); >Serial.println("Соединение с Wi-Fi установлено"); > void setup() < Serial.begin(115200); scanNetworks(); connectToNetwork(); Serial.println(WiFi.macAddress()); Serial.println(WiFi.localIP()); WiFi.disconnect(true); Serial.println(WiFi.localIP()); >void loop() <> 

Обратите внимание, что мы получаем IP-адрес два раза. Первый раз при выходе в интернет, а второй раз — когда закрываем WiFi-соединение. Во втором случае IP-адрес будет равен 0.0.0.0

В мониторе порта выводится следующая информация (часть данных я убрал в целях безопасности).

 Network name: Keenetic-7247 Signal strength: -79 MAC address: *:*:*:*:*:0A Encryption type: WPA2_PSK ----------------------- Network name: how2make 2.3 Signal strength: -91 MAC address: *:*:*:*:*:90 Encryption type: WPA_WPA2_PSK ----------------------- Network name: TP-Link_4A15 Signal strength: -91 MAC address: *:*:*:*:*:84 Encryption type: WPA_WPA2_PSK ----------------------- Соединяемся с Wi-Fi.. Соединяемся с Wi-Fi.. Соединение с Wi-Fi установлено *:*:*:*:*:20 192.163.2.21 0.0.0.0 

Точка доступа

Плата ESP32 может работать как точка доступа. Для первого знакомства получим базовую информацию о точке доступа через доступные функции. Мы можем установить собственные значения для SSID и пароля (пароль можно даже не указывать, чтобы сеть была открытой).

 #include "WiFi.h" const char* ssid = "ESP32Cat"; const char* password = "meow"; void setup() < Serial.begin(115200); // WiFi.softAP(ssid, password); WiFi.softAP(ssid); // без пароля Serial.println(); Serial.print("IP address: "); Serial.println(WiFi.softAPIP()); >void loop() <> 

После загрузки скетча мы получим IP-адрес платы. В настройках компьютера или смартфона должна появиться созданная точка доступа.

Читайте также:  При wifi снижается скорость

Кстати, когда пробовал вариант с паролем, то точка доступа не создалась почему-то. Upd: читатель сайта прислал комментарий по этому поводу: Дело в том, что любая точка доступа в пароле должна иметь минимум 8 символов, если я правильно помню, а в примере всего 4, поэтому скетч ведёт себя некорректно. В этом вся проблема, указываете от 8 символов — код работает стабильно.

Отслеживаем момент подключения и отключения устройства к точке доступа

За соответствующие события отвечают SYSTEM_EVENT_AP_STACONNECTED и SYSTEM_EVENT_AP_STADISCONNECTED.

После загрузки скетчка в настройках телефона найдите созданную точку доступа и присоединитесь к ней. Момент подключения будет обнаружен и в мониторе порта появится сообщение о соединении.

 #include "WiFi.h" void WiFiStationConnected(WiFiEvent_t event, WiFiEventInfo_t info) < Serial.println("Соединение установлено"); // что-то делаем, например, вычисляем mac-адрес for (int i = 0; i < 6; i++) < Serial.printf("%02X", info.sta_connected.mac[i]); if (i < 5)Serial.print(":"); >Serial.println("\n------------"); > void WiFiStationDisconnected(WiFiEvent_t event, WiFiEventInfo_t info) < Serial.println("Соединение разорвано"); // что-то делаем, например, снова вычисляем mac-адрес for (int i = 0; i < 6; i++) < Serial.printf("%02X", info.sta_disconnected.mac[i]); if (i < 5)Serial.print(":"); >Serial.println("\n------------"); > void setup() < Serial.begin(115200); WiFi.softAP("ESP32Cat"); WiFi.onEvent(WiFiStationConnected, SYSTEM_EVENT_AP_STACONNECTED); WiFi.onEvent(WiFiStationDisconnected, SYSTEM_EVENT_AP_STADISCONNECTED); >void loop() <> 

Mac-адрес для точки доступа

В первом примере с получением настроек модуля мы вычисляли Mac-адрес через функцию WiFi.macAddress. Существует также функция WiFi.softAPmacAddress(), когда плата работает в режиме точки доступа.

 #include "WiFi.h" void setup() < Serial.begin(115200); WiFi.mode(WIFI_MODE_AP); Serial.println(WiFi.softAPmacAddress()); >void loop() <> 

Включаем поддержку IPv6

Мы можем включить поддержку IPv6 и получить адрес в этом формате. Включение поддержки IPv6 происходит при помощи функции softAPenableIpV6(). Вызовем функцию при событии SYSTEM_EVENT_AP_START, когда активируется точка доступа.

После включения поддержки в событии SYSTEM_EVENT_AP_STA_GOT_IP6 (получение адреса) узнаём IPv6-адрес.

 #include "WiFi.h" void WiFiApStarted(WiFiEvent_t event, WiFiEventInfo_t info) < WiFi.softAPenableIpV6(); >void WiFiGotIp(WiFiEvent_t event, WiFiEventInfo_t info) < Serial.println(WiFi.softAPIPv6()); >void setup() < Serial.begin(115200); WiFi.onEvent(WiFiApStarted, SYSTEM_EVENT_AP_START); WiFi.onEvent(WiFiGotIp, SYSTEM_EVENT_AP_STA_GOT_IP6); WiFi.softAP("ESP32Cat"); >void loop() <> 

Сколько устройств подключено к точке доступа

Узнать число устройств, которые в данный момент подключены к точке доступа, можно через функцию softAPgetStationNum(). После запуска скетча подключите телефон и другие устройства к точке доступа, чтобы увидеть изменения.

 #include "WiFi.h" void setup() < Serial.begin(115200); WiFi.softAP("ESP32Cat"); >void loop()

Источник

How do I convert Wifi.localIP() to String and store it to external variable

I am trying to store the ip address into an extern string. My ip address value is in .cpp but then I want to store it in my .h file. I am storing it as string since I want to make it as a link. (http:// «ip address» /) My .h file

if (connectWifi("", "") == WL_CONNECTED) < DEBUG_WM(F("IP Address:")); DEBUG_WM(WiFi.localIP()); ipadd1 = String(WiFi.localIP()); //connected return true; >

4 Answers 4

Convert the IPAddress to a String , then get the const char * and convert that to an std::string .

ipadd1 = WiFi.localIP().toString().c_str(); 

Does ipadd1 = std::string(WiFi.localIP().toString().c_str()) work? Note there is a difference between std::string and String .

Читайте также:  Wifi ограничена возможность подключения

@KamilCuk can you update your answer above to reflect this? Might be worth providing both examples, one for char* and one for std::string.

A 5 min search give me the WiFi.localIp() function description, from there I knew it returned IPAddress object. Following to forum.arduino.cc Topic: How to manipulate IPAddress variables / convert to string you can use following function to convert it to string:

// author apicquot from https://forum.arduino.cc/index.php?topic=228884.0 String IpAddress2String(const IPAddress& ipAddress)

IPAddress may be handled just as an array of 4 int s.

If we want to write Wifi.localIP() in oled(SSD1306) or serial just write WiFi.localIP().toString() . Like this:

Serial.print("Connected, IP address: "); Serial.print(WiFi.localIP().toString()); display.clear(); display.setTextAlignment(TEXT_ALIGN_LEFT); display.setFont(ArialMT_Plain_10); display.drawString(0, 0, " WiFi is Connected." ); display.drawString(0, 10, " IP address: " + WiFi.localIP().toString() ); 

Источник

Circuits4you.com

Arduino interfacing, circuits tutorials with code and ebooks, Step by step guides for all sensor modules used for arduino. Programming tips and tricks.

ESP8266 IP to String Conversion

Converting ESP8266 IP address to string or character array. There is simple way to convert IP address to string is using toString() function.

WiFi.localIP().toString();

IP address to string

What is IP Address?

An Internet Protocol address (IP address) is a numerical label assigned to each device connected to a computer network that uses the Internet Protocol for communication. An IP address serves two principal functions: host or network interface identification and location addressing.

What is MAC Address?

A media access control address (MAC address) of a device is a unique identifier assigned to a network interface controller (NIC). For communications within a network segment, it is used as a network address for most IEEE 802 network technologies, including Ethernet, Wi-Fi, and Bluetooth.

How do you find your IP address of ESP8266?

You can get IP address of ESP8266 using WiFi.localIP(); when esp is connected to WiFi Router.

When ESP8266 is in access point mode then ESP has default IP address 192.168.4.1 .

Arduino ESP8266 Example for IP address conversion

The code to connect to a wireless access point is relatively straightforward: enter the SSID and the password of the network you want to connect to

/* * https://circuits4you.com * * Connecting NodeMCU ESP8266 to WiFi and * Get IP address to String */ #include // Include the Wi-Fi library const char* ssid = «SSID»; // The SSID (name) of the Wi-Fi network you want to connect to const char* password = «PASSWORD»; // The password of the Wi-Fi network String IPaddress; void setup() < Serial.begin(115200); // Start the Serial communication to send messages to the computer delay(10); Serial.println('\n'); WiFi.begin(ssid, password); // Connect to the network Serial.print("Connecting to "); Serial.print(ssid); while (WiFi.status() != WL_CONNECTED) < // Wait for the Wi-Fi to connect delay(500); Serial.print('.'); >Serial.println(‘\n’); Serial.println(«Connection established!»); Serial.print(«IP address:\t»); Serial.println(WiFi.localIP()); // Send the IP address of the ESP8266 to the computer IPaddress = WiFi.localIP().toString(); > void loop()

Results

More about IP address

Источник

Оцените статью
Adblock
detector