nfcpyが同じカードのIDを連続して読み続けてしまう場合

八光グループ本社では出退勤のタイムカードに某社のICカードシステムを利用しています。

本社は以前ご紹介したとおり長年やってますんで (なんと今年で75年なんですね。戦後より長い)、いろいろと設備が古くなっておりまして、おくればせながら建屋の建て替えラッシュだったりします。

われわれアズシエルの入っている建物も近々建て替えになります。

それにあわせて社員食堂も新しくなることになっていまして、そこでタイムカードで使っているICカードで社員を識別して、食堂で食べたものを自動で給与から天引する仕組みにできないかなとなりまして。

いろいろと検討しているんですが、とりあえずこのICカードはなんだろうということで、SONY の PaSoRi というカードリーダーを買いまして、Raspberry Pi 上の Linux で nfcpy という Python のライブラリで読み出してみました。

まずはテストで Suica とか nanaco とかを読ませてみると、この nfcpy すごくいいですね、カードをリーダーにかざしてるときからリーダーから離したときまで検知できる。なので、チャタリングみたいな、カードの読み取りミスがでにくい作りでした。

さて、それではタイムカード用のカードをかざすと…んんん?

なんかかざしている間中ずーとIDを繰り返し読み続けている…。つまりカードをかざしつづけている、ということを検出できていようなんですな。

いろいろ調べるとこのカードは使い捨てタイプといわれるカードらしい。

そもそもこのカードのID (製造番号) は一意である保証がない (使い捨てタイプといわれる所以) のだそうで、はたしてこのカードのIDで社員個人を識別できるのか? (タイムカードはメーカー独自の値を読み出しているらしい…) また、これで認証をして大丈夫なのか?といった問題があることを認識したのでした。

これについてはまだまだ状況進行中で、いくつかアイディアはあるのですけれども今回の主題からははずれるのでまたの機会に。

今回は、nfcpy を改造してこのカードも Suica や nanaco みたいにちゃんとカードをかざし続けていることを認識できるようにしてみました。

GitHub で公開しています→ アズシエル改造版nfcpy

MIFARE UltraLight なカードでおなじようにうまくいかないなーと思っている方は試してみてください。これが正しいのかどうかはわかってないので元の開発者の方にプルリクは出していませんが、手元では問題なく使えています。

もしよければ。