树莓派如何监控和记录网速

在这个Raspberry Pi网速监控教程中,我们将向您展示如何设置您的Raspberry Pi来监控您的互联网连接,并将数据保存到Grafana或Google Drive中。

Internet-Speed-Monitor-Thumbnail.jpg

如果你对监测你的下载速度,上传速度和ping随时间的影响感兴趣,本教程是非常好的。

此外,这可以帮助你找出什么时候你的网络可能处于峰值容量,或者你的网络连接是否下降。

为了实现这个网速监控,我们将向你展示如何编写一个小型的Python脚本,与Ookla的一个名为Speedtest CLI的程序进行交互。Speedtest CLI是我们的网速监控器用来监控网络连接的。

该程序通过轮询流行的speedtest.net服务来获取你的ping、下载速度和上传速度。

设备清单

下面是用来设置Raspberry Pi网速监控器的所有设备,点击链接可直达特别优惠购买。

建议

可选

安装Speedtest CLI

1. 在开始设置Raspberry Pi监控网速之前,我们必须首先确保我们的Raspberry Pi是最新的。

在终端中运行以下两个命令来更新Raspberry Pi。

sudo apt-get update
sudo apt-get upgrade

2. 现在我们需要安装一些包,这样我们就可以为Speedtest CLI软件添加包库。

运行以下命令安装gnupg1、apt-transport-https和dirmngr到你的Raspberry Pi。

sudo apt install apt-transport-https gnupg1 dirmngr

apt-transport-https 包是用来给 apt 包管理器增加对 https 协议的支持。如果没有这个包,apt在连接到Ookla的包库时就会出错。

此外,我们还安装了gnupg1,这个包用于您的Raspberry Pi和Speedtest.net服务器之间的安全通信。

最后,我们安装dirmngr包。这个包用于处理将包仓库添加到你的Raspberry Pi的源代码列表中。

3. 安装好我们需要的包后,现在可以将Ookla的Speedtest仓库的GPG密钥添加到钥匙链中。

我们需要这个钥匙链来下载speedtest命令行接口到我们的Raspberry Pi。

sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 379CE192D401AB61

4. 接下来我们需要将Ookla仓库添加到我们的来源列表中。

如果没有添加存储库,我们将无法将Speedtest CLI安装到我们的Raspberry Pi上。

你可以通过运行以下命令来添加这个版本库。

echo "deb https://ookla.bintray.com/debian generic main" | sudo tee  /etc/apt/sources.list.d/speedtest.list

5. 由于我们添加了一个新的包库,我们需要更新我们的包列表。

更新软件包列表就像运行以下命令一样简单。

sudo apt update

6. 最后,我们可以从Ookla将官方的Speedtest CLI安装到我们的Raspberry Pi上。

使用以下命令将软件包安装到您的设备上。

sudo apt install speedtest

6. 现在我们可以测试我们是否已经将speedtest软件安装到你的Raspberry Pi上。

让我们运行以下命令来启动speedtest。

speedtest

当您第一次在Raspberry Pi上运行speedtest软件时,您将被要求同意一些条款和条件。

要继续通过这个警告,你需要做的就是输入 “YES”,然后按ENTER键。

编写我们的速度测试Python脚本

1. 现在我们已经在Raspberry Pi上安装了Speedtest CLI,现在我们可以继续编写Python脚本,它将持续监控我们的下载和上传速度。

我们可以通过运行下面的命令开始为Raspberry Pi网速监控器创建Python脚本。

cd ~
sudo nano speedtest.py

2. 在这个文件中写下以下几行代码。我们将对代码的每一个重要部分进行解释,让你了解一切是如何工作的。

import os
import re
import subprocess
import time

这四行定义了我们在脚本中要依赖的所有库。下面我们将解释如何使用这些库。

导入os。os库是脚本用来与操作系统本身交互的。

在这个脚本中,我们将使用这个库来检查文件是否存在。

import re:re库通过提供一个处理模式搜索的库,让我们可以轻松地进行正则表达式。

我们用它来从Speedtest CLI给我们的数据中找到我们想要的值。

