15
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

PaSoRiとnfcpyでNFCの中身を覗いてみる

Last updated at Posted at 2022-04-24

はじめに

どうやってNFCカード/タグを読み込むの?

  • PCに外付けのNFCリーダーを接続する or NFC対応のスマホを使用する
  • NFCリーダーはSONY製のPaSoRiがデファクト感ある

どの型番のPaSoRiを使えば良いの?

  • PaSoRiの製品一覧は PaSoRi製品比較表 にまとまっているため、自分のプラットフォームで動作する機種を選択する
  • RC-S300RC-S380の後継機種
  • 注意点としてはRC-S300RC-S300/Sはnfcpy(後述)で認識できない

どうやって中身(データ)を見るの?

  • コードから制御したい場合は主に以下の3種類
    • PC/SC(Personal Computer/Smart Card) API
      • ICカードの情報を取得するためのAPI
      • 大抵のプラットフォームで使えるっぽい(未検証)
      • そのぶん敷居が高い印象
    • nfcpy
      • Python製のライブラリ
      • デファクト感ある
      • RC-S300RC-S300/Sに対応していない
        • Issues には上がってるが実装はされていない
      • libusb に依存している
    • node-pcsc
      • Node.js製のPC/SCラッパー
  • コードから制御する必要がない場合
    • NFC Tools - Pro Edition
      • NFCリーダーのアプリ
      • 一通りの操作が可能
      • カードエミュレーションモードも一応実装されているため、動作検証等にも使用できそう

本題: PaSoRiとnfcpyでNFCの中身を覗いてみる

  • NFCリーダーを接続後、以下のコマンドを実行
  • 認識されている場合、接続しているNFCリーダーが出力される
$ lsusb
...
Bus 001 Device 004: ID 054c:06c1 Sony Corp. RC-S380/S
...
  • nfcpyのインストール
$ pip install nfcpy
  • nfcpyの初期設定
    • 以下のコマンドを実行するとnfcpyを正常に動作させるために実行が必要なコマンドを教えてくれる
$ python3 -m nfc
This is the 1.0.4 version of nfcpy run in Python 3.9.7
on Linux-5.13.0-37-generic-x86_64-with-glibc2.34
I'm now searching your system for contactless devices
** found usb:054c:06c1 at usb:001:017 but access is denied
-- the device is owned by 'root' but you are 'kazukichi'
-- also members of the 'root' group would be permitted
-- you could use 'sudo' but this is not recommended
-- better assign the device to the 'plugdev' group
   sudo sh -c 'echo SUBSYSTEM==\"usb\", ACTION==\"add\", ATTRS{idVendor}==\"054c\", ATTRS{idProduct}==\"06c1\", GROUP=\"plugdev\" >> /etc/udev/rules.d/nfcdev.rules'
   sudo udevadm control -R # then re-attach device
I'm not trying serial devices because you haven't told me
-- add the option '--search-tty' to have me looking
-- but beware that this may break other serial devs
Sorry, but I couldn't find any contactless device
  • 上記で提示されたコマンドを実行後、再度以下のコマンドを実行すると、更に実行が必要なコマンドが提示されることもあるため注意する
$ python3 -m nfc
This is the 1.0.4 version of nfcpy run in Python 3.9.7
on Linux-5.13.0-40-generic-x86_64-with-glibc2.34
I'm now searching your system for contactless devices
** found usb:054c:06c1 at usb:001:004 but it's already used
-- scan sysfs entry at '/sys/bus/usb/devices/1-4:1.0/'
-- the device is used by the 'port100' kernel driver
-- this kernel driver belongs to the linux nfc subsystem
-- you can remove it to free the device for this session
   sudo modprobe -r port100
-- and blacklist the driver to prevent loading next time
   sudo sh -c 'echo blacklist port100 >> /etc/modprobe.d/blacklist-nfc.conf'
I'm not trying serial devices because you haven't told me
-- add the option '--search-tty' to have me looking
-- but beware that this may break other serial devs
Sorry, but I couldn't find any contactless device
  • 正常に設定できたら以下のような実行結果が表示される
$ python3 -m nfc
This is the 1.0.4 version of nfcpy run in Python 3.9.7
on Linux-5.13.0-40-generic-x86_64-with-glibc2.34
I'm now searching your system for contactless devices
** found SONY RC-S380/S NFC Port-100 v1.11 at usb:001:004
I'm not trying serial devices because you haven't told me
-- add the option '--search-tty' to have me looking
-- but beware that this may break other serial devs
  • nfcpyからNFCリーダーが認識できているかの確認
$ python
Python 3.9.7 (default, Sep 10 2021, 14:59:43) 
[GCC 11.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import nfc
>>> clf = nfc.ContactlessFrontend()
>>> clf.open('usb:054c:06c1')
True
  • NFCカードの検出をしてみる
    • 下記のコードを実行後、NFCリーダーにNFCカード/タグをかざしてみる
    • NFCカードの情報やメモリの内容が出力されていることが分かる
import nfc

clf = nfc.ContactlessFrontend("usb")
tag = clf.connect(rdwr={'on-connect': lambda tag: False})
print(tag)
print(('  \n  '.join(tag.dump())))
実行結果(センシティブな情報は■で伏せています)
$ pipenv run python3 app.py 
Type3Tag 'FeliCa Standard (RC-SA00/1)' ID=■■■■■■■■■■■■■■■■ PMM=■■■■■■■■■■■■■■■■ SYS=■■■■
System ■■■■ (Common Area)  
  Area 0000--FFFE  
  System FE0F (unknown)  
  Area 0000--FFFE  
    Area 1000--7FFF  
      Area 1001--7FFF  
        Random Service 64: write with key (0x1008)  
        Random Service 128: write with key (0x2008)  
        Area 8000--DFFF  
        Area 8001--AFFF  
          Random Service 512: write with key (0x8008)  
          Random Service 576: write with key (0x9008)  
          Random Service 640: write with key (0xA008)  
          Area B001--BFFF  
          Random Service 704: write with key (0xB008)  
          Random Service 705: write with key (0xB048)
項目 説明
Type3Tag NDEFのTypeが3(≒FeliCa)であることを示している
RC-SA00/1 NFCカードのICチップの型番
技術情報対象製品一覧 から確認することが可能
ID IDmのこと
NFCリーダー/ライターが通信相手のカードを識別するための製造ID
上位2byteが製造者コード、続く6byteがカード識別番号
PMM PMmのこと
NFCリーダー/ライターが通信相手のカードの種別と性能を識別するためのパラメータ
SYS システムコード
システムを識別するための値
事業者/使用用途ごとに割り当てられる
System / Area システム > エリア > サービス > ブロック という入れ子構造になっている
Random Service ユーザが自由にブロックを指定してアクセス可能なサービス
15
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
15
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?