WiFi Network の解説と実装リファレンス

記事内には広告が含まれています。

【概要】

Arduino環境における「WiFi Network」機能は、WiFi.hライブラリを通じて提供される無線LAN接続およびネットワークスタック管理の抽象化層を指す。この機能は、ESP32やESP8266等のWi-Fi対応マイコンにおいて、IEEE 802.11プロトコルスタックを操作し、SSIDへの接続、DHCPによるIPアドレスの取得、およびTCP/IP通信の基盤を構築する役割を担う。

基本的な動作原理

  1. スキャンと認証: 指定されたSSIDをターゲットとし、物理層での信号検知、MAC層での認証(WPA2/WPA3等)を行う。
  2. DHCPハンドシェイク: ルーター(AP)からIPアドレス、サブネットマスク、ゲートウェイ、DNSサーバー情報を取得する。
  3. ステート管理: 接続状態を内部的な状態マシン(DISCONNECTED, CONNECTING, CONNECTED等)として管理し、上位のアプリケーション層へ通知する。

【仕様】

Arduino環境では、特定の単一関数ではなく、WiFiクラスのメソッド群によって構成される。

| メソッド | 引数 | 戻り値 | 説明 |
| WiFi.begin() | String ssid, String password | void | 接続プロセスの開始。非ブロッキング動作が推奨される。 |
| WiFi.status() | なし | wl_wifi_status_t | 現在の接続状態を列挙型で返す。 |
| WiFi.localIP() | なし | IPAddress | 割り当てられたローカルIPアドレスを取得。 |
| WiFi.SSID() | なし | String | 現在接続中のSSIDを取得。 |

初期状態:
インスタンス化直後は WL_ disconnected 状態であり、無線チップの電源はオフ、またはアイドル状態にある。

【技術的特徴】

Station (STA) モード vs Access Point (AP) モード

  • STAモード: マイコンがクライアントとしてルーターに接続するモード。ほとんどのIoTアプリケーションで利用される。
  • APモード: マイコン自身がWi-Fiアクセスポイントとなり、他デバイスからの接続を受け付ける。セットアップ時やローカル制御に使用される。

割り込みとイベント通知

ESP32等の高度なチップでは、接続状態の変化をソフトウェア割り込みやコールバック関数(WiFi.setEventCallbackなど)を通じて通知することが可能であり、ポーリングによる監視よりも低消費電力かつ高応答な実装が可能となる。

【注意点】

1. ブロッキング動作の回避

WiFi.begin() を呼び出した直後に WiFi.status() をチェックすると、接続完了前に WL_CONNECTED 以外が返ることが多い。接続は非同期で行われるため、ループ内での適切なリトライ処理、またはタイマーを用いた待機処理が必須である。

2. リソース制約とメモリ

Wi-Fiスタックはメモリを大量に消費する。特に動的なメモリ確保(Stringクラスの多用など)は、ネットワーク処理中のヒープ不足(Heap Out of Memory)を引き起こし、システムのハングや再起動の原因となる。

3. 電源消費

Wi-Fi接続状態の維持は消費電流を急増させる。省電力設計では、Modem-sleepやLight-sleepモードとの連携を考慮する必要がある。

4. DHCPリースと再接続

DHCPリースが切れた際の自動再接続挙動はチップのドライバに依存する。確実な動作のためには、定期的なWiFi.status()監視による再接続ロジックの実装が推奨される。

【サンプルコード】

以下は、接続を保証するための堅牢な接続ルーチンである。

#include <WiFi.h>

const char* ssid = "YOUR_SSID";
const char* password = "YOUR_PASSWORD";

void setup() {
  Serial.begin(115200);

  // WiFiモードをSTAに設定
  WiFi.mode(WIFI_STA);

  Serial.print("Connecting to ");
  Serial.println(ssid);

  // 非同期接続開始
  WiFi.begin(ssid, password);

  // 接続待ち処理(最大10秒間)
  int retry_count = 0;
  while (WiFi.status() != WL_CONNECTED && retry_count < 20) {
    delay(500);
    Serial.print(".");
    retry_count++;
  }

  if (WiFi.status() == WL_CONNECTED) {
    Serial.println("\nConnected!");
    Serial.print("IP Address: ");
    Serial.println(WiFi.localIP());
  } else {
    Serial.println("\nConnection Failed.");
  }
}

void loop() {
  // 定期的な接続状態監視
  if (WiFi.status() != WL_CONNECTED) {
    Serial.println("Lost connection. Reconnecting...");
    WiFi.begin(ssid, password);
    delay(5000);
  }
  delay(10000);
}

【活用例】

  1. IoTデータロガー: WiFi.begin()で接続後、MQTTクライアントを起動してセンサーデータをクラウドへ送信。
  2. OTA(Over-the-Air)アップデート: ネットワーク接続を維持しながら、HTTPサーバーから最新のバイナリを取得し、フラッシュメモリを更新。
  3. ローカルWebサーバー: WiFi.mode(WIFI_AP)を使用し、スマート家電の初期設定用Web UIを構築する。

コメント

タイトルとURLをコピーしました