import subprocess: 子进程库对这个脚本是必不可少的,因为我们需要它来调用另一个python脚本。

在我们的案例中,我们将使用子进程库,这样我们就可以启动Speedtest CLI软件,并检索它返回的值。

导入时间。我们利用时间库,这样我们就可以记录每次调用Speedtest CLI软件的日期和时间。

这个库是可以让我们在很长一段时间内跟踪我们的速度。

response = subprocess.Popen('/usr/bin/speedtest', shell=True, stdout=subprocess.PIPE).stdout.read().decode('utf-8')

在这行代码中,我们利用子进程库启动对Speedtest CLI的调用,并告诉它把所有的东西从speedtest管到stdout。

通过在调用结束时使用 stdout.read().decode(‘utf-8’),我们将 Speedtest CLI 的响应存储到我们的响应变量中,并将其解码为一个可用的 Python 字符串。

ping = re.search('Latency:\s+(.*?)\s', response, re.MULTILINE)
download = re.search('Download:\s+(.*?)\s', response, re.MULTILINE)
upload =  re.search('Upload:\s+(.*?)\s', response, re.MULTILINE)

这三行代码相当简单,都是做同样的事情。

他们使用re库对某段文字运行正则表达式,找到位于每段文字旁边的数字。

例如,搜索ping可以找到 “Latency: 47.943 ms”,但只能抓取文字之间的数字。

ping = ping.group(1)
download = download.group(1)
upload = upload.group(1)

这几行很重要,因为我们使用”.group() “函数从正则表达式中抓取正确的数字。

利用这个功能,我们将从Speedtest CLI软件的输出中得到我们想要的值,我们可以将其写入我们的CSV文件中。

try:
    f = open('/home/pi/speedtest/speedtest.csv', 'a+')
    if os.stat('/home/pi/speedtest/speedtest.csv').st_size == 0:
            f.write('Date,Time,Ping (ms),Download (Mbps),Upload (Mbps)\r\n')
except:
    pass

这段代码很直接。这段代码被保存在try语句中,这样即使发生任何错误,也不会使脚本停止运行。

在try语句中,我们首先打开调用我们的speedtest.csv文件。

通过在参数中使用 “a+”,我们告诉它,如果文件不存在,我们要创建文件,并且任何新的数据都应该附加到已经存在的文件中。

之后,我们利用os库来检查speedtest.csv文件的实际大小,单位是字节。

如果文件的字节数等于0,我们继续。

如果文件确实存在,我们就照常进行。

f.write('{},{},{},{},{}\r\n'.format(time.strftime('%m/%d/%y'), time.strftime('%H:%M'), ping, download, upload))

最后,我们将所有数据用逗号隔开打印出来。

我们使用时间库的strftime()函数将当前日期和当前时间同时插入到我们的格式化字符串中。

之后,我们插入我们的ping,下载,上传。

下面我们附上了一个例子,说明我们的代码第一次运行时的输出数据会是什么样子。

Date, Time, Ping (ms), Download (Mbps),Upload(Mbps)
04/28/18,13:34,27.833,27.28,9.02

3. 一旦你完成了你的代码,它应该最终看起来像我们下面显示的那样。

import os
import re
import subprocess
import time

response = subprocess.Popen('/usr/bin/speedtest', shell=True, stdout=subprocess.PIPE).stdout.read().decode('utf-8')

ping = re.search('Latency:\s+(.*?)\s', response, re.MULTILINE)
download = re.search('Download:\s+(.*?)\s', response, re.MULTILINE)
upload =  re.search('Upload:\s+(.*?)\s', response, re.MULTILINE)

ping = ping.group(1)
download = download.group(1)
upload = upload.group(1)

try:
    f = open('/home/pi/speedtest/speedtest.csv', 'a+')
    if os.stat('/home/pi/speedtest/speedtest.csv').st_size == 0:
            f.write('Date,Time,Ping (ms),Download (Mbps),Upload (Mbps)\r\n')
except:
    pass

