nfcpyの使い方について思ったこと

タグ取得時の動作について

日本国内ではtype-3タグ(いわゆるところのFelicaなど)以外のタグの入手などが難しいためか Qiitaなどに掲載されているnfcpyのサンプルコードでは、基本的にtype-3タグしか考慮していないようなコードが散見される。

nfcpyについて

nfcpyではモジュール内で状態を持っているようで、タグ取得後、それぞれのタイプに応じて別のクラスからのインスタンスが生成される。 これらの確認はpythonの組み込み関数のdir()を用いることですべて取得することができる(最近この関数を知ったが、割といろんなとこで使えるのでちゃんと覚えたいと思った次第)

先述の問題について

type-3タグしか考慮していないコードだと、不意にPixel系のスマホなどをリーダーにかざすと、読み込み対象を絞っていないときではエラー落ちしてしまう。 そのため、すべてのタグの種別にはtypeというインスタンス変数のようなものを持っているため、 このtypeをキーとした辞書型で処理を変えるなり、if文で分岐するようなコードを書いておくとモノを作る時などに問題をちゃんと考慮できる状態になるかと考えられる。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import nfc

def connected(tag):
  # IDm, PMM等を出力
  print(tag)

  if tag.type == "type3tag":
    # 内容を16進数で出力する
    print(('  ' + '\n  '.join(tag.dump())))

  else:
    print("error: tag isn't Type3Tag")

# タッチ時のハンドラを設定して待機する
clf = nfc.ContactlessFrontend('usb')
clf.connect(rdwr={'on-connect': connected})

といったような感じ。("type3tag"については業務などで触れた時のあやふやな記憶に基づいてるため、実際にコードにする際にはご自身でご確認の上実装してください)