Сканирование сетей с помощью Arduino UNO WiFi Rev2

Узнайте, как настроить плату для сканирования ближайших Wi-Fi сетей и вывода их в Serial Monitor.

Введение

Одна из замечательных возможностей Arduino UNO WiFi Rev2 — это сканирование ближайших Wi-Fi сетей. Это осуществляется с помощью радиомодуля NINA-W102, и в этом руководстве мы рассмотрим несколько простых шагов, чтобы всё заработало!

Цели

Цели этого проекта:

  • Сканирование окружающих сетей.

  • Вывод доступных сетей в Serial Monitor.

  • Вывод дополнительной информации об этих сетях.

Необходимое оборудование и программное обеспечение

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

Сканирование Wi-Fi сетей — это довольно простой процесс. Устройство с Wi-Fi модулем, такое как смартфоны, компьютеры или платы для разработки вроде Arduino UNO WiFi Rev2, сканируют своё окружение и получают ответ от ближайших сетей.

Устройство, ищущее сеть, или клиент, отправляет пробный запрос (probe request), а ближайшие сети отправляют пробные ответы (probe responses). Эти ответы содержат такую информацию, как имя сети, мощность сигнала в дБм (децибел-милливатт) и тип шифрования.

Схема подключения

Для этого руководства дополнительная схема не требуется.

Схема подключения

Схема подключения.

Программирование платы

  1. Сначала нам нужно убедиться, что установлены необходимые зависимости. Для этого руководства нам потребуется установить библиотеку WiFiNINA. Если мы используем офлайн-редактор, эту библиотеку можно найти в Tools > Manage Libraries…. Если мы используем Cloud Editor, она уже установлена.

  2. Если мы используем офлайн-редактор, необходимо убедиться, что установлены драйверы для платы Arduino UNO WiFi Rev2. В редакторе перейдите в Tools > Board > Board Manager… и установите ядро Arduino avrMEGA Boards.

  3. Теперь давайте рассмотрим некоторые основные функции скетча, которые мы будем использовать.

    • WiFi.macAddress() — получает MAC-адрес платы.

    • WiFi.scanNetworks() — сканирует ближайшие сети.

    • WiFi.encryptionType() — получает тип шифрования найденной сети.

    • WiFi.SSID() — получает SSID (имя сети) найденной сети.

    • WiFi.RSSI() — получает RSSI (мощность сигнала) найденной сети (измеряется в дБм).

  4. Теперь мы можем загрузить код, приведённый ниже, на нашу плату Arduino UNO WiFi Rev2.

#include <SPI.h>
#include <WiFiNINA.h>

void setup() {
  //Initialize serial and wait for port to open:
  Serial.begin(9600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }

  // check for the WiFi module:
  if (WiFi.status() == WL_NO_MODULE) {
    Serial.println("Communication with WiFi module failed!");
    // don't continue
    while (true);
  }

  String fv = WiFi.firmwareVersion();
  if (fv < WIFI_FIRMWARE_LATEST_VERSION) {
    Serial.println("Please upgrade the firmware");
  }

  // print your MAC address:
  byte mac[6];
  WiFi.macAddress(mac);
  Serial.print("MAC: ");
  printMacAddress(mac);
}

void loop() {
  // scan for existing networks:
  Serial.println("Scanning available networks...");
  listNetworks();
  delay(10000);
}

void listNetworks() {
  // scan for nearby networks:
  Serial.println("** Scan Networks **");
  int numSsid = WiFi.scanNetworks();
  if (numSsid == -1) {
    Serial.println("Couldn't get a wifi connection");
    while (true);
  }

  // print the list of networks seen:
  Serial.print("number of available networks:");
  Serial.println(numSsid);

  // print the network number and name for each network found:
  for (int thisNet = 0; thisNet < numSsid; thisNet++) {
    Serial.print(thisNet);
    Serial.print(") ");
    Serial.print(WiFi.SSID(thisNet));
    Serial.print("\tSignal: ");
    Serial.print(WiFi.RSSI(thisNet));
    Serial.print(" dBm");
    Serial.print("\tEncryption: ");
    printEncryptionType(WiFi.encryptionType(thisNet));
  }
}

void printEncryptionType(int thisType) {
  // read the encryption type and print out the title:
  switch (thisType) {
    case ENC_TYPE_WEP:
      Serial.println("WEP");
      break;
    case ENC_TYPE_TKIP:
      Serial.println("WPA");
      break;
    case ENC_TYPE_CCMP:
      Serial.println("WPA2");
      break;
    case ENC_TYPE_NONE:
      Serial.println("None");
      break;
    case ENC_TYPE_AUTO:
      Serial.println("Auto");
      break;
    case ENC_TYPE_UNKNOWN:
    default:
      Serial.println("Unknown");
      break;
  }
}

void printMacAddress(byte mac[]) {
  for (int i = 5; i >= 0; i--) {
    if (mac[i] < 16) {
      Serial.print("0");
    }
    Serial.print(mac[i], HEX);
    if (i > 0) {
      Serial.print(":");
    }
  }
  Serial.println();
}

Тестирование

После загрузки кода на плату нам нужно открыть Serial Monitor. Когда мы его откроем, сначала мы увидим напечатанный MAC-адрес нашей платы, за которым следует текст "Scanning available networks". Через 10 секунд сканирования доступные сети будут перечислены вместе с информацией о каждой сети.

Список всех доступных сетей в Serial Monitor

Список всех доступных сетей в Serial Monitor.

Если мы посмотрим внимательнее на сеть #1 в списке, мы увидим, что сигнал составляет -38 дБм. Когда проводился этот тест, плата находилась всего в одном метре от маршрутизатора, поэтому мощность сигнала отличная.

Но если мы посмотрим на другие сети, мы увидим, что сигнал доходит до -94 дБм, что очень слабо. Если бы мы попытались подключить компьютер к этой сети, это, скорее всего, не удалось бы.

Маршрутизаторы с соответствующей мощностью сигнала

Маршрутизаторы с соответствующей мощностью сигнала.

Устранение неполадок

Если код не работает, есть несколько распространённых проблем, которые можно проверить:

  • Не установлена библиотека WiFiNINA.

  • Не установлены драйверы для Arduino UNO WiFi Rev2.

  • Не выбран правильный порт.

Заключение

В этом руководстве мы создали простой Wi-Fi сканер, который выводит все доступные сети в радиусе действия нашего Arduino UNO WiFi Rev2. Эта функция существует практически в любом устройстве, которое может подключаться к Интернету, и может быть весьма полезным инструментом для экспериментов, например, чтобы определить, как далеко наши устройства могут находиться от шлюза (маршрутизатора), чтобы работать корректно.