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

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


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

192.168.111.10
192.168.111.40
192.168.111.100〜110

以下の値は変更が必要です。
user64:こちらのページで 紹介しました「Email AddressをBase64に変換した文字列」
pass64:こちらのページで 紹介しました「PasswordをBase64に変換した文 字列」
mail_from:メール送信者のメールアドレス
mail_to:メール送信先のメールアドレス

/*
   Email client sketch for W51000
   Using SMTPClient Library
*/

#include <SPI.h>
#include <Ethernet.h>
#include <Mail.h>
#include <SMTPClient.h>
#include <ICMPPing.h>
 
// this must be unique
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
 
char server[] = "mail.smtp2go.com";
int port = 2525;
char user64[] = "Email AddressをBase64に変換した文字列"; // Your Username of SMTP2GO
char pass64[] = "PasswordをBase64に変換した文字列"; // Your Password of SMTP2GO
char mail_from[] = "Me<MailFrom@example.com>"; // Mail From
char mail_to[] = "You<MailTo@example.com>"; // Mail To

EthernetClient ethClient;

SmtpClient client(&ethClient, server, port);

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()
{
  byte inChar;
  Mail mail;
  char *body;
  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);
      Serial.println("Ready. Press 'e' to send.");
    } else {
      Serial.println("FAIL");
    }
  }

  if (connect) {
    inChar = Serial.read();
    if(inChar == 'e') {
      for(int i=0;i<sizeof(ips);i++) {
        if (ips[i] == MyIP) continue;
        pingAddr[3]=ips[i];
        body=execPing(pingAddr);
        if (body == NULL) continue;
        Serial.println(body);
     
        mail.login(user64);
        mail.password(pass64);
        mail.from(mail_from);
        mail.to(mail_to);
        mail.subject("Arduino email test");
        mail.body(body);
        if (client.send(&mail)) {
          Serial.println("Email sent");
        } else {
          Serial.println("Email failed");
        }
        free(body);
        delay(1000);
      } // end for
      Serial.println("Ready. Press 'e' to send.");
    }
  }

  ret = Ethernet.maintain();
//  Serial.print("maintain()=");
//  Serial.println(ret);
  if (ret == 1 || ret == 3) connect = 0;

}


char *execPing(IPAddress pingAddr) {
  char *buffer = NULL;

  ICMPEchoReply echoReply = ping(pingAddr, 4);
  if (echoReply.status == SUCCESS) return buffer;
  buffer=(char *)malloc(256);
  if (buffer == NULL) return buffer;
  memset(buffer,0,256);
  sprintf(buffer, "%d.%d.%d.%d Echo request failed; %d",
  pingAddr[0],pingAddr[1],pingAddr[2],pingAddr[3],echoReply.status);
  return buffer;
}

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



ここまで表示されたら「e」を送信します。



2つのアドレスから応答がありません。
このようなメールが届きます。




続く...