指纹识别这个模块吃灰好几年了,记得也就买回的时候鼓捣了一阵子,差不多能用了就放那了,这段时间比较闲暇,就有心把一些笔记记录啥的搬到CSDN上来,考虑到CSDN搬运工比较多,基础资料多但是真实开发使用总是差点意思,那我就都记录测试开发过程吧,如果有项目也会作为笔记记录,能不能公开…写完到时候再说。
as608 模块,肉手出镜~
嗯设备一出来就有一个坑!他的客服给的文档和设备实际接线位置不匹配~也不知道是我买错了型号,客服发错了,算了 反正我也就用四根火零TX,RX找到就行了。
设备有八个针,咱们只用并排4个,V+ 3.3v
rx-tx 交叉接线
GND 就可以了。
嗯,点亮了,应该没坏~
吐槽一下:手册写那么厚,看起来多费劲,我等一般人员给个快速开始就能满足我们的要求了。这次就是怎么简单实现怎么来。
那么,我这次就写一个类包含功能为:
- 注册指纹
- 查询指纹
- 删除指定指纹
- 清空指纹库
- 配套一个btree数据库用来管理指纹和用户匹配,作为考勤机设备的预备接口。
- 有无手指触碰检测窗口的检测,作自动触发
- 特殊的逻辑:注册指纹前应该先调用查询指纹确定指纹没有注册再注册避免一个指纹多个指纹ID出现。。。。虽然这么说,貌似也不太好避免。反正动作是有的,行不行就看运气了。(毕竟有的人手指起皮,神仙也没办法)
from machine import UART
import time,struct,btree
class As608(object):
def __init__(self,u1):
self.data0 = b'\xef\x01\xff\xff\xff\xff\01\x00\x03\x01\x00\x05' #手指检测指令
self.class_all_data = b'\xef\x01\xff\xff\xff\xff\01\x00\x03\x0d\x00\x11' #手指检测指令
self.login_data = b'\xef\x01\xff\xff\xff\xff\01\x00\x03\x10\x00\x14' #手指检测指令
self.search_data = b'\xef\x01\xff\xff\xff\xff\01\x00\x03\x11\x00\x15' #手指检测指令
self.del_one=b'\xef\x01\xff\xff\xff\xff\01\x00\x07\x0c' #删除指令的指令头,后边需要拼接2字节ID号2字节删除个数2字节校验和,校验和从4个FF后到校验指令前
self.u1=u1
def del_numid(self,num): #删除指纹,输入指纹序号(正整数)
self.u1.read()
data = self.del_one+struct.pack('>h',num)+b'\x00\x01'
data_list = struct.unpack('%db'%len(data[6:]),data[6:])
data=data+struct.pack('>h',sum(data_list))
self.u1.write(data)
time.sleep(1)
rec = self.u1.read()
if rec[-3:-2] == b'\x00':
print('删除了%d号指纹'%num)
return 1
else:
return 0
def write_btree(self,b_id,b_name): #传入参数必须是二进制字符串例如 b'1',b'gao'
try:
f = open("mydb", "r+b")
except OSError:
f = open("mydb", "w+b")
db = btree.open(f)
db[b_id] =b_name
db.flush()
db.close()
f.close()
def read_btree(self,b_id): #传入参数必须是二进制字符串例如 b'1',有返回值
try:
f = open("mydb", "r+b")
except OSError:
f = open("mydb", "w+b")
db = btree.open(f)
name = db.get(b_id)
db.close()
f.close()
return name
def finger (self): #手指有无检测,有返回1,无返回0
self.u1.read()
self.u1.write(self.data0)
time.sleep(1)
rec = self.u1.read()
if rec[-3:-2] == b'\x00':
print('检测到手指')
return 1
else:
return 0
def clear_all(self): #清空指纹库
self.u1.read()
self.u1.write(self.class_all_data)
time.sleep(1)
rec = self.u1.read()
if rec[-3:-2] == b'\x00':
print('指纹库全部清除')
import os
os.remove('mydb')
return 1
else:
return 0
def login(self,into_name=b''): #注册手指,先进行查询如果没有记录再去注册。
ok=self.search()
print(ok)
if ok == 0:
self.u1.read()
self.u1.write(self.login_data)
time.sleep(1)
rec = self.u1.read()
auth_code=rec[-5:-4] #提取确认码
if auth_code == b'\x00':
page_id = rec[-4:-2]
page_id = struct.unpack('>h',page_id)[0]
print(page_id)
self.write_btree(str(page_id),into_name)
print('注册成功')
return [1,page_id] #成功:返回[1,注册ID]
else:
print('注册失败')
return 0
else:
print('此手指已经注册过了')
def search(self): #查询手指并成功返回[1,注册的ID号,得分]
self.u1.read()
self.u1.write(self.search_data)
time.sleep(1)
rec = self.u1.read()
auth_code=rec[-7:-6] #提取确认码
if auth_code == b'\x00':
page_id = rec[-6:-4] # id值
page_id = struct.unpack('>h',page_id)[0]
score = rec[-4:-2] #得分
data_btree=self.read_btree(str(page_id))
print(page_id,score,data_btree)
return [1,page_id,score,data_btree]
else:
print('没有这个记录')
return 0
if __name__=='__main__':
u1=UART(1,57600,tx=22 ,rx=23 )
a=As608(u1)
a.finger() #检测手指,返回1或0
id=a.search() #验证手指 ,有返回
#a.del_numid(1) #删除指纹,输入指纹序号(正整数)
#a.login(name) #注册新手指,可输入名字并存入数据库,
这样可以显示指纹和人名(类似指纹考勤机功能的指纹和人对应),
也可以不输入(默认为空)只确定有这个指纹就行,作为指纹锁使用。
用法:上面的类保存为一个叫as608.py的文件放在主程序同级目录下,然后在主程序中按照下面的方法写着用。
from as608 import As608
from machine import UART
u1=UART(1,57600,tx=22 ,rx=23 )
a=As608(u1)
a.finger() #检测手指,返回1或0
id=a.search() #验证手指 ,有返回
#a.del_numid(1) #删除指纹,输入指纹序号(正整数)
#a.login(name) #注册新手指,可输入名字并存入数据库,这样可以显示指纹和人名(类似指纹考勤机功能的指纹和人对应),也可以不输入(默认为空)只确定有这个指纹就行,作为指纹锁使用。
养成好习惯,收工截图