概要
sony RC-S380を購入したので遊んでみました。
環境
- MAC
- Python3
- RC-S380
参考
この記事のsimple sampleを使わせていただきます。
Ctrl-cで終了できるようにする
ループ内に以下の記述をしました。
import signal
signal.signal(signal.SIGINT,signal.SIG_DFL)
外部のファイルからリストを読み書きする
この記事を参考にしてIDmのリストを外部ファイルに保存するようにしました。
pythonでlistをファイルに保存し、読み込む方法(numpyも同様!
仕様
- 新しいカードをタッチしたらidm_list.txtに書き込む
- すでにタッチしたことのあるカードなら"すでに登録されています"
- 登録したカードの数がMAX_ID_NUMに達したら"リストがいっぱいです"
書いたコード
import binascii
import nfc
import signal
class MyCardReader(object):
def on_connect(self, tag):
print ("読み取り中")
self.idm = binascii.hexlify(tag.idm)
return True
def read_idm(self):
clf = nfc.ContactlessFrontend('usb')
try:
clf.connect(rdwr = {'on-connect': self.on_connect})
finally:
clf.close()
class ListManagement:
MAX_ID_NUM = 2
def write_list(self,list):
f = open('idm_list.txt', 'w')
for x in list:
f.write(str(x) + "\n")
f.close()
def read_list(self,list):
f = open('idm_list.txt', 'r')
for x in f:
list.append(x.rstrip("\n"))
f.close()
def edit_list(self,list,new_idm):
if new_idm in list:
print ("すでに登録されています")
elif len(list) >= self.MAX_ID_NUM:
print ("リストがいっぱいです")
else:
print(str(new_idm) + "を追加します")
list.append(new_idm)
self.write_list(list)
if __name__ == '__main__':
cr = MyCardReader()
lm = ListManagement()
idm_list = []
lm.read_list(idm_list)
while True:
print ("カードをタッチしてください")
cr.read_idm()
print ("カードのID: ",end='')
new_idm = cr.idm
print (new_idm)
lm.edit_list(idm_list,new_idm)
# Ctrl-Cで終了するまで待機し続ける
signal.signal(signal.SIGINT,signal.SIG_DFL)
実行結果
カードのIDは適当に変えて書いています。
カードをタッチしてください
読み取り中
カードのID: b'01010910231b3e0f'
b'01010910231b3e0f'を追加します
カードをタッチしてください
読み取り中
カードのID: b'012e4529359755b7'
b'012e4529359755b7'を追加します
カードをタッチしてください
読み取り中
カードのID: b'012e3d198b4d6f8a'
listがいっぱいです
カードをタッチしてください
これから
一定時間が経過して同じカードをタッチしたら削除するようにしたい