ZKTeco 中控考勤机M300 plus java开发步骤 使用jacob 调用中控考勤机dll(详细配置)

  • 开发前的准备工作
  • 进行java代码测试
  • 以下为一些用到的操作方法
    • 这也只是一部分的操作方法,官方文档中提供了很多的开发接口方案,具体用到还要具体的研究

我们公司最近在做中控智慧的一个考勤机的系统,主要目的是通过我们的系统对考勤机的一些操作,以及获取到考勤机的数据。有一些开发的经验分享出来,以下是通过java使用jacob调用中控考勤机sdk方法。

开发前的准备工作

1、jacob-1.19版本
注意使用的本机jdk版本号为1.8以上必须使用jacob-1.19,其他版本不适合高版本jdk,下载链接:https://sourceforge.net/projects/jacob-project/

2、jdk1.8 64位(注意使用的jdk和jacob的操作位数要相同,负责会报错);

3、普通导入jar包方案:将jacob.jar 放入项目 WEB-INFO/lib下导入:
我是使用的是maven管理的,所以我直接导入pom文件:

<dependency><groupId>com.jacob</groupId><artifactId>jacob</artifactId><version>1.19</version>
</dependency>

此处的导入jar文件应该会报错,所以我直接将jacob-1.19.jar放在所对应的目录位置。可能版本号会爆红,但不影响使用。
4、将jacob-1.19-x64.dll 放入 jdk/bin目录下以及jdk/jre/bin,我的是:D:\Java\jdk1.8\bin;D:\Java\jdk1.8\jre\bin;
另外我为了以防万一,也将c:\windows\syswow64;C:\Windows\System32 目录下存放一份。

5、将中控考勤机官方提供的sdk 的dll文件全部放入 c:\windows\syswow64 目录下(我的是64位系统,32位的话没测试,放入system32目录下);
中控官网的sdk下载链接:https://www.zkteco.com/cn/download_catgory/45.html

6、这里很重要一定要,一定要管理员身份运行cmd
注册zkemkeeper.dll —>

regsvr32 c:\windows\syswow64\zkemkeeper.dll

只有注册成功才可以连接到考勤机

7、成功后如下提示:

进行java代码测试

然后进行连接测试,我使用的是内网,需要将考勤机的局域网考勤方式打开。

import com.jacob.activeX.ActiveXComponent;
import com.jacob.com.ComThread;
import com.jacob.com.Dispatch;
import com.jacob.com.Variant;import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;/*** 中控考勤机sdk函数调用类* @author zhangwei**/
public class ZkemSDK {//zkemkeeper.ZKEM.1private static ActiveXComponent zkem = new ActiveXComponent("zkemkeeper.ZKEM.1");/*** 链接考勤机* @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");}
}
/*** 考勤机链接测试* @author wangchao**/
public class Main {public static void main(String[] args) {ZkemSDK sdk = new ZkemSDK();boolean  connFlag = sdk.connect("192.168.1.100", 4370);System.out.println("conn:"+connFlag);//输出位true即为连接成功,否则请检查网络问题}
}

以下为一些用到的操作方法

