SlideShare a Scribd company logo
1 of 11
Type 4A NDEF を自力で読む
@hiero_adgjmptw
やりたいこと
• HCE を使ってなんちゃって Type4A NDEF タグを
作ってみた
– http://www.slideshare.net/hieroadgjmptw/hcetype4

• それを読もうと Android 端末を近づけると
「タップしてビーム」とか言われてぐんにょり
• Android – Android で確実にカード読み取りを
したかったら、enableReaderMode() を使って読
む必要がありそう
• せっかくなので、俺はこの赤い扉…じゃなくて
enableReaderMode() を使ったアプリを作るぜ

2
enableReaderMode
• public
void enableReaderMode (Activity activity, NfcAdapter.ReaderC
allback callback, int flags, Bundle extras)

• Android 4.4 で追加された API (Level 19)
• 端末の NFC カード機能、P2P 機能を停止し、純
粋なリーダー/ライターとして動作させるため
の API
– disableReaderMode() が呼ばれるか、アプリがサス
ペンドするまで有効

• flags の指定次第で、Type A のみ、NDEF の自
動解析をしない、といった動作指定ができる
• P2P 機能を停止できるので、「タップしてビー
ム」とかいわれてぐんにょりしない
3
Type 4A NDEF リーダーを作る
• 簡単3ステップ
① enableReaderMode を使い、端末の NFC 動作を
「Type A 通信のみ、NDEF 自動解析はしない」に設
定
② 対向タグが見つかったら、NfcA でタグに接続
③ あとは自力で NDEF タグアプリの選択から NDEF
データの読み込みまで行う

• 次のスライドから上記のざっくりした解説

4
①端末の NFC 動作設定
• アプリレジューム時に enableReaderMode を呼
び出すだけ
– FLAG_READER_NFC_A … TypeA 通信する
– FLAG_READER_SKIP_NDEF_CHECK … システムで自動的に行う NDEF 解析
を停める

@Override
public void onResume(){
super.onResume();
mNfcAdapter = NfcAdapter.getDefaultAdapter(this);
mNfcAdapter.enableReaderMode(this, this, NfcAdapter.FLAG_READER_NFC_A |
NfcAdapter.FLAG_READER_SKIP_NDEF_CHECK, null);
}
@Override
public void onPause(){
super.onPause();
mNfcAdapter.disableReaderMode(this);
}

