RaspberryPiと携帯回線網(+VPN)の死活監視プログラム

こんにちは、筆者です。RaspberryPiと携帯回線網の組み合わせは最強です。しかし、時々ですが携帯回線がダウンしてしまう場合があります。それの対策として死活監視プログラムの作成が必須となります。L-02Cのファームアップデートだけでは対処できないかも…。

Pythonを使ったPingの確認

Pythonを使ったPingの確認は前回の記事に詳しくかいています。pypingを使う方法です。pypingを使うためにはpipで追加する必要があります。

$sudo pip install pyping

LEDを組み合わせる

GPIO 17,27,22 (Board 11, 13, 15)を使います。LEDと抵抗を準備してください。

Pythonで作ってみる(ベータ版)

ちょっと急いで作ったので使用は自己責任で。多分大丈夫だとは思う。送り先と繰り返し調整は注意して下さい。間違えがあればコメントよろしくお願いします。一応確認はしていますが…。

※追記:pypingは多分pingを送るinterfaceがないとエラーが発生します。つまり、エラーが繰り返してしまうトラブルが発生します。これを解消するためpypingのエラーに対して例外処理を施して再起動を円滑に行えるように対処しました。

$vi ping_monitor.py
#!/usr/bin/python
# -*- coding: utf-8 -*-

import pyping
import RPi.GPIO as GPIO
import time
import os
import sys
GPIO.setmode(GPIO.BOARD)
GPIO.setup(11, GPIO.OUT)
GPIO.setup(13, GPIO.OUT)
GPIO.setup(15, GPIO.OUT)
################################################
#確認したいアドレス
host_dns     = "8.XXX.XXX.XXX"
host_vpn_A   = "25.XXX.XXX.XXX"
#代替比較アドレス
host_vpn_B   = "25.XXX.XXX.XXX"
################################################
#tが時間,sがtime sleep
def led_n3_f(t, s):
   n  = 0
   ts = t / (s * 2)
   while n < ts:
      GPIO.output(11, True)
      GPIO.output(13, True)
      GPIO.output(15, True)
      time.sleep(s)
      GPIO.output(11, False)
      GPIO.output(13, False)
      GPIO.output(15, False)
      time.sleep(s)
      n += 1
def led_n1_f(led_no, t, s):
   n  = 0
   ts = t / (s * 2)
   while n < ts:
      GPIO.output(led_no, True)
      time.sleep(s)
      GPIO.output(led_no, False)
      time.sleep(s)
      n += 1
def ping_tp(host_name, led_no, t):
   try:
      r_host = pyping.ping(host_name)
      if r_host.ret_code == 0:
         led_n1_f(led_no, t, 0.1)
         GPIO.output(led_no, True)
         return 0
      else:
         led_n1_f(led_no, t, 0.5)
         GPIO.output(led_no, False)
         return 1
   except:
      led_n1_f(led_no, t, 0.5)
      GPIO.output(led_no, False)
      return 1
def ping_sb(host_name_A, host_name_B, led_no, t):
   try:
      rA_host = pyping.ping(host_name_A)
      rB_host = pyping.ping(host_name_B)
      rAB     = (rA_host.ret_code) * (rB_host.ret_code)
      if rAB == 0:
         led_n1_f(led_no, t, 0.1)
         GPIO.output(led_no, True)
         return 0
      else:
         led_n1_f(led_no, t, 0.5)
         GPIO.output(led_no, False)
         return 1
   except:
      led_n1_f(led_no, t, 0.5)
      GPIO.output(led_no, False)
      return 1
def led_wait(t, s):
   n  = 0
   ts = t / (s * 2)
   while n < ts:
      GPIO.output(15, False)
      GPIO.output(11, True)
      time.sleep(s)
      GPIO.output(11, False)
      GPIO.output(13, True)
      time.sleep(s)
      GPIO.output(13, False)
      GPIO.output(15, True)
      time.sleep(s)
      n += 1
#EX:)解説:ホスト名, GPIOのPIN, 指定時間
#EX:)ping_tp(host_vpn_A, 11, 5)
#待ち時間
led_n3_f(10, 0.7)
led_wait(50, 0.25)

############################################################
while True:
   try:
      cn = 0
      while cn < 30:
         led_n1_f(15, 10, 1.5)
         GPIO.output(15, True)
         time.sleep(50)
         cn += 1
      tt1 = ping_tp(host_dns, 11, 20)
      if tt1 == 0:
         kk1 = ping_sb(host_vpn_A, host_vpn_B, 13, 20)
         if kk1 == 0:
            pass
         else:
            led_n1_f(15, 10, 0.5)
            os.system('sudo hamachi login')
            kk2 = ping_sb(host_vpn_A, host_vpn_B, 13, 20)
            if kk2 == 0:
               pass
            else:
               led_n1_f(15, 20, 0.05)
               os.system('sudo reboot')
               sys.exit()
      else:
         tt2 = ping_tp(host_dns, 11, 20)
         if tt2 == 0:
            kk3 = ping_sb(host_vpn_A, host_vpn_B, 13, 20)
            if kk3 == 0:
               pass
            else:
               led_n1_f(15, 10, 0.5)
               os.system('sudo hamachi login')
               kk2 = ping_sb(host_vpn_A, host_vpn_B, 13, 20)
               if kk2 == 0:
                  pass
               else:
                  led_n1_f(15, 20, 0.05)
                  os.system('sudo reboot')
                  sys.exit()
         else:
            led_n1_f(15, 20, 0.05)
            os.system('sudo reboot')
            sys.exit()
   except:
      led_n3_f(1800, 0.05)
      os.system('sudo reboot')
      sys.exit()

自動起動するようにする

再起動後自動起動することによってまた監視を続行する。

$sudo vi /etc/rc.local

#最後らへんに追加 先程作ったディレクトリを選択してください。ここではusr
python /usr/local/bin/ping_monitor.py &

exit 0

以上

自動起動を止めたい場合はrc.localの追加部分をコメントアウトするか削除してください。

広告

名前とアドレスは任意です。ご自由にコメントを。

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中