 /*** 获取用户信息* @param number 考勤号码* @return*/public Map<String,Object> 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<String,Object> m = new HashMap<String, Object>();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* @param name* @param password* @param isPrivilege* @param enabled* @return*/public 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 cardNo*/public boolean setCardNumber(String cardNo){//卡号Variant cardnumber = new Variant(cardNo,true);//先设置卡号信息boolean setStrCardNumber = zkem.invoke("SetStrCardNumber", cardnumber).getBoolean();//System.out.println("setStrCardNumber:"+setStrCardNumber);return setStrCardNumber;}/*** 删除考勤机对应用户* @param number 工号* @return*/public boolean deleteUserInfoByNumber(String number){//机器号Variant v0 = new Variant(1);//工号Variant cardnumber = new Variant(number,true);//指纹索引Variant backupNumber = new Variant(12,true);boolean deleteEnrollDataExt = zkem.invoke("SSR_DeleteEnrollDataExt",v0, cardnumber,backupNumber).getBoolean();
//        System.out.println("deleteEnrollDataExt:"+deleteEnrollDataExt);return deleteEnrollDataExt;}/*** 读取考勤记录到pc缓存。配合getGeneralLogData使用** @return*/public boolean readGeneralLogData() {boolean result = zkem.invoke("ReadGeneralLogData", 1).getBoolean();return result;}/*** 获取缓存中的考勤数据。配合readGeneralLogData / readLastestLogData使用。** @return 返回的map中,包含以下键值:* "EnrollNumber"   人员编号* "Time"           考勤时间串,格式: yyyy-MM-dd HH:mm:ss* "VerifyMode"* "InOutMode"* "Year"          考勤时间:年* "Month"         考勤时间:月* "Day"           考勤时间:日* "Hour"            考勤时间:时* "Minute"        考勤时间:分* "Second"        考勤时间:秒*/public List<Map<String, Object>> getGeneralLogData() {//以下代码是读取所有考勤数据的代码Variant v0 = new Variant(1);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<Map<String,Object>> strList = new ArrayList<Map<String,Object>>();boolean newresult = false;do{Variant   vResult = Dispatch.call(zkem, "SSR_GetGeneralLogData", v0,dwEnrollNumber,dwVerifyMode,dwInOutMode,dwYear,dwMonth,dwDay,dwHour,dwMinute,dwSecond,dwWorkCode);newresult = vResult.getBoolean();if(newresult){String enrollNumber = dwEnrollNumber.getStringRef();//如果没有编号,则跳过。if(enrollNumber == null || enrollNumber.trim().length() == 0)continue;Map<String,Object> m = new HashMap<String, Object>();m.put("EnrollNumber", enrollNumber);m.put("Time", dwYear.getIntRef() + "-" + dwMonth.getIntRef() + "-" + dwDay.getIntRef() + " " + dwHour.getIntRef() + ":" + dwMinute.getIntRef() + ":" + dwSecond.getIntRef());m.put("VerifyMode", dwVerifyMode.getIntRef());m.put("InOutMode", dwInOutMode.getIntRef());
//                m.put("Year", dwYear.getIntRef());
//                m.put("Month", dwMonth.getIntRef());
//                m.put("Day", dwDay.getIntRef());
//                m.put("Hour", dwHour.getIntRef());
//                m.put("Minute", dwMinute.getIntRef());
//                m.put("Second", dwSecond.getIntRef());strList.add(m);}}while(newresult == true);return strList;}/*** 删除某个日期之前的考勤记录* @param date* @return*/public boolean deleteAttendanceByDate(String date){//机器号Variant v0 = new Variant(1);//时间Variant dateTime = new Variant(date,true);boolean deleteAttlogByTime = zkem.invoke("DeleteAttlogByTime", v0, dateTime).getBoolean();System.out.println("deleteAttlogByTime:"+deleteAttlogByTime);return deleteAttlogByTime;}

这也只是一部分的操作方法,官方文档中提供了很多的开发接口方案,具体用到还要具体的研究

ZKTeco 中控考勤机M300 plus java开发步骤 使用jacob 调用中控考勤机dll(详细配置)相关推荐

  1. zkteco iface702 中控考勤机java开发步骤一---连接考勤机

    送您一个最高1888元的阿里云大礼包,快来领取吧~ java使用jacob调用中控考勤机sdk方法 1.jacob-1.19版本 2.jdk1.8 64位(经过测试jacob.1.19支持64为jdk ...

  2. Thrift实现C#调用Java开发步骤详解

    概述 Thrift实现C#调用Java开发步骤详解 详细 代码下载:http://www.demodashi.com/demo/10946.html Apache Thrift 是 Facebook ...

  3. java 使用jacob 调用中控考勤机dll(详细配置)

    根据网上内容搜索以及不断尝试,总结出以下java使用jacob调用中控考勤机sdk方法 1.jacob-1.18版本 2.jdk1.732位(经过测试jacob目前只支持32位jdk,64位下报错): ...

  4. 校园二手书商城源代码基于微信小程序云开发,可在线支付提现,含详细配置教程

    校园二手书商城源代码基于微信小程序云开发,可在线支付提现,含详细配置教程 完整代码下载地址:校园二手书商城源代码基于微信小程序云开发 欢迎使用,下面是配置教程 长话短说,下面直接说配置流程 一.小程序 ...

  5. java开发可重用代码包工具包_[Java教程]彻底搞懂Java开发工具包(JDK)安装及环境变量配置...

    [Java教程]彻底搞懂Java开发工具包(JDK)安装及环境变量配置 0 2021-01-04 04:00:04 安装并配置JDK环境变量,不但要知道怎样做,也要知道为什么这样做,知其然知其所以然. ...

  6. 此安装程序必须使用 java 开发工具包 (jdk) 执行_彻底搞懂Java开发工具包(JDK)安装及环境变量配置...

    [官方正版]java jdk 9学习笔记 78.4元 包邮 (需用券) 去购买 > 一.Java 和 JDK 是什么 Java:Java是一种优秀的程序设计语言,它有非常多的语言特性,如简单性. ...

  7. java项目中没有jdk包_彻底搞懂Java开发工具包(JDK)安装及环境变量配置

    一.Java 和 JDK 是什么 Java:Java是一种优秀的程序设计语言,它有非常多的语言特性,如简单性.面向对象.可移植性等.Java 并不只是一种语言,而是一个完整的平台,它有一个庞大的库,其 ...

  8. Java开发陪玩系统源码小程序app详细介绍

    Java开发的陪玩系统源码小程序app以下是它的功能介绍: 一.用户端: 1. 用户注册与登录:用户可以使用手机号或微信登录进行注册. 2. 服务列表:用户可以浏览选择陪玩师提供的服务类型和价格,包括 ...

  9. JAVA在IDEA中用JNA调用C++的dll动态链接库案例

    目录 引言 准备工作 1.JNA包 2.DLL文件 接口准备 接口参数说明 1.DLL路径 [报错]找不到文件 如何查看DLL文件的位数? 2.函数声明 如何查看DLL文件中有哪些函数? C++与JA ...

  10. Java基于VB通过Jacob调用AutoCAD接口

    Java 以跨平台深受大家喜欢,而由于它跨平台的目的,需要运行在java虚拟机上工作,使得它和本地机器各种内部联系变得很少,约束了它直接掉本地API的功能.本例采用VB代码生成调用AutoCAD接口的 ...

最新文章

  1. python推荐系统-RecQ-Python推荐系统框架
  2. java if语句选择题_选择语句(if else) 习题(2017/12/1)
  3. 华师大数据科学考研_2020年30所微电子院校考研信息详细汇总
  4. OC-NSArray
  5. wiki的watch设置
  6. 1、play编程基础
  7. LeetCode 1200. 最小绝对差
  8. 【今日CV 计算机视觉论文速览 第116期】Mon, 13 May 2019
  9. Go语言标准库之fmt.Print
  10. Office Word2019您正试图运行的函数包含有宏或需要宏语言
  11. hash通信(python多线程应用)采用md5加密
  12. eggjs 项目实践
  13. WebService的知识总结(一)
  14. 如何利用各大博客引流
  15. Typora怎么将文本居中
  16. linux获取笔记本摄像头视频,Linux下利用Opencv打开笔记本摄像头问题
  17. Elasticsearch:在华为大数据集群 从c80升级至651版本后,执行es命令修改配置失败
  18. 定值保险计算举例_保险中生命表的计算例题 定值保险和不定值保险计算例题...
  19. 计算机学硕考公更好还是专硕,专硕 VS 学硕 你适合读哪种?
  20. 飞书文档如何添加代码块 ```

热门文章

  1. viper12a电源电路图_viper12a引脚功能图与引脚电压
  2. typecho编辑器 图片修改宽度高度 并且设置居中
  3. 联合分布,边缘分布,条件分布,互信息
  4. 夏普电视出现android不动了,夏普电视常见故障问题分析与处理,电视机故障判断检修...
  5. 计算机管理及维护培训考试题,计算机考试题库和答案_浅析高校公共计算机机房管理与维护...
  6. C语言中的volatile三种作用,volatile关键字在嵌入式C语言中的使用
  7. innerhtml与outerhtml的区别
  8. 本地测试微信公众号推送模板
  9. 阿里矢量图库使用方法
  10. Google Guice