f.write('{},{},{},{},{}\r\n'.format(time.strftime('%m/%d/%y'), time.strftime('%H:%M'), ping, download, upload))

4. 现在你可以按CTRL + X,然后按Y,最后按ENTER键保存文件。

5. 现在我们的脚本已经写好了,我们需要建立一个文件夹来存储我们的speedtest.csv文件。运行以下命令来创建这个文件夹。

mkdir ~/speedtest

6. 现在我们已经建立了所需的文件夹,我们可以继续测试脚本了。

我们可以通过运行以下命令来测试我们的脚本。

python3 ~/speedtest.py

7. 一旦脚本执行完毕,你就可以打开新创建的speedtest.csv查看结果。

让我们在Raspberry Pi上运行以下命令来打开这个文件。

nano ~/speedtest/speedtest.csv

8. 在这个文件中,你应该看到类似下面的东西。列头和一些数据行。

Date, Time, Ping (ms), Download (Mbps),Upload(Mbps)
04/28/18,13:34,27.833,27.28,9.02

有两种不同的方式,你可以采取这个指南。

你可以使用InfluxDB和Grafana来存储和绘制数据,或者利用gDrive将数据同步到Google Drive。

使用Grafana显示您的速度测试数据

在本节中,我们将向您展示如何使用Grafana来快速绘制速度测试数据。

为我们的网速监测器设置InfluxDB。

在开始本节网速监控教程之前,您需要确保您已经将InfluxDB安装到您的Raspberry Pi或单独的服务器上。

我们将以此作为存储网速监控器接收到的数据的地方。

1. 开始,我们需要继续运行以下命令来启动InfluxDB命令行工具。

我们将使用这个工具来创建一个数据库,在那里我们将存储我们的数据。

influx -username admin -password <password>

如果你还没有设置认证,那么你不需要担心指定用户名和密码来连接InfluxDB。

2. 现在让我们创建一个名为 “internetspeed “的数据库。

在InfluxDB中创建数据库,就像使用CREATE DATABASE后跟数据库名称一样简单。

CREATE DATABASE internetspeed

3. 我们的下一步是创建一个名为 “speedmonitor “的用户,我们将使用它来与我们的数据库进行交互。

确保你把密码 “pimylifeup “换成更安全的东西。

不用担心权限问题,因为我们会在下一步处理。

CREATE USER "speedmonitor" WITH PASSWORD 'pimylifeup'

4. 现在给新的 “speedmonitor “用户分配 “internetspeed “数据库的所有权限。

GRANT ALL ON "internetspeed" to "speedmonitor"

5. 数据库创建完成后,使用以下命令退出工具。

quit

6. 最后我们需要做的是安装我们需要与Influx数据库交互的Python库。

sudo apt install python3-influxdb

将速度监控器的数据保存到InfluxDB中。

1. 现在我们已经创建了InfluxDB数据库,让我们通过创建一个新的Python脚本开始向其中添加数据。

这个脚本将与我们之前创建的脚本类似,所以我们只解释我们正在做的新东西。

rm ~/speedtest.py
sudo nano ~/speedtest.py

2. 为了启动这个文件,我们需要导入所有我们需要的Python库。

import re
import subprocess
from influxdb import InfluxDBClient

如你所见,我们已经删除了 “os “和 “time “两个库。

这两个库都不再需要了,因为我们不需要与文件交互,而且Influx会自动对数据进行时间戳。

现在我们导入 “InfluxDBClient “客户端,我们将使用它与InfluxDB服务器进行交互。

3. 导入包后我们的下一步是调用Speedtest CLI并处理数据。

在这个代码块的结尾,我们将得到我们想要的数据。

response = subprocess.Popen('/usr/bin/speedtest', shell=True, stdout=subprocess.PIPE).stdout.read().decode('utf-8')

ping = re.search('Latency:\s+(.*?)\s', response, re.MULTILINE)
download = re.search('Download:\s+(.*?)\s', response, re.MULTILINE)
upload =  re.search('Upload:\s+(.*?)\s', response, re.MULTILINE)

