Arduino+RC-S620/SでPollingに任意のIDmで応答させる

2012-05-11   treby   IDm Snatcher  , , , このエントリーをはてなブックマークに追加

Kick off記事にも書いたように、現在取り組んでいるプロジェクトではRC-S620/Sをカードとして取り扱うこと(カードエミュレーション)を根幹に据えている。この根幹技術について、機能としては実現することができたので、記録を残すこととする。

当然、Nexusにも反応する。

注:本記事でのカードエミュレーションは、R/WのPollingに任意のIDmで応答させることを指しているので、厳密にはカードエミュレーションではない。IDmのみで認証しているシステムにとってはカードエミュレーションになるのかもだけど。

はじめに

何か新しい機能を実現する際、先人がいると何かと心強いものである。参考文献に示すようにRC-S620/Sでのカードエミュレーションは過去にNFC猛者さんがされている。

そんな猛者さんが福岡NFC勉強会の折に、「これくらいならば簡単にできました」としきりに仰っていたことが頭から離れず、今回カードエミュレーション取り組んでみることにした次第である。

偶然にも最近、RC-S620/Sコマンドリファレンスマニュアル<簡易版>が更新された。新たに追加公開されたコマンドにより、猛者さんより格段に有利な状況で実現することができるようになった。(ちなみに猛者さんはPN533のドキュメント(PDF)を元に頑張ってらっしゃったらしい。ヤバい。)

リーダ・ライタをカードのように取り扱うことについて

ご存じの通り、NFCには以下の3つのモードがある。

  1. NFC Card Emulation Mode …… NFCカード(タグ)のように見せかけるモード。
  2. Peer-to-Peer Mode …… NFCデバイス同士で通信するモード。Android Beamなど。
  3. Reader/Writer Mode …… NFCカード(タグ)に情報を読み書きするモード。

この分類に当てはめるのであれば、おサイフケータイはCard Emulation Mode(FeliCaカードの代替)、NFC機能搭載Android端末はR/Wモード(画面ロック解除中は搬送波を出して相手を探している)で通常動作しているということができる。

また、NFCデバイスはInitiator機能とTarget機能という2つの機能を持っている。これら機能がどのモードで使われているかを整理すると次のようになる(と思う)。

  • Initiator機能 …… R/W Mode, P2P(Initiator)
  • Target機能 …… Card Emulation, P2P(Target)

つまり、NFCデバイスであるRC-S620/Sを(丁度おサイフケータイのように)NFCカードのように「見せかける」ことも可能なのだ。

TgInitTarget コマンド

RC-S620/Sコマンドリファレンスマニュアル<簡易版> v2.0で新しく公開されたコマンドの一つに、TgInitTargetがある。

このコマンド、パラメータを見れば分かるようにNFCID2(FeliCaでいうところのIDm)を指定できるようになっている。ここを任意に指定すれば自分の望むIDmとして認識させられるのではないかと考えた。

このことを元に、Arduinoライブラリを改造してみた。正直、当初はさっぱり上手く行かなかった(Initというくらいだからsetup関数の中に記述していた)。が、少しコードを工夫するだけでPollingしているデバイスに応答させることができた。

TgInitTarget コマンドどう使うのが正しいのか

上の実装方法であるがどうもRC-S620/SからはACKが返ってきていないようだ。コードをキレイキレイ化していないので確かなことは言えないが、どうも邪道なやり方らしい。ここは現在勉強中である。

何はともあれ、これで私もFeliCa IDmを操る能力を手に入れたぞ(こう書くとなんか悪役っぽい)。

参考リンク

技術関係

FeliCa IDmでユーザ認証することの危険性