【概要】
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コマンドを受け取り、ロボットアームやモーターを即時制御するシステム。


コメント