2014年11月10日月曜日

ラズベリーパイがICカードの残高をしゃべるよ

ICカードの残高を喋ってくれたら面白いと思ったので、早速やってみた。

ICカードのリーダーにはパソリPaSoRi(RC-S320)を使用した。

1.下準備
 a)libusb-devの インストール
apt-get install libusb-dev

 b)libpafeの インストール
wget http://homepage3.nifty.com/slokar/pasori/libpafe-0.0.8.tar.gz
tar xzvf libpafe-0.0.8.tar.gz
cd libpafe-0.0.8/
./configure
make
make install

 c)環境設定
 このままではrootでしか使えないので
/lib/udev/rules.d/60-libpafe.rulesを作成する

ACTION!="add", GOTO="pasori_rules_end"
SUBSYSTEM=="usb_device", GOTO="pasori_rules_start"
SUBSYSTEM!="usb", GOTO="pasori_rules_end"
LABEL="pasori_rules_start"

ATTRS{idVendor}=="054c", ATTRS{idProduct}=="006c", MODE="0664", GROUP="plugdev"
ATTRS{idVendor}=="054c", ATTRS{idProduct}=="01bb", MODE="0664", GROUP="plugdev"
ATTRS{idVendor}=="054c", ATTRS{idProduct}=="02e1", MODE="0664", GROUP="plugdev"

LABEL="pasori_rules_end"


そして、
udevadm control --reload-rules
これで、下準備はおしまい。

2.自作プログラムの実行
 動作確認として/libpafe-0.0.8/tests/内にsuica_zandaka.cを作成。

#include 
#include 
#include "libpafe.h"

int main(void){
 /*スイカの残高を表示する*/
 pasori* p;
 felica* f;
 int i;
 int m;
 int wk, wk2;
 uint8 b[16];
 uint8 idm[16];
 
 felica_block_info fbi;
 fbi.service = 0x090f;
 fbi.mode = 0;
 fbi.block = 0;
 
 printf("ICカードの残高は、");
 p = pasori_open();
 if(!p){
  fprintf(stderr,"error\n");
  exit(-1);
 }
 pasori_init(p);
 f = felica_polling(p,FELICA_POLLING_ANY,0,0);
 //printf("read test\n");

 felica_get_idm(f, idm);
  
        // IDm文字列を作成stdlib
 //printf("IDm = %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]);

 for(i=0;i!=32;i++){
  if(!felica_read(f,&i,&fbi,b)){
   /*printf("[%02d] : ",i);
                 printf("%02X ",b[0]);
   printf("%02X ",b[1]);
                 printf("%02X",b[2]);
                 printf("%02X",b[3]);
                 printf("%02X",b[4]);
                 printf("%02X ",b[5]);
                 printf("%02X-%02X -> ",b[6],b[7]);
                 printf("%02X-%02X      ",b[8],b[9]);
                 printf("%02X%02X - % 5d Yen        ",b[10],b[11],b[11]*256+b[10]);
                 printf("%02X%02X%02X%02X\n",b[12],b[13],b[14],b[15]);*/
   //printf("[%02d] : ",i);
   //printf("%d ",b[0]);
   if(((int)b[1] > 0) || ((int)b[2] > 0)){
     /*printf("%02X ",b[0]);
     printf("%02X ",b[1]);
     printf("%02X",b[2]);
     printf("%02X ",b[3]);
     wk=b[4]>>1;
     wk=wk&0x7F;
     printf("%02d/",wk);
     wk=b[4]&0x01;
     wk=wk<<3 data-blogger-escaped-wk2="b[5]">>5;
     wk2=wk2&0x07;
     wk=wk+wk2;
     printf("%02d/",wk);
     wk=b[5]&0x1F;
     printf("%02d ",wk);
     printf("%02X-%02X -> ",b[6],b[7]);
     printf("%02X-%02X      ",b[8],b[9]);*/
     printf("%6d円です。\n",b[11]*256+b[10]);
     pasori_close(p);
     return 0;
     //printf("%02X%02X%02X%02X\n",b[12],b[13],b[14],b[15]);
   }
  }
 }
 printf("読み取れませんでした。\n");
 pasori_close(p);
 return 0;
}



実行ファイルの作成はこんな感じ
gcc -DHAVE_CONFIG_H -I. -I..    -I../src -I../ -g -O2 -MT suica_zandaka-suica_zandaka.o -MD -MP -MF .deps/suica_zandaka-suica_zandaka.Tpo -c -o suica_zandaka-suica_zandaka.o `test -f 'suica_zandaka.c' || echo './'`suica_zandaka.c
mv -f .deps/suica_zandaka-suica_zandaka.Tpo .deps/suica_zandaka-suica_zandaka.Po
/bin/bash ../libtool --tag=CC   --mode=link gcc -I../src -I../ -g -O2   -o suica_zandaka suica_zandaka-suica_zandaka.o ../src/libpafe.la


プログラムの出力をAquesTalkPiにしゃべってもらう

./suica_zandaka | ../../aquestalkpi/AquesTalkPi  -v f1 -f - | aplay

こんな感じ


参考

0 件のコメント:

コメントを投稿