树莓派网络监视器

在此树莓派 Internet 速度监视器教程中,我们将向您展示如何设置树莓派来监视 Internet 连接并保存数据以在 Grafana 或 Google Drive 中查看。

如果您有兴趣监视一段时间后下载速度,上传速度和 ping 的影响,那么本教程非常有用。

此外,这可以帮助您确定网络可能在什么时候达到峰值容量,或者互联网连接状况是否恶化。

为了实现此互联网速度监控器,我们将向您展示如何编写一个小的 Python 脚本,该脚本与名为 speedtest -cli 的程序进行交互。

Speedtest-cli 是我们的互联网速度监控器将用来监控互联网连接的东西。

该程序通过轮询流行的 speedtest .net 服务来工作,以获取 ping ,下载速度和上载速度。

设备清单

以下是我们用来设置树莓派 Internet 速度监控器的所有设备。

推荐的

  • 树莓派

  • Micro SD 卡

  • USB 驱动器

  • 以太网电缆 (推荐) 或 * Wifi 加密狗 (Pi 3 具有内置 Wifi )

可选的

  • 树莓派外壳

视频

您可以观看下面的视频,以了解如何在树莓派上设置互联网速度监视器。

或者,在下一部分中查看指南的书面版本。

Adblock 阻止了视频?订阅我们的无广告服务,为我们提供支持。

安装 speedtest -cli

1 。在开始设置树莓派来监视互联网速度之前,我们必须首先确保树莓派是最新的。

我们可以通过在终端中运行以下两个命令来更新树莓派。

sudo apt-get update
sudo apt-get upgrade

2 对于我们的教程,我们将使用一个名为 ** speedtest-cli ** 的 Python 库。该 Python 库充当与 speedtest .net 通讯的命令行界面。

使用此库,我们可以快速轮询 Speedtest.net,以检索当前的上载和下载速度以及当前的 ping 。

但是,在使用此库之前,我们必须首先安装一个名为 ** Python pip ** 的软件包。

我们需要 Python pip 软件包的原因是,默认的 Raspbian 存储库中没有 ** speedtest-cli **。

相反,我们需要从 Python 程序包索引 (PyPI) 中检索它,这要感谢 pip 易于实现。

在大多数情况下,pip 是预安装的,但是我们将运行以下命令以确保已安装它。

sudo apt-get install python3-pip

3 现在在树莓派上安装了 pip 之后,我们可以继续使用它来下载 ** speedtest-cli python 库。**

Pip 非常易于使用,其功能与 apt -get 相同。

只需在树莓派上运行以下命令即可使用 pip 安装 speedtest -cli。

sudo pip3安装 speedtest -cli

4 现在我们已经安装了 speedtest -cli,现在可以对其进行测试。

通过运行以下命令,确保一切正常。

速度测试

5 您将看到此命令返回了很多信息。

为了使事情更简单,我们可以使用以下命令。

speedtest-cli-简单

如您在 --simple 参数中所见,仅下载,上传和 ping 返回。

编写速度测试 Python 脚本

1 现在,我们已经在树莓派上安装了 speedtest -cli,现在我们可以继续编写 Python 脚本了,它将持续监视我们的下载和上传速度。

我们可以通过运行以下命令开始为树莓派 Internet Speed Monitor 创建 Python 脚本。

光盘〜
sudo vim speedtest .py

2 在此文件中编写以下代码行。我们将解释代码的每个重要部分,以便您了解一切工作原理。

导入操作系统
汇入
导入子流程
导入时间

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

** import os:** 脚本使用 os 库与操作系统本身进行交互。

对于此脚本,我们将使用此库来检查文件是否存在。

** import re:** re 库通过提供用于处理模式搜索的库,使我们可以轻松地执行正则表达式。

我们使用它从 speedtest -cli 提供给我们的数据中找到想要的值。** import subprocess:** 子进程库对于此脚本至关重要,因为我们要求它能够调用另一个 python 脚本。
在本例中,我们将使用子进程库,以便我们启动 speedtest -cli 脚本并检索其返回的值。

导入时间:我们利用时间库,以便可以记录每次调用 speedtest -cli 的日期和时间。

该库将使我们能够长时间跟踪速度。

响应= subprocess.Popen('/usr/local/bin/speedtest-cli --simple',shell = True,stdout = subprocess.PIPE).stdout.read()。 decode ('utf-8')