5
②NfcA でタグに接続する
• 対向機にかざされたら NfcA で接続
@Override
public void onTagDiscovered(Tag tag) {
NfcA nfcA = null;
try {
nfcA = NfcA.get(tag);
nfcA.connect();
… (NDEF の読み込み(後述)) …
} catch (IOException e) {
Log.e(APPNAME, e.toString());
e.printStackTrace();
} catch (TagLostException e) {
Log.e(APPNAME, e.toString());
e.printStackTrace();
}

6
③NDEFタグ選択~NDEF読み込み
• 下記流れになる
自機

対向機

NDEF Tag Application(D2760000850101) の選択
成功(9000)
CC File (E103h) の選択
成功(9000)
CC File (15bytes) の読み込み
CC File 情報 + 成功(9000)
NDEF File (File の ID は CC File から読み込み) の選択
成功(9000)
NDEF サイズ確認(先頭 2bytes 読み込み)
サイズ情報(2bytes) +成功(9000)
NDEF 読み込み(2バイト目からサイズ情報 bytes 読み込み)
NDEF 情報+成功(9000)
7
③NDEFタグ選択~NDEF読み込み
final String NDEF_APP = "D2760000850101";
final String CCFILE_EF = "E103";
final String SELECT_BY_DF = "A40400";
final String SELECT_BY_EF = "A4000C";
final String READ_BINARY = "B0";
final byte[] SUCCESS = {(byte)0x90, (byte)0x00};
…
toast("start reading type4 ndef card", Toast.LENGTH_SHORT);
byte[] response = nfcA.transceive(strToHex("00"+SELECT_BY_DF+String.format("%02x", NDEF_APP.length()/2)+NDEF_APP+"00"));
if(!Arrays.equals(response, SUCCESS)) return;

toast( "select Cc File", Toast.LENGTH_SHORT);
response = nfcA.transceive(strToHex("00"+SELECT_BY_EF+String.format("%02x", CCFILE_EF.length()/2)+CCFILE_EF));
if(!Arrays.equals(response, SUCCESS)) return;
toast("read Cc File", Toast.LENGTH_SHORT);
response = nfcA.transceive(strToHex("00"+READ_BINARY+"00000F"));
if(response.length != 17) return;
CcFile ccFile = new CcFile();
ccFile.set(Arrays.copyOfRange(response, 0, 15));
toast("select NDEF File", Toast.LENGTH_SHORT);
ByteBuffer cmd = ByteBuffer.allocate(7);
cmd.put(strToHex("00"+SELECT_BY_EF+"02"));
cmd.put(ccFile.ndefFileControl.fileId);
response = nfcA.transceive(cmd.array());
if(!Arrays.equals(response, SUCCESS)) return;c
8
③NDEFタグ選択~NDEF読み込み
toast("read NDEF File", Toast.LENGTH_SHORT);
response = nfcA.transceive(strToHex("00"+READ_BINARY+"000002"));
int ndefLength = response[0]*256+response[1]; // 適当…符号大丈夫かな?
if(ndefLength >= 256) return; // とりあえず大きい NDEF ファイルは弾くことにする
ByteBuffer cmd2 = ByteBuffer.allocate(5);
cmd2.put(strToHex("00"+READ_BINARY+"0002"));
cmd2.put((byte)ndefLength);
response = nfcA.transceive(cmd2.array());
if(response.length!=ndefLength+2){
Log.e(APPNAME, "response is too short, expeted:"+ndefLength+"+2, but returned"+response.length);
return;
}
byte[] rawNdef = Arrays.copyOfRange(response, 0, ndefLength);
try {
NdefMessage ndefMessage = new NdefMessage(rawNdef);
} catch (FormatException e) {
Log.e(APPNAME, e.toString());
e.printStackTrace();
}
toast("read completed!", Toast.LENGTH_LONG);
// あとは NdefMessage を使って好きなように・・・
…

9
③NDEFタグ選択~NDEF読み込み
…
private byte[] strToHex(String str){
int length = str.length();
if(length%2!=0)return null;
length = length /2;
byte[] ret = new byte[length];
for(int i=0; i < length; i++){
ret[i] = (byte)Integer.parseInt(str.substring(i*2, (i+1)*2),16);
}
return ret;
}
private void toast(final String str, final int opt){
runOnUiThread(new Runnable(){
@Override
public void run(){
Toast.makeText(getApplicationContext(), str, opt).show();
}
});
}

10
やってみて
• Android Beam を OFF にしていても、Andoird
と Android を近づけると自動的に LLCP 接続が
走ってしまいカード読み取りできないので、
enableReaderMode() が必要
• なんか妙に TagLostException が発生しちゃう
なあ
– Bundle で EXTRA_READER_PRESENCE_CHECK_DELAY を
設定してあげたらマシになるんやろうか

11

More Related Content

What's hot

低レイヤー入門
低レイヤー入門低レイヤー入門
低レイヤー入門
demuyan
 
Android NFCアプリハンズオン
Android NFCアプリハンズオンAndroid NFCアプリハンズオン
Android NFCアプリハンズオン
Tomoki YAMASHITA
 
[CB16] スマートフォン制御のIoTデバイスにおけるBLE認証設計の課題:Gogoroスマートスクターの分析を通じて by Chen-yu Dai [...
[CB16] スマートフォン制御のIoTデバイスにおけるBLE認証設計の課題:Gogoroスマートスクターの分析を通じて by Chen-yu Dai [...[CB16] スマートフォン制御のIoTデバイスにおけるBLE認証設計の課題:Gogoroスマートスクターの分析を通じて by Chen-yu Dai [...
[CB16] スマートフォン制御のIoTデバイスにおけるBLE認証設計の課題:Gogoroスマートスクターの分析を通じて by Chen-yu Dai [...
CODE BLUE
 
Burp suite を使って iPhone アプリを診断した時に困ったことと、解決方法
Burp suite を使って iPhone アプリを診断した時に困ったことと、解決方法Burp suite を使って iPhone アプリを診断した時に困ったことと、解決方法
Burp suite を使って iPhone アプリを診断した時に困ったことと、解決方法
tobaru_yuta
 
[CB16] House of Einherjar :GLIBC上の新たなヒープ活用テクニック by 松隈大樹
[CB16] House of Einherjar :GLIBC上の新たなヒープ活用テクニック by 松隈大樹[CB16] House of Einherjar :GLIBC上の新たなヒープ活用テクニック by 松隈大樹
[CB16] House of Einherjar :GLIBC上の新たなヒープ活用テクニック by 松隈大樹
CODE BLUE
 

What's hot (20)

MongoDB World 2019: Benchmarking Transactions: MongoDB Meets TPC-C
MongoDB World 2019: Benchmarking Transactions: MongoDB Meets TPC-C MongoDB World 2019: Benchmarking Transactions: MongoDB Meets TPC-C
MongoDB World 2019: Benchmarking Transactions: MongoDB Meets TPC-C
 
月刊NDEF 2013年8月号
月刊NDEF 2013年8月号月刊NDEF 2013年8月号
月刊NDEF 2013年8月号
 
Accelerating Virtual Machine Access with the Storage Performance Development ...
Accelerating Virtual Machine Access with the Storage Performance Development ...Accelerating Virtual Machine Access with the Storage Performance Development ...
Accelerating Virtual Machine Access with the Storage Performance Development ...
 
低レイヤー入門
低レイヤー入門低レイヤー入門
低レイヤー入門
 
[CEDEC2017] LINEゲームのセキュリティ診断手法
[CEDEC2017] LINEゲームのセキュリティ診断手法[CEDEC2017] LINEゲームのセキュリティ診断手法
[CEDEC2017] LINEゲームのセキュリティ診断手法
 
RPC에서 REST까지 간단한 개념소개
RPC에서 REST까지 간단한 개념소개RPC에서 REST까지 간단한 개념소개
RPC에서 REST까지 간단한 개념소개
 
OSC2011 Tokyo/Spring 自宅SAN友の会(前半)
OSC2011 Tokyo/Spring 自宅SAN友の会(前半)OSC2011 Tokyo/Spring 自宅SAN友の会(前半)
OSC2011 Tokyo/Spring 自宅SAN友の会(前半)
 
Windows 10 mobileでnfc~suica・edy対応編~(公開用)
Windows 10 mobileでnfc~suica・edy対応編~(公開用)Windows 10 mobileでnfc~suica・edy対応編~(公開用)
Windows 10 mobileでnfc~suica・edy対応編~(公開用)
 
Goでかんたんソースコードの静的解析
Goでかんたんソースコードの静的解析Goでかんたんソースコードの静的解析
Goでかんたんソースコードの静的解析
 
月刊NDEF 2013年2月号(臨時号)
月刊NDEF 2013年2月号(臨時号)月刊NDEF 2013年2月号(臨時号)
月刊NDEF 2013年2月号(臨時号)
 
Android NFCアプリハンズオン
Android NFCアプリハンズオンAndroid NFCアプリハンズオン
Android NFCアプリハンズオン
 
DPDKを拡張してみた話し
DPDKを拡張してみた話しDPDKを拡張してみた話し
DPDKを拡張してみた話し
 
Dockerで楽しむ自宅サーバ
Dockerで楽しむ自宅サーバDockerで楽しむ自宅サーバ
Dockerで楽しむ自宅サーバ
 
便利なNFC ~利用シーンと技術の動向~
便利なNFC  ~利用シーンと技術の動向~便利なNFC  ~利用シーンと技術の動向~
便利なNFC ~利用シーンと技術の動向~
 
Wireshark だけに頼らない! パケット解析ツールの紹介
Wireshark だけに頼らない! パケット解析ツールの紹介Wireshark だけに頼らない! パケット解析ツールの紹介
Wireshark だけに頼らない! パケット解析ツールの紹介
 
[CB16] スマートフォン制御のIoTデバイスにおけるBLE認証設計の課題:Gogoroスマートスクターの分析を通じて by Chen-yu Dai [...
[CB16] スマートフォン制御のIoTデバイスにおけるBLE認証設計の課題:Gogoroスマートスクターの分析を通じて by Chen-yu Dai [...[CB16] スマートフォン制御のIoTデバイスにおけるBLE認証設計の課題:Gogoroスマートスクターの分析を通じて by Chen-yu Dai [...
[CB16] スマートフォン制御のIoTデバイスにおけるBLE認証設計の課題:Gogoroスマートスクターの分析を通じて by Chen-yu Dai [...
 
Burp suite を使って iPhone アプリを診断した時に困ったことと、解決方法
Burp suite を使って iPhone アプリを診断した時に困ったことと、解決方法Burp suite を使って iPhone アプリを診断した時に困ったことと、解決方法
Burp suite を使って iPhone アプリを診断した時に困ったことと、解決方法
 
[CB16] House of Einherjar :GLIBC上の新たなヒープ活用テクニック by 松隈大樹
[CB16] House of Einherjar :GLIBC上の新たなヒープ活用テクニック by 松隈大樹[CB16] House of Einherjar :GLIBC上の新たなヒープ活用テクニック by 松隈大樹
[CB16] House of Einherjar :GLIBC上の新たなヒープ活用テクニック by 松隈大樹
 
階層的決定性ウォレットを理解しよう
階層的決定性ウォレットを理解しよう階層的決定性ウォレットを理解しよう
階層的決定性ウォレットを理解しよう
 
Provision Intel® Optane™ DC Persistent Memory in Linux*
Provision Intel® Optane™ DC Persistent Memory in Linux*Provision Intel® Optane™ DC Persistent Memory in Linux*
Provision Intel® Optane™ DC Persistent Memory in Linux*
 

Similar to Type 4 andefを自力で読む

スタート低レイヤー #0
スタート低レイヤー #0スタート低レイヤー #0
スタート低レイヤー #0
Kiwamu Okabe
 
DE0でラジコンカー作ってみた 関西de0 fpga勉強会20120519
DE0でラジコンカー作ってみた 関西de0 fpga勉強会20120519DE0でラジコンカー作ってみた 関西de0 fpga勉強会20120519
DE0でラジコンカー作ってみた 関西de0 fpga勉強会20120519
Yasuhiro Ishii
 
Apache Camel Netty component
Apache Camel Netty componentApache Camel Netty component
Apache Camel Netty component
ssogabe
 
Androidの入力システム
Androidの入力システムAndroidの入力システム
Androidの入力システム
magoroku Yamamoto
 
ハードウェアによる仮想化支援機能を利用したハイパバイザーIPS
ハードウェアによる仮想化支援機能を利用したハイパバイザーIPSハードウェアによる仮想化支援機能を利用したハイパバイザーIPS
ハードウェアによる仮想化支援機能を利用したハイパバイザーIPS
FFRI, Inc.
 

Similar to Type 4 andefを自力で読む (20)

debugging server with strace
debugging server with stracedebugging server with strace
debugging server with strace
 
スタート低レイヤー #0
スタート低レイヤー #0スタート低レイヤー #0
スタート低レイヤー #0
 
OSSから学ぶSwift実践テクニック
OSSから学ぶSwift実践テクニックOSSから学ぶSwift実践テクニック
OSSから学ぶSwift実践テクニック
 
Arduino入門
Arduino入門Arduino入門
Arduino入門
 
DE0でラジコンカー作ってみた 関西de0 fpga勉強会20120519
DE0でラジコンカー作ってみた 関西de0 fpga勉強会20120519DE0でラジコンカー作ってみた 関西de0 fpga勉強会20120519
DE0でラジコンカー作ってみた 関西de0 fpga勉強会20120519
 
Apache Camel Netty component
Apache Camel Netty componentApache Camel Netty component
Apache Camel Netty component
 
デバドラを書いてみよう!
デバドラを書いてみよう!デバドラを書いてみよう!
デバドラを書いてみよう!
 
Django boodoo
Django boodooDjango boodoo
Django boodoo
 
Sourcecode Reading Workshop2010
Sourcecode Reading Workshop2010Sourcecode Reading Workshop2010
Sourcecode Reading Workshop2010
 
Androidの入力システム
Androidの入力システムAndroidの入力システム
Androidの入力システム
 
Twitter sphere of #twitter4j #twtr_hack
Twitter sphere of #twitter4j #twtr_hackTwitter sphere of #twitter4j #twtr_hack
Twitter sphere of #twitter4j #twtr_hack
 
Boost.SIMD
Boost.SIMDBoost.SIMD
Boost.SIMD
 
ハードウェアによる仮想化支援機能を利用したハイパバイザーIPS
ハードウェアによる仮想化支援機能を利用したハイパバイザーIPSハードウェアによる仮想化支援機能を利用したハイパバイザーIPS
ハードウェアによる仮想化支援機能を利用したハイパバイザーIPS
 
DartVM on Android
DartVM on AndroidDartVM on Android
DartVM on Android
 
Rとcdisc@moss10 公開用
Rとcdisc@moss10 公開用Rとcdisc@moss10 公開用
Rとcdisc@moss10 公開用
 
Wiresharkの解析プラグインを作る ssmjp 201409
Wiresharkの解析プラグインを作る ssmjp 201409Wiresharkの解析プラグインを作る ssmjp 201409
Wiresharkの解析プラグインを作る ssmjp 201409
 
卒研発表
卒研発表卒研発表
卒研発表
 
asm.js x emscripten: The foundation of the next level Web games
asm.js x emscripten: The foundation of the next level Web gamesasm.js x emscripten: The foundation of the next level Web games
asm.js x emscripten: The foundation of the next level Web games
 
Scala on Hadoop
Scala on HadoopScala on Hadoop
Scala on Hadoop
 
Windows® API Code Pack for Microsoft® .NET Framework
Windows® API Code Pack for Microsoft® .NET FrameworkWindows® API Code Pack for Microsoft® .NET Framework
Windows® API Code Pack for Microsoft® .NET Framework
 

Recently uploaded

Recently uploaded (11)

論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
 
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
 
Utilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native IntegrationsUtilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native Integrations
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 

Type 4 andefを自力で読む

  • 1. Type 4A NDEF を自力で読む @hiero_adgjmptw
  • 2. やりたいこと • HCE を使ってなんちゃって Type4A NDEF タグを 作ってみた – http://www.slideshare.net/hieroadgjmptw/hcetype4 • それを読もうと Android 端末を近づけると 「タップしてビーム」とか言われてぐんにょり • Android – Android で確実にカード読み取りを したかったら、enableReaderMode() を使って読 む必要がありそう • せっかくなので、俺はこの赤い扉…じゃなくて enableReaderMode() を使ったアプリを作るぜ 2
  • 3. enableReaderMode • public void enableReaderMode (Activity activity, NfcAdapter.ReaderC allback callback, int flags, Bundle extras) • Android 4.4 で追加された API (Level 19) • 端末の NFC カード機能、P2P 機能を停止し、純 粋なリーダー/ライターとして動作させるため の API – disableReaderMode() が呼ばれるか、アプリがサス ペンドするまで有効 • flags の指定次第で、Type A のみ、NDEF の自 動解析をしない、といった動作指定ができる • P2P 機能を停止できるので、「タップしてビー ム」とかいわれてぐんにょりしない 3
  • 4. Type 4A NDEF リーダーを作る • 簡単3ステップ ① enableReaderMode を使い、端末の NFC 動作を 「Type A 通信のみ、NDEF 自動解析はしない」に設 定 ② 対向タグが見つかったら、NfcA でタグに接続 ③ あとは自力で NDEF タグアプリの選択から NDEF データの読み込みまで行う • 次のスライドから上記のざっくりした解説 4
  • 5. ①端末の NFC 動作設定 • アプリレジューム時に enableReaderMode を呼 び出すだけ – FLAG_READER_NFC_A … TypeA 通信する – FLAG_READER_SKIP_NDEF_CHECK … システムで自動的に行う NDEF 解析 を停める @Override public void onResume(){ super.onResume(); mNfcAdapter = NfcAdapter.getDefaultAdapter(this); mNfcAdapter.enableReaderMode(this, this, NfcAdapter.FLAG_READER_NFC_A | NfcAdapter.FLAG_READER_SKIP_NDEF_CHECK, null); } @Override public void onPause(){ super.onPause(); mNfcAdapter.disableReaderMode(this); } 5
  • 6. ②NfcA でタグに接続する • 対向機にかざされたら NfcA で接続 @Override public void onTagDiscovered(Tag tag) { NfcA nfcA = null; try { nfcA = NfcA.get(tag); nfcA.connect(); … (NDEF の読み込み(後述)) … } catch (IOException e) { Log.e(APPNAME, e.toString()); e.printStackTrace(); } catch (TagLostException e) { Log.e(APPNAME, e.toString()); e.printStackTrace(); } 6
  • 7. ③NDEFタグ選択~NDEF読み込み • 下記流れになる 自機 対向機 NDEF Tag Application(D2760000850101) の選択 成功(9000) CC File (E103h) の選択 成功(9000) CC File (15bytes) の読み込み CC File 情報 + 成功(9000) NDEF File (File の ID は CC File から読み込み) の選択 成功(9000) NDEF サイズ確認(先頭 2bytes 読み込み) サイズ情報(2bytes) +成功(9000) NDEF 読み込み(2バイト目からサイズ情報 bytes 読み込み) NDEF 情報+成功(9000) 7
  • 8. ③NDEFタグ選択~NDEF読み込み final String NDEF_APP = "D2760000850101"; final String CCFILE_EF = "E103"; final String SELECT_BY_DF = "A40400"; final String SELECT_BY_EF = "A4000C"; final String READ_BINARY = "B0"; final byte[] SUCCESS = {(byte)0x90, (byte)0x00}; … toast("start reading type4 ndef card", Toast.LENGTH_SHORT); byte[] response = nfcA.transceive(strToHex("00"+SELECT_BY_DF+String.format("%02x", NDEF_APP.length()/2)+NDEF_APP+"00")); if(!Arrays.equals(response, SUCCESS)) return; toast( "select Cc File", Toast.LENGTH_SHORT); response = nfcA.transceive(strToHex("00"+SELECT_BY_EF+String.format("%02x", CCFILE_EF.length()/2)+CCFILE_EF)); if(!Arrays.equals(response, SUCCESS)) return; toast("read Cc File", Toast.LENGTH_SHORT); response = nfcA.transceive(strToHex("00"+READ_BINARY+"00000F")); if(response.length != 17) return; CcFile ccFile = new CcFile(); ccFile.set(Arrays.copyOfRange(response, 0, 15)); toast("select NDEF File", Toast.LENGTH_SHORT); ByteBuffer cmd = ByteBuffer.allocate(7); cmd.put(strToHex("00"+SELECT_BY_EF+"02")); cmd.put(ccFile.ndefFileControl.fileId); response = nfcA.transceive(cmd.array()); if(!Arrays.equals(response, SUCCESS)) return;c 8
  • 9. ③NDEFタグ選択~NDEF読み込み toast("read NDEF File", Toast.LENGTH_SHORT); response = nfcA.transceive(strToHex("00"+READ_BINARY+"000002")); int ndefLength = response[0]*256+response[1]; // 適当…符号大丈夫かな? if(ndefLength >= 256) return; // とりあえず大きい NDEF ファイルは弾くことにする ByteBuffer cmd2 = ByteBuffer.allocate(5); cmd2.put(strToHex("00"+READ_BINARY+"0002")); cmd2.put((byte)ndefLength); response = nfcA.transceive(cmd2.array()); if(response.length!=ndefLength+2){ Log.e(APPNAME, "response is too short, expeted:"+ndefLength+"+2, but returned"+response.length); return; } byte[] rawNdef = Arrays.copyOfRange(response, 0, ndefLength); try { NdefMessage ndefMessage = new NdefMessage(rawNdef); } catch (FormatException e) { Log.e(APPNAME, e.toString()); e.printStackTrace(); } toast("read completed!", Toast.LENGTH_LONG); // あとは NdefMessage を使って好きなように・・・ … 9
  • 10. ③NDEFタグ選択~NDEF読み込み … private byte[] strToHex(String str){ int length = str.length(); if(length%2!=0)return null; length = length /2; byte[] ret = new byte[length]; for(int i=0; i < length; i++){ ret[i] = (byte)Integer.parseInt(str.substring(i*2, (i+1)*2),16); } return ret; } private void toast(final String str, final int opt){ runOnUiThread(new Runnable(){ @Override public void run(){ Toast.makeText(getApplicationContext(), str, opt).show(); } }); } 10
  • 11. やってみて • Android Beam を OFF にしていても、Andoird と Android を近づけると自動的に LLCP 接続が 走ってしまいカード読み取りできないので、 enableReaderMode() が必要 • なんか妙に TagLostException が発生しちゃう なあ – Bundle で EXTRA_READER_PRESENCE_CHECK_DELAY を 設定してあげたらマシになるんやろうか 11