Wifi ssid mac address

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

Читайте также:  Scan to connect to wifi

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

  • 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-адрес платы. В настройках компьютера или смартфона должна появиться созданная точка доступа.

Читайте также:  Zyxel контроллер wi fi системы

Кстати, когда пробовал вариант с паролем, то точка доступа не создалась почему-то. 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()

Источник

Wifi ssid mac address

SSID — сокращение для идентификатора зоны обслуживания — является именем конкретной беспроводной сети. Имя беспроводной сети (SSID) задается на маршрутизаторе беспроводной сети или точке доступа. Маршрутизатор беспроводной сети или точка доступа могут как передавать, так и не передавать заданное имя сети SSID. Когда маршрутизатор беспроводной сети или точка доступа настроены на передачу идентификатора SSID, беспроводная сеть является широковещательной сетью. Если маршрутизатор беспроводной сети или точка доступа не настроены на передачу идентификатора SSID, беспроводная сеть является нешироковещательной сетью.
Широковещательная сеть. Компьютеры с адаптерами беспроводной сети, находящиеся в радиусе действия маршрутизатора беспроводной сети или точки доступа широковещательной сети, способны обнаруживать и отображать имя сети (SSID). Эту возможность полезно использовать при поиске беспроводных сетей, доступных для подключения.
Нешироковещательная сеть. Компьютеры с адаптерами беспроводной сети, находящимися в радиусе действия маршрутизатора беспроводной сети или точки доступа нешироковещательной сети, способны только обнаруживать, но не отображать имя сети (SSID). Чтобы подключиться к нешироковещательной сети, необходимо знать имя сети (SSID) для данной сети.
При попадании в зону действия двух точек доступа с идентичными SSID, приёмник может выбирать между ними на основании данных об уровне сигнала.

Читайте также:  Пароль вай фай laserjet

2vlary
SSID — это не основной параметр при подключении к беспроводной сети, можно подключится и по MAC адресу, если включено вещание SSID (Enable SSID Broadcast). SSID это не имя точки доступа, а идентификатор сети, в которой она вещает, неотъемлемая часть всей системы, в сети может быть несколько точек с SSID, но с разными MAC адресами. Отсюдова, я так думаю, все понятно. ))
А мешало мне жить потому что мне точку нужно было перевести в режим рипитера, а подцепить ее к основной точке можно было только с помощью MAC адреса.
Насчет BSSID согласен. Тут хорошо описано http://itc.ua/node/18022

Компьютерный форум Ru.Board » Hardware » Периферийные устройства » SSID и Mac адрес

Реклама на форуме Ru.Board.

Powered by Ikonboard «v2.1.7b» © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2023

Источник

Is it possible to get the SSID & MAC Address of Currently connected WiFi Network in an App

I am looking for a way to get both the MAC Adress and the SSID of the currently connected WiFi Network in my project. I have used Tony Million’s Reachability to decide when the user is on a WiFi network or not and was testing Kenial’s NICInfo only to find out that it only provides the iPhone’s WiFi MAC Address. Although both projects helped greatly in there own way, they do not get the job done. I am wondering if there is a public API (for certain Apple App Approval) or some back door to achieve this.

1 Answer 1

This involves a few different things:

  1. Getting SSID — This is independent of the MAC address issue. For this, check this SO answer: iPhone get SSID without private library. I don’t know what the etiquette is regarding re-posting code from other answers so I’ll just link.
  2. Getting MAC address — since the majority of networking operates at Layer 3 (which is called, who would have guessed, the Network Layer — http://en.wikipedia.org/wiki/OSI_model) and the MAC address is at Layer 2 (the Data Link layer) you’ll first need to get the IP address of the gateway of the WiFi interface. Just a side note — the question should be phrased as ‘How do I get the SSID of the currently connected WiFi network and the MAC address of the WiFi router/gateway’. Anywho, to get the gateway address, see this SO answer: How to get the WIFI gateway address on the iPhone? Once you have that, you need to convert it to a MAC address using ARP (Address Resolution Protocol, which is the protocol that all networks use to convert IP addresses to MAC addresses). Network interfaces don’t communicate via IP, they communicate via MAC, so this actually happens everywhere, all the time. It’s actually pretty easy to access the ARP table on a PC/Mac. For iOS, I found this SO answer to convert an IP address to a MAC address: Getting ARP table on iPhone/iPad

Linked

Hot Network Questions

Subscribe to RSS

To subscribe to this RSS feed, copy and paste this URL into your RSS reader.

Site design / logo © 2023 Stack Exchange Inc; user contributions licensed under CC BY-SA . rev 2023.7.12.43529

By clicking “Accept all cookies”, you agree Stack Exchange can store cookies on your device and disclose information in accordance with our Cookie Policy.

Источник

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