java连接 ZKTeco/中控 -打卡机/考勤机
连接步骤:
1. jacob-1.19版本;
2. 在resources目录下新建lib文件夹, 将jacob.jar 放入项目ib导入;
3. maven里导入本地jar包;
4.将jacob-1.19-x64.dll 放入64位 jre/bin目录下;
5.将中控考勤机sdk 的dll文件全部放入 c:\windows\system32 目录下;
6.运行cmd 注册zkemkeeper.dll —>regsvr32 c:\windows\system32\zkemkeeper.dll (也可以使用 自动注册.bat,不行的话就要放在64位里面)
7.已经配置完毕,进行代码测试;
我看了很多的文章,在这里有一个坑就是zkemkeeper.dll文件没有,这个的话就需要你找客服去要,(客服有可能给的也是错的,就要找客服给技术人员,你就找技术人员去要)而且还没人分享出来,下面就是我分享出来的 jacob-1.19.jar下载和控考勤机sdk
链接:java链接考勤机https://wwtx.lanzout.com/b04w8t9ra
提取码:asawwqe
转java连接 ZKTeco/中控 -打卡机/考勤机_zkteco java-CSDN博客https://blog.csdn.net/qq_58320145/article/details/132190661
开始教程
1.
将jacob-1.19.dll放入jdk1.8中的bin
新建一个lib然后放进去
这个代码是调用自己的lib中的jar包
com.zkem jacob 1.19 system ${project.basedir}/src/main/resources/lib/jacob.jar
这样就配置好了jacob.jar包了
1-1.
还有一个就是部署到服务器中就访问不到的一个问题
其他的不总要,只要吧enabled设置位true就可以了,说的就是访问自己的lib
true
2
下面就是将文件复制到c:\windows\system32和c:\windows\system64中,最重要的是记得注册zkemkeeper.dll
注册方法 在 zkemkeeper.dll文件夹的路径输入cmd,在命令窗口输入 regsvr32 zkemkeeper.dll
就可以进行注册
注册dll
3.
下面就是主要的代码部分了
实体类
package com.ruoyi.web.attendanceMachine; import java.util.Map; /** * 获取缓存中的考勤数据。配合readGeneralLogData / readLastestLogData使用。 * * * * @return 返回的map中,包含以下键值: * * "EnrollNumber" 人员编号 * * "Time" 考勤时间串,格式: yyyy-MM-dd HH:mm:ss * * "VerifyMode" 验证方式 1:指纹 2:面部识别 * * "InOutMode" 考勤状态 0:上班 1:下班 2:外出 3:外出返回 4:加班签到 5:加班签退 * * "Year" 考勤时间:年 * * "Month" 考勤时间:月 * * "Day" 考勤时间:日 * * "Hour" 考勤时间:时 * * "Minute" 考勤时间:分 * * "Second" 考勤时间:秒 * */ public class LogData { private String Year; private String Hour; private String InOutMode; private String Time; private String InOutMode1; private String Second; private String Minute; private String EnrollNumber; private String Day; private String Month; private String VerifyMode; private String Hms; public Map userInfo; public LogData(String year, String hour, String inOutMode, String time, String inOutMode1, String second, String minute, String enrollNumber, String day, String month, String verifyMode) { Year = year; Hour = hour; InOutMode = inOutMode; Time = time; InOutMode1 = inOutMode1; Second = second; Minute = minute; EnrollNumber = enrollNumber; Day = day; Month = month; VerifyMode = verifyMode; } public Map getUserInfo() { return userInfo; } public void setUserInfo(Map userInfo) { this.userInfo = userInfo; } public String getYear() { return Year; } public String getHms() { return Hms; } public void setHms(String hms) { Hms = hms; } public void setYear(String year) { Year = year; } public String getHour() { return Hour; } public void setHour(String hour) { Hour = hour; } public String getInOutMode() { return InOutMode; } public void setInOutMode(String inOutMode) { InOutMode = inOutMode; } public String getTime() { return Time; } public void setTime(String time) { Time = time; } public String getInOutMode1() { return InOutMode1; } public void setInOutMode1(String inOutMode1) { InOutMode1 = inOutMode1; } public String getSecond() { return Second; } public void setSecond(String second) { Second = second; } public String getMinute() { return Minute; } public void setMinute(String minute) { Minute = minute; } public String getEnrollNumber() { return EnrollNumber; } public void setEnrollNumber(String enrollNumber) { EnrollNumber = enrollNumber; } public String getDay() { return Day; } public void setDay(String day) { Day = day; } public String getMonth() { return Month; } public void setMonth(String month) { Month = month; } public String getVerifyMode() { return VerifyMode; } public void setVerifyMode(String verifyMode) { VerifyMode = verifyMode; } public LogData(){ } };
package com.ruoyi.web.attendanceMachine; import com.jacob.com.Variant; public class UserInfo { private String name; private Boolean Enabled; private String Password; private Integer Privilege; private String EnrollNumber; public Variant zw; public UserInfo(String name, Boolean enabled, String password, Integer privilege, String enrollNumber) { this.name = name; Enabled = enabled; Password = password; Privilege = privilege; EnrollNumber = enrollNumber; } public Variant getZw() { return zw; } public void setZw(Variant zw) { this.zw = zw; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Boolean getEnabled() { return Enabled; } public void setEnabled(Boolean enabled) { Enabled = enabled; } public String getPassword() { return Password; } public void setPassword(String password) { Password = password; } public Integer getPrivilege() { return Privilege; } public void setPrivilege(Integer privilege) { Privilege = privilege; } public String getEnrollNumber() { return EnrollNumber; } public void setEnrollNumber(String enrollNumber) { EnrollNumber = enrollNumber; } public UserInfo(){}; }
监听模块
package com.ruoyi.web.attendanceMachine; import com.jacob.com.Variant; import com.ruoyi.common.annotation.DataSource; import com.ruoyi.common.enums.DataSourceType; import com.ruoyi.common.utils.DateUtils; import com.ruoyi.common.utils.spring.SpringUtils; import com.ruoyi.system.service.IUserinfoService; import com.ruoyi.web.controller.mmt.UserinfoController; import org.springframework.beans.factory.annotation.Autowired; import com.ruoyi.system.domain.Userinfo; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @DataSource(value = DataSourceType.MASTER) public class SensorEvents { public IUserinfoService userinfoService; public void OnConnected(Variant[] arge){ System.out.println("当成功连接机器时触发该事件,无返回值===="); } public void OnDisConnected(Variant[] arge){ System.out.println("当断开机器时触发该事件,无返回值===="); } public void OnAlarm(Variant[] arge){ System.out.println("当机器报警时触发该事件===="+arge); } public void OnAttTransactionEx(Variant[] arge){ System.out.println("id:"+arge[0]); System.out.println("是否有效:0有效 1无效"+arge[1]); System.out.println("考勤状态:0 上班 1下班 2外出 3外出返回 4 加班签到 5 加班签退...."+arge[2]); System.out.println("验证方式 0:密码 1;指纹 15:刷脸认证"+arge[3]); System.out.println("验证时间"+arge[4]+"-"+arge[5]+"-"+arge[6]+"-"+arge[7]+":"+arge[8]+":"+arge[9]+" "+arge[10]); /*for (int i = 0; i实现代码
package com.ruoyi.web.attendanceMachine; import com.alibaba.fastjson2.JSON; import com.jacob.activeX.ActiveXComponent; import com.jacob.com.Dispatch; import com.jacob.com.DispatchEvents; import com.jacob.com.STA; import com.jacob.com.Variant; import com.ruoyi.common.utils.DateUtils; import com.ruoyi.system.domain.Userinfo; import com.ruoyi.system.service.IUserinfoService; import com.ruoyi.web.controller.mmt.Main; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.*; /** * 中控考勤机sdk函数调用类 * @author wangchao * */ public class ZkemSDK { private static ActiveXComponent zkem = new ActiveXComponent("zkemkeeper.ZKEM.1"); private Fingerprint fingerprint = null; /** * 链接考勤机 * * @param address 考勤机地址 * @param port 端口号 * @return */ public boolean connect(String address, int port) { boolean result = zkem.invoke("Connect_NET", address, port).getBoolean(); return result; } /** * 断开考勤机链接 */ public void disConnect() { zkem.invoke("Disconnect"); } /** * 读取考勤记录到pc缓存。配合getGeneralLogData使用 * * @return */ public static boolean readGeneralLogData() { boolean result = zkem.invoke("ReadGeneralLogData", 4).getBoolean(); return result; } /** * 读取该时间之后的最新考勤数据。 配合getGeneralLogData使用。//网上说有这个方法,但是我用的开发文档没有这个方法,也调用不到,我在controller中处理获取当天数据 * * @param lastest * @return */ public static boolean readLastestLogData(Date lastest) { boolean result = zkem.invoke("ReadLastestLogData", 2018 - 07 - 24).getBoolean(); return result; } /** * 获取缓存中的考勤数据。配合readGeneralLogData / readLastestLogData使用。 * * @return 返回的map中,包含以下键值: * "EnrollNumber" 人员编号 * "Time" 考勤时间串,格式: yyyy-MM-dd HH:mm:ss * "VerifyMode" 验证方式 1:指纹 2:面部识别 * "InOutMode" 考勤状态 0:上班 1:下班 2:外出 3:外出返回 4:加班签到 5:加班签退 * "Year" 考勤时间:年 * "Month" 考勤时间:月 * "Day" 考勤时间:日 * "Hour" 考勤时间:时 * "Minute" 考勤时间:分 * "Second" 考勤时间:秒 */ public static List getGeneralLogData() { Variant dwMachineNumber = new Variant(1, true);//机器号 Variant dwEnrollNumber = new Variant("", true); Variant dwVerifyMode = new Variant(0, true); Variant dwInOutMode = new Variant(0, true); Variant dwYear = new Variant(0, true); Variant dwMonth = new Variant(0, true); Variant dwDay = new Variant(0, true); Variant dwHour = new Variant(0, true); Variant dwMinute = new Variant(0, true); Variant dwSecond = new Variant(0, true); Variant dwWorkCode = new Variant(0, true); List strList = new ArrayList(); boolean newresult = false; do { Variant vResult = Dispatch.call(zkem, "SSR_GetGeneralLogData", dwMachineNumber, dwEnrollNumber, dwVerifyMode, dwInOutMode, dwYear, dwMonth, dwDay, dwHour, dwMinute, dwSecond, dwWorkCode); newresult = vResult.getBoolean(); if (true) { String enrollNumber = dwEnrollNumber.getStringRef(); //如果没有编号,则跳过。 // if (enrollNumber == null || enrollNumber.trim().length() == 0) // continue; String month = dwMonth.getIntRef() + ""; String day = dwDay.getIntRef() + ""; if (dwMonth.getIntRef() -1) { name = name.substring(0, index); } if (sName.getStringRef().length() > 4) { name = sName.getStringRef().substring(0, 4); } //如果没有名字,跳过。 if (name.trim().length() == 0) continue; UserInfo userInfo = new UserInfo(); userInfo.setEnrollNumber(enrollNumber); userInfo.setName(name); userInfo.setPassword(sPassword.getStringRef()); userInfo.setPrivilege(iPrivilege.getIntRef()); userInfo.setEnabled((Boolean) bEnabled.getBooleanRef()); userInfoList.add(userInfo); } return userInfoList; } /** * 设置用户信息 * * @param number * @param name * @param password * @param isPrivilege 0為普通用戶,3為管理員; * @param enabled 是否啟用 * @return */ public static boolean setUserInfo(String number, String name, String password, int isPrivilege, boolean enabled) { Variant v0 = new Variant(1); Variant sdwEnrollNumber = new Variant(number, true); Variant sName = new Variant(name, true); Variant sPassword = new Variant(password, true); Variant iPrivilege = new Variant(isPrivilege, true); Variant bEnabled = new Variant(enabled, true); boolean result = zkem.invoke("SSR_SetUserInfo", v0, sdwEnrollNumber, sName, sPassword, iPrivilege, bEnabled).getBoolean(); return result; } /** * 获取用户信息 * * @param number 考勤号码 * @return */ public static Map getUserInfoByNumber(String number) { Variant v0 = new Variant(1); Variant sdwEnrollNumber = new Variant(number, true); Variant sName = new Variant("", true); Variant sPassword = new Variant("", true); Variant iPrivilege = new Variant(0, true); Variant bEnabled = new Variant(false, true); boolean result = zkem.invoke("SSR_GetUserInfo", v0, sdwEnrollNumber, sName, sPassword, iPrivilege, bEnabled).getBoolean(); if (result) { Map m = new HashMap(); m.put("EnrollNumber", number); m.put("Name", sName.getStringRef()); m.put("Password", sPassword.getStringRef()); m.put("Privilege", iPrivilege.getIntRef()); m.put("Enabled", bEnabled.getBooleanRef()); return m; } return null; } /** * 获取用户信息 * * @param number 考勤号码 * @return */ public static String getUserInfoByName(String number) { Variant v0 = new Variant(1); Variant sdwEnrollNumber = new Variant(number, true); Variant sName = new Variant("", true); Variant sPassword = new Variant("", true); Variant iPrivilege = new Variant(0, true); Variant bEnabled = new Variant(false, true); boolean result = zkem.invoke("SSR_GetUserInfo", v0, sdwEnrollNumber, sName, sPassword, iPrivilege, bEnabled).getBoolean(); System.out.println(sName+"-"+sPassword+"-"+iPrivilege+"-"+bEnabled); return sName.getStringRef(); } public static Userinfo getUserInfoByNames(Userinfo userinfo) { Variant v0 = new Variant(1); Variant sdwEnrollNumber = new Variant(userinfo.getEnrollNumber(), true); Variant sName = new Variant("", true); Variant sPassword = new Variant("", true); Variant iPrivilege = new Variant(0, true); Variant bEnabled = new Variant(false, true); boolean result = zkem.invoke("SSR_GetUserInfo", v0, sdwEnrollNumber, sName, sPassword, iPrivilege, bEnabled).getBoolean(); userinfo.setEnrollNumber(String.valueOf(sdwEnrollNumber)); userinfo.setName(String.valueOf(sName)); userinfo.setPassword(String.valueOf(sPassword)); return userinfo; } //获取指纹 public static Variant GetUserTmpStr(String i) { Variant v0 = new Variant(1); byte temp = 0; Variant b = new Variant(i, true); Variant c = new Variant(1, true); Variant d = new Variant("", true); Variant e = new Variant(0, true); /* Variant dwMachineNumber = new Variant(0, true);//机器号 Variant dwEnrollNumber = new Variant(0, true);//用户号 Variant dwFingerIndex = new Variant(0, true);//指纹索引号 Variant TmpData = new Variant(0, true);//该参数返回指纹模板数据 Variant TmpLength = new Variant(0, true);//该参数返回指纹模板长度*/ boolean result = zkem.invoke("SSR_GetUserTmpStr",v0, b, c, d,e).getBoolean(); System.out.println("1:"+d.toString()); System.out.println("2:"+result); return d; } //上传指纹 public static void SetUserTmpStr(String x,Variant d) { Variant v0 = new Variant(1); Variant a = new Variant(x, true); Variant b = new Variant(2, true); Variant c = d; /* Variant dwMachineNumber = new Variant(0, true);//机器号 Variant dwEnrollNumber = new Variant(0, true);//用户号 Variant dwFingerIndex = new Variant(0, true);//指纹索引号 Variant TmpData = new Variant(0, true);//该参数返回指纹模板数据 Variant TmpLength = new Variant(0, true);//该参数返回指纹模板长度*/ boolean result = zkem.invoke("SSR_SetUserTmpStr", v0, a, b, c).getBoolean(); System.out.println("3:"+c.toString()); System.out.println("4:"+result); } //删除 public static void ReadAllTemplate() { Variant v0 = new Variant(1); // Variant dwMachineNumber = new Variant(0, true);//机器号 Variant dwEnrollNumber = new Variant("1", true);//用户号 Variant dwFingerIndex = new Variant(6, true);//指纹索引号 // Variant TmpData = new Variant(0, true);//该参数返回指纹模板数据 // Variant TmpLength = new Variant(0, true);//该参数返回指纹模板长度 boolean result = zkem.invoke("SSR_DelUserTmp", v0,dwEnrollNumber,dwFingerIndex).getBoolean(); } /** * 查詢所有/指定ID的打卡信息; * * @param userNumber * @return */ public static List getUserOneDayInfo(Object userNumber) { ZkemSDK sdk = new ZkemSDK(); Map userInfo = new HashMap(); List logDateList = new ArrayList(); //连接考勤机; boolean connect = sdk.connect("192.168.1.189", 4370); if (connect) { List generalLogDataAll = ZkemSDK.getGeneralLogData(); for (int i = 0; i而这个是中控提供的方法
好的,你已经完成了配置 考勤机/打卡机了
希望可以可怜可怜我给一个三连吧
转 java连接 ZKTeco/中控 -打卡机/考勤机_zkteco java-CSDN博客https://blog.csdn.net/qq_58320145/article/details/132190661