今回は、USB接続で動作する「Felica」のリーダー・ライターの接続確認です。
「Felica」はソニー社が開発した「非接触型ICカード」です。
非常に様々なところで使用され、現代の生活には欠かせないものとなっているでしょう。
使用するのは手元にあった古い端末ですが、おそらくは新しい端末でも同様に使用できると思います。
今回の目的は、USB接続し、カードやスマホをスキャン、IDを取得するまでです。
1. 使用する端末
手元にあるのは、この端末です。
古いものですが、今回の目的を達成することはできます。
|
2. 接続確認
接続方法はUSB端子に指すだけです。
正しく認識しているかは、以下のコマンドにて。
認識されていれば、「Sony Corp. FeliCa S310 [PaSoRi]」と表示されます。
lsusb
3. ライブラリなどのインストール
外部ライブラリをインストール、Pythonから使えるようにセットアップします。
- まずは、任意のフォルダに新しいフォルダを作成します。(例として、「pasori」とします)
- 「LXTerminal」を開き、作成されたフォルダに移動します。(「cd」コマンド)
- 以下のコマンドを実行し、ライブラリなどをインストールします。(「libusb」と「libpafe」)
sudo apt-get install libusb-dev git clone https://github.com/rfujita/libpafe.git cd libpafe ./configur make sudo make install
4. 動作確認
うまくインストールできたか確認します。
「LXTerminal」で「pasori」の下の「libpafe」フォルダの下、「tests」フォルダに移動し、以下コマンドで実行します。
動作できていれば、何行か表示され、「sucess」と表示されます。
これで、「sudo」(管理者権限)で実行できることが確認できます。
sudo ./pasori_test
5. 動作確認(非管理者権限)
プログラムを管理者権限で動作させるのは不便ですので、非管理者権限でも動作できるように設定します。
以下の内容でできますが、内容としては設定ファイルを作って、設定を書き込み再起動です。
1. 「60-libpafe.rules」を新規作成する
sudo nano /lib/udev/rules.d/60-libpafe.rules
2. 作成した「60-libpafe.rules」を編集する。
("054c"は、「lsusb」コマンドで確認できる「ID」の":"の前の値、
"006C"は、同じく「lsusb」コマンドで確認できる「ID」の":"の後ろの値です。)
ACTION!="add", GOTO="pasori_rules_end"
SUBSYSTEM=="usb_device", GOTO="pasori_rules_start"
SUBSYSTEM!="usb", GOTO="pasori_rules_end"
LABEL="pasori_rules_start"
ATTRS{idVendor}=="054c", ATTRS{idProduct}=="006c", MODE="0664", GROUP="plugdev"
LABEL="pasori_rules_end"
3. 再起動する。
4. 先ほどの動作確認と同様、「LXTerminal」で「pasori」の下の「libpafe」フォルダの下、「tests」フォルダに移動し、以下コマンドで実行します。
「sudo」は不要です。
うまくいっていれば、先ほどの「sudo」を付けた結果と同じになります。
./pasori_test
6. Pythonプログラミング
準備ができましたので、Pythonで組んだプログラムでIDを読込んでみましょう。
VisualStudioCodeでリモート接続して実行可能です。
スマホなどをリーダーにかざして実行すると、16進数の16桁の番号がターミナルに表示されます。
違うカードやスマホに変えると表示される値が変わり、何も乗せないと「0000000000000000」と表示されるかと思います。
# -*- coding: utf-8 -*- # 日本語コメントをエラーとしないように、UTF-8で保存 # 使用するライブラリのインポート from ctypes import * # 定数 FELICA_POLLING_ANY = 0xffff # ライブラリの読込 libpafe = cdll.LoadLibrary("/usr/local/lib/libpafe.so") # 初期化 libpafe.pasori_open.restype = c_void_p pasori = libpafe.pasori_open() libpafe.pasori_init(pasori) libpafe.felica_polling.restype = c_void_p felica = libpafe.felica_polling(pasori, FELICA_POLLING_ANY, 0, 0) # 読込 idm = c_ulonglong() libpafe.felica_get_idm.restype = c_void_p libpafe.felica_get_idm(felica, byref(idm)) # 16進表記で表示 print("%016X" % idm.value) # 後始末 libpafe.free(felica) libpafe.pasori_close(pasori)