加算減衰

思いついたら書きます

RFIDタグ内蔵の学生証を活用するPythonレシピ

大学サークルの同期にアドベントカレンダーを書いてくれと言われたのですが,大学関係用にブログを持っているわけでもなく,わざわざ単発記事を出すためのサービスを利用するのも微妙なので,こちらに投稿することにしました.アドベントカレンダーについて,詳細はこちらをご覧ください.今回の話は,RFIDタグ,もっと言うとFelicaですが,これを内蔵したICカード学生証を,大学の設備だけではなく,我々学生が有効に活用していくためのレシピをPythonで書いていこう,というものです.Pythonを選んだ理由は,Linuxで使える既存のライブラリで私が持っているFelicaリーダRC-S380/Sが使えそうなのが,Python2系で動くnfcpyくらいしかなさそうだったからです.ライブラリの選択肢が狭く,選択が消極的ではありますが,折角利用できるライブラリが存在するので,活用していきましょう.

github.com

この記事に書いた技術内容をやった理由は,以前Felicaリーダを買ったけどそれほど使い道がなく使い道を探していたことと,新入生歓迎会などの場で学生へのメール送信などを学生証読み取りだけで簡単にしようというアイデアがあったからです.

それでは実際にやっていきましょう.スクリプトを実行する前に,事前にpipなりpipenvなりで,nfcpyをインストールしておく必要があります.本記事のスクリプトはroot権限がないと上手く動作しませんが,nfcpyのexamplesにあるtagtool.pyを実行した時に発生するエラーの文章を読んでコマンドを実行すれば,root権限無しで実行できるようになります.これらをやったのが大分前なので詳細は忘れましたが,まぁ検索すれば大体なんとかなると思います*1

 

学生証のRFIDタグの中身をダンプする

まず中身をダンプしてみないことには,学生証のRFIDタグにどういった情報が記録されているのかすらわかりません.まずはじめに,nfcpyでFelicaをダンプするためのスクリプトを書いて実行し,RFIDタグのどこに何が記録されているのかを確認します.

 

Felicaリーダをコンピュータに接続し,上のスクリプトを実行すると,Felicaカードの中身を見ることができます.

実際の出力結果を提示することは省きますが,ダンプの結果からどのサービスコードにどういったデータが格納されているかわかります.

 

学生証のRFIDタグからデータを取得しよう

どこに何のデータが入っているのかを知ることができれば,データを抽出するのは簡単です.アドレスを指定して,データを活用可能な形で取り出しましょう!

 

このスクリプトは,弊学の学生証からID,有効期間を取り出して表示するスクリプトです.ダンプして得られたサービスコード,ブロックコードから tag.read_without_encryption([sc1], [bc1]) を利用してデータを取得し,文字列の必要な範囲を選択して抽出しています.特別難しいことはありません.これで学生証のデータを利用可能な形で取得することができました.

より実用的にしていくために,コールバック関数を書いて,学生証のRFIDタグを読み取ったら,読み取ったデータを引数に関数を呼び出すプログラムを書いていきます.

 

次のように利用できます.

 

これは上のクラスを利用するための簡単なスクリプトです.適宜printid関数の中身を書き換えると,タグからデータを取り出すスクリプトの中身を編集することなく,学生証のデータを扱うことができます.

 

ここまでの話で大体学生証からデータを取得して利用できるようになったので,後は皆様の活用次第,ということになります.弊学以外にも様々な大学で様々な情報を学生証に記録している例を確認しています.自分の学生証もRFIDタグになっています!という方は,是非中身をダンプして見ると面白いでしょう.

 

最後に

今回は大学サークルのアドベントカレンダーということで,サークルで1度やったまま活用する機会がなかった学生証RFIDタグ読み取りについて,簡単なお話をさせていただきました.ここまでお付き合い頂きありがとうございました.

最近作っているものがPythonで書くことが多いのでPythonばかり書いていて,今回アドベントカレンダーでこの内容を書くと決めてソースコードを書き直すことになって,またPythonを書くのか……と思いながら上のスクリプトを書いていました.うーん,動的型付け,辛い……*2
何かソースコード等おかしなところがあれば,コメント欄等でご指摘頂ければと思います.よろしくお願いします.

大学サークルのアドベントカレンダーで周りの人達が面白い文章をちゃんと書いている中,何も面白い話ができなかったので,辛い気持ちになりながらこの文を書いています.ただ,これまでなかなか他の人の文を読んで焦燥感に駆られながら文章を書くという機会もなかったので,とても面白かったです.お誘いいただきありがとうございました.

私はあと2本書くことになっているようなので,12月中はまた記事を2本以上は投げることになります.2回目となりますが,アドベントカレンダーについて詳しくはこちらを参照してください.よろしくお願いします.

*1:テキトーですまん

*2:本当か?(自分は動的型付けを書いていた時期が長いので)