以前書いた Arduino DHCP Libraryを使ってみる : blog.loadlimit – digital matter – で使ったライブラリが、最近のIDEで使えなくなったということで、他のライブラリを見つけました。
gkaindl.com → software → arduino ethernet
前述のDHCP Libraryをベースに改良されたもので、機能も拡張されています。
ダウンロード後、解凍して、中身のフォルダをArduinoのlibrariesフォルダにコピーします。
あとはただただソースを書くだけ。
DHCPの更新処理とかを自動でやってくれるmaintain()が便利です。こんな感じのコードになりました。
#if defined(ARDUINO) && ARDUINO > 18 #include <SPI.h> #endif #include <Ethernet.h> #include <EthernetDHCP.h> #include <EthernetDNS.h> byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; const char* hostName = "sample.com"; void setup() { delay(100); Serial.begin(9600); EthernetDHCP.begin(mac); } void loop() { EthernetDHCP.maintain(); const byte* dnsAddr = EthernetDHCP.dnsIpAddress(); EthernetDNS.setDNSServer(dnsAddr); static bool isDnsResolved = false; static byte remoteAddr[4]; if (!isDnsResolved) { DNSError err = EthernetDNS.sendDNSQuery(hostName); if (DNSSuccess == err) { do { err = EthernetDNS.pollDNSReply(remoteAddr); if (DNSTryLater == err) { delay(20); Serial.print("."); } } while (DNSTryLater == err); } if (DNSSuccess == err) { isDnsResolved = true; } } if (isDnsResolved) { Client client(remoteAddr, 80); Serial.println("connecting..."); if (client.connect()) { Serial.println("connected"); client.println("GET / HTTP/1.0"); client.println(); // 返事が戻ってくるまで待機 do { if (client.available()) { char c = client.read(); // ここで何かする } if (!client.connected()) { Serial.println(); Serial.println("disconnecting."); client.stop(); break; } } while (true); } else { Serial.println("connection failed"); delay(2000); } } }DNSの更新は見ていないのでDDNS環境のサーバを長時間監視する場合はそれなりの処理が必要です。
それと、イーサネットシールドがPCに接続していない場合にIPを取れない問題は、新しいバージョンのイーサネットシールドでは修正されていたようです。
スイッチサイエンス/商品詳細 Arduino イーサネットシールド
古いバージョンを使っている人は、下記のサイトに対策が載っていました。自分もコンデンサひとつとダイオードひとつ追加してみたら正常に動作するようになりました。
Arduino Ethernet Shieldのパワーオンリセット: PS3とLinux、電子工作も