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

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

# 使用したデバイス
[Raspberry Pi3](https://www.amazon.co.jp/s/?keywords=raspberry%20pi%203%20model%20b%2B)
[PaSoRi RC-S380](https://www.amazon.co.jp/s/?keywords=rc-s380)
[NFCタグ](https://www.amazon.co.jp/s/ref=nb_sb_noss_2?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&url=search-alias%3Daps&field-keywords=NFC%E3%82%BF%E3%82%B0&rh=i%3Aaps%2Ck%3ANFC%E3%82%BF%E3%82%B0)

## Raspberry Pi3
[VNC Viewer](https://www.realvnc.com/en/connect/download/viewer/)経由でコードを書いていたのでWifi（通常時）とイーサネットでの有線接続（Raspberry Pi設定）、PaSoRiを使うを理由に使ったものです。

<img width="204" alt="スクリーンショット 2018-07-05 5.58.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/12362/cb52b182-8f2d-a3c9-86a4-0034ab9552a2.png">

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

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

## NFCタグ
カード状の板にNFCタグのシールを貼ったり、[板状のNFC](https://www.amazon.co.jp/dp/B079K83CB3/ref=sspa_dk_detail_0?psc=1&pd_rd_i=B079K83CB3&pf_rd_m=AN1VRQENFRJN5&pf_rd_p=2699433929173063805&pf_rd_r=196D32YZGYD5981JCJ6Z&pd_rd_wg=FIGbQ&pf_rd_s=desktop-dp-sims&pf_rd_t=40701&pd_rd_w=GPN6u&pf_rd_i=desktop-dp-sims&pd_rd_r=f1799ad0-7fca-11e8-b8ba-43a31ee3b6d6)が安くなっているようです。

# 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を入れた方がいいかなとかは別途進めていただけると。

```py
# 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