Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

はじめに

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の仕様

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

出力仕様

  • 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

nofrmm
会社の人への説明用、趣味用にまとめています。 メインはiOSまわりっぽい。Photoshop、サーバまわりと記事を散文してます。 人は自由に生きるべき。 いつか北海道の良い開発会社にご縁があれば移住したい
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした