怠惰になるために本気出す

電子工作で色々作ってます

Sesame解錠編② pasoriと接続

今回はpasoriを接続してICカードidmと呼ばれるカード毎に固有の番号が付与されているので、pasoriでその番号を読み出して鍵を開けるためのしきい値として用います。

pasoriの接続確認

まずはpasoriがラズパイで認識しているか確認していきます。
pasoriをラズパイのUSBに挿し、ターミナルを起動後に
f:id:trkn5296:20220222171616p:plain

lsusbを入力してEnter。そうするとRC-S380と表示されているので認識されていることがわかります。
f:id:trkn5296:20220223121921j:plain

nfcpyのインストール

nfcpyというライブラリが公開されているのでインストールします。ターミナルを開いて下記のコードを入力するとインストールしてくれます。

 sudo pip3 install nfcpy


終わったらGithubで公開されいるサンプルコードを利用して動作確認していきます。
同じくターミナルで

git clone https://github.com/nfcpy/nfcpy.git

ダウンロードが終わったら下記をコピペ

cd nfcpy
sudo python3 examples/tagtool.py show

リーダーが待機状態となるので交通系ICカードをかざすと色々表示されますが、赤枠部分がIDがIDmです。
f:id:trkn5296:20220223172333p:plain


この状態だとsudoをつけないとプログラムが実行した際にラズパイがpasoriを認識することができずエラーとなって止まってしまいます。
ターミナルを開いて下記を入力

sudo nano /etc/udev/rules.d/nfcdev.rules

以下の1行をコピペして「ctrl+o」→「Enter」→「ctrl+x」

SUBSYSTEM=="usb", ACTION=="add", ATTRS{idVendor}=="054c", ATTRS{idProduct}=="06c3", GROUP="plugdev" # Sony RC-S380/P

書き込みが終わったら再起動します。これでsudoなしでも実行できるようになります。

追記(22/02/22)
以前同じことをやったときは特に問題なくsudoなしで実行できていたのですが、改めてやったら何故かうまくいきませんでした。
最悪ターミナル上からsudo有でプログラムを実行してやれば動くので特段支障はありません。


pythonで指定したICカードのみ動作させる

pythonでプログラムの動作確認を行っていきます。

import binascii, nfc, time
from threading import Thread, Timer
            
idm1 = b"xxxxxxxxxxxxxxxx" #交通系ICカード1
idm2 = b"yyyyyyyyyyyyyyy" #交通系ICカード2

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

#NFC接続リクエストのための準備
#212F(Felica)で設定
target_req_ic = nfc.clf.RemoteTarget("212F")
#0003(IC cart)
target_req_ic.sensf_req = bytearray.fromhex("0000030000")

print('ICカードをタッチしてください...')

while True:
    
    #USB接続されたカードリーダーをインスタンス化
    clf = nfc.ContactlessFrontend('usb')
    #ICカード待受開始
    target_res = clf.sense(target_req_ic, iterations=int(TIME_cycle//TIME_interval)+1, interval=TIME_interval)
    
    if not target_res is None:
        tag = nfc.tag.activate_tt3(clf, target_res)
        tag.sys = 3
        
        #IDmを取り出す
        idm = binascii.hexlify(tag.idm)
        print(idm)
        
        #特定のIDmだった場合のアクション
        if idm == idm1 or idm == idm2:
            print("OK")
            
        else:
            print("NG")
            
    clf.close()
#end while

今回はIf文と呼ばれる条件式を用いて、以下の青枠が条件式でそれに対して正だった場合に緑枠の動作(OKと表示)、そうでなかった場合に赤枠の動作(NGと表示)が行われるようになっています。プログラム上の「idm」はタッチされたICカードidmなので、「idm1」と「idm2」は鍵として使いたいidm入れてやると指定したICカードのみOKと表示される仕組みが完成します。
f:id:trkn5296:20220223171527j:plain

今後は緑色の動作内容を変更してICカードが一致した場合にSesameを解錠する動作内容に変更していきます。


次回:いよいよSesame登場