サーバ疎通状態を知らせるLED

更新日 2021-04-26 (月) 12:30:39

サーバを Raspberry Piから監視するシステム一つのLEDで2つのサーバ監視。

  • サーバAの疎通エラー
  • LEDが1秒間隔で点滅を繰り返す
  • サーバBの疎通エラー
  • LEDが2秒点灯1秒消灯を繰り返す
  • サーバA、B両方の疎通エラー
  • LEDt点灯

仕様

メインルーチン

CR 疎通確認
CR 疎通確認できたとき cr_flagファイルに「0」を書く。エラー時「1」を書く
MR 疎通確認
MR 疎通確認できたとき mr_flagファイルに「0」を書く。エラー時「1」を書く
,らイ魴り返す

LEDon/offルーチン

出力pin Pin37(GPIO PIN 26)

cr_flagファイル、mr_flagファイル読込
cr_flagファイル、mr_flagファイルともに「0」のときLED消灯

	LED_OFFルーチン
	1秒インターバル

cr_flagファイルが「1」、mr_flagファイル0」のとき点滅(1秒ON 1秒OFF)

	LED_ONルーチン
	1秒インターバル
	LED_OFFルーチン
	1秒インターバル

cr_flagファイルが「0」、mr_flagファイル1」のとき点滅(2秒ON 1秒OFF)

	LED_ONルーチン
	2秒インターバル
	LED_OFFルーチン
	1秒インターバル

cr_flagファイル、mr_flagファイルともに「1」のときLED点灯

	LED_ONルーチン
	1秒インターバル

,らい魴り返す

  • LEDの状態
cr_flagmr_flagLED
00OFF
101秒ON 1秒OFF
012秒ON 1秒OFF
11ON

LEDの表示プログラム

ledonoff_26.c

// LEDの状態
// ---------------------------------
// |cr_flag |mr_flag |LED          |
// |--------+--------+-------------|
// |0       |0       |OFF          |
// |1       |0       |1秒ON 1秒OFF |
// |0       |1       |2秒ON 1秒OFF |
// |1       |1       |ON           |
// ---------------------------------
//
// CR Pacs サーバ、MR Pacsサーバ 疎通チェック
//  CR 疎通確認
//  CR 疎通確認できたとき cr_flagファイルに「0」を書く。エラー時「1」を書く
//  MR 疎通確認
//  MR 疎通確認できたとき mr_flagファイルに「0」を書く。エラー時「1」を書く
//  ,らイ魴り返す(ただし、正常時は10秒間隔、Error時は1秒間隔)


#include <wiringPi.h>
#include <wiringPiI2C.h>
#include <stdio.h>
#include <stdlib.h>    // atof(charからdoubleに変換時必要
#include <stdbool.h>
#include <time.h>
#include <unistd.h>

// * ============ SSR Setting=========
#define PIN_SSR  26 

#define GPIO_ON  1
#define GPIO_OFF 0

int led_on(int pin_id ) {
    int result;

    digitalWrite( pin_id, GPIO_ON );
    result = GPIO_ON;
    return result;

}

int led_off(int pin_id ) {
    int result;

    digitalWrite( pin_id, GPIO_OFF );
    result = GPIO_OFF;
    return result;

}


/*ファイルの中身の値を返す(Raid Err)*/

int read_file(){
  FILE *fp;
  char *fname = "/home/pi/script/cr_flag";
  char buffer[8];

  if ((fp = fopen(fname, "r"))==NULL) {
    printf("ファイルを開くのに失敗しました\n");
    exit(1);
    }

  while((fgets(buffer, 8, fp))!=NULL) { 

    }
  //    printf("AA= %s\n",buffer);

  //文字列を整数に変換して戻す
    return atoi(buffer);
}
/*ファイルの中身の値を返す(Ping Err)*/

int read_file2(){
  FILE *fp;
  char *fname = "/home/pi/script/mr_flag";
  char buffer[8];

  if ((fp = fopen(fname, "r"))==NULL) {
    printf("ファイルを開くのに失敗しました\n");
    exit(1);
    }

  while((fgets(buffer, 8, fp))!=NULL) {

    }
  //    printf("AA= %s\n",buffer);

  //文字列を整数に変換して戻す
    return atoi(buffer);
}


