部室の入退室管理を学生証でできるようにした話。(2)
前回↓の続きです。 kuclubdtk.hateblo.jp
今回はNFCカードリーダーで学生証の情報を読み取るところを説明します。
今回説明するのは①の部分です。
主に使用したもの:
NFCカードリーダーとRaspberryPiをUSB接続して、 RaspberryPi上でPythonを走らせます。
使うライブラリの関係上、Python2を使わざるを得ませんでした...
nfcpyの仕様については下記サイト様を参考にさせていただきました。
また強制終了や途中のエラーで終了した場合、NFCカードリーダーの使用状態をOFFにする必要があったので、
hub-ctrl を使うことで、(無理やりですが)USBポートの電源をON,OFFして再起動させています。
hub-ctrlではUSBポートを個別で指定できますが面倒だったので、他に使用するものと予定がなかったので、全指定してます。
# -*- coding: utf-8 -*- import nfc from time import sleep import fcntl import termios import sys import os import subprocess def connected(tag): global id global name global res service_code = [nfc.tag.tt3.ServiceCode(0x100B >> 6, 0x100B & 0x3f)] bc_id = [nfc.tag.tt3.BlockCode(0)] bc_name = [nfc.tag.tt3.BlockCode(1)] name = tag.read_without_encryption(service_code, bc_name) # 名前 id = tag.read_without_encryption(service_code, bc_id) # 学籍番号 res=[id,name] return False def CardRead(): while 1: try: clf = nfc.ContactlessFrontend('usb') #USB接続のNFCリーダーを開く try: clf.connect(rdwr={'on-connect': connected})#NFCリーダーを起動して,NFCリーダーのタッチ検出をします clf.close() #print res return res except nfc.tag.tt3.Type3TagCommandError:#タッチが弱くて読み取れないとき print "タッチが短すぎます" clf.close() except IOError: print "NFCリーダーの接続を確認して、再度実行してください、USBを再起動します(前回予期せぬ終了)" cmd='sudo hub-ctrl -h 0 -P 2 -p 0'#USB OFF off = subprocess.call(cmd.split()) cmd='sudo hub-ctrl -h 0 -P 2 -p 1'#USB ON on = subprocess.call(cmd.split()) print ("再起動をお待ちください") sleep(1)#これ以上早すぎると安定しない print ("再起動が完了しました") if __name__ == '__main__': CardRead()
案外、簡単に情報が取れました。 ここで面白かったのは、名前を保存している領域の制約的に ローマ字15文字以上の名前の場合ぶつ切りされていたことです。 次回はデータベース部分について書きたいと思います。