LoginSignup
19
21

More than 5 years have passed since last update.

PaSoRiでNFCタグとFeliCaを読み込んで出力

Last updated at Posted at 2018-07-04

はじめに

NFCタグ、FeliCaで読み取りを行った時の備忘です。
ndefのデータ読み取りがpretty()での例が多かったので、登録したままのテキストだけを取り出すがゴールです。
Raspberry Piへの設定とnfcpyの仕様確認が大事です。

使用したデバイス

Raspberry Pi3
PaSoRi RC-S380
NFCタグ

Raspberry Pi3

VNC Viewer経由でコードを書いていたのでWifi(通常時)とイーサネットでの有線接続(Raspberry Pi設定)、PaSoRiを使うを理由に使ったものです。

スクリーンショット 2018-07-05 5.58.16.png

USBのハブがあればRaspberry Pi Zero(W)などでも可能かと思います。色々揃えると値段的に同じくらいになるかも?

PaSoRi

RC-S380以外での動作確認はなしです。

NFCタグ

カード状の板にNFCタグのシールを貼ったり、板状のNFCが安くなっているようです。

Raspberry piの設定

USBで繋いだパソリの確認

$ lsusb

nfcpyの設定

なかなか入らなくて、bzr branch lp:nfcpy したり、gitで元ソースをcloneしてました。
使えるようになった決め手がはっきりしていないです。

参考にしたサイトのURLを記載します。
https://devadjust.exblog.jp/23018234/
https://github.com/nfcpy/nfcpy
http://pongsuke.hatenablog.com/entry/2017/05/17/164317

実装

nfcpyの仕様

出力仕様

  • FeliCaを読み込んでIDmを出力
  • NFCタグを読み込んで、書き込んだテキストを読み込み出力。テキストが同じ場合はまとめる
  • FeliCaを最後にタッチすると終了

コード

こちらの記事を参考にさせてもらいました。
https://qiita.com/undo0530/items/89540a03252e2d8f291b#idm%E3%82%92%E5%8F%96%E3%82%8A%E5%87%BA%E3%81%99

私が書き換えたpythonのコード構成は雑なので参考までに
try ~ catch ~ finallyを入れた方がいいかなとかは別途進めていただけると。

# coding: utf-8
import nfc
import binascii
import time
from threading import Thread, Timer

 # 待ち受けの1サイクル秒
TIME_cycle = 10.0
# 待ち受けの反応インターバル秒
TIME_interval = 0.2
# タッチされてから次の待ち受けを開始するまで無効化する秒
TIME_wait = 3

# NFC接続リクエストのための準備
# 212F(FeliCa)で設定
target_req_felica = nfc.clf.RemoteTarget("212F")

# 106A(NFC type A)で設定
target_req_nfc = nfc.clf.RemoteTarget("106A")

def check_FeliCa():
    print  'FeliCa waiting...'
    # USBに接続されたNFCリーダに接続してインスタンス化
    clf = nfc.ContactlessFrontend('usb')
    # clf.sense( [リモートターゲット], [検索回数], [検索の間隔] )
    target_res = clf.sense(target_req_felica, iterations=int(TIME_cycle//TIME_interval)+1 , interval=TIME_interval)
    if not target_res is None:
        tag = nfc.tag.activate(clf, target_res)

        #IDmを取り出す
        idm = binascii.hexlify(tag.idm)
        print 'FeliCa detected. idm = ' + idm

        #sleepなしでは次の読み込みが始まって終了する
        print 'sleep ' + str(TIME_wait) + ' seconds'
        time.sleep(TIME_wait)

    clf.close()

def check_NFC():
    print  'NFC and FeliCa waiting...'
    # USBに接続されたNFCリーダに接続してインスタンス化
    clf = nfc.ContactlessFrontend('usb')

    mydict = {}
    while True:
        target_res = clf.sense(target_req_nfc,target_req_felica, iterations=int(TIME_cycle//TIME_interval)+1 , interval=TIME_interval)
        if not target_res is None:
            tag = nfc.tag.activate(clf, target_res)
            print 'TAG type: ' + tag.type

            # FeliCaカードをタッチしたら読み込みをやめる
            if tag.type == "Type3Tag":
                break
            # Type1,Type2:NFCタグ、Type4:Android端末でのNFCなど
            else:
                # NFCタグに埋めたtextを読む
                records = tag.ndef.records
                for record in records:
                    print 'NFC detected. record.text = ' + record.text
                    # str()で変換するとユニコードオブジェクトにならない
                    key = str(record.text)
                    mydict[key] = key

                print 'sleep ' + str(TIME_wait) + ' seconds'
                time.sleep(TIME_wait)
    for dic in mydict :
        print(dic)

    clf.close()

check_FeliCa()
check_NFC()

最後に

材料はほぼAmazonで揃いますし、家電量販店でも取り置きサービスなどがあるので細かいパーツを探す苦労がなくなりました。
当初iPhoneアプリで作成する予定がFeliCaの読み取りがうまくできず、ラズパイの利用となりました。
iPhoneでCore NFCでFeliCaの読み取りができればなと・・・。
http://www.itmedia.co.jp/mobile/articles/1802/08/news030_2.html

19
21
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
19
21