在这行代码中,我们利用子进程库启动对 speedtest -cli python 脚本的调用,并告诉其将从”speedtest-cli” 到”stdout” 的所有内容进行管道传输。

通过在调用结束时使用 stdout.read()。 decode ('utf-8'),我们将从 speedtest -cli 到响应变量的响应存储起来,并将其解码为可用的 Python 字符串。

ping = re.findall('Ping:\ s(。*?)\ s',响应,re.MULTILINE)
下载= re.findall('下载:\ s(。*?)\ s',响应,re.MULTILINE)
upload = re.findall('上传:\ s(。*?)\ s',响应,re.MULTILINE)

这三行代码非常简单,并且都执行相同的操作。

他们使用 re 库为某个文本片段运行正则表达式,并找到每个文本片段旁边的数字。

例如,搜索 ping 会找到”** Ping:47.943 毫秒 **”,但只能获取文本之间的数字。

ping = ping [0] .replace(',','。')
download =下载[0] .replace(',','。')
upload = upload [0] .replace(',','。')

这些行很重要,因为我们使用它们来清理从 speedtest -cli 输出中获取的数字。

由于我们计划将数据输出为 CSV 格式,因此所有数字值都需要用小数点 (。)替换逗号(,`)。否则,CSV 格式会将数字分成新的列。

多亏了 Python 的.replace() 函数,我们可以轻松地对每段文本执行此操作。

尝试:
    f =打开('/home/pi/speedtest/speedtest.csv','a +')
    如果 os .stat('/home/pi/speedtest/speedtest.csv')。 st _size == 0:
            f.write('Date,Time,Ping(ms),Download(Mbit/s),Upload(Mbit/s)\ r \ n')
除了:
    通过

这段代码很简单。该代码保留在 try 语句中,这样,如果发生任何错误,就不会停止脚本的运行。

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

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

之后,我们使用 os 库来检查我们的 speedtest.csv 文件的实际大小 (以字节为单位)。

如果文件的字节等于 0 ,则继续。

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

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

最后,我们打印出所有数据,并以逗号分隔。

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

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

下面,我们提供了一个示例,该示例显示了代码第一次运行时输出数据的外观。

日期,时间,Ping(ms),下载(Mbit/s),上传(Mbit/s)
04/28/18,13:34,27.833,27.28,9.02

3 一旦完成编写代码,它的外观应类似于我们在下面显示的内容。

导入操作系统
汇入
导入子流程
导入时间

响应= subprocess.Popen('/usr/local/bin/speedtest-cli --simple',shell = True,stdout = subprocess.PIPE).stdout.read()。 decode ('utf-8')

ping = re.findall('Ping:\ s(。*?)\ s',响应,re.MULTILINE)
下载= re.findall('下载:\ s(。*?)\ s',响应,re.MULTILINE)
upload = re.findall('上传:\ s(。*?)\ s',响应,re.MULTILINE)

ping = ping [0] .replace(',','。')
download =下载[0] .replace(',','。')
upload = upload [0] .replace(',','。')

尝试:
    f =打开('/home/pi/speedtest/speedtest.csv','a +')
    如果 os .stat('/home/pi/speedtest/speedtest.csv')。 st _size == 0:
            f.write('Date,Time,Ping(ms),Download(Mbit/s),Upload(Mbit/s)\ r \ n')
除了:
    通过

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

4 您现在可以通过按 CTRL + X 然后按 Y 并最后按 ENTER 保存文件。

5 现在编写了脚本,我们需要创建一个文件夹,其中将存储我们的 ** speedtest.csv ** 文件。运行以下命令创建此文件夹。

mkdir〜/speedtest

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

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

python3〜/speedtest.py**7** 脚本执行完毕后,您可以打开新创建的** speedtest.csv **来检查结果。

让我们通过在树莓派上运行以下命令来打开此文件。

vim 〜/speedtest/speedtest.csv

8 在此文件中,您应该看到类似下面的内容。列标题和一些数据行。

日期,时间,Ping(ms),下载(Mbit/s),上传(Mbit/s)
04/28/18,13:34,27.833,27.28,9.02

您可以采用两种不同的方法来学习本指南。

您可以使用 [InfluxDB 和 Grafana 来存储和绘制图形 (#synctografana)),也可以使用 gDrive 将数据同步到 Google 云端硬盘

使用 Grafana 显示您的 Speedtest 数据

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

为我们的 Internet Speed Monitor 设置 InfluxDB

在开始本互联网速度监控器教程的本节之前,您需要确保已将 InfluxDB 安装到树莓派或单独的服务器上。

我们将以此为存储 Internet 速度监视器接收到的数据的地方。

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

我们将使用该工具创建一个数据库,用于存储数据。

流入-username admin -password <密码>

如果您尚未设置身份验证,则无需担心指定用于连接到 InfluxDB 的用户名和密码。

2 现在,我们创建一个名为”** internetspeed **” 的数据库。

在 InfluxDB 中创建数据库很容易,因为使用 CREATE DATABASE 后跟数据库名称即可。

创建数据库互联网速度

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

确保将密码”** pimylifeup **” 换成更安全的密码。

不必担心特权,因为我们将在下一步中处理特权。

使用密码"pimylifeup"创建用户"speedmonitor"

4 现在,将新的”** speedmonitor “用户的所有权限分配给我们的” internetspeed **” 数据库。

将所有内容从"internetspeed"授予"speedmonitor"

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

放弃

6 我们要做的最后一件事是安装与 Influx 数据库进行交互所需的 Python 库。

sudo apt install python3 -influxdb

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

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

该脚本与我们之前创建的脚本类似,因此我们仅说明我们正在做的新事情。

rm〜/speedtest.py
sudo vim 〜/speedtest.py

2 要开始此文件,我们需要导入所需的所有 Python 库。

汇入
导入子流程
从 influxdb 导入 InfluxDBClient 

如您所见,我们已经删除了”** os “和” time **” 库。

由于我们不需要与文件进行交互,因此不再需要这两个库,并且 Influx 会自动为数据添加时间戳。

现在,我们导入”** InfluxDBClient **” 客户端,该客户端将用于与 InfluxDB 服务器进行交互。

3 导入软件包后的下一步是调用”** speedtest-cli **” 工具并处理数据。

在此代码块的最后,我们将只有我们要查找的数据。

响应= subprocess.Popen('/usr/local/bin/speedtest-cli --simple',shell = True,stdout = subprocess.PIPE).stdout.read()。 decode ('utf-8')
ping = re.findall('Ping:\ s(。*?)\ s',响应,re.MULTILINE)
下载= re.findall('下载:\ s(。*?)\ s',响应,re.MULTILINE)
upload = re.findall('上传:\ s(。*?)\ s',响应,re.MULTILINE)

ping = ping [0] .replace(',','。')
download =下载[0] .replace(',','。')
upload = upload [0] .replace(',','。')

4 现在,这里的情况有所不同。我们需要将该数据格式化为 Python 字典。

这样做的原因是该库希望数据采用类似 JSON 的格式。

speed_data = [
    {

“measurement”:”internet_speed”,
“标签”:{
“主机”:”RaspberryPiMyLifeUp”
},
“字段”:{
“下载”:float (download),
“upload”:float(upload),
“ping”:浮动 (ping)
}
}
]

在这里,我们使用 InfluxDB 如何期望数据来设置字典。我们给” 测量” 一个名称,”Internet \ _speed **”。

我们还设置了一个名为”** host **” 的标签,如果我们决定处理同一数据库中的多个设备,则可以将其分开。

接下来,我们传入字段,即在上一部分代码中检索的下载速度,上传速度和 ping 。我们将下载,上传和 ping 变量包装在 float() 函数中,以将其从字符串转换为数字。
如果我们不使用 float() 函数,则 Grafana 会将其视为字符串,并且无法正确解释。

5 现在有了我们需要的所有数据,我们现在可以开始使用 InfluxDB 。

我们需要做的第一件事是实例化 InfluxDBClient 库并传递我们的连接详细信息。

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

如果要查看可以设置的数据,则可以查看 InfluxDB 官方 Python 文档

客户端= InfluxDBClient('本地主机',8086,'speedmonitor','pimylifeup','internetspeed')

如果您使用的不是树莓派上的 InfluxDB 服务器,请确保使用其 IP 地址切换”** localhost **”。

另外,您需要将”** pimylifeup **” 更改为指南前面所设置的” 密码”。

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

client.write_points(speed_data)

7 这就是将数据传递到 InfluxDB 所需要做的一切。

当您在文件中输入所有代码后,它看起来应该像下面的样子。

汇入
导入子流程
从 influxdb 导入 InfluxDBClient 

响应= subprocess.Popen('/usr/local/bin/speedtest-cli --simple',shell = True,stdout = subprocess.PIPE).stdout.read()。 decode ('utf-8')
ping = re.findall('Ping:\ s(。*?)\ s',响应,re.MULTILINE)
下载= re.findall('下载:\ s(。*?)\ s',响应,re.MULTILINE)
upload = re.findall('上传:\ s(。*?)\ s',响应,re.MULTILINE)

ping = ping [0] .replace(',','。')
download =下载[0] .replace(',','。')
upload = upload [0] .replace(',','。')

speed_data = [
    {

“measurement”:”internet_speed”,
“标签”:{
“主机”:”RaspberryPiMyLifeUp”
},
“字段”:{
“下载”:float (download),
“upload”:float(upload),
“ping”:浮动 (ping)
}
}
]
客户端 = InfluxDBClient (‘本地主机’,8086,’speedmonitor’,’pimylifeup’,’internetspeed’)

client.write_points(speed_data)

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

在 Grafana 中查看我们的 Internet 速度数据

我们的下一步是使该数据库出现在 Grafana 中。

在开始本节之前,您必须 ** 确保已在树莓派上设置了 [Grafana] 或单独的设备。

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

1 设置好 Grafana 后,您可以通过打开其网络界面继续进行本教程。

如果不确定该位置,请转到树莓派或服务器的 IP 地址,然后输入端口”:3000”。

IP地址:3000

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

您可以将鼠标悬停在侧边栏上的齿轮 (1 ) 上,然后依次选择”** Data Sources “(数据源) 菜单选项 (2 )。

3 在下一个菜单中,您将需要单击” 添加数据源 “按钮以继续。

4 在” 添加数据源 “页面上,您需要找到 InfluxDB ,将其悬停在其上,然后单击” 选择 “按钮。

5 现在,我们需要输入您的 InfluxDB 安装的详细信息。

首先,输入 InfluxDB 的 URL (1 )。在我们的案例中,它与运行该软件的树莓派相同。如果您要这样做,请使用以下 URL 。

http://本地主机:8086

接下来,我们需要输入数据库的所有详细信息 (2 )。

如果您完全按照我们的指南进行操作,则 ** Database (数据库) 应设置为” internetspeed **”。

** User 应该是”speedmonitor”,最后,密码应该是您指定的密码,如果您使用我们的示例,那么该密码将是” pimylifeup **”。

设置所有必需的信息后,单击位于屏幕底部的” 保存并测试 “按钮 (3 )。

6 下一步是创建一个仪表板以显示此数据。

将鼠标悬停在边栏中的添加图标 (** + ) 上,然后单击”** 仪表板 “选项。

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

7 现在,我们可以设置要从数据库中读取的图形。
点击” 选择测量 “(1 ),然后选择我们的测量名称,在这种情况下为”** internet \ _speed “(**2 )

8 在设置了测量值之后,我们现在需要设置要观测的现场数据。

单击字段 (1 ) 旁边的文本” “。在此处,选择” 下载 “,”** ping “或”** 上传 “。

对于本指南,我们将从”** download “(**2 ) 开始。

9 接下来,我们要让 Grafana 将每个结果视为不同的单独结果。

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

在弹出菜单中,将鼠标悬停在”** Aggregations “上,然后单击” distinct “(**2 )。

10 最后,让我们为该数据起一个更好的名字,以便我们可以更轻松地理解它。

设置每个字段的别名以表示它们包含的内容 (1 )。例如,使用下载速度,我们将名称设置为”** Download Speed **”。

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

11 将每个字段添加到图形后,请点击侧栏中的扳手和齿轮符号。

12 在” 标题 “选项 (1 ) 中,输入要在图形上方显示的内容。在此示例中,我们使用了标题”** Network Speed **”。

完成后,通过单击屏幕右上角的保存按钮 (2 ) 保存仪表板。

13 为您的信息中心命名 (1 )。该名称可以是您想要的任何名称。我们称之为” 网络速度监控器 “。

现在,您可以通过单击” 保存 “按钮 (2 ) 保存此新的仪表板。

14 完成所有操作后,您现在应该可以在漂亮的图形中看到显示的数据。

使用 Grafana 自动执行速度监控器脚本

自动化脚本以使其定期运行是一个相当简单的过程。

1 自动化脚本以使其经常运行的最简单方法是使用 crontab 。

您可以通过在树莓派上运行以下命令来修改 crontab 。

sudo crontab -e

如果询问您要使用哪种编辑器,我们建议您选择 vim 作为最易于使用的编辑器。

2 在此文件中,将以下 cronjob 添加到底部。

此 cronjob 将每 30 分钟运行一次。如果您想确定其他时间,建议您使用我们的 Crontab 生成器。

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

如您所见,这是定期测试 Internet 速度而无需手动运行脚本的简便方法。

3 完成后,您可以通过按 CTRL + X,然后按 Y ,然后按 ENTER 保存文件。

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

将您的 Internet Speed 数据上传到 Google 云端硬盘

在本部分中,我们将向您展示如何自动将数据与 Google 云端硬盘帐户同步。

将速度测试数据上传到 Google 云端硬盘

1 在开始本节之前,您必须已完成编译和运行 gDrive 指南。

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

2 通过在树莓派上安装 gDrive ,我们现在可以为速度测试数据做好准备。

首先,使用 gDrive 在 Google 云端硬盘上创建一个新文件夹来存储我们的 speedtest .csv 文件。

我们可以通过在终端中使用以下命令来做到这一点。

gdrive mkdir speedtest

此命令将显示一条消息,指出目录已创建。此消息还会向您显示一个 ** ID **。

我们接下来的步骤将需要该 ID ,因此请在安全的地方写下它

3 现在创建了文件夹,我们可以使用其 ID 向其上载文件。

对于此测试,我们将上传我们的 speedtest.csv 文件。

运行以下命令,并确保将 ** YOUR \ _FOLDER \ _ID ** 替换为在上一步中获取的 ID 。

gdrive同步上传〜/speedtest YOUR_FOLDER_ID

在初始同步中,您应该看到以下消息出现在命令行中。

此消息告诉您文件已成功同步到您的 Google 云端硬盘帐户。

正在开始同步...收集本地和远程文件信息...找到 1 个本地文件和 0 个远程文件

1个远程文件丢失
[0001/0001]上载 speedtest .csv-> speedtest/speedtest.csv
同步完成于 3 .119979351s

4 现在 Google Drive 已成功与树莓派同步,我们可以继续进行整个过程的自动化,以便每次编辑时都上传 ** speedtest.csv **。

为 Google Drive 自动化树莓派 Internet Speed Monitor

1 与树莓派 Internet Speed Monitor 关联的下一件大事是使其自动化

为了实现自动化,我们将编写一个简单的 bash 脚本。此脚本将由 crontab 调用,以便将其定期运行。

通过在树莓派上运行以下 Linux 命令开始编写 bash 脚本。

vim 〜/speedtest.sh

2 。在此文件中,我们要输入以下几行。

确保将 ** YOUR \ _FOLDER \ _ID ** 替换为在 Google 云端硬盘上创建文件夹时收到的 ID 。

#!/bin/bash
python /home/pi/speedtest.py

/usr/local/bin/gdrive 同步上传 /home/pi/speedtest YOUR_FOLDER_ID

3 现在通过按 CTRL + X 然后按 Y 然后最后按 ENTER 保存文件。

4 。在为 bash 脚本设置 crontab 之前,我们必须首先赋予脚本执行特权。

我们可以通过在终端中运行以下命令来实现此目的。

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

5 现在完成所有工作,我们终于可以开始设置 crontab 了。

通过在树莓派上运行以下命令开始编辑 crontab 。如果询问您要使用的编辑器,建议您选择 ** Nano **(通常为 2 号)。

crontab -e

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

如果要更改 crontab 的行为,可以查看我们的 Crontab 生成器来确定所需的值。

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

7 现在,您应该启动速度测试监视器并运行该脚本,并每小时更新一次您的 speedtest.csv 文件。

我们希望到本树莓派互联网速度监视器教程结束时,您现在应该让树莓派在连接上自动运行互联网速度测试,并每小时将数据上传到 Google 。

如果您有任何想法,反馈或其他意见,请务必前往论坛。

分享到