以针会友php_Raspberry Pi

用Python爬虫抓取PHP探针提供的实时信息,比如网速、负载、内存信息等等,然后显示在1602显示屏上。让你随时监控服务器

关键词:PHP探针、服务器监控、VPS监控、Python、树莓派、Raspberry Pi、1602。

项目编号004,分类为信息/监控。

0.序言

我的ipv6代理服务器很受欢迎,因此按需求来讲,我需要一个能实时监控流量的工具。PHP探针作为一个很方便的工具,成为了我的选择。但是自带的web界面对我来说不是很方便。

玩了一假期的树莓派,之前做项目剩了很多1602屏幕。它们之间的组合,就有了今天的作品。

服务器监控助手,基于PHP探针和Raspberry Pi。用Python爬虫抓取PHP探针提供的实时信息,比如网速、负载、内存信息等等,然后经过处理,显示在1602显示屏上。让你随时监控服务器网速。服务器down掉了也能一秒发现。

又到了激动人心的命名环节了。不用考虑那么多,名字我早想好了

《洞察秋毫的观测者》——基于PHP探针和树莓派的服务器监控助手

1.PHP探针

使用PHP探针是有理由的,不光是因为MJJ最喜欢以针会友,也是因为对于一个有LNMP环境的服务器,上一个探针并不会带来多少性能损失。因此,准备PHP探针既方便,又合适。

我也做了一个提前预备,探索了一下雅黑PHP探针的结构,尝试用爬虫抓取了一下。

详细笔记参见:

[学习笔记]利用PHP探针和Python爬虫监控服务器状态–https://steinslab.io/archives/1144

这里调出一些骨架内容。

1.1 关于PHP探针

关于PHP探针,给不知道的读者说道说道。

【雅黑PHP探针】

雅黑PHP探针最大的优点:每秒更新,不用刷网页。有一个负责的站长,会对探针进行长期支持和更新。

用于Linux系统(不推荐使用于Windows系统)。

可以实时查看服务器硬盘资源、内存占用、网卡流量、系统负载、服务器时间等信息,1秒钟刷新一次。

以及包括服务器IP地址,Web服务器环境监测,php等信息。

php探针对于经常购买VPS折腾的人肯定不陌生,简单地老说就是一个可以获取系统信息并在网页上显示的php程序。雅黑PHP探针的界面如下:

因此,经常有人买各种廉价小内存的VPS,只能挂个探针,却因此获得巨大快感,并从bbs上交流。叫做以针会友。

1.2 分析

具体的分析方法请参见笔记:

[学习笔记]利用PHP探针和Python爬虫监控服务器状态–https://steinslab.io/archives/1144

1.3 服务器返回json

这个探针,在前端使用ajax每秒向服务器请求数据,请求的url为:

http://sfo01.misaka.cc:888/tz.php?act=rt

服务器会返回一个json数据,用于解析计算,在前端显示服务器负载网速信息等。返回的json其实多了小括号,示例如下:

({"useSpace":"3.986","freeSpace":"15.576","hdPercent":"20.38","barhdPercent":"20.38%","TotalMemory":"490.23 M","UsedMemory":"414.94 M","FreeMemory":"75.29 M","CachedMemory":"84.82 M","Buffers":"105.35 M","TotalSwap":"0 M","swapUsed":"0 M","swapFree":"0 M","loadAvg":"0.05 0.01 0.00 1\/117","uptime":"3\u59293\u5c0f\u65f644\u5206\u949f","freetime":"","bjtime":"","stime":"2017-02-18 15:35:36","memRealPercent":"45.85","memRealUsed":"224.77 M","memRealFree":"265.46 M","memPercent":"84.64%","memCachedPercent":"17.3","barmemCachedPercent":"17.3%","swapPercent":"0","barmemRealPercent":"45.85%","barswapPercent":"0%","NetOut2":"44 K 505 B ","NetOut3":"2 G 826 M 560 K 68 B ","NetOut4":"","NetOut5":"","NetOut6":"","NetOut7":"","NetOut8":"","NetOut9":"","NetOut10":"","NetInput2":"44 K 505 B ","NetInput3":"3 G 146 M 334 K 784 B ","NetInput4":"","NetInput5":"","NetInput6":"","NetInput7":"","NetInput8":"","NetInput9":"","NetInput10":"","NetOutSpeed2":"45561","NetOutSpeed3":"3014180932","NetOutSpeed4":"0","NetOutSpeed5":"","NetInputSpeed2":"45561","NetInputSpeed3":"3374660368","NetInputSpeed4":"0","NetInputSpeed5":""})

爬虫的思路也清晰了。

2 Python爬虫

Python爬虫的简易教程我参考了:

