■Ethernet.maintain関数
Ethernetクラス※1のEthernet.maintain関数は、DHCP※2リースの更新を許可します。DHCPを介してIPアドレスが割り当てられると、イーサネットデバイスは一定期間リースされます。Ethernet.maintain関数を使用すると、DHCPサーバーに更新を要求することができます。 サーバーの構成によっては、同じアドレス、新しいアドレス、またはまったく受信しないことがあります。
以下補足です
※1:Ethernetクラスのライブラリとは、Arduino Ethernet Shield(Ethernet.h)またはArduino Ethernet Shield 2とLeonardo Ethernet(Ethernet2.h)で動作するように設計されたライブラリです。このライブラリを用いる事によってArduinoボードをインターネットに接続することができます。ボードは、着信接続を受け付けるサーバーか、発信接続を確立するクライアントとして機能します。
バージョン1.0では、ライブラリはDHCP※2をサポートしています。Ethernet.begin(mac※3)を適切なネットワーク設定で使用すると、イーサネットシールドは自動的にIPアドレス※4を取得します。これにより、スケッチサイズが大幅に増加します。必要に応じてDHCPリースが正しく更新されるように、Ethernet.maintain関数を定期的に呼び出してください。
※3:MACアドレス(英語: Media Access Control address)とは、ネットワーク上で、各ノードを識別するために設定されているLANカードなどのネットワーク機器のハードウェアに原則として一意に割り当てられる物理アドレスです。
※4:IPアドレス(英: Internet Protocol address)とは、IPにおいてパケットを送受信する機器を判別するための番号です。
■使用例
Arduino IDEで使用するEthernet.maintain関数の使い方は以下の通りです。
例えば「Arduino Leonardo Ethernet」をPCにUSB接続し、またネットワークに接続されたLANケーブル接続して、ArduinoIDEの「ツール」→「ボード」→「Arduino Ethernet」を選択した状態にします。
次に下記プログラムを実行すると、着信メッセージをすべてに配信するシンプルなチャットサーバーが構築されます。
またDHCPを通じて割り当てられたIPアドレスは期間限定でクライアントへ貸し出されたものなので、長時間使用する場合はloop関数中などで定期的にEthernet.maintain関数を実行しサーバに対しDHCPリースの更新をします。
#include <SPI.h> #include <Ethernet.h> //コントローラのMACアドレスとIPアドレスを以下に入力します。 // IPアドレスはローカルネットワークに依存します。 //ゲートウェイとサブネットはオプションです。 byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED}; IPAddress ip(192, 168, 1, 177); IPAddress myDns(192, 168, 1, 1); IPAddress gateway(192, 168, 1, 1); IPAddress subnet(255, 255, 0, 0); EthernetServer server(23);// telnetはデフォルトでポート23になります boolean alreadyConnected = false; // クライアントが以前に接続されたかどうか void setup() { Ethernet.begin(mac, ip, myDns, gateway, subnet);// イーサネットデバイスを初期化する server.begin();// クライアントのリスニングを開始する Serial.begin(9600);// シリアル通信を開き、ポートが開くのを待ちます while (!Serial) {}; // シリアルポートが接続するのを待ちます。ネイティブUSBポートのみに必要 Serial.print("Chat server address:"); Serial.println(Ethernet.localIP()); } void loop() { EthernetClient client = server.available();// 新しいクライアントを待つ if (client) {// クライアントが最初のバイトを送信すると「hello」を送信 if (!alreadyConnected) { client.flush();// 入力バッファをクリアする Serial.println("We have a new client"); client.println("Hello, client!"); alreadyConnected = true; } if (client.available() > 0) { char thisChar = client.read();// クライアントから受信したバイトを読み込みます。 server.write(thisChar);// バイトをクライアントに返します。 Serial.write(thisChar); } }// バイトをサーバに返します。 int status = Ethernet.maintain(); Serial.print("Ethernet.maintain: "); Serial.println(status); }
図1:プログラム例
■構文
Ethernet.maintain();
■パラメータ
特に無し。
■戻り値
byte
0:何も起こっていない
1:失敗した更新
2:成功した更新
3:失敗し再バインド
4:成功の再バインド
励みになりますのでよければクリック下さい(^o^)/