NodeRedでRPiの制御
前記事で、RPi をWifi のAPにして、回線遅延シュミレーターを作ってみた。
せっかなので、外部から操作して、自由に遅延時間を変更したい。
I/F
RPiなので、ハードウェアI/F にしたい。
各種状態は、8個のLEDで表示しよう。
が、それだけでいいだろうか?
ネットワーク機器は、手元に置いて操作できるとは限らない。
マシンルームに置くこともありうる。
ということで、こんな構成を考えてみた。
RPi にNodeRedを起動して、遅延制御機能のサーバとして利用する。
BlinkT のsetup
driver のinstall
$ curl https://get.pimoroni.com/blinkt | bash
数分以上かかる。
終わったら、サンプルプログラムでテスト
$ cd Pimoroni/blinkt/examples
$ python3 rainbow.py
status表示用の適当なプログラムを作ってみる
LEDの表示用の簡単なpython scriptを作ってみる。
- Usage
Usage: rpi_status.py L0 L1 L2 L3 L4
L0 ... LAN ok/ng
L1 ... WLAN ok/ng
L2 ... on/off
L3 ... on/off
L4-L7 ... Delay (100msec)
- 実行サンプル
$ python3 rpi_status.py ok ok off off 1000
- サンプルソース
https://gist.github.com/kurosuke/cdf91e867652797e506f6b3539194e2d
Node-Red の setup
Node-Red のinstall
制御用のコントラーラーとして、Node-Redをinstall する。
https://nodered.jp/docs/getting-started/raspberrypi
$ bash <(curl -sL https://raw.githubusercontent.com/node-red/linux-installers/master/deb/update-nodejs-and-nodered)
10分くらいかかる。
起動後に、Node-Red にアクセス
前回の記事通りに設定済みなら、 rpilss.local
は、192.168.100.1
でもいい。
Node-Red で制御
先ほどのPython scriptは、Node-Redから起動する。
ということは、Node-Red で以下のステータスを管理する必要がある。
- LAN 状態(LINKUP and IP取得でOK)
- WLAN状態 (LINKUP and IP取得でOK)
- 遅延msec
Node-Redにはメモリ上にGlobal領域があるので、各イベントがその内容を更新するように設定する。
細かいテクニックは、後日。
フローを書き出したファイルは以下。
これで、RSET API サーバ機能も実装して、以下のendpoint で操作できるようになった。
状態取得
$ curl -X GET http://rpilss.local:1880/tc
---
{"datetime":"2020-09-22T11:23:56.122Z",
"delay_msec":100,
"lan":"ok",
"wlan":"ok",
"lan_ip":"192.168.7.107"}
遅延を200msecに設定
$ curl -X PATCH http://rpilss.local:1880/tc?delay_msec=200
---
{"datetime":"2020-09-22T11:24:53.105Z",
"delay_msec":200,
"lan":"ok",
"wlan":"ok",
"lan_ip":"192.168.7.107"}```
遅延を0に戻す
$ curl -X PATCH http://rpilss.local:1880/tc?delay_msec=0
---
{"datetime":"2020-09-22T11:25:47.729Z",
"delay_msec":0,
"lan":"ok",
"wlan":"ok",
"lan_ip":"192.168.7.107"}
---
Node-Red Dashboardで制御
node-red-dashboard
をinstall して設定すると、こんな画面も簡単に作れる。