ホーム » スタッフ » 斉藤徹 » libpafeで行き先表示板

2012年7月
« 6月   8月 »
1234567
891011121314
15161718192021
22232425262728
293031  

最近の投稿(電子情報)

アーカイブ

カテゴリー

libpafeで行き先表示板

1207131341_622x550.jpg

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