如何使用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
相关产品推荐
相关产品推荐

