SlideShare a Scribd company logo
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

一人でもNFC開発
一人でもNFC開発一人でもNFC開発
一人でもNFC開発
Hirokuma Ueno
 
ConfD で Linux にNetconfを喋らせてみた
ConfD で Linux にNetconfを喋らせてみたConfD で Linux にNetconfを喋らせてみた
ConfD で Linux にNetconfを喋らせてみた
Akira Iwamoto
 
AndroidでFeliCaの履歴を読もう
AndroidでFeliCaの履歴を読もうAndroidでFeliCaの履歴を読もう
AndroidでFeliCaの履歴を読もう
treby
 
WebRTCで動かす“テレイグジスタンス”ロボット
WebRTCで動かす“テレイグジスタンス”ロボットWebRTCで動かす“テレイグジスタンス”ロボット
WebRTCで動かす“テレイグジスタンス”ロボット
NTT Communications Technology Development
 
動的なILの生成と編集
動的なILの生成と編集動的なILの生成と編集
動的なILの生成と編集
terurou
 
MapboxVectorTileで陸・海・空を制覇せよ
MapboxVectorTileで陸・海・空を制覇せよMapboxVectorTileで陸・海・空を制覇せよ
MapboxVectorTileで陸・海・空を制覇せよ
AyumiShibamoto
 
Androidの新ビルドシステム
Androidの新ビルドシステムAndroidの新ビルドシステム
Androidの新ビルドシステム
l_b__
 
traitを使って楽したい話
traitを使って楽したい話traitを使って楽したい話
traitを使って楽したい話
infinite_loop
 
プログラマが欲しい仕様書とは
プログラマが欲しい仕様書とはプログラマが欲しい仕様書とは
プログラマが欲しい仕様書とはKatsutoshi Makino
 
Unityでスマホアプリが作れるか?
Unityでスマホアプリが作れるか?Unityでスマホアプリが作れるか?
Unityでスマホアプリが作れるか?
MakotoItoh
 
PHPからgoへの移行で分かったこと
PHPからgoへの移行で分かったことPHPからgoへの移行で分かったこと
PHPからgoへの移行で分かったこと
gree_tech
 
MCC CTF講習会 pwn編
MCC CTF講習会 pwn編MCC CTF講習会 pwn編
MCC CTF講習会 pwn編
hama7230
 
Device Farm を使ったスマホアプリの自動テスト
Device Farm を使ったスマホアプリの自動テストDevice Farm を使ったスマホアプリの自動テスト
Device Farm を使ったスマホアプリの自動テスト
健一 辰濱
 
Windows 10 mobileでnfc~suica・edy対応編~(公開用)
Windows 10 mobileでnfc~suica・edy対応編~(公開用)Windows 10 mobileでnfc~suica・edy対応編~(公開用)
Windows 10 mobileでnfc~suica・edy対応編~(公開用)
Nobuaki Aoki
 
SDL2の紹介
SDL2の紹介SDL2の紹介
SDL2の紹介
nyaocat
 
Binderのはじめの一歩とAndroid
Binderのはじめの一歩とAndroidBinderのはじめの一歩とAndroid
Binderのはじめの一歩とAndroidl_b__
 
180116LT”全国の大学バス列から 見たSFCの異常性”
180116LT”全国の大学バス列から見たSFCの異常性”180116LT”全国の大学バス列から見たSFCの異常性”
180116LT”全国の大学バス列から 見たSFCの異常性”
tan tan
 
Dll Injection
Dll InjectionDll Injection
Dll Injection
Hiroaki Hata
 
SDCCオープンネットワークのご紹介【2021/01版】
SDCCオープンネットワークのご紹介【2021/01版】SDCCオープンネットワークのご紹介【2021/01版】
SDCCオープンネットワークのご紹介【2021/01版】
ProjectDC-01
 

What's hot (20)

一人でもNFC開発
一人でもNFC開発一人でもNFC開発
一人でもNFC開発
 
ConfD で Linux にNetconfを喋らせてみた
ConfD で Linux にNetconfを喋らせてみたConfD で Linux にNetconfを喋らせてみた
ConfD で Linux にNetconfを喋らせてみた
 
AndroidでFeliCaの履歴を読もう
AndroidでFeliCaの履歴を読もうAndroidでFeliCaの履歴を読もう
AndroidでFeliCaの履歴を読もう
 
WebRTCで動かす“テレイグジスタンス”ロボット
WebRTCで動かす“テレイグジスタンス”ロボットWebRTCで動かす“テレイグジスタンス”ロボット
WebRTCで動かす“テレイグジスタンス”ロボット
 
動的なILの生成と編集
動的なILの生成と編集動的なILの生成と編集
動的なILの生成と編集
 
MapboxVectorTileで陸・海・空を制覇せよ
MapboxVectorTileで陸・海・空を制覇せよMapboxVectorTileで陸・海・空を制覇せよ
MapboxVectorTileで陸・海・空を制覇せよ
 
