2019/04/28

RFID-TAG(125KHz)の読み書き


概要

非接触ICカードリーダー/ライター 125khz USB RFID IDカードリーダー ライター コピー機 をLinux環境のPythonスクリプトで制御してみた。
Serial protocol for a chinese RFID 125Khz reader/writer を参考に自分なり作る。
完全に後追いプロジェクトです。(笑


プログラム

file : rfid_ctrl.py
#!/usr/bin/python3

import sys
import serial
import binascii
import time

uart_dev = '/dev/ttyUSB1'

def checksum(s):
    ret = 0
    for buf in binascii.a2b_hex(s):
        ret ^= buf
    return '%02X' % ret

def seract(opcode, opdat):
    cmdlen = '%04X' % (int(len(opdat) / 2) + 3)
    cmd = 'AADD' + cmdlen + opcode + opdat + checksum(opcode + opdat)
    #print('cmd:' + cmd)
    buf_tx = binascii.a2b_hex(cmd)
    ser.write(buf_tx)
    buf_rx = ser.read()
    if buf_rx == '':
        return 'ERROR'
    time.sleep(0.1)
    buf_rx += ser.read(1000)
    res = binascii.b2a_hex(buf_rx).decode('utf-8').upper()
    #print('res:' + res)
    return res

def rfid_wr(no,id):
    if no == 2:
        type = '02'
    elif no == 3:
        type = '03'
    else:
        type = '02'

    return seract(type + '0C','00' + id) # Lock(Off/On=0x00/0x01) + ID

def rfid_rd():
    return seract('010C','')

def rfid_beep(time):
    return seract('0103','%02X' % time)

def rfid_led(ctrl):
    if ctrl == 'off':
        opdat = '00' # Off
    elif ctrl == 'red':
        opdat = '01' # On(RED)
    elif ctrl == 'green':
        opdat = '02' # On(GREEN)
    elif ctrl == 'mix':
        opdat = '03' # On(Mix)
    else:
        opdat = '00' # Off
    return seract('0104',opdat)

args = sys.argv                                                                 
argc = len(args)                                                                

if (argc != 2):
    print('Usage: %s [-r] [ID]' % args[0])
    print('-r : Read')
    print('ID = 0123456789')
    print(' ex. 1F000013ED')
    quit()

id = args[1]
if id != '-r' and len(id) != 10:
    print('Error:ID length is wrong')
    quit()

ser = serial.Serial(uart_dev, 38400, timeout=0.1)
rfid_led('green')

if id == '-r':
    # --- Read ---
    ret = rfid_rd()
    sta = ret[6*2:6*2+2]
    rid = ret[7*2:12*2]
    if sta == '00':
        print(rid)
        rfid_beep(10)
    else:
        print("ERROR")
        rfid_beep(100)
else:
    # --- Write ---
    ret = rfid_wr(2,id)

    ret = rfid_rd()
    sta = ret[6*2:6*2+2]
    rid = ret[7*2:12*2]
    if sta == '00' and id == rid:
        print("OK")
        rfid_beep(10)
    else:
        print("NG")
        ret = rfid_wr(3,id)
        ret = rfid_rd()
        sta = ret[6*2:6*2+2]
        rid = ret[7*2:12*2]
        if sta == '00' and id == rid:
            print("OK")
            rfid_beep(10)
        else:
            print("ERROR")
            rfid_beep(100)

time.sleep(0.1)
rfid_led('red')
ser.close()


実行結果

書き込み

kawasan@cyobi3:~/usr/src/python/RFID$ ./rfid_ctrl.py 1F00001308
OK
読み出し
kawasan@cyobi3:~/usr/src/python/RFID$ ./rfid_ctrl.py -r
1F00001308