AndroidアプリでNFCタグを読み書きするための基礎知識:Androidで動く携帯Javaアプリ作成入門(38)(2/3 ページ)
Android のAPIを使ってSuica/Edy/運転免許証などのIDmを読む方法、NFCタグに情報を読み書きする方法について解説します
AndroidアプリからNFCタグのIDm(カード固有の番号)の読み込むには
NFCタグは、アプリから扱うのは珍しい感じがするかもしれませんが、実はすでに社会にかなり浸透しています。
筆者の手元にあるNFCタグは以下のとおりです。
名称 | 規格 | |
---|---|---|
運転免許証 | IsoDep | |
NfcB | ||
Suica | NfcF | |
ICOCA | NfcF | |
楽天Edy | NfcF | |
社員証 | MifareClassic | |
NfcA | ||
NdefFormatable | ||
入館証 | NfcF |
今回のサンプルアプリは、ACTION_TAG_DISCOVEREDのor条件ですべての規格を網羅しているので、すべて読み込めます(NfcBarcodeはAndroid 4.2、API Level 17以降なので、今回は省略)。PASMOやTASPOも読み込めるはずです。
社員証や入館証が勤怠管理や入退室管理に使われるケースは多いかと思います。さすがに開錠や施錠はできませんが、勤怠管理ならばスマホと社員証で簡単に実現可能で、具体的にはNFCタグのIDmを読み出して個人を特定すればよいだけです。
IDmの読み込み方法は2通りあります。Android 2.3〜2.3.2(API Level 9)の場合はIntentから、Android 2.3.3以降(API Level 10以降)の場合はTagからそれぞれ確実に取得可能です。
Intent intent = getIntent(); // IDmを取得、確実に取り出せる byte[] idm = intent.getByteArrayExtra(NfcAdapter.EXTRA_ID); // Tag から情報を取得(API Level 10なら確実に取り出せる) Tag tag = (Tag) intent.getParcelableExtra(NfcAdapter.EXTRA_TAG); if (tag != null) { // IDmを取得、確実に取り出せる byte[] idm2 = tag.getId(); }
コラム FeliCaの履歴取得
Google PlayではFeliCaの履歴を表示できるアプリが公開されています。仕組みとしては以下のように、FeliCaで定義されたコマンドを渡し、そのレスポンスをbyte[]で受け取るようです。
NfcF nfc = NfcF.get(tag); nfc.connect(); byte[] res = nfc.transceive(new byte[] { ... }); nfc.close(); NfcF#transceive(byte[])
ただし、どのようなフォーマットでコマンドを渡し、どのようなフォーマットのレスポンスが返されるかは非公開なので、今回の記事では扱いません。
有志の方々が解析を進められていて、その成果がいくつかの個所でオープンになっているので、興味のある方はそれらサイトを当たってください。
公開されているそれらのノウハウは外部のFeliCaを読み書きするためのものであり、FeliCa Networksが先日公開した「おサイフケータイ対応Android携帯電話アドホック機能対応アプリ開発用SDK」とは異なります(こちらはスマホ内のFeliCaチップを制御するためのAPIです)。
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
安くなった書き込み可能なNFCタグ
書き込み可能なタグはネット通販などで20枚1200円程度で購入可能です。
筆者の手元には5種類ありますが、IDmのバイト数(7bytesのものがある)、ユーザーエリア、通信距離、規格などが異なるものの、APIを通じて同等に扱うことが可能です。
ユーザーエリアは手元にあるもので最小は48bytes、最大は144bytes、通信距離は5〜25mmから5〜55mm、規格はMifare UL、NTAG203などです。おおむね10万回ほど書き換えが可能で、内容をフラッシュして読み出し専用にすることもできます(Ndef#makeReadOnly()を参照)。
特に気を付けなければならないのはユーザーエリアで、書き込む前に最大サイズを読み出せるものの、小さいものは数十bytes、大きくても百数十bytesしかないため、大量データを保持させることはできません。実運用では短縮URLやハッシュ値などを活用したいところです。
Copyright © ITmedia, Inc. All Rights Reserved.