Mesurer la vitesse WiFi avec Python

Cet article est l'article du 13ème jour du JSL \ (Nippon System Giken ) Advent Calendar 2019.


Récemment, j'ai senti qu'il y avait un moment où le WiFi dans l'entreprise ralentissait, mais je ne savais pas à quel point il était lent, alors j'ai écrit un script pour exécuter un test de vitesse régulièrement.

Premier résumé

-J'ai écrit un programme en Python pour mesurer la vitesse du WiFi interne en utilisant Speedtest CLI \ -Mesure de connexion Internet pour les développeurs.

Test de vitesse de CUI

Tout d'abord, je voulais l'exécuter régulièrement avec cron etc., alors j'ai pensé à faire un test de vitesse avec CUI

Dans mon image, le test de vitesse a été mesuré comme suit: recherche → exécuter….

スクリーンショット 2019-12-23 15.54.09.png

J'ai essayé d'organiser les moyens de mesurer la vitesse de la ligne réseau sur Linux | Developers \ .IO ) Il semble que speedtest.net fournit la CLI lorsque j'ai enquêté en regardant l'article, etc.

La CLI Speedtest fournit également un package Python,

--Il est possible d'installer binaire avec pip

j'ai découvert

Construire un environnement d'exécution de test rapide

J'ai construit un environnement en utilisant pipenv

$ mkdir wifi_speedtest
$ cd $_  
#Si pipenv n'est pas installé
# brew install pipenv

#Créer un environnement virtuel
$ pipenv --python 3.7

#Installation du package
$ pipenv install speedtest-cli

#Activer l'environnement virtuel
$ pipenv shell

#tester la commande speedtest
(.venv) $ speedtest --version
speedtest-cli 2.1.2
Python 3.7.4 (default, Oct 12 2019, 18:55:28) [Clang 11.0.0 (clang-1100.0.33.8)]

Essayez d'exécuter Speedtest sur CUI

Vous pouvez obtenir une liste de serveurs de destination de connexion fournie par des volontaires avec speedtest --list, alors choisissez-en un et notez le numéro.

(.venv) $ speedtest --list | grep Tokyo
15047) OPEN Project (via 20G SINET) (Tokyo, Japan) [6.34 km]
24333) Rakuten Mobile , Inc (Tokyo, Japan) [6.34 km]
28910) fdcservers.net (Tokyo, Japan) [6.34 km]
18516) GIAM PING VIETPN.COM (Tokyo, Japan) [6.34 km]
22247) Tokyonet (Castro, Brazil) [18486.74 km]

Si vous spécifiez ce qui suit, le test de vitesse sera toujours exécuté sur le serveur spécifié. Par exemple, pour un serveur fourni par «Rakuten Mobile, Inc», le numéro serait «24333».

#Test de vitesse d'exécution
(.venv) $ speedtest --server 24333
Retrieving speedtest.net configuration...
Testing from XXX (xx.xx.xx.xx)...
Retrieving speedtest.net server list...
Retrieving information for the selected server...
Hosted by Rakuten Mobile , Inc (Tokyo) [6.34 km]: 200.123 ms
Testing download speed................................................................................
Download: 16.08 Mbit/s
Testing upload speed......................................................................................................
Upload: 31.96 Mbit/s

J'ai pu mesurer en toute sécurité (certaines informations client sont masquées)

Cependant, cela est difficile à gérer sur le programme, alors ajoutez --json et essayez d'obtenir le résultat au format json.

(.venv) $ speedtest --server 24333 --json

résultat


{"download": 20208058.464686207, "upload": 54426180.687909536, "ping": 48.215, "server": {"url": "http://ookla.mbspeed.net:8080/speedtest/upload.php", "lat": "35.6833", "lon": "139.6833", "name": "Tokyo", "country": "Japan", "cc": "JP", "sponsor": "Rakuten Mobile , Inc", "id": "24333", "host": "ookla.mbspeed.net:8080", "d": 6.336536019993832, "latency": 48.215}, "timestamp": "2019-12-23T07:23:16.316637Z", "bytes_sent": 68534272, "bytes_received": 25353712, "share": null, "client": {"ip": "xx.xx.xx.xx", "lat": "xx.xxxx", "lon": "xxx.xxxx", "isp": "XXX", "isprating": "3.7", "rating": "0", "ispdlavg": "0", "ispulavg": "0", "loggedin": "0", "country": "JP"}}

