NFCリーダーライター PaSoRi を試す
手元にあるのは RC-S370で、現在は生産が終了しているモデルですね。
認識
$ lsusb Bus 001 Device 004: ID 041e:323d Creative Technology, Ltd Bus 001 Device 005: ID 054c:02e1 Sony Corp. FeliCa S330 [PaSoRi] Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp. SMSC9512/9514 Fast Ethernet Adapter Bus 001 Device 002: ID 0424:9514 Standard Microsystems Corp. Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Sony Corp. FeliCa S330 [PaSoRi]
と認識されています。
nfcpy
nfcpy を使います。
ドキュメントはこちら
Getting started — nfcpy 0.13.0 documentation
インストール
$ sudo pip install nfcpy ・・・ Successfully installed nfcpy ndeflib pydes libusb1 Cleaning up...
動作確認
$ python -m nfc This is the 0.13.0 version of nfcpy run in Python 2.7.9 on Linux-4.9.28-v7+-armv7l-with-debian-8.0 I'm now searching your system for contactless devices ** found usb:054c:02e1 at usb:001:005 but access is denied -- the device is owned by 'root' but you are 'kiyo' -- 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}==\"02e1\", 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
指示が出ているので従う。
$ sudo sh -c 'echo SUBSYSTEM==\"usb\", ACTION==\"add\", ATTRS{idVendor}==\"054c\", ATTRS{idProduct}==\"02e1\", GROUP=\"plugdev\" >> /etc/udev/rules.d/nfcdev.rules' $ sudo udevadm control -R
もう一度・・・
$ python -m nfc This is the 0.13.0 version of nfcpy run in Python 2.7.9 on Linux-4.9.24-v7+-armv7l-with-debian-8.0 I'm now searching your system for contactless devices 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
おや?
RC-S380/P でやりなおす
特に対応から外れているわけでも無いので、手元にあるPaSoRiが壊れていのかもしれない、、、ということで、新しい PaSoRi を買い直しました。
RC-S380/P を刺して、、、
This is the 0.13.0 version of nfcpy run in Python 2.7.9 on Linux-4.9.28-v7+-armv7l-with-debian-8.0 I'm now searching your system for contactless devices ** found SONY RC-S380/P NFC Port-100 v1.11 at usb:001:010 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
よし。
やはり、手元の S370 は、古くて壊れていたのかな?
git のサンプルを動かす
スイカを乗せて・・・
$ git clone https://github.com/nfcpy/nfcpy.git $ cd nfcpy $ python examples/tagtool.py [nfc.clf] searching for reader on path usb [nfc.clf] using SONY RC-S380/P NFC Port-100 v1.11 at usb:001:010 ** waiting for a tag ** Type3Tag 'FeliCa Standard (RC-S915)' ID=*** PMM=*** SYS=***
データを読み書きする
まず、メディア?を入手します。
アマゾンで買ったこれは、素直に動いてくれました。
先に書くと、フォーマットをして、NDEF 対応にしないと NDEF のやり取りが来ません。
NDEFフォーマットに成功したメディア達
フォーマット
format.py
import nfc def on_connect(tag): print("format:", tag.format()) clf = nfc.ContactlessFrontend('usb') if clf: print("Clf: {}".format(clf)) clf.connect(rdwr={ 'on-connect': on_connect }) clf.close()
実行
$ python format.py Clf: SONY RC-S380/P on usb:001:010 ('format:', True)
データの読み取り
messageに入っているデータを読み込みます。
フォーマットしただけだと、空っぽです。
import nfc def on_startup(targets): print("on_startup()") return targets def on_connect(tag): print("Tag: {}".format(tag)) print("Tag type: {}".format(tag.type)) #print '\n'.join(tag.dump()) if tag.ndef: print tag.ndef.message.pretty() #return True def on_release(tag): print("on_release()") if tag.ndef: print(tag.ndef.message.pretty()) clf = nfc.ContactlessFrontend('usb') if clf: print("Clf: {}".format(clf)) clf.connect(rdwr={ 'on-startup': on_startup, 'on-connect': on_connect, 'on-release': on_release }) clf.close()
実行
$ python 001.py Clf: SONY RC-S380/P on usb:001:010 on_startup() Tag: Type3Tag 'FeliCa Lite-S (RC-S966)' ID=_ID_ PMM=_PMM_ SYS=88B4 Tag type: Type3Tag record 1 type = '' name = '' data = ''
書き込み
書き込んで、確認してみる。
import nfc def on_startup(targets): print("on_startup()") return targets def on_connect(tag): print("Tag: {}".format(tag)) print("Tag type: {}".format(tag.type)) #print '\n'.join(tag.dump()) if tag.ndef: record = nfc.ndef.TextRecord("Hello World!") tag.ndef.message = nfc.ndef.Message(record) print tag.ndef.message.pretty() #return True def on_release(tag): print("on_release()") if tag.ndef: print(tag.ndef.message.pretty()) clf = nfc.ContactlessFrontend('usb') if clf: print("Clf: {}".format(clf)) clf.connect(rdwr={ 'on-startup': on_startup, 'on-connect': on_connect, 'on-release': on_release }) clf.close()
実行
$ python 002.py Clf: SONY RC-S380/P on usb:001:010 on_startup() Tag: Type3Tag 'FeliCa Lite-S (RC-S966)' ID=__ID__ PMM=__PMM__ SYS=88B4 Tag type: Type3Tag record 1 type = 'urn:nfc:wkt:T' name = '' data = '\x02enHello World!'
今回は、いつ買ったわからない RC-370 が動かなかったけれども、買い直した RC-S380/P では動いた点、
フォーマットしないと NDEF でのやり取りができない点でつまずきました!