文章简洁精悍。没多少字,简单带过后,了解了爬虫运用的一些思想。

我的探索笔记见:

[学习笔记]利用PHP探针和Python爬虫监控服务器状态–https://steinslab.io/archives/1144

最后的爬虫代码(Python3):

# -*- coding:utf-8 -*-

from urllib import request

import json

#探针爬虫类

class PHPTZ:

#初始化方法,定义一些变量

def __init__(self):

self.url = 'http://138.197.193.89:888/tz.php?act=rt'

def getData(self):

try:

f = request.urlopen(self.url)

data = f.read()

data2 = str(data.decode('utf-8')).strip('(').strip(')')

dataj = json.loads(data2)

print(dataj)

print(type(dataj))

except

print('Error')

return None

myserver = PHPTZ()

myserver.getData()

运行一下:

pi@raspberrypi:~ $ sudo python3 tz.py

{'NetInput7': '', 'NetInput5': '', 'NetOut2': '44 K 505 B ', 'uptime': '3天4小时48分钟', 'loadAvg': '0.00 0.00 0.00 1/115', 'NetInput10': '', 'stime': '2017-02-18 16:39:49', 'NetInput4': '', 'NetOutSpeed2': '45561', 'NetInputSpeed3': '3379146879', 'freetime': '', 'NetOut9': '', 'UsedMemory': '418.66 M', 'hdPercent': '20.39', 'swapFree': '0 M', 'NetOut7': '', 'CachedMemory': '87.81 M', 'NetInput3': '3 G 150 M 620 K 127 B ', 'NetOut3': '2 G 830 M 296 K 887 B ', 'NetInputSpeed4': '0', 'NetOut6': '', 'NetInput2': '44 K 505 B ', 'memRealPercent': '45.61', 'FreeMemory': '71.57 M', 'NetInput8': '', 'NetOut8': '', 'memRealFree': '266.66 M', 'freeSpace': '15.573', 'swapPercent': '0', 'barmemRealPercent': '45.61%', 'memCachedPercent': '17.91', 'TotalMemory': '490.23 M', 'NetInputSpeed2': '45561', 'barmemCachedPercent': '17.91%', 'NetInputSpeed5': '', 'TotalSwap': '0 M', 'NetOut4': '', 'barhdPercent': '20.39%', 'Buffers': '107.28 M', 'useSpace': '3.989', 'memPercent': '85.4%', 'bjtime': '', 'NetOutSpeed4': '0', 'NetInput6': '', 'memRealUsed': '223.57 M', 'barswapPercent': '0%', 'swapUsed': '0 M', 'NetOut5': '', 'NetInput9': '', 'NetOutSpeed5': '', 'NetOutSpeed3': '3018105719', 'NetOut10': ''}

确实得到了一个包含数据的字典。

这里注意一下。字典中”speed”的值为一累计数,在后来的数据处理用,需要算出差值,在本机估算网速。

3.使用1602液晶屏

3.1 1602及接口定义

16是指一行显示16个字符,02表示2行。1602是一种非常常见的、在DIY和工业中广泛使用的显示期间。价格低,可以选用各种颜色的背光,字符颜色也是可选的。

这里不是i2c接口的1602显示屏。

1602的引脚定义如下:

VSS,接地

VDD,接5V电源

VO,液晶对比度调节,接电位器中间的引脚

RS,寄存器选择

RW,读写选择

EN,使能信号

D0,数据位0,4位工作模式下不用,不接

D1,数据位1,4位工作模式下不用,不接

D2,数据位2,4位工作模式下不用,不接

D3,数据位3,4位工作模式下不用,不接

D4,数据位4

D5,数据位5

D6,数据位6

D7,数据位7

A,液晶屏背光+,接5V

K,液晶屏背光-,接地

3.2 Raspberry Pi 3B 的引脚定义

该图是型号3b的引脚定义图。之前也是图不对被坑了好久。注意在以下Python代码中,接口号码指的是“GPIO”代号。

3.3 Adafruit的charLCD库

Adafruit系列的库是我比较喜欢的库,好用,简洁易懂!

下载后在树莓派上安装时,注意:

需要注意python命令默认代表的Python版本号。我的树莓派,“python”这条命令默认指的是Python2。因此,我需要运行

sudo python3 setup.py install

3.4 点亮1602和运行示例代码

来看一下charLCD库的示例代码:

#!/usr/bin/python

# Example using a character LCD connected to a Raspberry Pi or BeagleBone Black.

import time

import Adafruit_CharLCD as LCD

# Raspberry Pi pin configuration:

lcd_rs = 27 # Note this might need to be changed to 21 for older revision Pi's.

lcd_en = 22

lcd_d4 = 25

lcd_d5 = 24

lcd_d6 = 23

