PYTHON CODE¶
Note
Use Python2.7 version
Note
Linux users install LAMP. Windows user install WAMP.
Note
Create a database. I have created a database named ‘fingerdb’. Create a table. I have created a table named ‘fingertb’ with fields ‘slno’,’name’ and ‘finger’
Upload to database¶
Code below uploads finger template to database:
import serial, time, datetime
import struct #Convert between strings and binary data
import sys
import os
import binascii
import mysql.connector
cnx=mysql.connector.connect(user='root',password='',host='localhost',database='fingerdb') # connect to MySql database
cur=cnx.cursor()
#ser = serial.Serial('/dev/ttyUSB0',57600) # serial communication in Linux
ser = serial.Serial("COM6", baudrate=9600, timeout=1) #serial communication in Windows
pack = [0xef01, 0xffffffff, 0x1] # Header, Address and Package Identifier
def readPacket(): # Function to read the Acknowledge packet
time.sleep(1)
w = ser.inWaiting()
ret = []
if w >= 9:
s = ser.read(9) # Partial read to get length
ret.extend(struct.unpack('!HIBH', s))
ln = ret[-1]
time.sleep(1)
w = ser.inWaiting()
if w >= ln:
s = ser.read(ln)
form = '!' + 'B' * (ln - 2) + 'H' # Specifying byte size
ret.extend(struct.unpack(form, s))
return ret
def readPacket1(): # Function to read the Acknowledge packet
time.sleep(1)
w = ser.inWaiting()
ret = []
form = 'B' * 700
s = ser.read(700)
t=binascii.hexlify(s) # convert to hex
u=t[24:]
cur.execute("insert into fingertb(name,finger) values('%s','%s')" %(name,u) ) # upadate database
cnx.commit()
v=binascii.unhexlify(u)
form1='B'*688
ret1=[]
ret1.extend(struct.unpack(form1, v))
ret.extend(struct.unpack(form, s))
def writePacket(data): # Function to write the Command Packet
pack2 = pack + [(len(data) + 2)]
a = sum(pack2[-2:] + data)
pack_str = '!HIBH' + 'B' * len(data) + 'H'
l = pack2 + data + [a]
s = struct.pack(pack_str, *l)
ser.write(s)
def verifyFinger(): # Verify Module?s handshaking password
data = [0x13, 0x0, 0, 0, 0]
writePacket(data)
s = readPacket()
return s[4]
def genImg(): # Detecting finger and store the detected finger image in ImageBuffer
data = [0x1]
writePacket(data)
s = readPacket()
return s[4]
def img2Tz(buf): # Generate character file from the original finger image in ImageBuffer and store the file in CharBuffer1 or CharBuffer2.
data = [0x2, buf]
writePacket(data)
s = readPacket()
return s[4]
def regModel(): # Combine information of character files from CharBuffer1 and CharBuffer2 and generate a template which is stroed back in both CharBuffer1 and CharBuffer2.
data = [0x5]
writePacket(data)
s = readPacket()
return s[4]
def UpChar(buf): # Upload the character file or template of CharBuffer1/CharBuffer2 to upper computer
data = [0x8,buf]
writePacket(data)
s = readPacket1()
print ("Type done to exit")
name=raw_input("Enter name : ")
while (name!='done'):
if verifyFinger():
print 'Verification Error'
sys.exit(0)
print 'Put finger',
sys.stdout.flush()
time.sleep(1)
while genImg():
time.sleep(0.1)
print '.',
sys.stdout.flush()
print ''
sys.stdout.flush()
if img2Tz(1):
print 'Conversion Error'
sys.exit(0)
print 'Put finger again',
sys.stdout.flush()
time.sleep(1)
while genImg():
time.sleep(0.1)
print '.',
sys.stdout.flush()
print ''
sys.stdout.flush()
if img2Tz(2):
print 'Conversion Error'
sys.exit(0)
if regModel():
print 'Template Error'
sys.exit(0)
if UpChar(2):
print 'Template Error'
sys.exit(0)
name=raw_input("Enter name : ")
Download to R305 fingerprint module¶
Note
After entering ‘name’, enter integer values 1,2,3.... for ‘store id’.
Warning
Entering the same ‘store id’ for differnet names will overwrite the finger templete stored.
Code below downloads the finger template from database to R305 fingerprint module:
import serial, time, datetime, struct
import sys
import os
import mysql.connector
import binascii
cnx=mysql.connector.connect(user='root',password='',host='localhost',database='fingerdb')
cur=cnx.cursor()
ser = serial.Serial("COM6", baudrate=9600, timeout=1)
pack = [0xef01, 0xffffffff, 0x1]
def readPacket():
time.sleep(1)
w = ser.inWaiting()
ret = []
if w >= 9:
s = ser.read(9) #partial read to get length
ret.extend(struct.unpack('!HIBH', s))
ln = ret[-1]
time.sleep(1)
w = ser.inWaiting()
if w >= ln:
s = ser.read(ln)
form = '!' + 'B' * (ln - 2) + 'H'
ret.extend(struct.unpack(form, s))
return ret
def readPacket1():
time.sleep(1)
w = ser.inWaiting()
time.sleep(1)
pack_str='B'* 688
cur.execute("select finger from fingertb where name='%s'"%name)
row=cur.fetchone()
srow = str(row[0])
v=binascii.unhexlify(srow)
form1='B'*688
ret1=[]
ret1.extend(struct.unpack(form1, v))
x=ret1
s = struct.pack(pack_str, *x)
ser.write(s)
if store(idno):
print 'store error'
sys.exit(0)
print "Enrolled successfully at id %d"%j
def writePacket(data):
pack2 = pack + [(len(data) + 2)]
a = sum(pack2[-2:] + data)
pack_str = '!HIBH' + 'B' * len(data) + 'H'
l = pack2 + data + [a]
s = struct.pack(pack_str, *l)
ser.write(s)
def verifyFinger():
data = [0x13, 0x0, 0, 0, 0]
writePacket(data)
s = readPacket()
return s[4]
def DownChar(buf): # download character file or template from upper computer to the specified buffer of Module
data = [0x9,buf]
writePacket(data)
s = readPacket1()
def store(id): # store the template of specified buffer (Buffer1/Buffer2) at the designated location of Flash library
data = [0x6, 0x1, 0x0, id]
writePacket(data)
s = readPacket()
return s[4]
name=raw_input('enter the name please')
idno=int(raw_input('enter the store id'))
if verifyFinger(): # Verify Password
print 'Verification Error'
sys.exit(0)
if DownChar(1):
print 'Template Error'
sys.exit(0)
Search and authenticate¶
Code below scans the finger and authenticates:
import serial, time, datetime, struct
import sys
ser = serial.Serial("COM6", baudrate=9600, timeout=1)
pack = [0xef01, 0xffffffff, 0x1]
def readPacket():
time.sleep(1)
w = ser.inWaiting()
ret = []
if w >= 9:
s = ser.read(9) #partial read to get length
ret.extend(struct.unpack('!HIBH', s))
ln = ret[-1]
time.sleep(1)
w = ser.inWaiting()
if w >= ln:
s = ser.read(ln)
form = '!' + 'B' * (ln - 2) + 'H'
ret.extend(struct.unpack(form, s))
return ret
def writePacket(data):
pack2 = pack + [(len(data) + 2)]
a = sum(pack2[-2:] + data)
pack_str = '!HIBH' + 'B' * len(data) + 'H'
l = pack2 + data + [a]
s = struct.pack(pack_str, *l)
ser.write(s)
def verifyFinger():
data = [0x13, 0x0, 0, 0, 0]
writePacket(data)
s = readPacket()
return s[4]
def genImg():
data = [0x1]
writePacket(data)
s = readPacket()
return s[4]
def img2Tz(buf):
data = [0x2, buf]
writePacket(data)
s = readPacket()
return s[4]
def search(): # search the whole finger library for the template that matches the one in CharBuffer1 or CharBuffer2
data = [0x4, 0x1, 0x0, 0x0, 0x0, 0x5]
writePacket(data)
s = readPacket()
return s[4:-1]
if verifyFinger():
print 'Verification Error'
sys.exit(-1)
print 'Put finger',
sys.stdout.flush()
time.sleep(1)
for _ in range(5):
g = genImg()
if g == 0:
break
print '.',
sys.stdout.flush()
print ''
sys.stdout.flush()
if g != 0:
sys.exit(-1)
if img2Tz(1):
print 'Conversion Error'
sys.exit(-1)
r = search()
print 'Search result', r
if r[0] == 0 :
print 'Authentication Successful'
sys.exit(0)
else:
print 'Authentication fail'
sys.exit(1)