非接触ICカードな勤怠管理的デバイスをRasberry Piで作ってみた(送信編)

さて、送信編です。 準備編→構築編→送信編(今ここ)と続いていますので、まだご覧になっていない方はぜひ。
前回の構築編で、無事ICカードの情報が読み取れる事がわかりました。
今回は、読み取った情報をサーバに送信する部分を実装したいと思います。
※使用言語はPerl5.20.2です。
■ プログラムの流れ
1.待受中にする
2.読み取った値を分割して変数に入れる
3.LEDを点灯させる
4.パラメータをサーバに送信
5.5秒間Sleep
6.LEDを消灯
7.1に戻る
1.待受中にする
社内でしか使わない物なので、ゴリゴリとsystemコマンドを直打ちしていきます。
たしか
$ explorenfc-basic
が待ち受け状態にするコマンドだったので、返り値を取れるようバッククオート演算子で囲います。
my $ic_value = `explorenfc-basic`;
2.読み取った値を分割して変数に入れる
次に、$ic_valueの中から「UID」の部分をピンポイントで抜き出します。
改行コードがCRLFだったので¥n¥rで分割します。
my @temp = split(/
/, $ic_value);
if($temp[5] =~ /UID/){
$c = 5;
}
elsif($temp[6] =~ /UID/){
$c = 6;
}
else{
$error = 1;
}
$temp[$c] =~ s/ISO14443A UID: //g;
本当はこんな冗長な書き方はしませんがとりあえず流れを分かりやすくするために・・・
ifで条件分けしているのは、なぜかデータのUID部分がたまに5行目になることがあり、その場合のための対応です。
本当はこんな冗長な(略
最後に、ISO144~~という余計な部分をカットします。これはサーバ側でやっても良いかもしれません。
3.LEDを点灯させる
RasberryPi B+にはスピーカー端子などというリッチな端子がなく、読み取れたかどうかがその場で分からないので、代わりにLEDを点灯させます。 これも読み取り状態にするあれと同様、システムコマンドを使います。
RasberryPiにはACTランプというLEDが最初からついているので、これを光らせましょう。
コマンド的には、
# echo 1 > /sys/class/leds/led0/brightness
で緑色のLEDが点灯します。echoのあとの1を0にすると消灯します。
ただこのコマンド、root権限じゃないと実行できないので注意です。
多分どうにか出来るんでしょうけど、特に重要じゃないので先に進みます。
4.パラメータをサーバに送信
LWP::UserAgentとURIモジュールを使います。
取得したパラメータをURLエスケープし、getリクエストでサーバに投げます。
SSLを使用する場合、LWP::Protocol::httpsが必要になるのでご注意を。その際にCrypt::SSLeayやNet::SSLeayが必要になりますが、RasberryPiはDebian系OSなのでその辺のインストール方法が若干特殊かもしれません。
今回はhttpにて実装します。
$ua = LWP::UserAgent->new;
my $user_agent = "Mozilla/5.0";
$ua->agent($user_agent);
my $uri = URI->new("http://hogehoge.ecninc.co.jp/");
my $paramater = {
uid => $temp[$c]
};
$uri->query_form(%$paramater);
my $response = $ua->get($uri);はい、そのまんまです。
5.5秒間Sleep
これは単純に、一定時間NFCリーダーの上にカードを置いた際、連続してデータを送信しないための重複禁止措置です。
5秒という数字にこだわりがあるわけではないのでここは自由に変更していいと思います。
Perlでの実行停止はsleep(5);で行います。
6.LEDを消灯
3でも書きましたが、
# echo 0 > /sys/class/leds/led0/brightness
で消灯します。ここで消灯してあげないとずーっとLEDランプがつきっぱなしです。
7.1に戻る
このままでは一人読み取ったらプロセスが終了してしまうので、Whileかなにかで1に戻し、プロセスを起動し続けるようにします。
あとはサーバ側で取得したパラメータをアレコレ料理してあげれば良いかと思います。
注意点としては、このスクリプトはsuで実行しなくてはらない点、プロセスを起動し続けるようにする点です。
SSHでプロセスを立ち上げてしまうと切断時にプロセスも終了してしまうので、SSHで立ち上げたい場合は
# nohup perl script.pl &
としてあげると幸せになるかと思います。
弊社ではこんな感じで放置設置されています。

社員は出勤時・退勤時に自分のICカードをこの上にフワッと乗せて出退勤処理をします。
かかったお金:合計10,000円くらい
かかった時間:合計3時間くらい
というわけで非常に節約になりました。
ただ、RasberryPiをこれだけのために使うのは非常にリソースがもったいないので、別のネタも考えたいと思います。





