Realizziamo uno Speed Tester con Orange Pi in grado di controllare la velocità di Internet e creare grafici

Possiamo creare un dispositivo in grado di monitorare la velocità di Internet, effettuando ogni 30 minuti uno speed test e stampando i risultati su un grafico tramite il software Grafana. Per eseguire il tutto ci basterà un Orange Pi dotato di scheda ethernet 10/100/1000 Mbps (nel nostro caso abbiamo usato un Orange Pi Zero 2W a cui abbiamo montato una scheda di rete esterna con porta USB Type-C), una MicroSD Card e un sistema operativo Linux based.

Per ottenere questo monitoraggio della velocità di Internet, ti mostreremo come scrivere un piccolo script Python che interagisce con il noto servizio Speedtest CLI di Ookla, che useremo come monitor per controllare la nostra velocità di Internet e capire se ci sono importanti variazioni nell’arco della giornata.

Fase preliminare

Premuriamoci di scaricare la versione di ARMbian per il nostro Orange Pi Zero 2W, andando sul sito ufficiale e scaricando a questo LINK. Una volta scaricata, da PC tramite Rufus [LINK], carichiamola sulla MicroSD che adopereremo per il nostro Orange Pi Zero 2W. L’operazione è semplice, basta selezionare la destinazione (MicroSD), il sistema operativo e lanciare la copia dei file. Appena terminerà il processo, rimuoviamo la MicroSD ed inseriamola nella Orange Pi, mentre è ancora spenta.

Avviamo la single-board computer, collegandola a un monitor e ad una tastiera, e attendiamo il caricamento di ARMbian. Il sistema operativo vi chiederà di compilare alcune voci, come nome, password utente e amministratore, tastiera, scelta della rete (Ethernet nel nostro progetto) e tante altre informazioni che non vi mostriamo in questa guida. Una volta completata questa fase, procediamo installando SSH per controllare la scheda via terminale da un altro PC.

sudo apt install ssh

Loggandoci con l’utente creato in precedenza, apparirà il nostro indirizzo IP, fondamentale e da conservare. Successivamente, possiamo staccare il monitor e la tastiera e lavorare comodamente da PC usando PuTTY [LINK]. Avviato PuTTY, inseriamo in Host Name l’indirizzo IP e clicchiamo su Open. Si aprirà la finestra di terminale con cui fare login come utente e inserendo la password che avevamo scelto prima. Siamo dentro il nostro Orange Pi e possiamo passare alla vera e propria configurazione.

Installazione Speedtest

Iniziamo aggiornando il sistema operativo con i comandi:

sudo apt update
sudo apt upgrade

Ora dobbiamo installare alcuni pacchetti in modo da poter aggiungere il repository dei pacchetti per il software Speedtest CLI. Serviranno per migliorare la comunicazione tra l’Orange Pi e Speedtest.net, aggiungendo il supporto per il protocollo https.

sudo apt install apt-transport-https gnupg1 dirmngr lsb-release

Aggiungiamo la chiave GPG per il repository Speedtest di Ookla:

curl -L https://packagecloud.io/ookla/speedtest-cli/gpgkey | gpg --dearmor | sudo tee /usr/share/keyrings/speedtestcli-archive-keyring.gpg >/dev/null

Aggiungiamo poi il repo di Ookla per lo Speed Test:

echo "deb [signed-by=/usr/share/keyrings/speedtestcli-archive-keyring.gpg] https://packagecloud.io/ookla/speedtest-cli/debian/ $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/speedtest.list

Aggiorniamo l’elenco dei pacchetti:

sudo apt update

Installiamo ora la CLI Speedtest:

sudo apt install speedtest

Una volta installato, eseguiamo il seguente comando per avviare lo speedtest:

speedtest

Lo Speedtest si avvierà, chiedendoci di accettare alcune condizioni d’uso digitando YES.

Creiamo uno script in Python per avviare il monitoraggio della velocità di Internet e lo chiameremo speedtest.py.

sudo nano speedtest.py

Si aprirà una finestra dove dovete andare a copiare quanto segue. Ricordatevi di modificare il nome utente, inserendo il vostro, altrimenti lo script non si avvierà. Una volta inserito il tutto, fate Ctrl+X per uscire, Y per confermare.

