電気通信工学研究会公式ブログ

関西大学の公認サークル、電気通信工学研究会のブログです。

部室の入退室管理を学生証でできるようにした話。(2)

前回↓の続きです。   kuclubdtk.hateblo.jp

今回はNFCカードリーダーで学生証の情報を読み取るところを説明します。

  f:id:kuclubdtk:20190210212021p:plain

 今回説明するのは①の部分です。

 

主に使用したもの:

  1. python2.7
  2. Sony NFC/FeliCaリーダー PaSoRi(パソリ)RC-S380/S
  3. RaspberryPi 3B

NFCカードリーダーとRaspberryPiをUSB接続して、 RaspberryPi上でPythonを走らせます。  

使うライブラリの関係上、Python2を使わざるを得ませんでした...

nfcpyの仕様については下記サイト様を参考にさせていただきました。

www.takunoko.com

また強制終了や途中のエラーで終了した場合、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文字以上の名前の場合ぶつ切りされていたことです。 次回はデータベース部分について書きたいと思います。