lcd_d7 = 18

lcd_backlight = 4

# BeagleBone Black configuration:

# lcd_rs = 'P8_8'

# lcd_en = 'P8_10'

# lcd_d4 = 'P8_18'

# lcd_d5 = 'P8_16'

# lcd_d6 = 'P8_14'

# lcd_d7 = 'P8_12'

# lcd_backlight = 'P8_7'

# Define LCD column and row size for 16x2 LCD.

lcd_columns = 16

lcd_rows = 2

# Alternatively specify a 20x4 LCD.

# lcd_columns = 20

# lcd_rows = 4

# Initialize the LCD using the pins above.

lcd = LCD.Adafruit_CharLCD(lcd_rs, lcd_en, lcd_d4, lcd_d5, lcd_d6, lcd_d7,

lcd_columns, lcd_rows, lcd_backlight)

# Print a two line message

lcd.message('Hello\nworld!')

# Wait 5 seconds

time.sleep(5.0)

# Demo showing the cursor.

lcd.clear()

lcd.show_cursor(True)

lcd.message('Show cursor')

time.sleep(5.0)

# Demo showing the blinking cursor.

lcd.clear()

lcd.blink(True)

lcd.message('Blink cursor')

time.sleep(5.0)

# Stop blinking and showing cursor.

lcd.show_cursor(False)

lcd.blink(False)

# Demo scrolling message right/left.

lcd.clear()

message = 'Scroll'

lcd.message(message)

for i in range(lcd_columns-len(message)):

time.sleep(0.5)

lcd.move_right()

for i in range(lcd_columns-len(message)):

time.sleep(0.5)

lcd.move_left()

# Demo turning backlight off and on.

lcd.clear()

lcd.message('Flash backlight\nin 5 seconds...')

time.sleep(5.0)

# Turn backlight off.

lcd.set_backlight(0)

time.sleep(2.0)

# Change message.

lcd.clear()

lcd.message('Goodbye!')

# Turn backlight on.

lcd.set_backlight(1)

用起来感觉和Arduino一样。

已经很清楚了,主要是注意,数字代表GPIO接口。

ok,我找到正确的GPIO参照图后,成功点亮。

4.最终组合

先贴出来完整代码

from urllib import request

import json

import time

import Adafruit_CharLCD as LCD

import math

class PHPTZ:

def __init__(self):

self.url = 'http://150.95.151.229:8888/tz.php?act=rt'

self.dataj = []

def getData(self):

try:

f = request.urlopen(self.url)

data = f.read()

data2 = str(data.decode('utf-8')).strip('(').strip(')')

self.dataj = json.loads(data2)

return self.dataj

except :

print('Error')

return None

def getSpeed(self):

return self.dataj['NetOutSpeed3']

class my1602:

def __init__(self,a):

self.lcd_rs = 27

self.lcd_en = 22

self.lcd_d4 = 25

self.lcd_d5 = 24

self.lcd_d6 = 23

self.lcd_d7 = 18

self.lcd_backlight = 4

self.lcd_columns = 16

self.lcd_rows = 2

self.lcd = LCD.Adafruit_CharLCD(self.lcd_rs, self.lcd_en, self.lcd_d4, self.lcd_d5, self.lcd_d6, self.lcd_d7,self.lcd_columns, self.lcd_rows, self.lcd_backlight)

self.dataj = a

def display(self,b,d,t):

self.dataj = b

self.lcd.clear()

self.lcd.message(self.dataj['NetOut3']+'\n'+str("%.3f"%(d/1024/t))+' KB/s')

#主函数开始,前四行类似于setup

myserver = PHPTZ()

mylcd = my1602(data)

time1 = time.time()

speed2=speed1=myserver.getSpeed()

#大循环

while(1):

data=myserver.getData()

speed2=speed1

data1=myserver.getSpeed()

time2=time1

time1=time.time()

mylcd.display(data,float(speed1)-float(speed2),float(time1)-float(time2))

主函数,前四行类似于Arduino中的setup(),只运行一次初始化。然后进入大循环。

myserver.getSpeed()返回值为字符串,需要转化成float。

计算网速,用了两次time.time获取时间戳,然后再相除换算得到具体网速。鉴于本地和服务器延迟基本稳定,此方法比较准确。

"%.3f"%(d/1024/t)保留3位小数

面向对象的设计模式意识浅薄,多多包涵

运行,成功!

5.包装及最终效果

包装见:

最终效果:

6.结语

假期学了一点点Python,玩了树莓派。在学期初真真正正用树莓派做出了一个符合自己需求的东西。

树莓派真的好玩,我突然发现我对Linux的理解更深了,一些日常操作也不在话下了。

树莓派真好玩儿,您得来一个。

相关

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值