Raspberry Pi 3にPaSoRi(RC-S380)を接続して、nfcpyを使用し、Python言語でSuicaカードをダンプします。nfcpy のバージョンは 0.11.0 (2016-04-21) です。
nfcpy のインストールについては、「raspberry piでSuicaの履歴の表示」を参照してください。
nfcpyの公式のドキュメントがあります。左側のメニューから、「Module Reference → nfc.tag → Type 3 Tag」を選択すると、FeliCaカードで使用できるメソッドの仕様が表示されます。
Suicaカードのダンプアプリの作成
- スクリプトの1行目に、「#!/usr/bin/env python」と記述し, 実行可能権を付けると、「python」が必要なくなり、「./suica.py」だけでプログラムが実行できます。
- スクリプトの2行目の「# -*- coding: utf-8 -*-」 は、このソースがUTF-8で記述されていることpythonに示します。コードのコメントに日本語を使いたい時には必要です。
- スクリプトの5行目の「sys.path.insert(1, os.path.split(sys.path[0])[0])」は、親ディレクトリと自分と同じ深さのディレクトリをimportしたいときに検索パスを追加しています。この構文がないと、実行時に「ImportError: No module named nfc」と表示されます。
- スクリプトの16行目で、タイプ3のタグ(FeliCa)かを判断し、タイプ3のタグの場合、dumpメソッドでSuicaカードをダンプします。
suica.py
#!/usr/bin/env python # -*- coding: utf-8 -*- import os import sys sys.path.insert(1, os.path.split(sys.path[0])[0]) import binascii import nfc service_code = 0x090f def connected(tag): # タグのIDなどを出力する print tag if isinstance(tag, nfc.tag.tt3.Type3Tag): try: # 内容を16進数で出力する print(' ' + '\n '.join(tag.dump())) except Exception as e: print "error: %s" % e else: print "error: tag isn't Type3Tag" # タッチ時のハンドラを設定して待機する clf = nfc.ContactlessFrontend('usb') clf.connect(rdwr={'on-connect': connected})
Suicaカードのダンプアプリの実行
次のようにsuica.pyを起動し、RC-S380にSuicaカードをかざすと、次のようにSuicaカードがダンプされます。
$ ./suica.py Type3Tag 'FeliCa Standard (RC-S???)' ID=010103128E143F07 PMM=100B4B428485D0FF SYS=0003 System 0003 (Suica) Area 0000--FFFE Area 0040--07FF Random Service 1: write with key & read with key (0x0048 0x004A) Random Service 2: write with key & read w/o key (0x0088 0x008B) 0000: 00 00 00 00 00 00 00 00 20 00 00 2f 08 00 03 13 |........ ../....| Area 0800--0FBF Purse Service 32: direct with key & cashback with key & read with key (0x0810 0x0812 0x0816) Purse Service 33: direct with key & cashback with key & read with key (0x0850 0x0852 0x0856) Purse Service 34: direct with key & cashback with key & read with key (0x0890 0x0892 0x0896) Random Service 35: write with key & read with key (0x08C8 0x08CA) Random Service 36: read with key (0x090A) Cyclic Service 36: write with key & read w/o key (0x090C 0x090F) 0000: 16 01 00 02 21 88 97 10 97 04 2f 08 00 03 13 00 |....!...../.....| 0001: 16 01 00 02 21 88 97 04 97 10 1c 09 00 03 11 00 |....!...........| 0002: 05 0d 00 0f 21 6e 0c 6a 00 00 09 0a 00 03 0f 00 |....!n.j........| 0003: 16 01 00 02 21 6e d4 0b d4 05 e1 0a 00 03 0e 00 |....!n..........| 0004: 16 01 00 02 21 63 97 10 97 04 95 0b 00 03 0c 00 |....!c..........| 0005: 16 01 00 02 21 63 1d 0c 1d 09 82 0c 00 03 0a 00 |....!c..........| 0006: 16 01 00 02 21 5c 02 03 1d 0d 1c 0d 00 03 08 00 |....!\..........| 0007: 16 01 00 02 21 5c 05 18 02 03 42 0f 00 03 06 00 |....!\....B.....| 0008: 1d 01 00 02 21 5c 88 03 88 01 0a 12 00 03 04 00 |....!\..........| 0009: 16 01 00 02 21 5c 88 01 88 03 a0 12 00 03 02 00 |....!\..........| 000A: 16 01 00 02 21 5c 1d 0d 05 18 36 13 00 03 00 00 |....!\....6.....| 000B: 16 01 00 02 21 58 1d 08 1d 0c 10 18 00 02 fe 00 |....!X..........| 000C: 16 01 00 02 21 58 d8 02 d5 25 b5 18 00 02 fc 00 |....!X...%......| 000D: 16 01 00 02 21 58 d5 25 d8 02 78 19 00 02 fa 00 |....!X.%..x.....| 000E: 16 01 00 02 21 58 1d 0c 1d 08 3b 1a 00 02 f8 00 |....!X....;.....| 000F: 12 02 00 00 21 58 1d 0c 00 00 e0 1a 00 02 f6 00 |....!X..........| 0010: c7 46 00 00 21 45 52 0c 5e 0b 58 07 00 02 f5 00 |.F..!ER.^.X.....| 0011: 16 01 00 02 21 41 03 0d 1d 0d ee 08 00 02 f4 00 |....!A..........| 0012: c7 46 00 00 21 41 76 84 ad 4e 6b 0b 00 02 f2 00 |.F..!Av..Nk.....| 0013: 16 01 00 02 21 41 1d 0d 03 0d cf 0b 00 02 f1 00 |....!A..........| Area 0FC0--7FFF Area 1000--17BF Random Service 64: write with key & read with key (0x1008 0x100A) Random Service 65: write with key & read with key (0x1048 0x104A) Cyclic Service 66: write with key & read w/o key (0x108C 0x108F) 0000: 20 00 97 04 20 02 21 88 19 20 ed 00 00 00 00 00 | ... .!.. ......| 0001: a0 00 97 10 10 04 21 88 19 05 00 00 00 00 00 00 |......!.........| ・・・ ・・・
- サービスコード「0x090f」ブロック番号「0-19」(「Cyclic Service 36: write with key & read w/o key (0x090C 0x090F)」以降)に利用履歴が表示されています。
- サービスについては、FeliCaカード ユーザーズマニュアル 抜粋版の「3.4サービス」を参照してください。
サービス属性一覧 表示 説明 Random Service ユーザが自由にブロックを指定してアクセス可能なサービス Cyclic Service ログの記録をユースケースとしてブロックへのアクセスに特殊な機能を付与したサービス Purse Service ブロックデータの一部を正の数値とみなして、その値を減算する機能持つサービス direct with key Purse Serviceにおいて、指定されたブロックデータをそのまま上書きするアクセス cashback with key Purse Serviceにおいて、キャッシュバックデータの値の範囲で指定された値をパースデータに加算するアクセス
- パスワードなしで読み書きできるのは “w/o key” (without key = キーなし)となっているサービスだけです。
アプリを起動しても、「: そのようなファイルやディレクトリはありません」と表示されて実行できない場合、ファイルの改行コードが、Windows[CRLF]でなくUnix[LF]になっていることを確認してください。