ping = ping.group(1)
download = download.group(1)
upload = upload.group(1)

4. 现在是事情变得有点不同的地方。我们需要将这些数据格式化为一个Python字典。

原因是库希望数据是类似JSON的格式。

speed_data = [
    {
        "measurement" : "internet_speed",
        "tags" : {
            "host": "RaspberryPiMyLifeUp"
        },
        "fields" : {
            "download": float(download),
            "upload": float(upload),
            "ping": float(ping)
        }
    }
]

在这里,我们根据InfluxDB对数据的期望来设置我们的字典。我们给测量的数据取了一个名字,”Internet_speed”。

我们还设置了一个名为 “host “的标签,以允许我们在决定处理同一数据库中的多个设备时将其分离出来。

接下来,我们传入字段,也就是我们在上一段代码中检索到的下载速度、上传速度和ping。

我们用float()函数将下载、上传和ping变量从字符串转换为数字。

如果我们不使用float()函数,Grafana会把这些看作是字符串,而不会正确解释它们。

5. 现在手头已经有了我们需要的所有数据,我们现在可以着手开始使用InfluxDB了。

首先我们需要做的是实例化InfluxDBClient库,并传入我们的连接信息。

我们只传入这个函数的前五个参数,即主机、端口、用户名、密码和数据库名。

如果你想知道可以设置哪些数据,那么可以查看InfluxDB官方的Python文档。

client = InfluxDBClient('localhost', 8086, 'speedmonitor', 'pimylifeup', 'internetspeed')

如果您使用的InfluxDB服务器不在您的Raspberry Pi上,请确保将 “localhost “与它的IP地址进行切换。

另外,你还需要将 “pimylifeup “改成前面指南中设置的密码。

6. 现在我们已经与InfluxDB服务器建立了连接,现在我们可以通过添加以下一行代码将数据点写入服务器。

client.write_points(speed_data)

7. 这就是我们需要做的所有工作,将数据传递给InfluxDB。

当你输入完所有的代码后,这个文件应该会变成我们下面的样子。

import re
import subprocess
from influxdb import InfluxDBClient

response = subprocess.Popen('/usr/bin/speedtest', shell=True, stdout=subprocess.PIPE).stdout.read().decode('utf-8')

ping = re.search('Latency:\s+(.*?)\s', response, re.MULTILINE)
download = re.search('Download:\s+(.*?)\s', response, re.MULTILINE)
upload =  re.search('Upload:\s+(.*?)\s', response, re.MULTILINE)

ping = ping.group(1)
download = download.group(1)
upload = upload.group(1)

speed_data = [
    {
        "measurement" : "internet_speed",
        "tags" : {
            "host": "RaspberryPiMyLifeUp"
        },
        "fields" : {
            "download": float(download),
            "upload": float(upload),
            "ping": float(ping)
        }
    }
]
client = InfluxDBClient('localhost', 8086, 'speedmonitor', 'pimylifeup', 'internetspeed')

client.write_points(speed_data)

8. 按CTRL + X,然后按Y,再按ENTER键保存文件。

查看我们在Grafana的网速数据

我们下一步就是让这个数据库在Grafana中显示出来。

在开始本节之前,您必须确保在您的Raspberry Pi或单独的设备上设置了Grafana。

Grafana是我们将使用的工具,用于绘制图形和可视化我们所有的数据。

1. 设置好Grafana后,打开它的网页界面就可以继续学习本教程。

如果你不确定这个地址在哪里,那就去你的Raspberry Pi或服务器的IP地址,然后是端口:3000。

IPADDRESS:3000

2. 在Grafana网络界面中,我们需要添加一个新的数据源。

您可以通过将鼠标悬停在侧边栏的齿轮上(1.),然后是 “数据源 “菜单选项(2.)来实现。

internet-speed-tester-Grafana-01-Add-a-new-data-source.jpg

3. 在下一个菜单中,你需要点击 “添加数据源 “按钮来继续。

internet-speed-tester-Grafana-02-Add-Data-Source-Configuration-Page.jpg

