如何将Zk4500采集的指纹模板存入ZKTeco K50生物识别考勤机
问题原因
- 模板编码不匹配:Java侧
FingerprintSensorEx.BlobToBase64输出的是Base64编码的模板字符串,但是你调用的Finger.json_unpack方法默认将模板字段按十六进制格式解码,解码得到的二进制内容完全错误,考勤机无法识别无效的指纹模板。 - 用户匹配逻辑错误:你提前调用
conn.set_user创建了user_id为6的用户,但是后续遍历用户列表时,判断条件为user.user_id == "3",永远找不到目标用户,保存模板的逻辑根本不会执行。 - 缺少设备操作收尾:你调用
conn.disable_device锁定设备操作后,没有执行conn.enable_device恢复设备状态,也没有正确断开连接,会导致操作未落地到考勤机的持久化存储。
解决方法
- 修正模板编码转换逻辑:将Java侧输出的Base64模板先做Base64解码得到二进制内容,再传入Finger对象,不需要走默认按十六进制解码的
json_unpack方法。 - 修正用户匹配规则:将匹配条件修改为你实际要绑定指纹的用户ID,避免找不到目标用户。
- 补全设备操作流程:操作完成后恢复设备正常状态,最后主动断开连接。
修正后的Python代码示例
import base64 from zk import ZK, const from zk.finger import Finger conn = None try: zk = ZK('192.168.10.201', port=4370, timeout=5, password=0, force_udp=False, ommit_ping=False) conn = zk.connect() conn.disable_device() # 创建用户(如果已存在可以跳过该步骤) conn.set_user(uid=6, name='ahmed f', privilege=const.USER_ADMIN, password='12345678', group_id='', user_id='6', card=0) # 替换为Java侧实际输出的Base64模板字符串 fingerPrintTemplateForDB1 = "替换为Java输出的Base64模板内容" # Base64解码得到二进制模板 template_bin = base64.b64decode(fingerPrintTemplateForDB1) # 构造Finger对象,fid取值0-9,对应同一用户最多10枚指纹 my_finger = Finger(uid=6, fid=0, valid=1, template=template_bin) # 找到目标用户 target_user = None users = conn.get_users() for user in users: # 匹配你要绑定的用户ID if user.user_id == "6": target_user = user break if target_user: conn.save_user_template(target_user, [my_finger]) print("指纹模板保存成功") else: print("未找到目标用户") finally: if conn: conn.enable_device() conn.disconnect()
额外注意事项
- 指纹fid取值范围为0-9,对应同一个用户最多10枚指纹,不要重复使用同一个fid给同一用户的多枚指纹。
- ZK4500输出的标准ZKTeco指纹模板长度为604字节,你可以打印
len(template_bin)确认长度是否符合,长度错误的模板也会被考勤机拒绝。 - 如果还是失败,可以先从K50考勤机上录入一枚指纹,调用
conn.get_user_template()导出模板,和你ZK4500输出的模板做对比,确认格式一致。
内容的提问来源于stack exchange,提问作者Muzamil
相关产品推荐
相关产品推荐

