###はじめに
こんばんは、麻菜結です。最近ツイッターでつぶやいた
これを実現していくうえで得た様々な知見に関して書いていこうのやつです。 今回は置時計に表示する通信量データを、ライブラリを使わずゴリゴリ取得したやつです。いつかラズパイをwifiルーター兼アレクサ兼ファイルサーバー兼テレビ兼時計にしてそれらのアイテムを廃業にしたい
— 麻菜 結🐜🚪👿🍹 (@asana_yui) August 22, 2020
###環境
Raspbian64bit
Linux asana 5.4.51-v8+ #1333 SMP PREEMPT Mon Aug 10 16:58:35 BST 2020 aarch64 GNU/Linux
Debian系の傍流です。あんまりこの辺は気にしなくてよさそう。
###やりかた
/proc/net/dev
にアクセスしてみるだけです。結構わかりやすく書いてある。
$ cat /proc/net/dev
Inter-| Receive | Transmit
face |bytes packets errs drop fifo frame compressed multicast|bytes packets errs drop fifo colls carrier compressed
lo: 9120 152 0 0 0 0 0 0 9120 152 0 0 0 0 0 0
wlan0: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
eth0: 2265270920 1920829 0 0 0 0 0 8753 2436031286 2437082 0 0 0 0 0 0
左側は受け取った通信、右側は送り出した通信です。それぞれの行からインターフェースを選んで、バイト数なりパケット数なりを切り取っていけばよい訳です。ここで表示される数は起動してからの累計の数なので、もし『今どのくらい通信しているかのグラフを作成したい』となったら、前の数値との比較を行えばいいわけですね。
###実際の取得例
Python3.7.3でやってみます。いわゆるwith句
が使えるやつにしましょう。
今回は、古い値と新しい値を比較して差を標準出力するプログラムを作成してみます。
0.5秒間隔で出力するので、適当な所でCtrl+C
で止めてください。
from time import sleep
data = []
now = [0, 0]
old = [0, 0]
interface = "eth0"
try:
while(True):
with open("/proc/net/dev", mode="r") as f:
for l in f.readlines():
if(interface in l):
data = [e for e in l.split(" ") if e != ""]
now = [int(data[1]), int(data[9])]
print(f"Receive: {now[0] - old[0]} Byte Transmit: {now[1] - old[1]} Byte")
old = now
sleep(0.5)
except KeyboardInterrupt:
pass
$ python3 print_traffic.py
Receive: 2268743515 Byte Transmit: 3012744264 Byte
Receive: 60 Byte Transmit: 146 Byte
Receive: 60 Byte Transmit: 130 Byte
Receive: 60 Byte Transmit: 130 Byte
Receive: 222 Byte Transmit: 275 Byte
^C
0番目の値がはねていますが、初期値が0の為です。ちゃんとしたグラフアプリケーションを作る人はエラー値として消しておくと無難だとおもいます。
ちなみに、スクリプトの内包表記の部分の処理、一回実行してみればわかりますが、このように書くと、その行の空白を除いた、インターフェース名と数値だけのリストになるので便利です。そのあとお好きな値を取り出してみてください。
###終わりに
今回は、知ってる人にとってはLinuxの基礎の基礎みたいなところから記事を作りました。もちろんLinuxUnix弱者の私は最近知ったわけですが。ラズパイの5インチのディスプレイを買ったとたんいろんな使い道が思いついてやばいですね。これ系統で記事がいっぱいかけそう。なお
のCPUとメモリ部分はpsutilライブラリを使いました。この記事の意味が問われます。(画像の通信量部分はこの記事のモノと仕様が異なります。) ここまで読んでくださってありがとうございました。お役に立てたならば幸いです。置き時計できた!
— 麻菜 結🐜🚪👿🍹 (@asana_yui) August 31, 2020
タッチパネル採用でipアドレス表示とか画面消灯とかができます。
qiitaで質問に答えてくれた兄貴ありがとう! pic.twitter.com/bOGuSIT1rC