f:id:pongsuke:20170518112302j:plain

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
Im 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
Im not trying serial devices because you havent told me
-- add the option --search-tty to have me looking
-- but beware that this may break other serial devs
Sorry, but I couldnt 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
Im now searching your system for contactless devices
Im not trying serial devices because you havent told me
-- add the option --search-tty to have me looking
-- but beware that this may break other serial devs
Sorry, but I couldnt 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=***

データを読み書きする

まず、メディア?を入手します。

アマゾンで買ったこれは、素直に動いてくれました。

www.amazon.co.jp

先に書くと、フォーマットをして、NDEF 対応にしないと NDEF のやり取りが来ません。

NDEFフォーマットに成功したメディア達
f:id:pongsuke:20170518154414j:plain

フォーマット

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 
.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 
.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 でのやり取りができない点でつまずきました!