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

如何使用zkemkeeper类的SSR_GetDeviceData获取新指纹设备日志?

问题:旧代码无法从新型号指纹设备获取日志

我原本使用以下代码通过zkemkeeper类的SSR_GetDeviceData方法获取指纹设备日志,代码曾正常运行,但现在针对inBIO260、ACP-260、BioClock I等新型号设备无法获取指纹日志,求解决办法。

原代码

zkemkeeper.CZKEM CZ = new zkemkeeper.CZKEM();
CZ.BASE64 = 1;
CZ.ReadMark = true;
CZ.Connect_Net(ipaddress, port);
if (CZ.SSR_GetDeviceData(machineNumber, out Buffer, 10 * 1024 * 1024, "transaction", "*", "", ""))
{
    var lines = Buffer.Split(new char[] { '\n' }, StringSplitOptions.RemoveEmptyEntries).Skip(1);
    List<MachineInfo> models = new List<MachineInfo>();
     
    foreach (var item in lines)
    {
        var values = item.Split(',');
        var model = new MachineInfo
        {
            IndRegID = Convert.ToInt32(values[1]),
            TimeStamp = Convert.ToString(values[6]),
            DateTimeRecord = Convert.ToString(new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc).AddSeconds(ToTimestamp(Convert.ToInt64(values[6]))))
        };
    }
     
    return models;
}

解决方法

1. 升级SDK控件

新型号设备可能采用了ZKTeco的更新协议,旧版zkemkeeper控件不兼容。请从ZKTeco官方获取对应设备的最新SDK,替换项目中的zkemkeeper.dll及相关依赖文件,确保版本匹配。

2. 调整SSR_GetDeviceData参数

  • 日志类型参数:将第四个参数从"transaction"改为具体的日志类型,比如"AttTransaction"(考勤日志)或"FPTransaction"(指纹验证日志),部分新型号不支持通配符"*"。
  • 字段指定:第五个参数传入需要获取的具体字段,而非"*",例如"IndRegID,TimeStamp,DateTimeRecord",避免返回冗余数据导致解析错误。
  • BASE64设置:部分新型号不需要BASE64编码,尝试将CZ.BASE64 = 0再测试。

3. 完善设备交互流程

在调用SSR_GetDeviceData前,必须确保:

  • Connect_Net返回true,设备连接成功。
  • 调用CZ.EnableDevice(machineNumber, true)激活设备交互,部分新型号需要这一步才能读取数据。
  • 操作完成后调用CZ.EnableDevice(machineNumber, false)释放设备,避免后续连接问题。

4. 适配新的日志格式

新型号设备返回的CSV日志字段顺序可能已变更,原代码中硬编码的values[1]、values[6]会导致索引越界或数据错误。建议先打印Buffer的完整内容,分析新的字段结构,再调整索引。

修改后的示例代码

zkemkeeper.CZKEM CZ = new zkemkeeper.CZKEM();
// 关闭BASE64编码(根据设备实际情况调整)
CZ.BASE64 = 0;
CZ.ReadMark = true;

List<MachineInfo> models = new List<MachineInfo>();

if (CZ.Connect_Net(ipaddress, port))
{
    // 激活设备交互
    if (CZ.EnableDevice(machineNumber, true))
    {
        // 指定具体日志类型和需要的字段
        if (CZ.SSR_GetDeviceData(machineNumber, out string Buffer, 10 * 1024 * 1024, "AttTransaction", "IndRegID,TimeStamp,DateTimeRecord", "", ""))
        {
            var lines = Buffer.Split(new[] { '\n' }, StringSplitOptions.RemoveEmptyEntries).Skip(1);
            
            foreach (var item in lines)
            {
                var values = item.Split(',');
                // 打印字段内容,确认索引对应关系
                // Console.WriteLine($"字段内容:{string.Join("|", values)}");
                
                if (values.Length >= 3)
                {
                    var model = new MachineInfo
                    {
                        IndRegID = Convert.ToInt32(values[0]), // 根据实际字段索引调整
                        TimeStamp = values[1],
                        DateTimeRecord = values[2] // 若设备直接返回格式化时间,无需转换
                    };
                    models.Add(model);
                }
            }
        }
        else
        {
            // 获取错误码排查问题
            int errorCode = 0;
            CZ.GetLastError(ref errorCode);
            Console.WriteLine($"获取日志失败,错误码:{errorCode}");
        }
        // 释放设备
        CZ.EnableDevice(machineNumber, false);
    }
    CZ.Disconnect();
}
else
{
    Console.WriteLine("设备连接失败");
}

return models;

5. 排查错误码

如果调用SSR_GetDeviceData失败,调用CZ.GetLastError(ref errorCode)获取错误码,对照ZKTeco SDK文档排查具体问题,比如权限不足、协议不匹配等。

内容的提问来源于stack exchange,提问作者Abbas Mohamed

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 11:43:16