nfcpy で Felica をエミュレートする


基本的に公式のGetting started に例が載っています
Emulate a card
私は Pasori RC-S380 を使っていますが、その場合このままでは動きません
USBカードリーダーをベンダーIDとプロダクトIDで指定する必要があります
exampleでは nfc.ContactlessFrontend('usb:054c:06c1') となっています
Pasori RC-S380 の場合は nfc.ContactlessFrontend('usb:054c:06c3') と変更します
これで動くようになるはずです

そのまま書いてありますが
idm, pmm, sys = '03FEFFE011223344', '01E0000000FFFF00', '12FC'
を変更すれば IDm, PMm, システムコードも自由に変更することが出来ます

PMm の冒頭を書き換える事でIC種別も変更可能です
idm, pmm, sys = '03FEFFE011223344', '01E0000000FFFF00', '12FC' と設定し、 nfcpy/examples/tagtool.py で読み取った結果

Type3Tag 'FeliCa Plug (RC-S926)' ID=03FEFFE011223344 PMM=01E0000000FFFF00 SYS=12FC
NDEF Capabilities:
  readable  = yes
  writeable = yes
  capacity  = 1008 byte
  message   = 0 byte

idm, pmm, sys = '03FEFFE011223344', '00F1000000FFFF00', '12FC' と設定し、 nfcpy/examples/tagtool.py で読み取った結果

Type3Tag 'FeliCa Lite-S (RC-S966)' ID=03FEFFE011223344 PMM=00F1000000FFFF00 SYS=12FC
NDEF Capabilities:
  readable  = yes
  writeable = yes
  capacity  = 1008 byte
  message   = 0 byte

idm, pmm, sys = '03FEFFE011223344', '0332000000FFFF00', '12FC' と設定し、 nfcpy/examples/tagtool.py で読み取った結果

Type3Tag 'FeliCa Standard (RC-SA00/1)' ID=03FEFFE011223344 PMM=0332000000FFFF00 SYS=12FC
NDEF Capabilities:
  readable  = yes
  writeable = yes
  capacity  = 1008 byte
  message   = 0 byte

また、ndef_read, ndef_write は NdefFormatable にするためなので、NdefFormatable でなくする場合はその二つを消すことで実現出来ます

Felica の仕様についてはこちらの記事が分かりやすかったです
Qiita - [PASMO] FeliCa から情報を吸い出してみる - FeliCaの仕様編 [Android][Kotlin]