NFC通信での読み取り_NfcFのTag

■Suicaのカードから読み取り。
前回スマホにカードをかざすと音がなることを確認できたので、データについて見ていく。デバッグを適当なところで止めて読み込んだデータを確認する。

下の画像はSuicaカードを読み込んだ際の図。tagオブジェクトが、android.nfc.tech.NfcF となっているので、タイプFであることが分かる。クレジットカードでは NfcA、マイナカードでは NfcBだった。


この状態で中身をいろいろと見てみても、Suicaのカードの内容が見つからない。ここで得られたデータからさらに操作が必要なよう。

tagオブジェクトに対して、connect や transceive メソッドを使うともう少し情報が得られるようだけど、メソッドを使ってみると、「android.nfc.TagLostException: Tag was lost.」というエラーが出る。入力した引数が問題のようで、いろいろ調べながら試していくと下記コードでとりあえずエラーは出なかった。

 byte[] dt = new byte[1 + 1 + 8 + 10];
            byte[] len_cmd = {(byte) 0x7f, 0x06};
            byte[] tID = nf.getTag().getId();
            System.arraycopy(len_cmd, 0, dt, 0, len_cmd.length);
            System.arraycopy(tID, 0, dt, len_cmd.length, tID.length);
            byte[] result = new byte[255];
            try {
                nf.connect();
                result = nf.transceive(dt);
            } catch (IOException ioe) {
                ioe.printStackTrace();
            }

transceive の引数のフォーマットは、長さ(1バイト)、コマンドコード(1バイト)、ID(8バイト)、パラメータ(10バイト)とあった。長さはとりあえず長めの127(0x7f)、コマンドコードは Readとなる 06(0x06)(JIS X 6319-4で06がReadとなっている)、IDは読み込んだ tag から取得。パラメータはおそらくオプションでないかと思うので指定無し。

エラーは出なかったけど、戻ってきた値はバイトの形で、どんな情報かよく分からない。下の図で後ろの -1, -95 が得られたものだと思う。また、コマンドコードの部分が 07 となっていた(JIS X 6319-4のレスポンスコードに一致する)。


この辺りをもう少し調べる。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です