IPAddress の解説と実装リファレンス
【概要】
IPAddress は、Arduinoのネットワークライブラリ(Ethernet, WiFi等)において、IPv4アドレスを構造的に扱うためのクラスです。単なる32ビットの整数としてIPアドレスを管理するのではなく、オブジェクトとしてカプセル化することで、文字列への変換、各オクテットへのアクセス、比較演算などを容易に実行できるように設計されています。
【仕様】
IPAddress クラスは、4バイト(32ビット)のデータを保持し、標準的なドット区切り形式(例: 192.168.1.1)を操作するためのメソッドを提供します。
主要なコンストラクタとメソッド
- コンストラクタ:
IPAddress(uint8_t a, uint8_t b, uint8_t c, uint8_t d): 各オクテットを指定して初期化。IPAddress(uint32_t addr): 32ビットの数値から初期化。IPAddress(): デフォルトコンストラクタ(すべて0で初期化)。- 主要メソッド:
bool fromString(const char* s): 文字列(”192.168.0.1″等)を解析して内部状態を更新。成功時はtrue、失敗時はfalseを返す。String toString(): 現在のIPアドレスをドット区切りの文字列として返す。operator==,operator!=,operator<: 比較演算子のオーバーロードにより、アドレス間の比較が可能。
データ型
- 内部保持データ:
uint8_t[4](4バイトの配列) - 戻り値の型:
bool(解析時),String(変換時)
【技術的特徴】
- ネットワークバイトオーダーの考慮: 内部的な32ビット整数としての管理と、表示用のドット区切り形式の変換において、エンディアン(Endianness)の問題を抽象化し、開発者が意識せずに操作できる構造になっています。
- 比較演算子の効率:
IPAddressオブジェクト同士の比較は、内部的なバイト配列の比較として最適化されており、文字列比較よりも高速に動作します。 - 型安全性の向上:
uint32_tを直接扱う場合と比較して、意図しない算術演算を防ぎ、ネットワークプロトコルに準拠したデータ操作を強制します。
【注意点】
- メモリ制約:
toString()メソッドはStringクラスを返すため、頻繁な呼び出しやループ内での使用はヒープメモリの断片化を引き起こす可能性があります。高頻度な処理では、toString()を避け、必要最小限の箇所でのみ使用することが推奨されます。 fromStringの失敗: 不正な形式の文字列(例: “256.0.0.1” や “192.168.1”)が渡された場合、内部状態は更新されずfalseを返します。エラーハンドリングを実装する際は、必ず戻り値を確認してください。- IPv6非対応:
IPAddressクラスはIPv4専用です。IPv6を扱う場合は、別途対応するクラスまたはライブラリを使用する必要があります。
【サンプルコード】
#include <Arduino.h>
#include <WiFi.h>
// Ethernetライブラリを使用する場合も同様の構造\n
void setup() {
Serial.begin(115200);
// 方法1: 各オクテットを指定
IPAddress addr1(192, 168, 1, 10);
Serial.print("Manual IP: ");
Serial.println(addr1.toString());
// 方法2: 文字列から変換
IPAddress addr2;
if (addr2.fromString("192.168.1.50")) {
Serial.print("String IP: ");
Serial.println(addr2.toString());
} else {
Serial.println("Invalid IP string!");
}
// 比較演算の例
if (addr1 == addr2) {
Serial.println("Addresses are equal");
} else {
Serial.println("Addresses are different");
}
}
void loop() {
// N/A
}
【活用例】
- DHCPクライアントの実装: DHCPサーバーから取得したIPアドレスを
IPAddress型で保持し、Webサーバーのリスニングアドレスとして設定する。 - 簡易的なネットワークスキャナー:
IPAddressクラスとpingまたはTCP接続試行を組み合わせ、特定のサブネット内のデバイス存在確認を行う。 - ステータス表示: ネットワーク接続状態をシリアルモニタやOLEDディスプレイに表示する際、
toString()を用いて整形されたIPアドレスを表示する。


コメント