ようやく、HCEのサンプルを作った。
https://github.com/hirokuma/HceSample
URI(スマートポスターじゃなく)のつもり。
動作は、Windows8.1 + RC-S380 + FeliCaランチャーで確認。
なんでかわからないけど、FeliCaランチャーが起動していないとだめなのだ。
NFPで動くんだったら関係なさそうなのだけど、なんだろうね?
NDEFのシーケンスで、NFC HACKSに載っている範囲でしか見てないから、Type 4A全般のエミュレーションにはなっていない。
最初は、こちらを見ながら作ろうとしていたのだが、途中でNFC Forumの仕様書を見始めたので、たぶん別物になったんじゃないだろうか。
http://www.slideshare.net/hieroadgjmptw/hcetype4
最初のSelectで、NDEF applicationの名前を行うので、そこで一致したら「NDEFアクセス中」みたいなフラグを立てるようにした。
ここらへんが、まだType 4Aのしくみをわかっていないので、そういう捌き方で良いのかはっきりしてない。
まあ、動くからいいか・・・。
うちではこれ以上の動作確認ができないので、ここまでかな。
あと、月刊NDEFも久々に作りました。
カードエミュレーション特集。
http://www.slideshare.net/hiro99ma/ndef-2013-12
記憶をたどりながら書いたので、あまり説明にこだわってなく、こざっぱりした感じになったんじゃないかな。
まあ、大半は昨日酒を飲みながら書いているので、ちょっと心配ではあるが・・・まあ大丈夫だろう。
hiro99maさん、こんにちは^^
返信削除AndroidのHCEの検索でこちらのブログに辿り着きました。
githubにあったソースをEclipseでビルドしNexus7に入れました。
そして、カードリーダに近付けてみたのですが、動作してないようなのです。
processCommandApdu 関数に入れたログの情報が、LogCatに出力されません。
Nexus7のAndroidバージョンは 5.0.2です。
何か見落としていることがあるのでしょうか。
もし、気が付いたことがあったら教えてください。
よろしくお願いします。
コメントありがとうございます。
削除いくつか確認を。
・Nexus7は2013年モデルでしょうか?
→2012年モデルは、HCEに対応してないため。
・カードリーダは何をお使いでしょうか?
→特に情報は持ってないのですが、とりあえず・・・。
さっき、Nexus7(2013)+Android5.0.2にHceSampleをインストールし、リーダライタとしてNexus5のTagInfoをReaderモードで接近させたところ、最初はこんな感じで始まっていました。
-----------------
D/BrcmNfcJni( 4015): RoutingManager::stackCallback: event=0x18
D/HostEmulationManager( 4015): notifyHostEmulationActivated
D/BrcmNfcJni( 4015): RoutingManager::stackCallback: event=0x17
D/BrcmNfcJni( 4015): RoutingManager::stackCallback: NFA_CE_DATA_EVT; stat=0x0; h=0x301; data len=13
D/HostEmulationManager( 4015): notifyHostEmulationData
D/HostEmulationManager( 4015): Binding to service ComponentInfo{com.blogpost.hiro99ma.hcesample/com.blogpost.hiro99ma.hcesample.HostSampleService}
D/HostEmulationManager( 4015): Waiting for new service.
D/HostEmulationManager( 4015): Service bound
★ここからprocessCommandApdu()のログが出る
-------------------
お返事ありがとうございます。
削除・Nexus7は2013年モデルを使っています。
・カードリーダは
組み込み向けモジュールのAMI2000/model3445 を使っています。
ISO15693,ISO14443TypeA/B,FeliCa の4 種類のIC カードに対応した
マルチターゲットのリーダー・ライターです。
今は、Type AのICカードを読込んでいます。
AndroidでType Aのカードの代わりをさせようとしています。
再度ソースを試して頂きまして、ありがとうございます。
TagInfo側を準備できないので試せないのですが、カードリーダとの
やり取りに問題がありそうな感じでしょうか。
AndroidのHCEは、Type Aではあるのですが、上位層がISO7816で通信しています。
削除NFC Forumの分類でいえば「Type 4A Tag」になります(製品でいえば、MIFARE DESFireなど)。
http://developer.android.com/guide/topics/connectivity/nfc/hce.html#SupportedProtocols
Type Aだと「Type 2 Tag」(MIFARE Ultralightなど)が多いのですが、それと同じ方式ではアクセスできないことになります。
無線の区間はType2もType4もISO14443なので、このR/Wで無線の通信はできるだろうと思います。
あとは、R/W側のアプリがISO7816でアクセスするようにすればいけるかも・・・と思いました(AMI2000のPDFには、適合カードに「Desfire」も載っていましたし)。
ISO7816はICカードを電気的に接触してアクセスするときのプロトコルで、無線でアクセスするときはISO-DEPとかISO14443-4(T=CL)などと呼ばれているようなので、そういったキーワードで探すとよいかもしれません。
hiro99maさん、
削除アドバイス、本当に感謝いたします。
AndroidのHCEは、Type A Tag で、MIFARE DESFire相当なので
大丈夫だろうと考えていました。
ただし、MIFARE UltralightとMIFARE DESFireはメモリ構成が違うので
カードリーダのアプリ内で吸収させようと考えていました。
カードリーダ側から見ると、Androidを近付けた時点で
IC Type=TypeA、ID=08 CC E6 DA(ランダム)、ATQA=04 00、SAK=60
とデータを受け取り正常終了しています。
その後、カードリーダにメモリブロックを指定してReadさせても、
Android側の反応がない状態です。
ISO7816やISO14443-4の資料は集めていますので、もう一度確認してみます。
そこまで動いていたのですね。失礼しました。
削除Androidは普段Android Beam用に短い期間でNFC-AやNFC-Fを切替ながら動いていたように思うので、それが読めているのかもしれません。
私は最初、HCEの確認をSonyのPaSoRiとSDKに付属していたType4Aを読むサンプルアプリでやろうとしていたのですが、あまりにうまく読めなかったのであきらめてしまいました。
Android Beamを使わない設定にしても変わらなかったので、そのままにしています。