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 をオフにします。


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


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


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

2014年4月10日木曜日

9Solutions で遊ぶ

クレスコIDの大坂さんが遊びに来てくれました~。
簡単にロケーション管理が可能な 9Solutions のデモをマルチメディア館でやります。


セッティング中。9Solutions はBLEを使ってタグがどこにあるのかを検知します。

関係ないですがお昼休みにお弁当食べに行った海ではすでに泳いでる人たちが!


で、こちらが親分の機械。親分はネットに繋ぎます。


こちらが受信機とタグ。


受信機は電源だけあればよく、あとは受信機同士で通信して親分に報告し、親分がクラウドへ送信するとまぁ、そういう感じです。タグにはボタンが付いてたりして、ボタンが押されたら通知することなどもできます。

管理画面がこちら。タグがどの部屋に居るのかがリアルタイムにわかります。


3つの部屋に受信機を設置しました。親分は左上の部屋に置いてあります。受信機同士が話し合って、一番タグに近い受信機のある部屋にそのタグがあるということで親分に報告し、クラウド上のデータが更新されます。
うーん、本当に簡単にできちゃいましたねー。

私「なんで 9Solutions って名前なんですか?」
大坂さん「さぁ~?」