【ミーア】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;
}
続きはこちらで記載しています。
いいなと思ったら応援しよう!
よろしければサポートお願いします!いただいたサポートはクリエイターとしての活動費に使わせていただきます!