You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 16:27:22