Chapter 33

🏷NFCリーダを制御する - ⭐

kotaproj
kotaproj
2021.10.02に更新

💡やること

NFCリーダ(PaSoRi RC-S380/S)を使用して、NFCタグの情報を取得します。

🏁デモ

🔧パーツ一覧

no 部品名 個数 備考
1 ラズベリーパイ 1 今回はZeroで確認
2 NFCリーダ(PaSoRi" RC-S380/S) 1 Amazon
3 NFCタグ 1セット Amazon

接続図

今回、回路図はありません。NFCリーダをUSBケーブルで接続します。

💻環境

開発環境

  • ラズベリーパイ
    • Linux rpi 5.10.17-v7l+ #1403 SMP Mon Feb 22 11:33:35 GMT 2021 armv7l GNU/Linux
  • Python
    • Python 3.7.3 (default, Jan 22 2021, 20:04:44)

ラズベリーパイの設定

特になし

モジュールのインストール

OSのクリーンインストールした前提で記載しています。

apt

特になし

pip

Pythonに関するモジュールをインストールします。
NFCリーダには、nfcpyを使用します。

$ python3 -m venv env
$ source env/bin/activate
(env) $ pip install nfcpy

サンプルコードの確認

サンプルコードを確認したい場合は、下記を実施します。

(env) $ git clone https://github.com/nfcpy/nfcpy.git

./nfcpy/examples に配置されています。

📝手順

NFCタグを認識し、IDが取得できていることを確認します。

NFCリーダを認識しているか確認する

USBデバイスが認識しているかは、"lsusb"で確認ができます。

$ lsusb
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 003: ID 054c:06c1 Sony Corp.  <=NFCリーダ
略

NFCリーダのIDは次で使用します。

udevルールの設定(sudo権限)

必須ではありませんが、毎回sudo権限で実施するのは面倒なので、
udevルールの設定を行います。

上記のNFCリーダの例で記載します。

$ sudo nano /etc/udev/rules.d/nfcdev.rules

↓

SUBSYSTEM=="usb", ACTION=="add", ATTRS{idVendor}=="054c", ATTRS{idProduct}=="06c1", GROUP="plugdev"
  • [参考]nanoエディタの操作
    • ctrl + o : write
    • ctrl + x : close

このあと、再起動を行う必要があります。

lsusbの結果が、"Bus 001 Device 003: ID xxxx:yyyy zzzzzzzz"の場合、

  • ATTRS{idVendor}には、"xxxx"
  • ATTRS{idProduct}には、"yyyy"

を指定します。

製品によって、idVendor/idProductは異なりますので、注意してください(コピペ注意)。

サンプルコードを実行する

Githubで公開されているサンプルコードを実行します。

実行手順

(env) $ python nfcpy/examples/tagtool.py

実行結果

操作は、# コメントで記載します。

[nfc.clf] searching for reader on path usb
[nfc.clf] using SONY RC-S380/S NFC Port-100 v1.11 at usb:001:003
** waiting for a tag **
# この時点でNFCタグのリードの待ち状態
# このあとに、NFCタグを読み込ませています
Type2Tag 'NXP NTAG213' ID=04586C6A266581
NDEF Capabilities:
  readable  = yes
  writeable = yes
  capacity  = 137 byte
  message   = 25 byte
NDEF Message:
record 1
  type = 'urn:nfc:wkt:T'
  name = ''
  data = b'\x02en\xe3\x81\x82\xe3\x81\x8b\xe3\x81\x95\xe3\x81\x9f\xe3\x81\xaa\xe3\x81\xaf'
# NFCタグの情報が表示される
# recode 1のデータは、iOSアプリ - NFC Toolsから登録した独自データです
(env) $ 

リードする

1回リードするごとに、タグ情報を表示します。
3回リードすると、終了します。

コード

nfc_read.py
import binascii
import nfc
import os

class TagTool():
    def __init__(self):
        pass

    def on_rdwr_connect(self, tag):
        # タッチ処理
        print("on_rdwr_connect:run")

        # タグ情報を表示
        print(tag)

        # IDmの表示
        self.idm = binascii.hexlify(tag._nfcid)
        print("IDm : " + str(self.idm))

        # 詳細の表示
        if tag.ndef:
            print("NDEF Capabilities:")
            print("  readable  = %s" % ("no", "yes")[tag.ndef.is_readable])
            print("  writeable = %s" % ("no", "yes")[tag.ndef.is_writeable])
            print("  capacity  = %d byte" % tag.ndef.capacity)
            print("  message   = %d byte" % tag.ndef.length)
            if tag.ndef.length > 0:
                print("NDEF Message:")
                for i, record in enumerate(tag.ndef.records):
                    print("record", i + 1)
                    print("  type =", repr(record.type))
                    print("  name =", repr(record.name))
                    print("  data =", repr(record.data))
        print("on_rdwr_connect:over")
        return True


    def read_tag(self):
        print("read_tag:run")
        cl = nfc.ContactlessFrontend('usb')
        try:
            cl.connect(rdwr={'on-connect': self.on_rdwr_connect})
        finally:
            cl.close()
        print("read_tag:over")

if __name__ == '__main__':
    tt = TagTool()
    for _ in range(3):
        tt.read_tag()

実行手順

(env) $ python nfc_read.py

実行結果

(env) $ python nfc_read.py 
read_tag:run
on_rdwr_connect:run
Type2Tag 'NXP NTAG215' ID=0400F001134903
IDm : b'0400f001134903'
NDEF Capabilities:
  readable  = yes
  writeable = yes
  capacity  = 492 byte
  message   = 0 byte
on_rdwr_connect:over
read_tag:over
read_tag:run
略

🔎ポイント

nfcpy

nfcpyは、NFCリーダを制御するためのモジュールです。
今回は、読み込みのみで使用しています。
詳しく知りたい方は、↓の公式サイトを参照ください。

https://nfcpy.readthedocs.io/en/latest/topics/get-started.html