ArduinoでRFIDタグのエミュレーション

ArduinoでRFIDタグのエミュレーションをして、リーダーに任意のデータを送信するテストを行いました。







参考にさせていただいたのはこちらのサイト。参考というよりほぼそのままです ;

ArduinoでRFID
http://plaza.rakuten.co.jp/cpu4edu/25019/

Stupid Simple Arduino LF RFID Tag Spoofer
http://www.instructables.com/id/Stupid-Simple-Arduino-LF-RFID-Tag-Spoofer/


■ リーダー
今回使用したのはは、OLIMEXのMOD-RFID125というRFIDリーダー。USBでつなぐと、キーボードまたはシリアル機器として使用できます。125kHzタイプのRFIDタグを読み出せます。SUICAなどで使われる13.56MHzタイプのリーダーも販売されているので、次はそちらも試してみたいです。熱収縮チューブでパッケージという男前な外装。ケースに入ったタイプも販売されています。

MOD-RFID125
http://strawberry-linux.com/catalog/items?code=15031



キーボードとして使う場合、付属のカードをかざすと16進数10桁のIDと改行がテキストとして入力されます。シリアル機器として使う場合は、デバイスについているスイッチを長押ししてモードを切り替え、ターミナルから接続して確認する事ができます。




■ エミュレーション
カードは書き込みに対応していないので、IDを変更できません。特定のカードの接触を検知するだけならいいのですが、何らかの変化するデータをリーダに送るためには、IDに相当する部分をエミューレートする必要があります。今回はそれをArduinoにコイルを接続して実現します。


■ 回路
回路はこんな感じ。

0.1uF(100nF)のコンデンサしか手元になくて、それでも動くかなと思ったけどダメで、むしろコンデンサを外したら動きました。でも、あったほうが安定すると思います。


■ コイル
コイルのパラメータがどういう関係にあるのかよく分かっていないのですが、書いてある通りに作ってみました。あまり厳密でなくてもいけるようです。

線種:UEW(エナメル線)
線径:0.35mm(AWG27〜28)
巻径:φ40mm
巻数:30回




■ ソフト

Arduinoに入れるのはこちら。64bitのデータを繰り返し送っています。
http://ja.scribd.com/doc/30215336/RFID-Faker-Code

データの構造でちょっと迷ったのでメモ。こちらにちゃんと説明がありました。

以下がデータになります。このまま送ると"ffffffffff"です。

//スタートビット。データの始まりを示す。
int data_to_spoof[64] = {1,1,1,1,1,1,1,1,1,

// 以下10行がデータ。前の4bitで0〜15を表す。
// 最後のbitはパリティ。4bitのうち1の個数が偶数なら0, 奇数なら1。
1,1,1,1,0,
1,1,1,1,0,
1,1,1,1,0,
1,1,1,1,0,
1,1,1,1,0,
1,1,1,1,0,
1,1,1,1,0,
1,1,1,1,0,
1,1,1,1,0,
1,1,1,1,0,

// 各データの桁毎のパリティ。
// この場合、全ての桁で1が10個で偶数なので0,0,0,0となる。
0,0,0,0,

//ストップビット。データの終了を示す。
0};

■ まとめ

Arduinoから"3141592653"という文字列を送ってみます。



今回は決まった値を出すだけでしたが、その時々のデバイスの状態を非接触で送信できるので、いろいろと使えそうです。