การประยุกต์ใช้ NODE MCU ESP8266 ในการ ping server หลายๆตัว


แนวคิด

      เนื่องจากหน้าที่หลักคือการ monitor server และ network  และมีจำนวน server และ switch หลายตัว ที่ต้องคอย monitor ว่าทำงานไหม ปกติต้องดูผ่านหน้าจอโปรแกรม หรือใช้เครื่องคอมพิวเตอร์ทำหน้าที่แทน แต่บทความนี้จะประยุกต์เอา ESP8266  ราคาถูกๆ แค่หลักร้อยต้นๆ มาทำหน้าที่แทน โดยหลักการทำงานคือ มันจะ ping ip ของ server และ switch ตามที่เรากำหนด หาก ping ไม่เจอ ก็จะแจ้งเตือนผ่าน line notify และเก็บลง firebase หรือ thingspeak ทำกราฟไว้ดู

  สำหรับ code นี้จะต้องติดตั้ง library เพิ่มเติม เป็น .zip file จากที่นี่้ http://arduiniana.org/Streaming/Streaming5.zip

*หมายเหตุยังไม่ได้เพิ่ม code ในส่วนของ line notify และ thingspeak  และเพิ่มส่งเวลา จาก ntp server ไปด้วย
  ต้องรวม ping + line notify + time + thingspeak  // ว่างๆ มาเขียนต่อให้เสร็จ






sourc code NODE MCU ESP8266


///////////////////////////////////////////////////

#include <ESP8266WiFi.h>       // https://github.com/esp8266/Arduino
extern "C" {
  #include <user_interface.h>  // https://github.com/esp8266/Arduino
  #include <ping.h>            // https://github.com/esp8266/Arduino
}
#include <Streaming.h>         // http://arduiniana.org/libraries/streaming

/******* EDIT *******/
const char* mySSID     = "ssid";
const char* myPASSWORD = "wifipassword";
const uint8_t pingCount = 3;     // number off Ping repetition
const uint8_t pingInterval = 1;  // Ping repetition every n sec
   /* Local Ping example: 6 x IP on (W)LAN to test if the device is ONline or OFFline *
    * Of course, this can also with internet addresses                                */
const uint8_t ipCount = 6;       // number of IP addresses in pingIp[2][n] array
const char* pingIp[2][ipCount] = {{"192.168.1.1",   "192.168.1.22",   "192.168.1.108", "192.168.1.11", "192.168.1.3", "192.168.1.27"},
                                  {"server", "AP", "CAMERA",    "AP_GATE",     "PC", "WEB"}};
/***** END EDIT *****/

struct ping_option pingOpt, pOpt;
struct ping_resp pingResp;
const uint8_t port = 80;
uint8_t ipNext = 0;

void setup() {
  Serial.begin(115200);
  delay(100);
  WiFi.disconnect();
  WiFi.begin(mySSID, myPASSWORD);
  while (WiFi.status() != WL_CONNECTED) {delay(200); Serial << ".";}
  /***** no other WiFi function required *****/
  Serial << endl << "doPing() start" << endl << "============" << endl;
  Serial << "Ping IP: " << pingIp[0][ipNext] << ", " << pingIp[1][ipNext] << endl;
  doPing(pingIp[0][ipNext]);  // start Ping IP[0][0]
}

void loop(){}

void pingRecv(void *arg, void *pdata) {  // Pong callback function
//  struct ping_option *pingOpt = (struct ping_option *)arg;
  struct ping_resp *pingResp = (struct  ping_resp *)pdata;
  if (pingResp->ping_err == -1) Serial << "Device OffLine" << endl;
  else Serial << "ping recv: bytes = " << pingResp->bytes << ", time = " << pingResp->resp_time << "ms" << endl;
}

void pingSent(void *arg, void *pdata) {  // Ping finished callback
//  struct ping_option *pingOpt = (struct ping_option *)arg;
//  struct ping_resp *pingResp = (struct  ping_resp *)pdata;
  Serial << "ping finished" << endl;
  if (++ipNext < ipCount)   {  // next Ping?
    Serial << "Ping IP: " << pingIp[0][ipNext] << ", " << pingIp[1][ipNext] << endl;
    doPing(pingIp[0][ipNext]);  // init and start Ping IP[0][n]
  }
}

void doPing(const char *targetIpAddress) {   // init and start Ping
  struct ping_option *pingOpt = &pOpt;
  pingOpt->count = pingCount;
  pingOpt->coarse_time = pingInterval;
  pingOpt->ip = ipaddr_addr(targetIpAddress);
  ping_regist_recv(pingOpt, pingRecv);  // Pong callback function 'pingRecv'
  ping_regist_sent(pingOpt, pingSent);  // Ping finished callback function 'pingSent'
  ping_start(pingOpt);  // start Ping
}



//////////////////////////////////////////////////
ขอบคุณแหล่งที่มา http://kendziorra.nl/arduino/93-esp8266-simple-pingpong

////////////////////// code time server ntp /////////////////////

#include <ESP8266WiFi.h>
#include <time.h>

const char* ssid = "ssid";                  //ใส่ชื่อ SSID Wifi
const char* password = "wifipasword";          //ใส่รหัสผ่าน

int timezone = 7 * 3600;                    //ตั้งค่า TimeZone ตามเวลาประเทศไทย
int dst = 0;                                //กำหนดค่า Date Swing Time

void setup()
{
 Serial.begin(115200);
 Serial.setDebugOutput(true);

  WiFi.mode(WIFI_STA);                                        //เชื่อมต่อ Wifi
  WiFi.begin(ssid, password);
  Serial.println("\nConnecting to WiFi");
  while (WiFi.status() != WL_CONNECTED) {
     Serial.print(",");
     delay(1000);
   }
    configTime(timezone, dst, "pool.ntp.org", "time.nist.gov");     //ดึงเวลาจาก Server
    Serial.println("\nWaiting for time");
    while (!time(nullptr)) {
      Serial.print(".");
      delay(1000);
    }
    Serial.println("");
}
        
void loop()
{
  configTime(timezone, dst, "pool.ntp.org", "time.nist.gov");    //ดีงเวลาปัจจุบันจาก Server อีกครั้ง
  time_t now = time(nullptr);
  struct tm* p_tm = localtime(&now);
  delay(1000);
}

/////////////////////////////////////////
ขอบคุณแหล่งที่มา  http://montienfocus.blogspot.com/2016/06/internet-esp8266.html

ความคิดเห็น

โพสต์ยอดนิยมจากบล็อกนี้

แจ้งเตือนเข้าไลน์กลุ่ม ผ่าน Line notify เมื่อมีคน login เข้า server ของเราผ่าน SSH (linux) หรือ remote desktop เข้ามา (windows server)

การทำ cloud iot ด้วย thingsboard ไว้ใช้เองครับ

การประยุกต์ใช้ line notify ในการแจ้งปัญหาการใช้งาน สำหรับ php