4. 在 “添加数据源 “页面,需要找到InfluxDB,将鼠标悬停在其上,点击 “选择 “按钮。

internet-speed-tester-Grafana-03-Add-InfluxDB-Time-series-database.jpg

5. 现在我们需要输入InfluxDB的安装细节。

首先,输入InfluxDB的URL(1.)。在我们的例子中,这是在我们运行软件的同一个Raspberry Pi上。如果您也是这样做的,那么请使用以下URL。

http://localhost:8086

接下来,我们将需要为我们的数据库输入所有的细节(2。

如果你完全按照我们的指导,数据库应该设置为 “internetspeed”。

用户应该是 “speedmonitor”,最后,密码应该是你指定的密码,如果你用我们的例子,这个密码应该是 “pimylifeup”。

设置好所有所需信息后,点击屏幕下方的 “保存和测试 “按钮(3.

internet-speed-tester-Grafana-04-InfluxDB-Details.jpg

6. 下一步是创建一个仪表盘来显示这些数据。

将鼠标悬停在侧栏的添加图标(+)上,点击 “仪表盘 “选项。

internet-speed-tester-Grafana-05-Create-Dashboard.jpg

6. 在 “新面板 “上,点击 “添加查询 “按钮。

internet-speed-tester-Grafana-06-Add-Query-to-Dashboard.jpg

7. 现在我们可以设置从数据库中读取图形。

点击 “选择测量”(1.),然后选择我们的测量名称,在本例中是 “internet_speed”(2.)。

internet-speed-tester-Grafana-07-Select-Measurement-to-query.jpg

8. 测量设置好了,我们现在需要设置我们要反的字段数据。

点击字段旁边的文字 “值”(1. 从这里选择 “下载”、”ping “或 “上传”。

在本指南中,我们将从 “下载”(2.

internet-speed-tester-Grafana-08-Select-Field-to-Display.jpg

9. 接下来,我们要让Grafana把每一个结果都当作一个独立的个体结果。

我们可以通过点击选择行(1.)中的加法(+)按钮来实现。

在弹出的菜单中,将鼠标悬停在 “聚合 “上,点击 “独特”(2.

internet-speed-tester-Grafana-09-Change-data-aggregation.jpg

10. 最后,让我们给这个数据起一个更好的名字,以便我们更容易理解它。

设置每个字段的别名,以代表其包含的内容(1. 例如,对于下载速度,我们设置为 “下载速度”。

现在点击 “添加查询 “按钮(2.),并重复步骤7 – 9,直到将所有三个字段(下载、上传和ping)添加到图表中。

internet-speed-tester-Grafana-10-Set-Data-Alias.jpg

11. 一旦你将每个字段添加到图表中,点击侧栏中的扳手和齿轮符号。

internet-speed-tester-Grafana-11-Configure-Grafana-Panel.jpg

12. 在 “标题 “选项(1.)中输入你想在图表上方显示的内容。在本例中,我们使用的标题是 “网络速度”。

完成后,点击屏幕右上角的保存按钮(2.)保存仪表盘。

internet-speed-tester-Grafana-12-Set-Panel-Name.jpg

13. 给你的仪表盘起个名字(1.)。这个名字可以是任何你想要的。我们称我们的 “网络速度监控器”。

现在你通过点击 “保存 “按钮来保存这个新的仪表板(2.)。

internet-speed-tester-Grafana-13-Save-Dashboard.jpg

14. 完成所有工作后,你现在应该可以看到你的数据显示在一个漂亮的图表中。

internet-speed-tester-Grafana-14-Dashboard-Ready.jpg

使用Grafana自动化您的速度监控脚本。

自动化你的脚本,使其定期运行是一个合理直接的过程。

1. 最简单的方法是利用crontab来自动化你的脚本每隔一段时间就运行一次。

您可以在Raspberry Pi上运行以下命令来修改crontab。

sudo crontab -e

如果有人问你要用什么编辑器,我们建议你选择nano,因为它最容易使用。

2. 在该文件中,在底部添加以下cronjob。

这个cronjob将每30分钟运行一次。如果您想改变时间,我们建议您使用我们的Crontab生成器。

*/30 * * * * python3 /home/pi/speedtest.py

正如你所看到的,这是一个不费吹灰之力的方法,让你的网络速度定期测试,不需要你手动运行脚本。

3. 完成后,可以按CTRL + X,然后按Y,再按ENTER键保存文件。

crontab将自动更新并立即开始运行您的脚本。

将您的网速数据上传到Google Drive

在本节中,我们将向您展示如何将您的数据与Google Drive帐户自动同步。

将速度测试数据上传到Google Drive

1. 在你开始本节之前,你必须完成我们的编译和运行gDrive指南。

我们将使用该软件来完成以下步骤。

2. 在您的Raspberry Pi上设置好gDrive后,我们现在可以为速度测试数据做准备了。

让我们先用gDrive在Google Drive上创建一个新的文件夹来存储我们的speedtest.csv文件。

我们可以通过在终端中使用以下命令来实现。

gdrive mkdir speedtest

这个命令会显示一条消息,说目录已经创建。这条信息也会显示一个ID。

我们接下来的几个步骤会需要这个ID,所以把它写在安全的地方。

3. 现在创建了文件夹,我们可以用它的ID上传一个文件到里面。

在这次测试中,我们将上传我们的speedtest.csv文件。

运行下面的命令,并确保将YOUR_FOLDER_ID替换为上一步检索到的ID。

gdrive sync upload ~/speedtest YOUR_FOLDER_ID

在初始同步时,你应该会看到命令行上出现如下信息。

这条消息告诉你,文件已经成功同步到你的Google Drive账户。

Starting sync...
Collecting local and remote file information...
Found 1 local files and 0 remote files

1 remote files are missing
[0001/0001] Uploading speedtest.csv -> speedtest/speedtest.csv
Sync finished in 3.119979351s

4. 随着Google Drive现在成功地与Raspberry Pi同步,我们可以继续自动化整个过程,以便我们每次编辑speedtest.csv时都能上传。

为Google Drive自动化Raspberry Pi网速监控器

1. 树莓Pi网速监控器接下来要做的一件大事就是自动化。

为了实现自动化,我们将编写一个简单的bash脚本。这个脚本将被crontab调用,这样它就会被例行运行。

在Raspberry Pi上运行以下Linux命令,开始编写bash脚本。

nano ~/speedtest.sh

2. 在该文件中,我们要输入以下几行:

确保将YOUR_FOLDER_ID替换为您在Google drive上创建文件夹时收到的ID。

#!/bin/bash
python /home/pi/speedtest.py
/usr/local/bin/gdrive sync upload  /home/pi/speedtest YOUR_FOLDER_ID

3. 现在按CTRL + X然后按Y,最后按ENTER键保存文件。

4. 在我们为bash脚本设置crontab之前,我们必须先给脚本执行权限。

我们可以通过在终端内运行以下命令来实现。

sudo chmod +x /home/pi/speedtest.sh

5. 现在一切都完成了,我们终于可以开始设置crontab了。

通过在Raspberry Pi上运行以下命令开始编辑crontab。如果有人问你要使用什么编辑器,我们建议你选择Nano(通常是2号)。

crontab -e

6. 在文件底部添加以下一行。这一行将告诉crontab,它应该每小时运行一次我们的bash脚本。

如果你想改变crontab的行为,你可以查看我们的Crontab生成器来计算出你想要的值。

0 * * * * /home/pi/speedtest.sh

7. 现在你应该了网速测试监控器,脚本会每小时更新你的speedtest.csv文件。

我们希望通过这个Raspberry Pi网速监控教程,让你的Raspberry Pi自动在你的连接上运行网速测试,并每小时将数据上传到谷歌。

如果你有什么想法、反馈或者其他什么,欢迎留言讨论。

平均: 0 / 5. votes: 0

到目前为止还没有投票!成为第一位评论此文章。

欢迎转载,请留下出处链接:Labno3 » 树莓派如何监控和记录网速

赞 (0)

评论

3+9=