如何用Python及PyZK为ZKTeco设备添加/读取RFID卡号?
ZKTeco Uface800 Plus 基于PyZK实现RFID卡读取与绑定
一、基础RFID卡号读取
先实现最直接的卡号读取功能,让设备等待用户刷卡并返回卡号:
from zk import ZK def read_rfid_card(zk): zk.enable_device() print("请在设备上刷RFID卡...") try: # 等待刷卡,超时30秒 card_info = zk.wait_for_card(timeout=30) if card_info: card_number = card_info['card'] print(f"读取到RFID卡号: {card_number}") return card_number print("超时未刷卡") return None except Exception as e: print(f"读取失败: {str(e)}") return None # 使用示例 if __name__ == "__main__": zk = ZK('192.168.1.201', port=4370, timeout=5) try: zk.connect() zk.disable_device() # 禁用设备本地按键操作,避免干扰 card_num = read_rfid_card(zk) if card_num: # 可选:直接绑定到指定用户 zk.set_user(uuid=1, card=card_num, name="测试用户") print("卡号已绑定至用户UUID=1") finally: zk.disconnect()
二、实现enroll_card(uuid)函数绑定指定用户
这个函数会先校验用户是否存在,再引导用户刷卡完成绑定:
def enroll_card(zk, user_uuid): # 检查目标用户是否存在 target_user = zk.get_user(user_uuid) if not target_user: print(f"UUID={user_uuid}的用户不存在,请先创建用户") return False print(f"请为用户【{target_user.name}】(UUID:{user_uuid})刷RFID卡...") zk.enable_device() try: card_info = zk.wait_for_card(timeout=30) if not card_info: print("超时未刷卡,录入终止") return False card_number = card_info['card'] # 更新用户的RFID卡号信息 zk.set_user( uuid=user_uuid, card=card_number, name=target_user.name, privilege=target_user.privilege, password=target_user.password ) print(f"成功绑定卡号: {card_number} 至用户【{target_user.name}】") return True except Exception as e: print(f"录入失败: {str(e)}") return False # 使用示例 if __name__ == "__main__": zk = ZK('192.168.1.201', port=4370, timeout=5) try: zk.connect() zk.disable_device() # 为UUID=2的用户录入RFID卡 enroll_card(zk, 2) finally: zk.disconnect()
关键注意事项
- 确保PyZK为最新版本:执行
pip install --upgrade pyzk避免兼容性问题 - 设备IP、端口需与实际配置一致,默认端口为4370
- 若
wait_for_card方法无效,可尝试事件监听方式替代:def listen_card_event(zk): zk.start_heartbeat() while True: event = zk.wait_for_event() if event and event['type'] == 'card': return event['data']['card'] - 操作完成后记得调用
disconnect()关闭设备连接
内容的提问来源于stack exchange,提问作者nacer
相关产品推荐
相关产品推荐

