14.run.sh(その2)
プラグインのボタンクリック時に対し、RaspberryPi側に何らかのアクションを起こさせたい場合にも run.sh を使用することができます。
実は、先に説明した「run クラスを持つ input タグ」での実行時、webui の内部では以下の処理を行っています。
① ブラウザの JavaScript がympdのサーバに向かって 'ACTIVATE_PLUGIN,/opt/plugins/' + プラグインのパス + ’,’ + パラメータ
という命令を送る。
②ympd サーバが①の命令を受信すると、プラグインのパスにある run.sh を指定されたパラメータを与えて実行する。
つまり、上記と同じ仕組みをプラグインのJavaScriptで構築し、run.sh に直接渡せばよいのです。
function some_button_click(param) {
var p = $('#plugin-form').data('path') + ',' + param;
socket.send('ACTIVATE_PLUGIN,/opt/plugins/' + p);
}
上記の関数例(プラグインのJavaScriptソースコード)は ①の動きを直接記載したもので、
関数の引数 param は プラグインの run.sh に渡すパラメータです。
また、$('#plugin-form').data('path')が当該プラグインのパスが記載されている場所になります。
この場合は単一の引数ですが、何らかの区切りで文字列を繋げば複数の引数をrun.shに渡し、run.shで区切り文字で配列を分割すれば複数パラメータを渡すことも可能です。
次に、run.sh の実行結果をどうやってプラグインが受領するかですが、一例として run.sh に以下のように記載すると、
/var/lib/mpd/RAM/ 上に隠しファイルで実行結果を書き込みできます。
LOG=/var/lib/mpd/RAM/.bbb.out
echo "aaa" > $LOG
echo "---" >> $LOG
さらにこの.bbb.outをプラグインで受信する場合、 JavaScript でこのようにすると良いでしょう。
var checktimer = setInterval(function () {
$('#out')
.load('/RAM/.bbb.out?t=' + Date.now(), '', function (data) {
if (data.endsWith('---\n')) {
clearInterval(checktimer);
var data2 = data.replace('---\n', '');
//ここに受信したデータの処理を書き込み
}
});
}, 300);
これは、idにoutというタグを予め用意しておき、/RAM/.bbb.out の出力を300ミリ秒間隔で 文字列の最後が "---\n" で終わるまで受信し続けます。
"---\n"が文字列の最後にあった場合、これを除去して受信したデータを処理すれば良い訳です。