1日1回だけメールを送信する

Raspberryへのping結果をメールする(1)


今まで、Ethernetシールドを使ったメール送信を紹介してきました。
そこで、Raspberry君達の生死状況を Arduino の ping で確認し、その結果をメールで送信してみます。
全体のイメージはこのような感じです。



まず、Arduinoで ping ができる様に、こちらから Arduino-Ping のライブラリをダウンロードします。
ダウンロードして展開したら「icmp_ping」のフォルダーだけをライブラリーフォルダーに移動します。

最初のArduinoのスケッチは以下の通りです。
ips には、生死確認を行いたいRaspberry君達のIPアドレスの一番最後の桁を、
pingAddrにはIPアドレスの先頭の3桁を指定します。
以下のスケッチでは以下のIPアドレス(自分自身を除く)を持つRaspberry君達にpingを発行します。

192.168.111.10
192.168.111.40
192.168.111.100〜110

/*
  Ping Example
 */

#include <SPI.h>        
#include <Ethernet.h>
#include <ICMPPing.h>

byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED}; // mac address for ethernet shield
byte ips[] = {10,40,100,101,102,103,104,105,106,107,108,109,110}; // ip address for ping target
IPAddress pingAddr(192,168,111,000); // ip address to ping

SOCKET pingSocket = 0;

ICMPPing ping(pingSocket, (uint16_t)random(0, 255));

bool connect;
byte MyIP;

void setup()
{
  Serial.begin(9600);
  connect = 0;
}

void loop()
{
  int ret;
 
  if (!connect) {
    Serial.print("Connecting DHCP Server....");
    if (Ethernet.begin(mac)) {
      connect=1;
      Serial.println("OK");
      Serial.println(Ethernet.localIP());  // IPアドレスを表示
      MyIP = Ethernet.localIP()[3];  // 自分のIPアドレス
      Serial.print("MyIP=");
      Serial.println(MyIP);
    } else {
      Serial.println("FAIL");
    }
  }
 
  if (connect) {
    for(int i=0;i<sizeof(ips);i++) {
      if (ips[i] == MyIP) continue;
      pingAddr[3]=ips[i];
      execPing(pingAddr);
      delay(1000);
    } // end for
  } // end if
 
  delay(10000);
}

void execPing(IPAddress pingAddr) {
  char buffer[256];
  int ret;
 
  ICMPEchoReply echoReply = ping(pingAddr, 4);
  if (echoReply.status == SUCCESS)
  {
    sprintf(buffer,
           "Reply[%d] from: %d.%d.%d.%d: bytes=%d time=%ldms TTL=%d",
            echoReply.data.seq,
            echoReply.addr[0],
            echoReply.addr[1],
            echoReply.addr[2],
            echoReply.addr[3],
            REQ_DATASIZE,
            millis() - echoReply.data.time,
            echoReply.ttl);
  }
  else
  {
    sprintf(buffer, "%d.%d.%d.%d Echo request failed; %d",
    pingAddr[0],pingAddr[1],pingAddr[2],pingAddr[3],echoReply.status);
  }
  Serial.println(buffer);
}

このスケッチを実行するとArduinoのシリアルモニターに以下が表示されます。



192.168.111.103は自分自身なのでpingのあて先から除外しています。
192.168.111.108 と 110からは応答がありません。

続く....