ArduinoとEthernetシールドとDHCPとDNS

以前書いた 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、電子工作も


新しく会社作りました!

コメントをどうぞ