import os
import re
import subprocess
import time

response = subprocess.Popen('/usr/bin/speedtest --accept-license --accept-gdpr', 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)
jitter = re.search('Latency:.*?jitter:\s+(.*?)ms', response, re.MULTILINE)

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

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

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

Spieghiamo velocemente lo script: esso eseguire il programma CLI Speed Test di Ookla, registrando i dati di ping, latenza, download e upload in ordine temporale, all’interno del file speedtest.csv. Ogni volta che verrà eseguito, genererà una nuova riga dove va a registrare ogni informazioni, creando un database. Non ci resta che creare la cartella che ospiterà questo file CSV

mkdir ~/speedtest

Testiamo lo script speedtest.py avviandolo da terminale.

python3 ~/speedtest.py

Se tutto è stato settato in modo corretto, lo script avrà registrato i dati sul file speedtest.csv. Apriamolo con il comando:

nano ~/speedtest/speedtest.csv

Il risultato ottenuto sarà simile a questo.

Una volta appurato il funzionamento, dobbiamo installare sul nostro Orange Pi un programma per la gestione di un database, essenziale per poter poi visualizzare i risultati dei test su un grafico lineare. Questo software si chiama InfluxDB, disponibile nella versione V1 e V2. Nel nostro progetto andiamo ad utilizzare la versione InfluxDB V1. Da terminale, aggiungiamo la chiave GPG di InfluxDB:

curl https://repos.influxdata.com/influxdata-archive.key | gpg --dearmor | sudo tee /usr/share/keyrings/influxdb-archive-keyring.gpg >/dev/null

Poi aggiungiamo InfluxDB sul repo:

echo "deb [signed-by=/usr/share/keyrings/influxdb-archive-keyring.gpg] https://repos.influxdata.com/debian stable main" | sudo tee /etc/apt/sources.list.d/influxdb.list

Aggiorniamo la lista dei repo:

sudo apt update

Poi installiamo InfluxDB:

sudo apt install influxdb

Una volta che avremo installato InfluxDB dobbiamo impostare Orange Pi affinché esegua ad ogni avvio il programma. Eseguiamo uno per volta i seguenti comandi:

sudo systemctl unmask influxdb
sudo systemctl enable influxdb

Ora che tutto è stato impostato, possiamo procedere ad avviare InfluxDB sul nostro Orange Pi. Per avviare il server InfluxDB, dovremo eseguire il seguente comando. Il gestore del servizio avvierà quindi il servizio e inizierà a monitorarlo.

sudo systemctl start influxdb

Poiché ora abbiamo installato InfluxDB V1, possiamo iniziare a configurare con il database. Di default InfluxDB V1 non prevede nessuna impostazione utente, che possiamo però creare a nostra discrezione. Se non abbiamo creato alcun utente, eseguiamo il comando:

influx

Procediamo ora alla creazione di un database per InfluxDB che chiamiamo internet_speed

CREATE DATABASE internet_speed

Il nostro prossimo passo è creare un utente chiamato speedmonitor che utilizzeremo per interagire con il nostro database. Creiamo la password lamiapassword, che utilizziamo solo a scopo dimostrativo, ma che consigliamo di sostituirla con qualcosa di un po’ più sicuro.

CREATE USER "speedmonitor" WITH PASSWORD 'lamiapassword'

Ora assegna all’utente speedmonitor tutti i privilegi sul nostro database internetspeed, creato in precedenza.

GRANT ALL ON "internet_speed" to "speedmonitor"

Usciamo dalla configurazione InfluxDB:

quit

Per permettere il corretto funzionamento, dobbiamo installare la libreria Python che ci permette di interagire con il nostro database Influx

sudo apt install python3-influxdb

Avendo creato un nuovo database, dobbiamo modificare il precedente script Python. Torniamoci e cancelliamo tutto il contenuto.

sudo nano speedtest.py

Una volta svuotato, copiamo quanto segue. Ricordatevi di modificare l’indirizzo IP presente nelle ultime righe di codice, inserendo quello assegnato al vostro Orange Pi. Vi consigliamo caldamente di impostare un IP Statico sul vostro Modem/Router.

