2013/12/22

[nfc]HCEのサンプルを作った

ようやく、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

記憶をたどりながら書いたので、あまり説明にこだわってなく、こざっぱりした感じになったんじゃないかな。
まあ、大半は昨日酒を飲みながら書いているので、ちょっと心配ではあるが・・・まあ大丈夫だろう。

6 件のコメント:

  1. hiro99maさん、こんにちは^^
    AndroidのHCEの検索でこちらのブログに辿り着きました。
    githubにあったソースをEclipseでビルドしNexus7に入れました。
    そして、カードリーダに近付けてみたのですが、動作してないようなのです。
    processCommandApdu 関数に入れたログの情報が、LogCatに出力されません。
    Nexus7のAndroidバージョンは 5.0.2です。
    何か見落としていることがあるのでしょうか。
    もし、気が付いたことがあったら教えてください。
    よろしくお願いします。

    返信削除
    返信
    1. コメントありがとうございます。
      いくつか確認を。

      ・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()のログが出る
      -------------------

      削除
    2. お返事ありがとうございます。

      ・Nexus7は2013年モデルを使っています。

      ・カードリーダは
      組み込み向けモジュールのAMI2000/model3445 を使っています。
      ISO15693,ISO14443TypeA/B,FeliCa の4 種類のIC カードに対応した
      マルチターゲットのリーダー・ライターです。
      今は、Type AのICカードを読込んでいます。
      AndroidでType Aのカードの代わりをさせようとしています。

      再度ソースを試して頂きまして、ありがとうございます。
      TagInfo側を準備できないので試せないのですが、カードリーダとの
      やり取りに問題がありそうな感じでしょうか。

      削除
    3. 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)などと呼ばれているようなので、そういったキーワードで探すとよいかもしれません。

      削除
    4. 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の資料は集めていますので、もう一度確認してみます。

      削除
    5. そこまで動いていたのですね。失礼しました。

      Androidは普段Android Beam用に短い期間でNFC-AやNFC-Fを切替ながら動いていたように思うので、それが読めているのかもしれません。
      私は最初、HCEの確認をSonyのPaSoRiとSDKに付属していたType4Aを読むサンプルアプリでやろうとしていたのですが、あまりにうまく読めなかったのであきらめてしまいました。
      Android Beamを使わない設定にしても変わらなかったので、そのままにしています。

      削除

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。