はじめに
先日、perl入学式 in大阪 第五回へ行ってきた。
内容はperlのMojoliciousというwebアプリケーションフレームワークを使って、掲示板を作ってみようというもの。
そこで実際にMojoliciousを使ってみて、RaspberryPiでIOTする上で自前のwebアプリ制作に使えそうだ、という気分になったので、とりあえず簡単なものを作ってみた。
なお、成果物をまるっと紹介したいだけなので、ライブラリのインストールや、ラズパイのセッティング等は割愛している。
Why Mojolicious??
なぜ、MojoliciousがRaspberryPiでIOTするのに良さそうと思ったかは以下の通り
- linuxの素のシステムパールでさくっと動く
- 一つのperlスクリプトを書くだけでwebアプリが完結する
- webサーバアプリケーション本体を内蔵している
- その気になれば完成度の高いものも作れる
- webiopiのように全て用意されてしまっていないので、自由に作れる
環境
- サーバ
- RaspberryPi3
- OS
- Raspbian jesse(debian系のlinux)
- perl
- Raspbian内蔵のシステムperl
- Mojolicious
- ver.7.20
- ブラウザ
- safari
ブラウザでLチカするだけの試作
できた。
ざっとMojoliciousのDocを読んで目に付いたのがこれだけだったので、まさかのラジオボタン。
ともかくブラウザで入力した情報を'POST'でサーバへ送って、それを元にサーバのアプリケーションで電子回路を制御する、というIOTっぽい基本的な流れを作れたのでよしとする。
ハード
ただledを光らせたいだけなのでこれだけでOK。
アノード側にGPIOを接続している。
ソフト
とりあえずwebアプリ側をperl x Mojoliciousで、電子回路制御アプリ側をpythonで用意した。
HTMLはperlスクリプトの__DATA__セクションに記述できるようになっているので、今回はこの2ファイルのみで実装できる。
以前に同じような試作をした時は、HTML, JavaScript, PHPのリソースを一式用意して、apacheに乗せてサーバを立ち上げて...とかなり手間と時間がかかったので拍子抜けするくらいシンプルで楽にできてしまった。
Mojo_IOT
#!/usr/bin/env perl
use utf8;
use Mojolicious::Lite;
my $led ="";
get '/' => sub {
my $c = shift;
$c->render(template => 'index');
};
post '/post' => sub {
my $c = shift;
$led = $c->param('led');
`python mojoIOT_led.py $led`;
$c->redirect_to('/');
};
app->start;
__DATA__
@@ index.html.ep
% layout 'default';
% title 'IN';
%= form_for '/post' => method => 'POST' => begin
LED<br>
on
%= radio_button 'led' => '1'
off
%= radio_button 'led' => '0', checked => 'checked'
%= submit_button 'send'
% end
@@ layouts/default.html.ep
<!DOCTYPE html>
<html>
<head>
<title><%= title %></title>
</head>
<body>
<%= content %>
</body>
</html>
- webアプリ側でやっていること
-
POST
でラジオボタンから値('1' or '0')を取得して変数へ格納し、それを起動引数として下記のpythonスクリプトを実行 - その他タイトルや文字列の表示
-
mojoIOT_led.py
#!/usr/bin/python
import RPi.GPIO as GPIO
import sys
gpio1 = 18
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)
GPIO.setup(gpio1,GPIO.OUT)
args = sys.argv
if args[1] == '1' :
GPIO.output(gpio1, GPIO.HIGH)
else :
GPIO.output(gpio1, GPIO.LOW)
- 電子回路制御アプリでやっていること
- コマンドライン引数を取得し、値に応じてGPIOへhigh/lowの信号を出力する
サーバの起動
Mojolicious内蔵のサーバで起動する。
$morbo MojoIOT
デフォルトのポートは:3000
なので、あとは好きにlocalhostなり、ローカル,
グローバルにアクセスしてブラウザから操作すればOK。
まとめ・TODO
- まとめ
- ハード側の開発に時間をかけて、それを利用するweb側をさくっとやっつけたい、でも後々はそれなりのアプリにできたらしたい、みたいな人にはMojoliciousは良さそうだなと思った
- TODO
- いまいちMojoliciousのDocを読み切れていなくチープな実装になっているので、もう少しweb系のテクニックの習得合わせてしっかりとした実装にしたい
- 制作しているIOTなマシンに実際に使っていきたい