Raspberry Pi的远程开发
介绍
互联网连接的关键指标之一是它对互联网上其他主机的ping时间。因此,编写一个程序,定期ping其他主机并记录结果。对于那些想要在其他远程计算机上远程执行代码的人,例如AWS实例或DigitalOcean Droplet,过程完全相同。
本教程是在Windows上创建的,代码是在RPi上执行的,RPi是一台Linux计算机。在其他受支持的操作系统上,某些路径和工作流程可能略有不同。
先决条件
确保满足以下先决条件:
- 你有专业版的PyCharm。
- 代码将在任何Linux机器上运行。您也可以使用本地VM。
您还需要一些额外的软件:
- PostgreSQL,因为它将用于创建数据库。
- Libpq-dev,Psycopg2需要。
- Python-dev,需要编译Psycopg2。
要一次安装所有这些,请运行以下命令:
sudo apt-get update && sudo apt-get install -y postgresql libpq-dev python-dev
Raspberry Ping
构建的应用程序包含两部分:
- 首先,实际进行测量。为了测量结果,可以调用每个Linux机器(包括Raspberry Pi)附带的ping命令行工具。然后,将结果存储在PostgreSQL数据库中。
- 其次,使用Flask应用程序对结果进行可视化,该应用程序使用Matplotlib绘制最近结果的图表。
准备你的Raspberry Pi
由于希望以后能够查看带有结果的网页,因此在网络中为Pi提供固定IP非常重要。 为此,请编辑/ etc / network / interfaces。
将Pi设置为使用静态IP后,请raspi-config在命令行中使用。转到“ 高级选项”,选择“ SSH”,然后选择“ 是”。当你完成这项工作后,你就可以开始使用PyCharm了。
创建一个项目
创建一个纯Python项目:选择File | New Project。将项目命名为“raspberry.pi”。
然后按照 Configuring Remote Interpreters via SSH中所述添加SSH远程解释器。配置SSH服务器时,请指定Pi(主机)的IP地址,例如172.27.120.177。另外,指定登录到设备的凭据。
接下来,在PyCharm中,按Ctrl+Shift+A,开始输入“启动SSH会话”:
然后从主机列表中选择您的Raspberry Pi,您应该连接。
接下来,安装其他软件。
在PostgreSQL中设置权限和创建数据库
现在需要在PostgreSQL中设置权限。最简单的方法是返回SSH终端,并运行以下命令以获得Postgres用户的SQL提示:
sudo -u postgres psql
现在创建一个用户(Postgres术语中的 ‘role’),其名称与运行该过程的用户的名称相同:
CREATE ROLE pi WITH LOGIN PASSWORD ‘hunter2’;
重要注意事项!请确保PostgreSQL中的角色与Linux用户名具有相同的名称。您可能还需要替换更好的密码。在PSQL中用分号(;)来结束SQL语句是很重要的,因为它会假定您正在编写多行语句,直到用分号终止。授予PI用户登录权限,这意味着用户可以登录。没有登录权限的角色用于创建组。
接下来,创建一个数据库:
CREATE DATABASE pi WITH OWNER pi;
其次,出口psql用\q。
捕获pings
要获取有关Internet连接质量的信息,请使用系统的ping实用程序ping服务器 ,然后使用正则表达式读取结果。输出 ping:
所有具有单独往返时间的行都以64字节开头。 所以让我们创建一个文件ping.pyFile | New - Python File),然后开始编码。
这里可以先获取ping的输出,然后遍历这些行,选择以数字开头,后跟“bytes from”字样的行:
此时,如果您运行代码(Ctrl+Shift+F10),您应该看到此代码在Raspberry Pi上远程运行:
要检查部署设置是否已正确设置,请指向主菜单上的Tools | Deployment 。应检查检查命令“ Automatic Upload”。
存储ping
如果要存储ping PostgreSQL,为它们创建一个表。首先,需要创建一个PostgreSQL数据库:
选择PostgreSQL后,将打开数据源页面:
在此页面上,下载所需的驱动程序,输入所需的凭据,然后单击“Test Connection”按钮以确保已连接。
由于我们的数据库只暴露给localhost,所以需要使用SSH隧道:
在连接之后,通过执行setup_db.sql脚本来创建表 。从GitHub复制粘贴脚本,连接后立即打开SQL控制台,然后使用绿色播放按钮执行。
现在已经有了这个工作,然后扩展脚本,将ping记录到数据库中。要从Python连接到数据库,需要安装psycopg2。为此,请指向 File | Settings(对于Windows和Linux)或PyCharm / Preferences (对于macOS用户),然后单击Project Interpreter页面,然后使用"+"图标来安装包
Cron
实际上会定期记录ping,需要安排运行此脚本。为此,将使用cron。当对数据库使用对等身份验证时,需要确保脚本以pi用户身份运行。因此,打开一个SSH会话(确保已登录 pi),然后运行crontab -e以编辑用户crontab。然后在文件的底部添加以下行:
*/5 * * * * /home/pi/raspberryping/ping.py jetbrains.com >> /var/log/raspberryping.log 2>&1
确保文件末尾有换行符!
第一个*/5意味着脚本将每5分钟运行一次。如果您想要不同的频率,您可以了解有关crontabs的更多信息。现在还需要创建日志文件并确保脚本可以写入它:
sudo touch /var/log/raspberryping.log
sudo chown pi:pi /var/log/raspberryping.log
此时花点时间,当您稍后再回来时,应该记录一些ping时间。让查看PyCharm的数据库工具。打开 Database tool window 在屏幕右侧),然后双击该表。您应该看到它包含值:
创建Flask应用程序
如果看不到有关它们的统计数据,那么记录ping是没有好处的。因此,编写一个小型Flask应用程序(安装Flask,pip install在终端中使用),并使用 matplotlib绘制最近ping时间的图表。
在Flask应用程序中,将创建两个路径:
- On /,这里将列出在过去一小时内使用基本统计数据确定的destinations(最后一小时的最小,平均,最长时间)。
- 在/ graphs / 上,我们将绘制过去3小时内ping的图表。
该路线很简单:只是执行一个查询来获取感兴趣的数据,并传递给模板。为了确保一切正常,在调用时设置一个断点 render_template:
然后启动调试会话(图标动作startDebugger svg)并在浏览器中查看结果。/ graphs / 路线要复杂得多。首先,必须在合理大小的垃圾箱中获得过去三个小时的平均值(比方说,10分钟)。其次,必须绘制图形。
查询数据
要寻找的数据是:
- 在过去3小时内每10分钟一次
- 获取指定目标的最小,平均和最长ping时间
第一部分使这个查询相当复杂。即使PostgreSQL支持间隔,日期范围以及生成一系列日期的方法,也无法生成一系列范围。这个问题的一个解决方案是公用表表达式(CTE),这是一种执行子查询的方法,您可以在以后将其称为真实表。
要以10分钟的间隔获取过去三小时的一系列timestamps很简单:
select begin_time from generate_series(now() - interval '3 hours', now(), interval '10 minutes') begin_time;
该generate_series函数有三个参数:begin,end和step。该功能适用于数字和timestamps,因此可以轻松实现。需要两个timestamps之间的时间。可以使用另一个SQL magic: window functions,它允许在当前所在的行之前或之后处理行。所以添加 end_time到查询中:
LEAD获取结果中下一行的值,按照OVER子句中指定的方式排序 。您可以使用LAG以类似方式获取上一行。所以现在可以用这个查询包装WITH intervals as ( … query goes here … )使它成为一个CTE。然后可以加入ping表并获得正在寻找的结果:
接下来,执行此查询。右键单击 editor background,然后在context菜单中选择Execute:
(如果您没有看到Execute,请选择 Attach Console让PyCharm知道您要执行查询的数据库)。
您可以使查询工作速度提高30倍。要实现此显着加速,请将此索引添加到查询中:
CREATE INDEX pings_recorded_at ON pings(recorded_at);
绘制数据图
获取数据后,matplotlib用于生成一个折线图,其中包含每个bin的最小,平均和最大ping时间。Matplotlib可以使用plot_date function轻松绘制基于时间的数据。
当绘图准备好后,它将作为.png文件“保存” 到StringIO对象,然后用于创建HTTP响应。通过设置content_type标题image/png,一切都安排好了。
所以最终的结果是:
概要
- 创建了一个项目
- 在终端中,设置权限并创建用户。
- 创建了一个数据库。
- 捕获ping。
- 在特殊数据库中存储ping。
- 创建了Flask应用程序
- 查询数据
- 绘制数据