Python module for serial communication with RFIDGeek boards and possibly other RFID boards based on the TI TRF7970A chip
Switch branches/tags
Nothing to show
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Failed to load latest commit information.
rfidgeek [#1] Document and make termcolor optional Jan 2, 2018
requirements.txt Add functionality to write tags too, untested Mar 25, 2013

PyRFIDGeek is a python package for reading and writing ISO 15693 cards following the Danish RFID data model for libraries, using serial communication to RFIDGeek boards (tested with RFIDUARTUSB7970 from RFIDGeek) and possibly other boards based on the TI TRF7970A chip, such as TI's Evaluation Module (EVM). In addition, it can scan for ISO14443A/B cards and return their UIDs, but there's no read/write support for ISO14443 or Mifare (pull requests are welcome :))

To install from PyPI:

pip install rfidgeek


If you haven't already, you might need to install the CP210x USB to UART Bridge VCP Drivers first.

You then need to find out the name of the virtual com port the RFID board is connected to. On Mac OS , it's most likely /dev/tty.SLAB_USBtoUART. If not, look for similar names under /dev/. On Windows, it will be COMx, where x is some number. Check device manager or scan through the ports to find x.

Once you have the COM port name, you can initialize PyRFIDGeek like so:

from rfidgeek import PyRFIDGeek, ISO14443A, ISO15693

rfid = PyRFIDGeek(serial_port='/dev/tty.SLAB_USBtoUART')

There's additional serial port options that can be changed, but most likely the defaults will do fine.


See also the example_*.py files.

Scanning for ISO 14443 and 15693 tags:

for protocol in [ISO14443A, ISO15693]:
    for uid in rfid.inventory():
        print('Found {} tag: {}', protocol, uid)


Reading ISO 15693 tags


for uid in rfid.inventory(single_slot=False):
    item = rfid.read_danish_model_tag(uid)
    print ' # Item id: %s (part %d of %d)' % (item['id'], item['partno'], item['nparts'])
    print '   Country: %s, library: %s' % (item['country'], item['library'])
    if item['crc_ok']:
        print '   CRC check successful'
        print '   CRC check failed'


Writing ISO 15693 tags

uids = rfid.inventory()

for partno, uid in enumerate(uids):
    item = {
        'partno': partno,
        'nparts': len(uids),
        'country': 'NO',
        'library': '1030310',   # ISIL
        'id': '75K110086'       # Document id
    if rfid.write_danish_model_tag(uid, item):
        print 'Wrote tag %d of %d' % (partno, len(uids))
        print 'Write failed, please try again'



To see all messages sent and received, add a logging handler before you initialize the RFIDGeek module, such as StreamHandler that prints to stderr by default:

import logging
logger = logging.getLogger()
ch = logging.StreamHandler()


Optionally, install termcolor (pip install termcolor) to get color coded messages.