フェリカ 革製キーホルダ型 ICタグ (FeliCa Lite-S, フェリカライトエス) 業務用, TS-K1-NFCをamazonから購入したので、Raspberry Pi 3にRC-S380 非接触ICカードリーダー/ライター PaSoRi(パソリ)を接続してデータを書き込みました。RC-S380に置いた購入した革製キーホルダ型 ICタグを次に示します。

革製キーホルダ型ICタグ

革製キーホルダ型ICタグのデータダンプ

pythonプログラムを使用して、購入した革製キーホルダ型 ICタグをダンプしました。
pythonプログラム「tagDump.py」を次に示します。

  • 20行目のdump関数でICタグをダンプします。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import os
import sys
#sys.path.insert(1, os.path.split(sys.path[0])[0])
sys.path.append('/home/pi/nfcpy')
 
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})

pythonプログラム「tagDump.py」を実行すると次のようにダンプされます。

Type3Tag 'FeliCa Lite-S (RC-S966)' ID=012E4128728C7E8B PMM=00F1000000014300 SYS=88B4
    0: 10 04 01 00 0d 00 00 00 00 00 01 00 00 00 00 23 |...............#|
    1: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
    *  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
   13: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
   14: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff (REGA[4]B[4]C[8])
  128: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 (RC1[8], RC2[8])
  129: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 (MAC[8])
  130: 01 2e 41 28 72 8c 7e 8b 00 00 00 00 00 00 00 00 (IDD[8], DFC[2])
  131: 01 2e 41 28 72 8c 7e 8b 00 f1 00 00 00 01 43 00 (IDM[8], PMM[8])
  132: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 (SERVICE_CODE[2])
  133: 88 b4 00 00 00 00 00 00 00 00 00 00 00 00 00 00 (SYSTEM_CODE[2])
  134: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 (CKV[2])
  135: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 (CK1[8], CK2[8])
  136: ff ff ff 01 ff 00 00 00 00 00 00 00 00 00 00 00 (MEMORY_CONFIG)
  144: 02 fe ff 00 00 00 00 00 00 00 00 00 00 00 00 00 (WCNT[3])
  145: ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? (MAC_A[8])
  146: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 (STATE)

FeliCa Lite-Sでは、次の2種類のサービスコードが利用できます。

FeliCa Lite-Sのサービスコード
サービスコード 権限 認証
0009h RW 不要
000Bh RO及びRW 不要

データダンプの右側に表示されている項目名とその内容を次に示します。詳細については「FeliCa Lite」を参照してください。
FeliCa Lite-Sのブロック構成

革製キーホルダ型 ICタグ書き込み/読み出し

次のpythonプログラム「tagRW.py」を使って、ブロック0に「0xcc」を16バイト書き込み、読み出します。

  • 23行目で書き込むデータ「cc」を16バイト分data変数に設定します。
  • 24行目でサービスコード「0x0009」のブロック「0」に関数「write_without_encryption」により書き込みます。
  • 25行目でサービスコード「0x0009」のブロック「0」に関数「read_without_encryption」により読み込みます。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import os
import sys
#sys.path.insert(1, os.path.split(sys.path[0])[0])
sys.path.append('/home/pi/nfcpy')
 
import binascii
import nfc
   
service_code_9 = 0x0009
service_code_b = 0x000b
   
def connected(tag):
  # タグのIDなどを出力する
  print tag
   
  if isinstance(tag, nfc.tag.tt3.Type3Tag):
    try:
      # ブロック0番の内容を16進数[bb]で書き込み、読み出す。
      sc_9 = nfc.tag.tt3.ServiceCode(service_code_9 >> 6, service_code_9 & 0x3f)
      bc = nfc.tag.tt3.BlockCode(0, service=0)
      data = 16 * "\xcc"
      data = tag.write_without_encryption([sc_9], [bc], data)
      print ("block{0}: {1}".format( 0, binascii.hexlify(tag.read_without_encryption([sc_9], [bc]))))
    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})

pythonプログラム「tagRW.py」を実行した結果を次に示します。

$ sudo python tagRW.py
Type3Tag ‘FeliCa Lite-S (RC-S966)’ ID=012E4128728C7E8B PMM=00F1000000014300 SYS=88B4
block0: cccccccccccccccccccccccccccccccc