2014年4月17日木曜日

ACRリーダでNTAG固有のコマンドを使う

このブログでは毎度おなじみの ACR122U リーダですが、UID取得やデータの書込み・読み込みはAPDUコマンドを使って簡単に行うことができます。
APDUコマンドってなんねー、っていう話はちょっと強敵すぎるので置いておいて、
例えば 0xFF 0xCA 0x00 0x00 0x00 っていうコマンドを投げると置いてあるタグのIDが返ってきます。

ANAのEdyカード

ACR122UToolで実行

で、ここまではいいんですが NTAG 固有の技を使いたいときはどうすればいいんでしょうか。というわけで Direct Transmit というコマンドが用意されています。これはリーダがコマンドをいろいろ解釈せんと、直接コマンドを送りつけるものです。

あー、これ使えばいいんやんとこれまでのほほんと暮らしてきたわけですが、実際使ってみて えー!そうやったん?というような内容があったのでここに書きます。

やりたいことは以前のブログにもありましたが NTAG21x のパスワード機能です。前回のブログでは Android でやってすんなりできたのでまぁ、ACRでも同じやろーと思っていたら全然違ったという話です。プログラムからやると面倒なので ACR122UTool を使って実行します。

認証コマンドは 0x1B です。これに続けて4バイトのパスワードを付けます。パスワードのデフォルトは 0xFF 0xFF 0xFF 0xFF なのでこれでやってみます。


まぁ、ダメですね。0x63 0x00 というのは ACRリーダ的にコマンドに失敗したという意味です。
で、Direct Transmit の出番です。構文は 0xFF 0x00 0x00 0x00 [以降の電文長] [コマンド] となっていますので、これに従って投げます。


やっぱりダメです。
よくよく見ると、Direct Transmit はリーダの中にあるチップ(PN532)に対してダイレクトに投げるコマンドのようです。つまり PN532 のコマンドを利用してその先の NTAG と通信しなければなりません。
というわけで PN532 の InCommunicateThru というコマンドを使います。0xD4 0x42 [投げるコマンド] の構文です。


あ、応答がありました。先頭の 0xD5 0x43 0x00 はコマンド種別とステータスです。後ろの 0x90 0x00 は正常終了のステータス。ということで間の 0x00 0x00 がコマンドの応答内容になります。先のブログの通り、ここは PACK 値というのが返ります。デフォルトは 0x00 0x00 なのでこれが返ってきてるようです。

よっしゃー!行けたか―!ということで読み書きパスワード設定済みのタグを使って読取をしてみます。パスワードが 0x01 0x02 0x03 0x04 に設定してあるのでこれを投げます。


PACK値に設定している 0x12 0x34 が返ってきてます。よしよし。
では読取コマンド 0x30 を使って 4ページ目を読みましょう。


あれ?

ということで結構悩んだんですが、ACRリーダの AutoPolling というのが影響しているそうです。
認証を行う場合、認証後にリードやライトをするわけですが、この間は当然接続が持続されていなければなりません。
しかし AutoPolling だと自動的に Polling をやっちゃって接続が切れてしまうのではないかというのは私の勝手な推測でありこれにより何らかの事故がありましても何の責任も負いませんということでご了承いただきたくよろしくお願い申し上げます。

というわけで AutoPolling をオフにします。


次に現在リーダに乗っているタグをアクティブにします。


で、先ほどと同じように認証コマンドを投げた後で読み取りコマンドを投げると


読めました!あー、結構大変やったなー。

0 件のコメント:

コメントを投稿