Edited at

nfcpy 0.13.4でNFCのIDを読む

More than 1 year has passed since last update.


Raspberry Pi 3でNFCのタグが読みたい

ということで、nfcpyをインストールしました。その他必要事項はググれば色々出るとおもいます。

0.10で大きな改変があったようですが、webに乗っている比較的新し目のコードを0.13で実行してもエラーになるので、ソースコード読んだりしながら試行錯誤した結果が下記のコードです。

結局、ぐぐると出て来るコードのIDmやUIDをidentifierに変えると動きました。


環境

Raspberry Pi 3 + RC-S380


コード

#!/usr/bin/env python

# -*- coding: utf-8 -*-

import nfc
import binascii

def on_connect(tag):
print tag
print tag.type
print binascii.hexlify(tag.identifier).upper()

def main():
with nfc.ContactlessFrontend('usb') as clf:
clf.connect(rdwr={'on-connect': on_connect})

if __name__ == '__main__':
main()


結果

Xperia X Performance SOV33を読ませてみました。

Type4ATag MIU=255 FWT=0.038664

Type4Tag
08xxxxxx


SOS

Type3は毎回同じIDをはくのですが、Type4Aは毎回違うIDが出てきてIDの意味がないという状態です。

nfcpyだとこれ以上できそうにないんですが、解決策ご存じの方ご教示ください。


解決策

Type4に対する根本的な解決策ではないのですが、targetsで212Fと424Fを指定することによりType 3のFelicaの読み込みに限定できました。

212F,424Fは212Hz, 424HzのFelica用のプロトコルといったところでしょうか?

import nfc, nfc.clf

import binascii

def on_connect(tag):
print tag
print tag.type
print binascii.hexlify(tag.identifier).upper()

def main():
clf = nfc.ContactlessFrontend("usb")

rdwr_options = {
'targets': ['212F' , '424F'], #Felicaに限定
'on-connect': on_connect,
}

clf.connect(rdwr=rdwr_options)

if __name__ == '__main__':
main()


その結果

Type3Tag 'FeliCa Mobile 3.0' ID=0134XXXXXXXXXXXX PMM=0114XXXXXXXXXXXX SYS=FE00

Type3Tag
0134XXXXXXXXXXXX