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

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

【概要】

WiFiServer は、Arduino環境(特にESP8266やESP32など)において、TCP接続を待ち受けるためのサーバーインスタンスを管理するクラスです。このクラスは、ネットワーク層のTCPプロトコルを抽象化し、特定のポート番号でクライアントからの接続要求を受け付け、データの送受信を行うための基礎的なインターフェースを提供します。

WiFiServer 自体はHTTPプロトコルを解釈するものではなく、生のTCPストリームを扱うためのものです。HTTPレスポンスを返すアプリケーションを構築する場合は、このクラスの上にWebServerライブラリを重ねるか、手動でHTTPヘッダーを構築して送受信する必要があります。

【仕様】

コンストラクタ

  • WiFiServer(uint16_t port)
    • 引数: port (0-65535) – 待ち受けるTCPポート番号。
    • 動作: 指定されたポートでのリスニング設定を初期化する。

主要メソッド

  • bool begin()
    • 戻り値: 初期化成功の真偽値。
    • 動作: サーバーを起動し、リスニング状態へ移行させる。
  • int clients()
    • 戻り値: 現在接続されているクライアントの数。
  • int available()
    • 戻り値: 最初の接続済みクライアントから読み取れるバイト数。
  • WiFiClient handleClient()
    • 戻り値: 処理中のWiFiClientオブジェクト。
    • 動作: 接続されているクライアントを順次走査し、コールバック処理を実行する。

【技術的特徴】

  • 非ブロッキング設計: WiFiServer のメソッドは基本的に非ブロッキングで動作します。これは、Arduinoのシングルスレッド・イベントループ構造において、特定のクライアントの処理中に他の通信やセンサー処理を停止させないための設計です。
  • TCPスタックとの分離: WiFiServer は下位のネットワークスタック(LwIP等)とやり取りを行いますが、アプリケーション層のプロトコル(HTTP, MQTT, SMTP等)の解析は行いません。純粋な「データの通り道」としての役割に特化しています。
  • WebServerクラスとの違い: WebServerクラスはWiFiServerを継承または内部的に利用しており、HTTPリクエストのパース、URLルーティング、ヘッダーの自動生成といった高度な抽象化を提供します。

【注意点】

  • リソースの制約: 接続可能な最大クライアント数は、ハードウェアのメモリおよびネットワークスタックの設定に依存します。過度な同時接続はメモリ枯渇の原因となります。
  • ブロッキング操作の禁止: handleClient 内で delay() や長い while ループを実行すると、他のクライアントの処理やWi-Fiの維持(Keep-alive)に悪影響を及ぼし、接続が切断される原因となります。
  • バッファ管理: available() で取得できるデータ量は、内部バッファのサイズに依存します。大量のデータを一度に受信しようとすると、バッファオーバーフローやデータの欠落が発生する可能性があるため、チャンク単位での読み取りを推奨します。
  • タイムアウト: クライアントが接続したままデータを送受信しない場合、リソースを占有し続けることがあります。適切なタイムアウト処理の実装を検討してください。

【サンプルコード】

以下は、特定のポートで待ち受け、クライアントから受信した文字列をそのまま送り返す(Echo)基本的なTCPサーバーの実装例です。

#include <WiFi.h>

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

WiFiServer server(8080);

void setup() {
  Serial.begin(115200);
  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

  Serial.println("Connected to WiFi");
  server.begin();
  Serial.print("Server started on port: ");
  Serial.println(8080);
}

void loop() {
  WiFiClient client = server.available();

  if (client) {
    Serial.println("New Client Connected.");

    while (client.available()) {
      char c = client.read();
      Serial.write(c);
      client.write(c); // Echo back
    }

    client.stop();
    Serial.println("Client Disconnected.");
  }
}

【活用例】

  • 産業用プロトコルへの対応: Modbus TCPや独自プロトコルを使用した、工場内機器とのデータ交換。
  • 低レイテンシのテレメトリ: HTTPのオーバーヘッドを避け、生データのみを高速に転送するセンサーデータのアップロード。
  • カスタムプロトコルの実装: MQTTの代替として、非常にシンプルなコマンドベースの通信を自作する場合。
  • リアルタイム制御: 外部PCからのTCPコマンドを受け取り、ロボットアームやモーターを即時制御するシステム。

コメント

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