Androidの新ビルドシステム
Androidの新ビルドシステムAndroidの新ビルドシステム
Androidの新ビルドシステム
 
traitを使って楽したい話
traitを使って楽したい話traitを使って楽したい話
traitを使って楽したい話
 
プログラマが欲しい仕様書とは
プログラマが欲しい仕様書とはプログラマが欲しい仕様書とは
プログラマが欲しい仕様書とは
 
Unityでスマホアプリが作れるか?
Unityでスマホアプリが作れるか?Unityでスマホアプリが作れるか?
Unityでスマホアプリが作れるか?
 
PHPからgoへの移行で分かったこと
PHPからgoへの移行で分かったことPHPからgoへの移行で分かったこと
PHPからgoへの移行で分かったこと
 
MCC CTF講習会 pwn編
MCC CTF講習会 pwn編MCC CTF講習会 pwn編
MCC CTF講習会 pwn編
 
Device Farm を使ったスマホアプリの自動テスト
Device Farm を使ったスマホアプリの自動テストDevice Farm を使ったスマホアプリの自動テスト
Device Farm を使ったスマホアプリの自動テスト
 
Windows 10 mobileでnfc~suica・edy対応編~(公開用)
Windows 10 mobileでnfc~suica・edy対応編~(公開用)Windows 10 mobileでnfc~suica・edy対応編~(公開用)
Windows 10 mobileでnfc~suica・edy対応編~(公開用)
 
SDL2の紹介
SDL2の紹介SDL2の紹介
SDL2の紹介
 
Binderのはじめの一歩とAndroid
Binderのはじめの一歩とAndroidBinderのはじめの一歩とAndroid
Binderのはじめの一歩とAndroid
 
180116LT”全国の大学バス列から 見たSFCの異常性”
180116LT”全国の大学バス列から見たSFCの異常性”180116LT”全国の大学バス列から見たSFCの異常性”
180116LT”全国の大学バス列から 見たSFCの異常性”
 
Unityと.NET
Unityと.NETUnityと.NET
Unityと.NET
 
Dll Injection
Dll InjectionDll Injection
Dll Injection
 
SDCCオープンネットワークのご紹介【2021/01版】
SDCCオープンネットワークのご紹介【2021/01版】SDCCオープンネットワークのご紹介【2021/01版】
SDCCオープンネットワークのご紹介【2021/01版】
 

Similar to Type 4 andefを自力で読む

debugging server with strace
debugging server with stracedebugging server with strace
debugging server with strace
Yoshinari Takaoka
 
スタート低レイヤー #0
スタート低レイヤー #0スタート低レイヤー #0
スタート低レイヤー #0Kiwamu Okabe
 
OSSから学ぶSwift実践テクニック
OSSから学ぶSwift実践テクニックOSSから学ぶSwift実践テクニック
OSSから学ぶSwift実践テクニック
庸介 高橋
 
DE0でラジコンカー作ってみた 関西de0 fpga勉強会20120519
DE0でラジコンカー作ってみた 関西de0 fpga勉強会20120519DE0でラジコンカー作ってみた 関西de0 fpga勉強会20120519
DE0でラジコンカー作ってみた 関西de0 fpga勉強会20120519Yasuhiro Ishii
 
Apache Camel Netty component
Apache Camel Netty componentApache Camel Netty component
Apache Camel Netty componentssogabe
 
デバドラを書いてみよう!
デバドラを書いてみよう!デバドラを書いてみよう!
デバドラを書いてみよう!
Masami Ichikawa
 
Django boodoo
Django boodooDjango boodoo
Django boodoo
泰 増田
 
Sourcecode Reading Workshop2010
Sourcecode Reading Workshop2010Sourcecode Reading Workshop2010
Sourcecode Reading Workshop2010
Hiro Yoshioka
 
Androidの入力システム
Androidの入力システムAndroidの入力システム
Androidの入力システムmagoroku Yamamoto
 
Twitter sphere of #twitter4j #twtr_hack
Twitter sphere of #twitter4j #twtr_hackTwitter sphere of #twitter4j #twtr_hack
Twitter sphere of #twitter4j #twtr_hack
kimukou_26 Kimukou
 
Boost.SIMD
Boost.SIMDBoost.SIMD
Boost.SIMD
Akira Takahashi
 
ハードウェアによる仮想化支援機能を利用したハイパバイザーIPS
ハードウェアによる仮想化支援機能を利用したハイパバイザーIPSハードウェアによる仮想化支援機能を利用したハイパバイザーIPS
ハードウェアによる仮想化支援機能を利用したハイパバイザーIPSFFRI, Inc.
 
DartVM on Android
DartVM on AndroidDartVM on Android
DartVM on Android
nothingcosmos
 
