サーバ機のプログラミング
エントリポイントの準備
サーバー機では、AloneのCGIモジュールを使います。これには、apache httpdと協調動作をさせなければなりません。 いくつか方法がありますが、ここでは、ディレクトリ構成とデプロイの項でいうケース2の方針で実施します。
エントリポイントの雛形は、alone/htdocs/index.rb として用意してありますので、これを /usr/lib/cgi-bin へコピーします。併せて、htdocs以下の静的コンテンツも公開ディレクトリへコピーします。
sudo cp alone/htdocs/index.rb /usr/lib/cgi-bin/ sudo cp -R alone/htdocs/* /var/www/html/
コピーしたindex.rbを編集し、requre "al_config" のパスを絶対パスで書き換えます。
- index.rb
require "/home/pi/alone/al_config"
ここまでで、Aloneのデプロイは終わりです。試しにアクセスしてみましょう。サンプルプログラムの一覧が表示されたら成功です。
REST API の設計
REST APIは、以下のようにします。
URL
http://HOST/cgi-bin/index.rb?ctrl=data_post
メソッド
POST
データ形式
data={JSON ENCODED DATA}
例:data={"pressure":"1013.12345", "temperature":"25.567"}
今回は簡単にするため、データJSONの前に、data= と付与してブラウザからのPOSTを模擬します。 また、アクションではGETとPOSTの識別までは行いません。
データ保存型式の設計
データ保存は、日付ごとのファイル名をつけたCSVファイルとして保存する仕様とします。
本格的にはデータベース等を採用すべきですが、ここでは簡単のためにファイルシステムを使います。
/var/log/logger/data-YYYYMMDD.csv
CSVファイルには、先頭にデータ受信日時を付加し、気圧、気温の順でコンマ区切りで記録します。
- CSVファイルヘッダはつけません
- 日時は現地時間とし、タイムゾーンは省略します
- 気圧はhPa単位とし、小数点2位まで記録します
- 気温はセルシウス度とし、小数点1位まで記録します
- 改行コードは、CRLFとします。
YYYY-MM-DD HH:MM:SS, ####.##, ##.# (CRLF)
Alone アクションとして実装
ではこのREST APIをAloneのアクションとして実装しましょう。 コマンドラインで以下のコマンドを打って、雛形を作ってください。
cd alone/controllers/ mkdir data_post cd data_post
データを保存するディレクトリも作りましょう。
sudo mkdir /var/log/logger sudo chown www-data:www-data /var/log/logger
次に、コントローラクラスにアクションメソッドを実装します。
今回はデフォルトアクションでデータを受信するので、action_indexメソッドを実装します。アクションが正しく終了したこと見てわかるように、最後に"OK"と出力するようにもしておきました。
- main.rb
require "alone" require "json" class DataPostController < AlController FILENAME = "/var/log/logger/data-" def action_index data = AlForm.get_parameter(AlText.new("data")) log data data = JSON.parse( data ) now = Time.now filename = FILENAME + now.strftime("%Y%m%d") + ".csv" csv = now.strftime("%Y-%m-%d %H:%M:%S, ") + sprintf("%.2f, %.1f\r\n", data["pressure"].to_f, data["temperature"].to_f) open(filename, "a") {|file| file.write( csv ) } puts "OK" end end
単体テスト
REST-APIが正しく動作するか、単体でテストしておきましょう。
標準でcurlコマンドが用意されていますので、これを使って /var/log/logger 以下に正しくCSVファイルができるか確認してみます。
もし動かなければ、そのエラー理由が /tmp/al_cgi.log ファイルに記録されています。これをみながらデバッグします。
curl -X POST -d 'data={"pressure":"1013.12345", "temperature":"25.567"}' \ 'http://localhost:/cgi-bin/index.rb?ctrl=data_post'