ユーザ用ツール

サイト用ツール


raspi_iot:サーバ機のプログラミング

サーバ機のプログラミング

エントリポイントの準備

サーバー機では、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のデプロイは終わりです。試しにアクセスしてみましょう。サンプルプログラムの一覧が表示されたら成功です。

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"と出力するようにもしておきました。

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'
raspi_iot/サーバ機のプログラミング.txt · 最終更新: 2019/03/30 16:32 by hirohito