見出し画像

【ミーア】Wi-Fiのセキュリティと信号強度に応じたアイコン表示→BLE通信切れる問題

前回の改修では、Wi-Fi接続を、アプリ画面でSSIDを直接入力するのではなく、利用可能なWi-Fiネットワークをリスト表示して選択できるようにするところまでを行った。

今回は下記を行う

  • Wi-Fiネットワークリストに、セキュリティの有無と信号強度に応じたアイコン表示

  • 使用したいWi-Fiリストが見つからないときに再度探すボタン+注釈文言追加

  • SSID選択とパスワード入力画面の分離

Wi-Fiネットワーク選択画面にセキュリティの有無を表示

Wi-Fiのセキュリティと信号強度をESP32から取得

Wi-Fiの信号強度(RSSI:Received Signal Strength Indicator)とセキュリティ情報は、ESP32でWi-Fiネットワークをスキャンする際に取得できる。

Wi-Fiネットワークの情報を保持する構造体を用意して、スキャンされたWi-FiネットワークのリストをNetworkInfo構造体のベクタとして返すように修正する。

// WiFiConnection.h
#pragma once

#include <WiFi.h>
#include <vector>

// Wi-Fiネットワークの情報を保持する構造体
struct NetworkInfo {
  String ssid;
  int32_t rssi;
  uint8_t encryptionType;
};

bool setupWiFi(const char *ssid, const char *password);
std::vector<String> scanNetworks();
// WiFiConnection.cpp
#include "WiFiConnection.h"

std::vector<NetworkInfo> scanNetworks() {
  std::vector<NetworkInfo> networkList;

  WiFi.mode(WIFI_STA);
  WiFi.disconnect();
  delay(100); // モード変更後に少し待つ

  Serial.println("Scanning WiFi networks...");
  int n = WiFi.scanNetworks();
  Serial.println("Scan complete.");
  if (n == 0) {
    Serial.println("No networks found.");
  } else {
    Serial.println("Available networks:");
    Serial.println("SSID / RSSI / Encryption");
    for (int i = 0; i < n; ++i) {
      // スキャンされた各ネットワークの情報を取得
      NetworkInfo info;
      info.ssid = WiFi.SSID(i);
      info.rssi = WiFi.RSSI(i);
      info.encryptionType = WiFi.encryptionType(i);

      // ネットワーク情報をシリアル出力
      Serial.print(info.ssid);
      Serial.print(" / ");
      Serial.print(info.rssi);
      Serial.print(" / ");
      switch (info.encryptionType) {
        case WIFI_AUTH_OPEN:
          Serial.println("Open");
          break;
        case WIFI_AUTH_WEP:
          Serial.println("WEP");
          break;
        case WIFI_AUTH_WPA_PSK:
          Serial.println("WPA_PSK");
          break;
        case WIFI_AUTH_WPA2_PSK:
          Serial.println("WPA2_PSK");
          break;
        case WIFI_AUTH_WPA_WPA2_PSK:
          Serial.println("WPA_WPA2_PSK");
          break;
        case WIFI_AUTH_WPA2_ENTERPRISE:
          Serial.println("WPA2_ENTERPRISE");
          break;
        // その他の暗号化方式については適宜追加
        default:
          Serial.println("Other");
      }

      networkList.push_back(info);
    }
  }
  return networkList;
}

Wi-Fiリスト、暗号化方式、および信号強度をシリアルポートに出力して確認する。

次にBLEManager.cpp にある serializeNetworks 関数と onWrite コールバック関数も、新しい NetworkInfo 構造体を扱えるように変更する。

// BLEManager.cpp
// Wi-FiネットワークリストをJSON形式の文字列にシリアル化
String serializeNetworks(const std::vector<NetworkInfo> &networks) {
  DynamicJsonDocument doc(1024);
  JsonArray array = doc.to<JsonArray>();

  for (const auto &network : networks) {
    JsonObject obj = array.createNestedObject();
    obj["ssid"] = network.ssid;
    obj["rssi"] = network.rssi;
    obj["encryptionType"] = network.encryptionType;
  }

  String result;
  serializeJson(doc, result);
  return result;
}

続きはこちらで記載しています。


この記事が参加している募集

#仕事について話そう

110,284件

#今月の振り返り

13,057件

よろしければサポートお願いします!いただいたサポートはクリエイターとしての活動費に使わせていただきます!