2014年8月3日日曜日

【C#】Windows7 以下で FeliCa を読んでみる

最近仕事で C# を使うことが多くなりまして。

NFC というか FeliCa の情報取りたいなーと使い方を調べていると、大体 FeliCa の SDK 使うことを基本に書かれている内容ばかりなのと、ID 読むだけならゴロゴロ情報はあるのですがそれ以外があまり無くて少し困ったのでメモを。
別にオープンな領域に書かれているモノを呼ぶのに SDK 使わなくたってできるでしょ?カード側からそれを受け取るコマンド送れば終わりでしょ?4時間もあれば終わるでしょ。
なんて迂闊なことを行ってしまって見事にハマってしまいました。

今回のメモは FeliCa の非暗号化部分を読み込むところがメインです。

書かれているパラメータの意味は PC/SC や FeliCa の仕様書を読んでみてください。
FeliCaのオープンな部分を読むだけとはいえ、なんかあれこれ煩いことになるのも面倒なのでソースまでは公開してません。

PC/SC をお話するのは PC/SC-Sharp を使っています。
Async な Task を組んだり、Monitor の実装があったり、P/Invoke 周りやデータの変換諸々が非常に楽になります。
PCSC-Sharp

FeliCaの仕様

PC/SCの仕様

SmartCardの作法


方法
2種類のAPDUをTransmitする。

1種類目
CLA = 0xFF
Ins = 0xA4
P1 = 0x00
P2 = 0x01
Data = 0x090F

2種類目
CLA = 0xFF
Ins = 0xB0
P1 = 0x00
P2 = Index
Le = 0


これで最大で20レコード分が取れます。

データ領域は Cyclic で、どこが先頭なのかは中の Sequence を見るなりして適当に Sort が必要です。

教訓
Transmit が Error じゃなくても、Status Word が 0x9000 になるまで安心しない。
Transmit は Command さえ送信出来ればエラーは帰ってこない。
送れてるけど Response がないとかの場合は Status Word のコードとにらめっこが必要。


0 件のコメント :

コメントを投稿