LEDの点灯から
Linuxなどは、マイコンなどのレジスタを直接叩かなくてもいいように、仮想ファイルシステムと呼ばれるものが存在しています。
例えば、ラズパイでGPIOを操作するときには、ライブラリとかを使っているかと思いますが、実態は/sys/class/gpio/っていうところに入っているファイルを操作しています。
こんな感じの要領で、OpenWrtのLEDを制御する場合も、同じように、ファイルの中身を変更する感覚でON/OFFできます。
(かといって、通信状況を示す点滅動作等は、割り込みなどが含まれてくると思うので、OpenWrtのGUIで操作した方が楽です)
↑このサイトが参考になりました。ありがとうございます。
ということで、実際にLEDをON/OFFできるか確かめてみましょう。
ここは、以前自分がGUIで設定してしまっているので、解除している部分です。
普通の人は必要ありません。(多分)
名前がWANのやつは、WAN端子がリンクすると光るみたいなゴミ機能が 入っていたので、こいつを消します。
ややこしいのですが、LAN(通信すると点滅するやつ)をWANに持ってきました。
(理由としては、WANだと緑のみしか制御できないのですが、Routerだと緑/オレンジの制御ができます)
ということで、今回はRouterランプ を制御します。
次に、SSHでルーターに接続します。
ルーターのIPアドレスに合わせてください。
(注:今回はrootアカウントでログインしていますが、一般ユーザー用のアカウントがあるのであれば、そっちでログインしたほうが、セキュリティ的にも良いです)
パスワードを求められますが、入力している内容は見えません。
次に、LEDの名前について確認しておきます。
(本当はrootで操作しているので#ですが、今回はみやすさの関係で$にしています)
初期状態だと、ホームディレクトリにいるので、cd /でルートディレクトリ(階層の一番上)に移動させます
cdコマンドで sys/class/leds ディレクトリに移動します。
lsコマンドで仮想ファイルの名前を確認しておきます。
今回だと、routerLEDは
bcm53xx:green:router
bcm53xx:amber:router
の2つがあります。
$ cd bcm53xx:green:router
試しに、greenLEDを点灯させてみたいと思います。
bcm53xx:green:router ディレクトリに移動します。
次に、lsコマンドでファイルを見てみます。
ここに brightnessとはdeviceとかいろいろありますが、今回はbrightnessというファイルを操作します。
brightnessに1を書くことで、LEDが点灯します。
一番下のLEDが緑色に点灯しているかと思います。
当たり前ですが、0を書くことで、LEDが消灯します。
次に、amber(オレンジ色)を点灯させてみます。
$ cd ../../ #ledsディレクトリまで戻る
$ cd bcm53xx:amber:router
同じように、echo 1 > brightnessとかってすれば、オレンジ色が光ります。
(このルーターは同時に光らせることはできないようで、後にbrightnessを変更した方が優先されるようです。例えばgreenのあとにamberを操作すると、オレンジ色で光る)
とりあえず光らせることには成功しました。
プログラムを書く&実行する
今回は簡単にできると思うので、シェルスクリプトで実装します。また、このためだけにSMBとかFTPとかでやり取りするのは面倒なので、今回はnanoやvim等のCUIで動作するテキストエディタを使います。
いろいろ考えた結果、/usr ディレクトリの中に data ディレクトリを作成し、その中に ping_led.sh ファイルを入れたいと思います。
(/usr/data/ping_led.sh ということ)
usrディレクトリに移動して、dataというディレクトリを作成します。
nano使えないんですね…。しかたないのでvi使います。
vimはクセが強いので、できれば使いたくはないんですが、しょうがないので使います。
vimに書き込むには、最初にiキーを押します。すると、インサートモードになり書き込めるようになります。
#!/bin/sh
#LED OFF
echo 0 > /sys/class/leds/bcm53xx:amber:router/brightness
echo 0 > /sys/class/leds/bcm53xx:green:router/brightness
ping -c 1 -W 5 www.google.com
if [ $? = 0 ]; then
#GREEN ON
echo 1 > /sys/class/leds/bcm53xx:green:router/brightness
else
#AMBER ON
echo 1 > /sys/class/leds/bcm53xx:amber:router/brightness
fi
vimは保存する手順が面倒です。
まずescキーを押して、インサートモードを終了します。
次に :wq と入力して終了します。
(余談ですが、wがwrite(書き込み) qがquit(終了)を意味しています。ただ、当たり前ですが、終了してから書き込みはできないので、:qwは怒られます)
簡単に説明しておきますが、
echo 0 > /sys/class/led…で、LEDを消灯させています。
次に、pingを使って、インターネットに接続できているか確かめます。
-c 1 で1度のみ行う。-W 5 で タイムアウト時間を5秒とする
的な感じです。
接続先は www.google.comですが、適時変更してください。
(個人的に思ったのは、www.openwrt.orgなんていいのかなと思いました)
if [ $? = 0 ]; then
は、$?が直前に実行したコマンドの戻り値です。今回は、pingが成功したかこれで見ています。(成功すれば0 失敗したら0以外)
ここハマりポイントなんですが、if␣[␣$?␣=␣0␣]みたいな感じで空白が必要です。(これらも別のコマンドだか引数扱いってことらしいです。シェルスクリプトむずいですね)
あとは、なんとなくわかると思うので省略します。
人によっては、なんで最初LED消灯させてるの?って思う人がいるかも知れませんが、それの方が今どういう状態にいるのかわかりやすいので良いかなと思ったからです。
LEDが消灯→pingコマンド実行中
緑色LEDが点灯→pingコマンドが通った&次まで待機
オレンジLEDが点灯→pingコマンド失敗&次まで待機
こんな感じですかね。
よーく見てるとLEDが一瞬消灯していますが、ほぼ気にならないレベルです。
常に光っていたいんだ!って場合は、下にサンプルおいておくのでどうぞ。
#!/bin/sh
ping -c 1 -W 5 www.google.com
if [ $? = 0 ]; then
#GREEN ON
echo 0 > /sys/class/leds/bcm53xx:amber:router/brightness
echo 1 > /sys/class/leds/bcm53xx:green:router/brightness
else
#AMBER ON
echo 0 > /sys/class/leds/bcm53xx:green:router/brightness
echo 1 > /sys/class/leds/bcm53xx:amber:router/brightness
fi
次に、実行します。
当たり前ですが、作っただけだと、実行権限がないため動かせません。
ということで、作ったシェルスクリプトに実行権限を付与します。
これで動かせるようになりました。実際に動かしてみましょう。
インターネットに接続出来ているのであれば、緑色に光ればOKです。
もしオレンジ色に光ってしまった場合は、pingのアドレスがあっているか、インターネットに繋がっているか確認します。
次に、LANケーブルをWAN端子からブチ抜き、もう一度実行します。
オレンジ色に光ればOKです。
定期的に実行する
このままだと、インターネットに接続しているか毎回実行しなければいけないため、定期的に実行してみたいと思います。
Linux(性格にはUnix系)にはcronというジョブ管理ツールが入っているのでそれらを使います。
で設定ファイルを開きます。
* * * * * for i in `seq 0 5 59`;do (sleep ${i}; /usr/data/ping_led.sh) & done;
太字にした数字が何秒ごとに実行するかです。今回だと5秒毎にしています。
おそらく標準のvimが開くので、iキーでインサートモードにして、入力が終わったら、escキー→:wqで終了します。
上のサイトが参考になりました。forとseqでできるのすごいですね。
これで5秒毎にさいほど作ったコマンドが実行されるようになりました。めでたしめでたし。
余談というかなんというか
ぶっちゃけ、こんなの作らなくても良くないって思う人は多いと思うんですが、スマホだと手軽にコマンド実行できないですし、端末の問題なのか、ルーターより上の問題なのか簡単に分かるっていうのがメリットだと思っています。
特に、スマホとかfirestickとかで問題が起こったとき、ルーター見るだけでインターネットに接続できているか確認できて、「ルーター再起動するか」とか「とりあえず端末再起動するか」とかそういう切り分けできますから。
まあ結局は自己満足なんですけどね。