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と改行がテキストとして入力されます。シリアル機器として使う場合は、デバイスについているスイッチを長押ししてモードを切り替え、ターミナルから接続して確認する事ができます。
■ エミュレーション
■ 回路
回路はこんな感じ。
0.1uF(100nF)のコンデンサしか手元になくて、それでも動くかなと思ったけどダメで、むしろコンデンサを外したら動きました。でも、あったほうが安定すると思います。
■ コイル
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で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"という文字列を送ってみます。
今回は決まった値を出すだけでしたが、その時々のデバイスの状態を非接触で送信できるので、いろいろと使えそうです。