LoginSignup
3
4

More than 3 years have passed since last update.

Python3 でFelicaのIDmを読み取って記録する

Last updated at Posted at 2019-06-27

概要

sony RC-S380を購入したので遊んでみました。

環境

  • MAC
  • Python3
  • RC-S380

参考 

この記事のsimple sampleを使わせていただきます。

Raspberry PiでFelicaのIDmを表示する

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がいっぱいです
カードをタッチしてください

これから 

一定時間が経過して同じカードをタッチしたら削除するようにしたい

3
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
4