1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

PaSoRiを使ってNFCで遊ぶ

Posted at

NFCリーダーについて

rc-s300では、nfcpyは対応してない(らしい)。
実際に購入してみてセットアップしてみたが、動かなかった。

今回はrc-s380を利用しています。

IMG_5512.jpg

IMG_5513.jpg

画像上がrc-s300
画像下がrc-s380

amazonで探すと上のs300が沢山出てきます。騙されないようにしましょう。
rc-s380はもう販売が終了してる 2025/2/9時点
中古やヤフオクを探しましょう

セットアップ

セットアップなしではnfcpy君は認識してくれないのでセットアップを行う。

nfcリーダーをpcにさす

Zadig編

Zadigをダウンロード

optionsから List All Devicesを選択

image.png

接続してるnfcデバイスを選択
image.png

Reinstall Driverをクリック
image.png

libusb編

libusbをダウンロードします

image.png

libusb-1.0.27.7z

私は↑を選択しました。

zipファイルなので解凍します。

MS64\dll\libusb-1.0.dllC:\Windows\System32
MS32\dll\libusb-1.0.dllC:\Windows\SysWOW64 に移動。

64bit想定で行っています。

nfcpyライブラリのインストール

pip install nfcpy

実際に使ってみようちゃんねる

読み取り編

git clone https://github.com/nfcpy/nfcpy.git

cd nfcpy
cd examples

python tagtool.py

てきとうな交通系ICや学生証などのnfc機器を近づける。

[nfc.clf] searching for reader on path usb
[nfc.clf] using SONY RC-S380/S NFC Port-100 v1.11 at usb:001:012
** waiting for a tag **
Type3Tag ID=xxxxxxxxxxxxxx PMM=xxxxxxxxxxxx SYS=xxxx

このような感じで出力されたら大丈夫です

書き込み編

documentに書き込みの方法があったので利用

import nfc
import struct

ndef_data_area = bytearray(64 * 16) # NDEFデータエリアとしてバイト配列を初期化
ndef_data_area[0] = 0x10  # NDEFのバージョン ('1.0')
ndef_data_area[1] = 12    # 読み取り可能な最大ブロック数
ndef_data_area[2] = 8     # 書き込み可能な最大ブロック数
ndef_data_area[4] = 63    # NDEFデータが格納可能なブロック数
ndef_data_area[10] = 1    # 読み取りと書き込みの許可設定
ndef_data_area[14:16] = struct.pack('>H', sum(ndef_data_area[0:14]))  # 最初の14バイトのデータの合計値を16ビットの整数にして格納

# NDEFデータの読み取りを行う
def ndef_read(block_number, rb, re):
    if block_number < len(ndef_data_area) / 16:
        first, last = block_number*16, (block_number+1)*16
        block_data = ndef_data_area[first:last]
        return block_data

# NDEFデータの書き込み
def ndef_write(block_number, block_data, wb, we):
    global ndef_data_area
    if block_number < len(ndef_data_area) / 16:
        first, last = block_number*16, (block_number+1)*16
        ndef_data_area[first:last] = block_data
        return True
    
# NFCタグの初期化を行う関数
def on_startup(target):
    idm, pmm, sys = '03FEFFE011223344', '01E0000000FFFF00', '12FC' #ここを任意の値に変更
    target.sensf_res = bytearray.fromhex('01' + idm + pmm + sys)
    target.brty = "212F"
    return target

# NFCタグが接続されたときの処理
def on_connect(tag):
    print("tag activated")
    tag.add_service(0x0009, ndef_read, ndef_write)
    tag.add_service(0x000B, ndef_read, lambda: False)
    return True

# NFCリーダーの起動と待機
with nfc.ContactlessFrontend('usb:054c:06c1') as clf:
    while clf.connect(card={'on-startup': on_startup, 'on-connect': on_connect}):
        print("tag released")

実際に読みとってみると変更した値が出力された

何かに応用したものもつくってみようかな

1
1
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
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?