2018/03/11

[nfc]Debian9とRC-S370とnfcpy

久々に、PaSoRiを触っている。
BeagleBone Greenに挿して使えるのか、確認しているだけだがね。


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

せっかくなので、nfcpyを使うことにしよう。
なるべく普通のやり方で使えるに越したことはないのだ。


nfcpyはpython2.xで動くようになっている。
BeagleBone GreenにインストールしたDebianではpython2.7.13が使えるようになっていたので、都合がよい。

$ sudo pip install -U nfcpy

これでインストールできたようなので、下の方に書かれていた「import nfc」の手順を順番にやってみた。
が、open()に失敗する。

不思議に思い、インストール手順にあった「python -m nfc」をやってみると、使用中になっているようだった。

$ python -m nfc
No handlers could be found for logger "nfc.llcp.sec"
This is the 0.13.4 version of nfcpy run in Python 2.7.13
on Linux-4.9.82-ti-r102-armv7l-with-debian-9.4
I'm now searching your system for contactless devices
** found usb:054c:02e1 at usb:001:002 but it's already used
-- scan sysfs entry at '/sys/bus/usb/devices/1-1:1.0/'
-- the device is used by the 'pn533_usb' 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 pn533_usb
-- and blacklist the driver to prevent loading next time
    sudo sh -c 'echo blacklist pn533_usb >> /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

赤文字を実行してやると、openできるようになった。
デバイス関係だからsudoがいるかと思ったが、なくても大丈夫そうだ。


読んでみよう。

>>> import nfc
No handlers could be found for logger "nfc.llcp.sec"
>>> clf=nfc.ContactlessFrontend()
>>> clf.open('usb:054c:02e1')
True
>>> tag=clf.connect(rdwr={'on-connect': lambda tag: False})
>>> print(tag)
Type3Tag 'FeliCa Lite (RC-S965)' ID=0127005D19FE4B78 PMM=00F0000002060300 SYS=88B4

おお、読めた。
SystemCodeが0x88B4になっているから、NDEF用にしていないカードだったのだろう。

Type2のNDEFタグを読ませてみたが、特にそれっぽい表示はしなかった。

>>> tag=clf.connect(rdwr={'on-connect': lambda tag: False})
>>> print(tag)
Type2Tag 'NXP NTAG216' ID=043968D29C3981

>>> for record in tag.ndef.records:
...     print(record)
...
NDEF Uri Record ID '' Resource 'http://www.nxp.com/demoboard/OM5578'

わかりづらいが、printの前にはスペースを入れている。


APIを見て、まねした。


import nfc

def on_connect(tag):
    print('connect: ')
    print(tag)

#def on_discover(tag):
#    print('discover!');
#    return tag;

options = {
        'on-connect': on_connect,
#        'on-discover': on_discover,
        }

while True:
    with nfc.ContactlessFrontend('usb') as clf:
        tag = clf.connect(rdwr=options)
        if tag.ndef:
            print('return:')
            print(tag.ndef.message.pretty())


discoverで検出すると思ったのだが、on-connectでもやれそうだ。
これ、on-connectを指定しないと、tagはboolになるようだった。

whileにしたのは、一度検出すると抜けてしまうからなのだが、これはこれでカードをかざしている間はループし続けてしまう。
on-releaseで離れたのを検知させた方がよさそうだ。

0 件のコメント:

コメントを投稿

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。