在此树莓派 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 。
如果您有任何想法,反馈或其他意见,请务必前往论坛。