int main ( int argc, char **argv ) {

  int ret1, ret2;

  /* Initialize wiringPi */
  if( wiringPiSetupGpio() == -1 ) return 1;

  /* Initialize GPIO */
  pinMode( PIN_SSR, OUTPUT );

// マイクロ秒 (1秒)
useconds_t delay=1000000;

int status_sw;

while (1){

  /* cr_flagファイル、mr_flagファイルともに「0」のときLED消灯 */

// --LEDONOFF決定する前に cr_flagとmr_flagの読み取り
  ret1 = read_file();

  ret2 = read_file2();

  // printf ("BB = %d \n", ret);

  if (ret1 == 0 && ret2 == 0){
    status_sw = led_off(PIN_SSR);
    usleep(delay);
  }

  /*cr_flagファイルが「1」、mr_flagファイル0」のとき点滅(1秒ON 1秒OFF)*/

// --LEDONOFFを決定する前にcr_flagとmr_flagの読み取り
  ret1 = read_file();

  ret2 = read_file2();

  if (ret1 == 1 && ret2 == 0){
    status_sw = led_on(PIN_SSR);

    usleep(delay);
 
   }

// --LEDONOFFを決定する前にcr_flagとmr_flagの読み取り
  ret1 = read_file();

  ret2 = read_file2();

  if (ret1 == 1 && ret2 == 0){

    status_sw = led_off(PIN_SSR);

    usleep(delay);
  }

//  printf("ON %d %d\n" ,status_sw, PIN_SSR);

  /* cr_flagファイルが「0」、mr_flagファイル1」のとき点滅(2秒ON 1秒OFF) */

// --LEDONOFFを決定する前にcr_flagとmr_flagの読み取り
  ret1 = read_file();

  ret2 = read_file2();
 
  if (ret1 == 0 && ret2 == 1){

    status_sw = led_on(PIN_SSR);

    usleep(delay);

  }

// --LEDONOFFを決定する前にcr_flagとmr_flagの読み取り
  ret1 = read_file();

  ret2 = read_file2();

  if (ret1 == 0 && ret2 == 1){

    usleep(delay);

    status_sw = led_off(PIN_SSR);

    usleep(delay);

  }

  /* cr_flagファイル、mr_flagファイルともに「1」のときLED点灯 */

// --LEDONOFFを決定する前にcr_flagとmr_flagの読み取り
  ret1 = read_file();

  ret2 = read_file2();

   if (ret1 == 1 && ret2 == 1){
     status_sw = led_on(PIN_SSR);
     usleep(delay);
   }


//  printf("OFF %d\n" ,status_sw);

 }

}
  • コンパイル

gcc -o ledonoff_26 ledonoff_26.c -lwiringPi

メインプログラム

cr_mr_ck.php

<?php
// CR Pacs サーバ、MR Pacsサーバ 疎通チェック
//  CR 疎通確認
//  CR 疎通確認できたとき cr_flagファイルに「0」を書く。エラー時「1」を書く
//  MR 疎通確認
//  MR 疎通確認できたとき mr_flagファイルに「0」を書く。エラー時「1」を書く
//  ,らイ魴り返す(ただし、正常時は10秒間隔、Error時は1秒間隔)

//------LED 点灯、点滅、消灯----



//-----Ping 応答確認ルーチン

function Ping($ip){

       //配列の初期化(初期化しないと実行結果が追加されていくがサブルーチンなので不要かも)
         $output = array();

         $cmd = "/bin/ping -c 1 " . $ip ;
         $s_moji = "1 received, 0% packet loss";
         $n_line = 0;
         $ret = exec($cmd ,$output);
         for ($i = 0 ; $i < count($output); $i++) {
//           echo $output[$i]. "\n";

//文字列$s_mojiが見つかったら疎通できるので、フラグ0を立ててforを抜け出す
            if (strpos($output[$i], $s_moji) != FALSE){
                $p_flag = 0;
                break;
                }
             $p_flag = 1;
         }

//疎通できるとき   $p_flag : 0
//疎通エラーのとき  $p_flag : 1

         return $p_flag;
}
 

//------main------------------ 

//リモートのIP

       $ip1 = "192.168.0.118"; // CR Pacs サーバ
       $ip2 = "192.168.0.122"; // MR Pacs サーバ


//標準出力と標準エラー出力の両方共を破棄

        $stdout_discard = " >/dev/null 2>&1";

//出力PIN

        $pin_no = 26;

//GPIOポートを出力に設定

        $cmd = "/usr/local/bin/gpio -g mode " . $pin_no . " out";

        $ret = exec($cmd);

//ledonoff_20のプロセス停止(2重起動防止のため)

        $cmd = "/usr/bin/killall /home/pi/script/ledonoff_26" . $stdout_discard;

        $ret = exec($cmd);

//ledonoff_26の起動

        //LED ONOFFプログラムを非同期で実行
        $cmd = "/home/pi/script/ledonoff_26" . $stdout_discard . " &";
        $ret = exec($cmd);


// Ping状態のファイル

        $cr_status = "/home/pi/script/cr_flag";
        $mr_status = "/home/pi/script/mr_flag";


//ループ時間
        $Tintrval = 10; // 基本 10秒


        while(1){


//Pingの疎通確認ルーチンへ
                $ping_flag1 = Ping($ip1);

//Ping疎通結果をファイル 「/home/pi/script/cr_flag」に書き込み

                $cmd = "echo " . $ping_flag1 . " > " . $cr_status;

                // echo $cmd . "\n";

                $ret = exec($cmd);



//Pingの疎通確認ルーチンへ
                $ping_flag2 = Ping($ip2);

//Ping疎通結果をファイル 「/home/pi/script/mr_flag」に書き込み

                $cmd = "echo " . $ping_flag2 . " > " . $mr_status;

                // echo $cmd . "\n";

                $ret = exec($cmd);

//$ping_flag1または2が1(Error時)の時はタイムインターバルを0秒にする

                if($ping_flag1 == 1 || $ping_flag2 == 1)){
                        $Tinterval = 0;

                }else{
                        $Tinterval = 10;
                }


// ledonoff_26が止まったら起動する

                //配列の初期化(初期化しないと実行結果が追加されていく)
                $output = array();

                $cmd = "/bin/ps x | /bin/grep ledonoff_26 | /bin/grep -v grep"; 
                $ret = exec($cmd ,$output);
//              echo count($output) . " \n";
                if ( count($output) == 0){

                        //LED ONOFFプログラムを非同期で実行
                        $cmd = "/home/pi/script/ledonoff_26" . $stdout_discard . " &";
                        $ret = exec($cmd);
                }

                // 10秒のタイムインターバル
                sleep($Tinterval);

    }

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2021-04-26 (月) 12:30:39 (154d)