import re
import subprocess
from influxdb import InfluxDBClient

response = subprocess.Popen('/usr/bin/speedtest --accept-license --accept-gdpr', 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)
jitter = re.search('Latency:.*?jitter:\s+(.*?)ms', response, re.MULTILINE)

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

speed_data = [
    {
        "measurement" : "internet_speed",
        "tags" : {
            "host": "OrangePiZero2W"
        },
        "fields" : {
            "download": float(download),
            "upload": float(upload),
            "ping": float(ping),
            "jitter": float(jitter)
        }
    }
]
client = InfluxDBClient('192.168.XXX.XXX', 8086, 'speedmonitor', 'lamiapassword', 'internetspeed')

client.write_points(speed_data)

Avviamo nuovamente lo script:

python3 ~/speedtest.py

Passiamo ad installare Grafana sul nostro Orange Pi Zero 2W, aggiungendo la chiave GPG di Grafana:

curl https://apt.grafana.com/gpg.key | gpg --dearmor | sudo tee /usr/share/keyrings/grafana-archive-keyrings.gpg >/dev/null

Aggiungiamo Grafana ai repo del sistema operativo:

echo "deb [signed-by=/usr/share/keyrings/grafana-archive-keyrings.gpg] https://apt.grafana.com stable main" | sudo tee /etc/apt/sources.list.d/grafana.list

Aggiorniamo la lista dei repo:

sudo apt update

Installiamo Grafana digitando su terminale quanto segue:

sudo apt install grafana

Abilitiamo l’avvio automatico di Grafana:

sudo systemctl enable grafana-server

Non ci resta che avviare Grafana per la prima volta:

sudo systemctl start grafana-server

Ora che Granafa è stato installato e correttamente avviato, passiamo al setting. Per prima cosa raggiungiamo l’indirizzo IP della nostra single-board computer da browser.

http://192.168.xxx.xxx:3000

La prima cosa che vedremo quando caricherà  Grafana è una schermata di accesso. In questa schermata potremmo accedere utilizzando l’utente amministratore predefinito creato quando hai installato Grafana. Il nome utente per questo utente è  admin e la password è admin.

Dopo il primo accesso, Grafana richiederà di cambiare la password amministratore.

Fatto ciò, saremo dentro a Grafana e pronti per creare il nostro grafico per lo Speed Test. Iniziamo muovendoci lateralmente a sinistra su Open Menu (tre linee) poi su Connections -> Data sources. 

Cerchiamo a selezioniamo il database InfluxDB. Premiamo sul pulsante, in alto a destra, Add new data source.

Ci verrà richiesto di inserire i parametri del nostro InfluxDB:

  • URL http://192.168.xxx.xxx:8086
  • Database internet_speed
  • User speedmonitor
  • Password lamiapassword

Clicchiamo su Save & Test per salvare e verificare i paramentri.

Dall’Open menu andiamo su Dashboard. Poi clicchiamo sul pulsante NEW e selezioniamo la voce New Dashboard.

Si aprirà una nuova pagina e clicchiamo sul pulsante Add visualization e selezioniamo il database InfluxDB.

Impostiamo i parametri del database nel grafico, cliccando su select measurement e selezionando internet_speed.

Nella sezione SELECT, clicchiamo su field() e selezioniamo uno dei valori tra download, upload o ping. Noi inizieremo dal download.

Sempre dalla sezione SELECT, clicchiamo su mean() -> Aggregations -> distinct.

Aggiungete una nuova query con il pulsante Add query. Ripetete queste operazioni per i valori di upload e ping.

Concluse queste operazioni, a destra del monitor, in Panel options diamo il titolo al grafico Speed Test.

In alto a destra, clicchiamo ora su Save e diamo un nome alla Dashboard. Abbiamo impostato correttamente Grafana e con il trascorrere del tempo vedremo i nostri dati nel grafico. Tuttavia, occorre che il nostro Orange Pi avvii automaticamente lo script per aggiornare i dati. Torniamo sul terminale e digitiamo:

crontab -e

In fondo al fine che abbiamo aperto copiamo quanto segue:

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

In questo modo, ogni 30 minuti verrà eseguito lo speed test, aggiornato il database e il grafico di Grafana.