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の追加部分をコメントアウトするか削除してください。
最近のコメント