====== サーバ機のプログラミング ======
===== エントリポイントの準備 =====
サーバー機では、Aloneの[[alcgi:start|CGIモジュール]]を使います。これには、apache httpdと協調動作をさせなければなりません。
いくつか方法がありますが、ここでは、[[detail:ディレクトリ構成とデプロイ|ディレクトリ構成とデプロイ]]の項でいうケース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" のパスを絶対パスで書き換えます。
require "/home/pi/alone/al_config"
ここまでで、Aloneのデプロイは終わりです。試しにアクセスしてみましょう。サンプルプログラムの一覧が表示されたら成功です。
http://192.168.1.11/cgi-bin/index.rb
===== 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"と出力するようにもしておきました。
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'