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のレスポンスコードに一致する)。
この辺りをもう少し調べる。