linuxで、Felica(Edy)の読み込みのできるライブラリ libpafe が単純で、使いやすそうだったので、ちょいと遊んでみた。 1秒間隔でポーリングさせ、Edyが認識できる度に"(在室)"と"(不在)"が切り替わるようにしてみた。Edy認識のプログラムを20行ほどと、判断+表示切替のShell Script を20行ほど、書いてみた。
下の電光掲示板は、随分前にサーバで制御できるようにしてあったので、 かなり簡単にできてます。
// felica.cxx
//
// EdyのIDを1秒間隔でポーリング。
// 見つけたらIDを表示して停止
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
extern "C" {
#include <libpafe/libpafe.h>
#include <libpafe/pasori_command.h>
#include <libpafe/felica_command.h>
}
// 停止判定
volatile int flag_abort = 0 ;
// ^C による停止の処理
void func_sigterm( int x ) {
flag_abort = 1 ;
}
int main() {
pasori* p ;
// PaSoRiを初期化
if ( (p = pasori_open()) != NULL ) {
felica* f ;
sighandler_t old ;
pasori_init( p ) ;
// pasori_set_timeout( p , 0 ) ; // timeout forever
// イベントハンドラの切り替え
old = signal( SIGTERM , func_sigterm ) ;
while( !flag_abort ) {
// Felicaがあるかチェックする(Edyのみ)
if ( (f = felica_polling( p , FELICA_POLLING_EDY ,
0 , 1 )) != NULL ) {
uint8 idm[ 16 ] ;
// IDmを取得する
felica_get_idm( f , idm ) ;
printf( "%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x\n" ,
idm[ 0 ] , idm[ 1 ] , idm[ 2 ] , idm[ 3 ] ,
idm[ 4 ] , idm[ 5 ] , idm[ 6 ] , idm[ 7 ] ) ;
// felica_free()があるはずなんだけど...
free( f ) ;
// 強制終了
flag_abort = 1 ;
break ;
}
// 1秒間隔
usleep( 1000000 ) ;
}
// イベントハンドラを戻す
signal( SIGTERM , old ) ;
// PaSoRiを閉じる
pasori_close( p ) ;
}
return 0 ;
}
これを処理する Shell Script。
#!/bin/bash MY_EDY_ID="11:22:33:44:55:66:77:88" EDY_ID="/usr/local/bin/edy_id" EABADGE="/usr/local/bin/eabadge.pl" STATE="HERE" while [ "$STATE" != "" ]; do case $STATE in HERE ) $EABADGE -f "(在室)" ;; OUT ) $EABADGE -f "(不在)" ;; esac GET_ID=`$EDY_ID` while [ "$GET_ID" != "$MY_EDY_ID" ]; do GET_ID=`$EDY_ID` done case $STATE in HERE ) STATE="OUT" ;; OUT ) STATE="HERE" ;; esac done
