PyCharm使用技巧:Raspberry Pi的遠端開發

AABBbaby發表於2018-08-15

PyCharm v2018.2最新版本下載

 

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應用程式
  • 查詢資料
  • 繪製資料

 

更多資源請檢視【PyCharm入門視訊教程

相關文章