Pensez à gérer cela sur Python

Exécutez Speedtest en Python

Comme il est fourni en tant que package Python, j'ai pensé à exécuter un test de vitesse de manière enfichable en Python, mais cette fois j'ai pensé à gérer le résultat de l'exécution dans CUI tel quel, donc test de vitesse avec module de sous-processus Décidé d'exécuter la commande

sous-processus \ - \ - \ - gestion des sous-processus - documentation Python 3 \ .8 \ .1

wifi_speedtest.py


def get_speedtest_result():
    process = subprocess.run(['speedtest', '--server', '24333', '--json'], capture_output=True)
    return json.loads(process.stdout)


def bit_to_mbit(bit):
    """
Faire un sentiment qui ne se soucie pas des erreurs
    """
    return bit / 1024 / 1024


result = get_speedtest_result()
print(bit_to_mbit(result["download"]), bit_to_mbit(result["upload"]))

résultat


13.46394215 50.48002296

Il y a plusieurs façons d'exécuter une commande avec subprocess, mais cette fois j'ai obtenu la sortie standard avec run () + capture_output = True, qui est officiellement mentionnée dans l'exemple d'utilisation.

Cette fois, j'ai frappé l'API SpreadSheet pour l'enregistrer (les détails sont omis ci-dessous).

Vous pouvez l'ignorer dans Slack et l'enregistrer comme vous le souhaitez.


En passant, l'utilisation des scripts de Pipenv était pratique car il n'était pas nécessaire d'activer l'environnement virtuel lors de l'exécution à partir de cron (les processus exécutés via pipenv run sont traités de la même manière que l'exécution dans un environnement virtuel).

Pipfile


[scripts]
dev = 'python wifi_speedtest.py'

Recommended Posts

Mesurer la vitesse WiFi avec Python
python3 Mesurez la vitesse de traitement.
Accélérez grossièrement Python avec numba
FizzBuzz en Python3
Grattage avec Python
Statistiques avec python
Grattage avec Python
Twilio avec Python
Intégrer avec Python
Jouez avec 2016-Python
AES256 avec python
Testé avec Python
python commence par ()
avec syntaxe (Python)
Bingo avec python
Zundokokiyoshi avec python
Excel avec Python
Micro-ordinateur avec Python
Cast avec python
Comment mesurer le temps d'exécution avec Python Partie 1
Vitesse explosive avec Python (bouteille)! Développement d'API Web
Comment mesurer le temps d'exécution avec Python, partie 2
Mesurer la température du processeur de Raspeye avec Python
Communication série avec Python
Django 1.11 a démarré avec Python3.6
Jugement des nombres premiers avec Python
Python avec eclipse + PyDev.
Communication de socket avec Python
Analyse de données avec python 2
Grattage en Python (préparation)
Essayez de gratter avec Python.
Apprendre Python avec ChemTHEATER 03
"Orienté objet" appris avec python
Exécutez Python avec VBA
Manipuler yaml avec python
Résolvez AtCoder 167 avec python
Communication série avec python
[Python] Utiliser JSON avec Python
Apprendre Python avec ChemTHEATER 05-1
Apprenez Python avec ChemTHEATER
Exécutez prepDE.py avec python3
Python ~ Apprentissage rapide de la grammaire ~
1.1 Premiers pas avec Python
Collecter des tweets avec Python
Binarisation avec OpenCV / Python
3. 3. Programmation IA avec Python
Méthode Kernel avec Python
Non bloquant avec Python + uWSGI
Grattage avec Python + PhantomJS
Publier des tweets avec python
Conduisez WebDriver avec python
Utiliser mecab avec Python 3
[Python] Redirection avec CGIHTTPServer
Analyse vocale par python
Pensez à yaml avec python
Premiers pas avec Python
Utiliser DynamoDB avec Python
Getter Zundko avec python
Gérez Excel avec python
Loi d'Ohm avec Python
Jugement des nombres premiers avec python