Rとcdisc@moss10 公開用
Rとcdisc@moss10 公開用Rとcdisc@moss10 公開用
Rとcdisc@moss10 公開用
Masafumi Okada
 
Wiresharkの解析プラグインを作る ssmjp 201409
Wiresharkの解析プラグインを作る ssmjp 201409Wiresharkの解析プラグインを作る ssmjp 201409
Wiresharkの解析プラグインを作る ssmjp 201409
稔 小林
 
卒研発表
卒研発表卒研発表
卒研発表
yayugu
 
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
Noritada Shimizu
 
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
Tadahiro Higuchi
 

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

MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。
MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。
MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。
iPride Co., Ltd.
 
FIDO Alliance Osaka Seminar: Welcome Slides.pdf
FIDO Alliance Osaka Seminar: Welcome Slides.pdfFIDO Alliance Osaka Seminar: Welcome Slides.pdf
FIDO Alliance Osaka Seminar: Welcome Slides.pdf
FIDO Alliance
 
【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching
【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching
【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching
harmonylab
 
FIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdf
FIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdfFIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdf
FIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdf
FIDO Alliance
 
単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...
単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...
単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...
Fukuoka Institute of Technology
 
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアルLoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
CRI Japan, Inc.
 
FIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdf
FIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdfFIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdf
FIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdf
FIDO Alliance
 
論文紹介: Exploiting semantic segmentation to boost reinforcement learning in vid...
論文紹介: Exploiting semantic segmentation to boost reinforcement learning in vid...論文紹介: Exploiting semantic segmentation to boost reinforcement learning in vid...
論文紹介: Exploiting semantic segmentation to boost reinforcement learning in vid...
atsushi061452
 
2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx
2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx
2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx
yassun7010
 
論文紹介: Offline Q-Learning on diverse Multi-Task data both scales and generalizes
論文紹介: Offline Q-Learning on diverse Multi-Task data both scales and generalizes論文紹介: Offline Q-Learning on diverse Multi-Task data both scales and generalizes
論文紹介: Offline Q-Learning on diverse Multi-Task data both scales and generalizes
atsushi061452
 
【AI論文解説】Consistency ModelとRectified Flow
【AI論文解説】Consistency ModelとRectified Flow【AI論文解説】Consistency ModelとRectified Flow
【AI論文解説】Consistency ModelとRectified Flow
Sony - Neural Network Libraries
 
YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)
YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)
YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)
NTT DATA Technology & Innovation
 
FIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdf
FIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdfFIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdf
FIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdf
FIDO Alliance
 
TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024
TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024
TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024
Matsushita Laboratory
 
FIDO Alliance Osaka Seminar: CloudGate.pdf
FIDO Alliance Osaka Seminar: CloudGate.pdfFIDO Alliance Osaka Seminar: CloudGate.pdf
FIDO Alliance Osaka Seminar: CloudGate.pdf
FIDO Alliance
 

Recently uploaded (15)

MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。
MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。
MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。
 
FIDO Alliance Osaka Seminar: Welcome Slides.pdf
FIDO Alliance Osaka Seminar: Welcome Slides.pdfFIDO Alliance Osaka Seminar: Welcome Slides.pdf
FIDO Alliance Osaka Seminar: Welcome Slides.pdf
 
【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching
【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching
【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching
 
FIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdf
FIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdfFIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdf
FIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdf
 
単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...
単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...
単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...
 
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアルLoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
 
FIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdf
FIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdfFIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdf
FIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdf
 
論文紹介: Exploiting semantic segmentation to boost reinforcement learning in vid...
論文紹介: Exploiting semantic segmentation to boost reinforcement learning in vid...論文紹介: Exploiting semantic segmentation to boost reinforcement learning in vid...
論文紹介: Exploiting semantic segmentation to boost reinforcement learning in vid...
 
2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx
2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx
2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx
 
論文紹介: Offline Q-Learning on diverse Multi-Task data both scales and generalizes
論文紹介: Offline Q-Learning on diverse Multi-Task data both scales and generalizes論文紹介: Offline Q-Learning on diverse Multi-Task data both scales and generalizes
論文紹介: Offline Q-Learning on diverse Multi-Task data both scales and generalizes
 
【AI論文解説】Consistency ModelとRectified Flow
【AI論文解説】Consistency ModelとRectified Flow【AI論文解説】Consistency ModelとRectified Flow
【AI論文解説】Consistency ModelとRectified Flow
 
YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)
YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)
YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)
 
FIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdf
FIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdfFIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdf
FIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdf
 
TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024
TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024
TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024
 
FIDO Alliance Osaka Seminar: CloudGate.pdf
FIDO Alliance Osaka Seminar: CloudGate.pdfFIDO Alliance Osaka Seminar: CloudGate.pdf
FIDO Alliance Osaka Seminar: CloudGate.pdf
 

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