2015年6月9日火曜日

ACR でカードエミュレーション

そういえばACR122Uでカードエミュレーションってやってなかったよなーというわけでトライしてみました。

ACRリーダ自体にはそんなことができるAPIは用意されていませんので、中のPN532チップに直接語りかけることになります。
http://stackoverflow.com/questions/21051315/nfc-acr122-tginitastarget-initiator-releasing-target
こちらに詳しくやり方が書いてあります。

チップ内のレジストリの変更が必要のようですが、手元のACRのを確認すると変更しなくても動きました。

ACR122U Toolでやってみます。

まずは SetParameter で 0x30 を設定します。PN532のマニュアルによれば ISO/IEC 14443-4 PICC を有効にするパラメータのようです。


次に TgInitAsTarget コマンドを使って、Targetモードに移行します。Targetモードは電波を発信せず、Initiatorモードの機器が発する電波を利用して動作します。カードの動きですね。

TgInitAsTarget コマンドは複雑で、以下の形式です。

0xD4 | 0x8C | Mode(1byte) | MifareParams(6byte) | FeliCaParams(18byte) | NFCID3t(10 byte) | Len Gt | Gt[0..n] | Len Tk | Tk[0..n]

MifareParamsの中で、SENS_RES、NFCID1t、SEL_RES を指定します。

これを投げます。


投げてしばらくするとタイムアウトのせいかエラーで返ります。
ので投げてすぐ Galaxy Nexus をかざします。


するとこんな風に返答がきます。うまくいってるようです。が、Galaxy Nexusの方は読取に失敗したみたいな音がします。恐らくACKを返してないせいだと思いますがToolでそこまですばやく操作できないのでプログラムでACK(0x90 0x00)を返してみます。


するとほら!TagInfoでちゃんとタグとして認識してくれます。UIDが4byteの古いTypeAですね。