前言:前几天项目改造,需要将中控702设备集成到网站后台上去;找官方在线客服、电话客服、售后技术QQ都表示只提供C#语言的Demo,无奈只能去找度娘各种解决方案,网上相关教程较多 也挺杂的,最后终于好了!
借鉴:
https://blog.csdn.net/qq_24511731/article/details/55049918?locationNum=9&fps=1
前期准备:先尝试中控考勤软件是否能正常连接:如果Zk Time都没有搞定,先去联系中控官网客服解决。
- jacob-1.18版本
- jdk1.732位
- 将jacob.jar 放入项目 WEB-INFO/lib下导入
- 将jacob-1.18-x64.dll 放入32位 jdk/bin目录下,我的是:C:\Program Files (x86)\Java\jdk1.7.0_79\bin;
- 将中控考勤机sdk 的dll文件全部放入 c:\windows\syswow64 目录下(我的是64位系统,32位的话没测试,放入system32目录下);
- 运行cmd 注册zkemkeeper.dll —>regsvr32 c:\windows\syswow64\zkemkeeper.dll
下载DEMO包:中控JavaDemo资源
详细:
附四个类:
1:ZkemUtils工具类:主要是一些常用的方法,
如:
1: 获取所有用户信息----getUserInfo
2: 根据单个用户ID获取用户信息----getUserInfoByNumber
3: 创建、修改用户信息----setUserInfo
4: 获取当天打卡信息----getUserOneDayInfo(Object userNumber )传入“用户ID”只返回当天当前用户的打卡信息,传“null”返当天所有的打卡信息
5:删除用户信息----delectUserById(String dwEnrollNumber)传入需要删除的用户ID。
使用前先在构造快中配置考勤机的IP和端口
ZkemUtils工具类:
package com.zt;
import cn.hutool.core.date.DateUtil;
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.zt.po.LogData;
import com.zt.po.UserInfo;
import java.util.*;
public class ZkemSDKUtils {
public static void main(String[] args) {
ZkemSDKUtils sk = new ZkemSDKUtils();
boolean flag = readGeneralLogData();
List<LogData> userOneDayInfo = getUserOneDayInfo(null);
System.out.println(userOneDayInfo.toString());
boolean auth = ZkemSDKUtils.setUserInfo("6", "唐涛", null, 0, true);
System.out.println(auth);
List<UserInfo> userInfo = ZkemSDKUtils.getUserInfo();
System.out.println(userInfo.toString());
regEvent();
}
{
boolean connect = connect("192.168.1.18", 4370);
}
//zkemkeeper.ZKEM.1 为zkemkeeper.dll 注册成功后 在注册表可以查看:HKEY_CLASSES_ROOT最下面
private static ActiveXComponent zkem = new ActiveXComponent("zkemkeeper.ZKEM.1");
/**
* 连接考勤机
*
* @param address 考勤机地址
* @param port 端口号
* @return
*/
public static boolean connect(String address, int port) {
boolean result = zkem.invoke("Connect_NET", address, port).getBoolean();
return result;
}
/**
* 启动事件监听
*/
public static void regEvent(){
zkem.invoke("RegEvent", new Variant(1), new Variant(1));
zkem.invoke("ReadRTLog", new Variant(1));
zkem.invoke("GetRTLog", new Variant(1));
new DispatchEvents(zkem.getObject(), new SensorEvents());
new STA().doMessagePump();
}
/**
* 读取考勤记录到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" 考勤