hantas's blog

ブログ移転しました→ http://blog.taniho.net/

部室メーリスを学生証と連動させる(1)

Miceは学内に部室を持っており自由に使うことが出来ますが,その開け閉めをメーリングリストに流すことが義務づけられています。
しかしいちいち携帯を取りだしメールを作りしょぼい構内LANに悩まされながらメールを送るのは面倒です。

そこで,全員がIC機能付きの学生証を持っているので,これを使おうと思い立ちました。
すなわち,部室の入り口にカードリーダーを設置しておき,こいつにタッチするだけで部室の開放状況をメールする,あわよくば契約しているサーバー上にデータを放り投げようというわけです。
幸いにも学生証はFeliCa規格を利用しているようです。
SONYから発売されているNFCリーダライタ「RC-S620/S」を利用し,RaspberryPi B+から制御しようと考えました。
Sony Japan | FeliCa | 法人のお客様 | 製品情報 | RC-S620/S・S620/U

ここ数日はRC-S620/Sの使い方,ICカードとの通信の仕方を調べたので軽くまとめておきます。

今回参照したドキュメントは次のURLから参照できます。
Sony Japan | FeliCa | 法人のお客様 | 技術情報
「RC-S620/S製品仕様書<簡易版>」
「RC-S620/Sコマンドリファレンスマニュアル<簡易版>」
FeliCa技術方式の各種コードについて」
FeliCaカード ユーザーズマニュアル 抜粋版」

FeliCaには認証不要でアクセスできる領域と,認証が必要となる領域があります。
これらのドキュメントは,認証不要で利用できる機能しか書かれていません。
例えばsuicaの残高だったり,履歴だったりは参照できますが,それ以上踏み込んだことは出来ないというわけですね。

まずは学生証の中身を解析した,その手段からまとめておきます。

今回出てくる通信は2種類,
PC ←→ RC-S620/S ……①
RC-S620/S ←→ 学生証 ……②
それぞれの通信ごとにプロトコルが決まっており,インターネットを飛び交っているパケットのように,上位層のパケットを下位層のパケットに埋め込むようにしてデータを用意します。
ここれは,①のパケットの中に②のパケットが埋め込まれる形になります。

①で送信したコマンドは次の順番,
GetFirmwareVersion(通信できているか確認)
RFConfiguration(リーダの設定)
InListPassiveTarget(カードの補足とIDmの確認)
CommunicateThruEX(カードとの通信)

CommunicateThruEXを何回か送信し,②の通信を行います。
サービスコードはSearch Service Codeで調べられます。
肝心のデータですが,まずは学生証が対応しているサービスコードという物を調べる必要があります。
Request Serviceコマンドを,0x0000~0xFFFFまで順番に送信して,0xFFFF以外が返ってきた時のアドレスを吐き出すプログラムを書きました。
その中で今回認証なしでアクセスできるのは,下6bitがユーザーズマニュアル30ページに認証不要と書かれているものに該当するアドレスのみです。
ここで得たサービスコードに,Read Without Encryptionコマンドを,0~エラーが返ってくる手前のブロックコードまで順にアクセスし,データを読み込みました。
(実際にこのアドレスにアクセスする際はリトルエンディアンで送信します)

……とここまでプロトコルを読み込むのに結構かかりました。
残念なことに,学生証で認証不要でアクセスできる領域にはめぼしいデータがありません(?)でした。
(ハテナマークが付いてるのはまだ検証中だから,ですが)
学生証から学籍番号を読み取るのは一旦置いておき,IDm(カードの個別番号)を読み取って,あらかじめ用意しておいたIDm←→名前対応表から部室メーリスを送るシステムを作りましょう。

今日はここまで。
頑張ってこのシステムは実現させます。