树莓派 SAKS 扩展板挑战应用 之 站点宕机指示

本文所介绍的内容基于树莓派瑞士军刀扩展板(SAKS),由于 SAKS 基于树莓派通用的 GPIO 设计,文中的原理和代码也适用于其他情况。

本文由树莓派实验室创作,遵循CC协议(署名-非商业性使用-禁止演绎-相同方式共享),欢迎树莓派爱好者们遵循协议内容转载传播。谢绝不遵守协议的转载和抄袭。

本节介绍通过 SAKS 扩展板的 LED 指示任意网站的可访问状况。如果你有一个自己的网站或者博客,确保它能够在任何时候都能正常访问是很有必要的。当被监测的网站无法访问或者发生错误时,红色或黄色 LED 亮起,而当网站能正常访问时,绿色指示灯亮起。

本例程中涉及到的 SAKS 扩展板引脚编号如下:

功能

BOARD
编码

BCM
编码

wiringPi
编码

LED排灯
74HC595
DS 31 6 22
SHCP 35 19 24
STCP 33 13 23

站点无法访问通常是因为:
1.服务器故障,Web 服务进程无法正常响应。此时无法获得任何请求响应。
2.服务器程序出错,Web 服务经常可以正常响应。此时可以获得请求的错误信息。
3.服务器或监测程序没有接入网络,或两者之间网络出现故障。

上述3种情况中,1、3均表现为请求超时或请求被拒绝,此时我们希望红色 LED 亮起提示管理员宕机。情况2通过错误代码可判断无法访问的具体原因,此情况下我们亮起黄色 LED 提示管理员需要排除错误。(实际上还可以根据需要,将请求返回的错误代码编号通过 SAKS 扩展板的数码管显示出来。)

以下程序代码将对预先设定的网址周期性进行监测,通过发送 HTTP 请求尝试获得应答。并对应答的结果来指示状态。

# -*- coding: utf-8 -*-
import RPi.GPIO as GPIO
import time
import urllib2
import socket

GPIO.setmode(GPIO.BCM)
# 初始化LED组控制引脚
DS = 6
SHCP = 19
STCP = 13

GPIO.setup(DS, GPIO.OUT)
GPIO.setup(SHCP, GPIO.OUT)
GPIO.setup(STCP, GPIO.OUT)

GPIO.output(DS, GPIO.LOW)
GPIO.output(SHCP, GPIO.LOW)
GPIO.output(STCP, GPIO.LOW)

# 要检测的网址
url = "https://shumeipai.nxez.com/"
# 设置超时时间10秒
urllib2.socket.setdefaulttimeout(10)
# 初始化状态
status = 0
# 检测频率间隔
interval = 60

def writeBit(data):
    GPIO.output(DS, data)

    GPIO.output(SHCP, GPIO.LOW)
    GPIO.output(SHCP, GPIO.HIGH)

#写入8位LED的状态
def writeByte(data):
    for i in range (0, 8):
        writeBit((data >> i) & 0x01)
    #状态刷新信号
    GPIO.output(STCP, GPIO.LOW)
    GPIO.output(STCP, GPIO.HIGH)

def check():
    global status
    try:
        response = urllib2.urlopen(url)
        if response.code == 200:
            status = 200
    except urllib2.HTTPError, e:
        if e.code == 500 or e.code == 404 or e.code == 403:
            status = e.code
        else:
            status = 0
    except urllib2.URLError, e:
        print e
        status = 0
    finally:
        print status


while True:
    check()
    #正常状态,绿灯亮
    if status == 200:
        writeByte(0x10)
    #异常状态,蓝灯亮
    elif status == 500 or status == 404 or status == 403:
        writeByte(0x04)
    #错误状态,红灯亮
    else:
        writeByte(0x40)

    time.sleep(interval)

以上代码保存为 sitecheck.py,接下来运行。

sudo python sitecheck.py

也可以从 GitHub 下载源码运行:

sudo git clone https://github.com/spoonysonny/SAKS-tutorials.git
cd SAKS-tutorials/site-check
sudo python sitecheck.py

如果需要监测的网址数量是多个,可以对上面的代码进行完善。将轻触开关和数码管加入其中,数码管显示网址编号,而轻触开关切换当前指示网站的状态指示。

需要特别留意的是,当被检测的域名无法正常解析时,某些ISP会自作主张地返回一个200状态(通常是类似114的页面),这种情况下程序对站点可访问性的判断可能会受到影响,请根据您的ISP特征添加必要的逻辑判断。

后面我们后面将开始介绍如何基于 SAKS 扩展板 DIY 各种有趣、实用的东西,欢迎持续关注!

本文属于《树莓派瑞士军刀扩展板(SAKS)DIY 教程》系列文章,查看系列文章目录,请访问:https://shumeipai.nxez.com/swiss-army-knife-shield-for-raspberry-pi-diy-tutorials