中控指纹采集器java版本

具体实现官网已经给了demo,可以自行看下。接下来是我在此基础上将demo改成接口的形式,供页面调用。

指纹采集页面:

效果图:

代码概述:

1、去除原demo线程中的sleep,采用手动录入重新获取指纹图片的模式。

2、提供三个接口,初始化设备,重新录入(关闭设备,然后开启设备),获取指纹(获取指纹采集生成的图片)

3、生成指纹图片到本地

4、finger文件夹下目前只保存一个,每次生成新图片之前删除已存在的图片

注:下方代码仅供参考,具体实现请以自身开发环境而定(3、4步请根据自身情况而定。由于我暂时不做电子存档,所以没有存指纹图片以及关联业务)

package com.jinmdz.fmis.api.api.controller;import com.zkteco.biometric.FingerprintSensorErrorCode;
import com.zkteco.biometric.FingerprintSensorEx;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
import javax.swing.*;
import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;/*** @author lvyq* @version 1.0 指纹采集* @description: TODO* @date 2020/11/24 17:50*/
@RestController
@RequestMapping("/zk")
public class ZKFingerController {int fpWidth = 0;int fpHeight = 0;private byte[] lastRegTemp = new byte[2048];private int cbRegTemp = 0;private byte[][] regtemparray = new byte[3][2048];private boolean bRegister = false;private boolean bIdentify = true;private int iFid = 1;private int nFakeFunOn = 1;private int enroll_idx = 0;private byte[] imgbuf = null;private byte[] template = new byte[2048];private int[] templateLen = new int[1];private boolean mbStop = true;private long mhDevice = 0;private long mhDB = 0;private WorkThread workThread = null;private JTextArea textArea;/*** @description: 打开指纹采集* @author: lvyq* @date: 2020/11/24 17:52* @version 1.0*/@RequestMapping("/fingerInit")private Object ZKFingerInit() {Map<String, Object> map = new HashMap<>();String msg = initFinger();map.put("state", true);map.put("msg", msg);return map;}/*** @description: 重新录入* @author: lvyq* @date: 2020/11/25 17:50* @version 1.0*/@RequestMapping("/reFinger")public Object reFinger() {Map<String, Object> map = new HashMap<>();//关闭FreeSensor();//开启String msg = initFinger();map.put("state", true);map.put("msg", msg);return map;}/*** @description: 获取指纹图片* @author: lvyq* @date: 2020/11/25 17:51* @version 1.0*/@RequestMapping("/getFingerImg")public Object getFingerImg(HttpServletRequest request) {Map<String, Object> map = new HashMap<>();String path = "E:\\finger\\";File file = new File(path);try {String newPath = path + file.listFiles()[0].getName();File newFile = new File(newPath);String fingerName = newFile.getName();map.put("state", true);//文件网络路径,供前端回显,此处仅供参考map.put("imgUrl", "http://127.0.0.1:80/finger/fingerName");//文件相对地址,前端使用-保存数据库map.put("imgPath", "/finger/fingerName");} catch (Exception e) {map.put("code", 0);map.put("data", null);map.put("msg", "暂无图片");return map;}return map;}private String OnExtractOK(byte[] template, int len) {String text = "";if (bRegister) {int[] fid = new int[1];int[] score = new int[1];int ret = FingerprintSensorEx.DBIdentify(mhDB, template, fid, score);if (ret == 0) {bRegister = false;enroll_idx = 0;return "手指已经注册" + fid[0] + ",取消注册";}if (enroll_idx > 0 && FingerprintSensorEx.DBMatch(mhDB, regtemparray[enroll_idx - 1], template) <= 0) {return "请按同一个手指三次报名";}System.arraycopy(template, 0, regtemparray[enroll_idx], 0, 2048);enroll_idx++;if (enroll_idx == 3) {int[] _retLen = new int[1];_retLen[0] = 2048;byte[] regTemp = new byte[_retLen[0]];if (0 == (ret = FingerprintSensorEx.DBMerge(mhDB, regtemparray[0], regtemparray[1], regtemparray[2], regTemp, _retLen)) &&0 == (ret = FingerprintSensorEx.DBAdd(mhDB, iFid, regTemp))) {iFid++;cbRegTemp = _retLen[0];System.arraycopy(regTemp, 0, lastRegTemp, 0, cbRegTemp);//String strBase64 = FingerprintSensorEx.BlobToBase64(regTemp, cbRegTemp);return "注册成功";} else {return "注册失败,错误码" + ret;}} else {text = "你需要按" + (3 - enroll_idx) + "次指纹";}} else {if (bIdentify) {int[] fid = new int[1];int[] score = new int[1];int ret = FingerprintSensorEx.DBIdentify(mhDB, template, fid, score);if (ret == 0) {text = "识别成功, fid=" + fid[0] + ",score=" + score[0];} else {text = "识别失败, errcode=" + ret;}} else {if (cbRegTemp <= 0) {text = "请先注册!";} else {int ret = FingerprintSensorEx.DBMatch(mhDB, lastRegTemp, template);if (ret > 0) {text = "验证成功, score=" + ret;} else {text = "验证失败,ret=" + ret;}}}}return text;}private void FreeSensor() {mbStop = true;if (0 != mhDB) {FingerprintSensorEx.DBFree(mhDB);mhDB = 0;}if (0 != mhDevice) {FingerprintSensorEx.CloseDevice(mhDevice);mhDevice = 0;}FingerprintSensorEx.Terminate();}public static byte[] changeByte(int data) {return intToByteArray(data);}public static byte[] intToByteArray(final int number) {byte[] abyte = new byte[4];abyte[0] = (byte) (0xff & number);abyte[1] = (byte) ((0xff00 & number) >> 8);abyte[2] = (byte) ((0xff0000 & number) >> 16);abyte[3] = (byte) ((0xff000000 & number) >> 24);return abyte;}public static int byteArrayToInt(byte[] bytes) {int number = bytes[0] & 0xFF;number |= ((bytes[1] << 8) & 0xFF00);number |= ((bytes[2] << 16) & 0xFF0000);number |= ((bytes[3] << 24) & 0xFF000000);return number;}public static void writeBitmap(byte[] imageBuf, int nWidth, int nHeight, String path) throws IOException {java.io.FileOutputStream fos = new java.io.FileOutputStream(path);java.io.DataOutputStream dos = new java.io.DataOutputStream(fos);/***。。。具体代码见demo。此处代码直接引用。无需修改。。*/fos.close();}private class WorkThread extends Thread {@Overridepublic void run() {super.run();int ret = 0;while (!mbStop) {templateLen[0] = 2048;if (0 == (ret = FingerprintSensorEx.AcquireFingerprint(mhDevice, imgbuf, template, templateLen))) {if (nFakeFunOn == 1) {byte[] paramValue = new byte[4];int[] size = new int[1];size[0] = 4;int nFakeStatus = 0;//GetFakeStatusret = FingerprintSensorEx.GetParameters(mhDevice, 2004, paramValue, size);nFakeStatus = byteArrayToInt(paramValue);System.out.println("ret = " + ret + ",nFakeStatus=" + nFakeStatus);if (0 == ret && (byte) (nFakeStatus & 31) != 31) {textArea.setText("Is a fake-finer?");return;}}OnCatpureOK(imgbuf);OnExtractOK(template, templateLen[0]);String strBase64 = FingerprintSensorEx.BlobToBase64(template, templateLen[0]);System.out.println("strBase64=" + strBase64);}}}}private void OnCatpureOK(byte[] imgBuf) {try {long dateTime = System.currentTimeMillis();//删除图片文件try {String path = "E:\\finger\\";File file = new File(path);String newPath = path + file.listFiles()[0].getName();File newFile = new File(newPath);System.out.println("删除图片==" + file.getName() + "" + newFile.delete());} catch (Exception e) {e.printStackTrace();} finally {writeBitmap(imgBuf, fpWidth, fpHeight, "E:\\finger\\" + dateTime + ".bmp");}} catch (IOException e) {e.printStackTrace();}}public String initFinger() {if (0 != mhDevice) {return "请先关闭设备";}int ret = FingerprintSensorErrorCode.ZKFP_ERR_OK;cbRegTemp = 0;bRegister = false;bIdentify = false;iFid = 1;enroll_idx = 0;if (FingerprintSensorErrorCode.ZKFP_ERR_OK != FingerprintSensorEx.Init()) {return "初始化失败!";}ret = FingerprintSensorEx.GetDeviceCount();if (ret < 0) {FreeSensor();return "没有设备连接!";}if (0 == (mhDevice = FingerprintSensorEx.OpenDevice(0))) {FreeSensor();return "打开设备失败,ret=" + ret + "!";}if (0 == (mhDB = FingerprintSensorEx.DBInit())) {FreeSensor();return "初始化数据库失败,ret=" + ret + "!";}//set fakefun offFingerprintSensorEx.SetParameters(mhDevice, 2002, changeByte(nFakeFunOn), 4);byte[] paramValue = new byte[4];int[] size = new int[1];//GetFakeOnsize[0] = 4;FingerprintSensorEx.GetParameters(mhDevice, 2002, paramValue, size);nFakeFunOn = byteArrayToInt(paramValue);size[0] = 4;FingerprintSensorEx.GetParameters(mhDevice, 1, paramValue, size);fpWidth = byteArrayToInt(paramValue);size[0] = 4;FingerprintSensorEx.GetParameters(mhDevice, 2, paramValue, size);fpHeight = byteArrayToInt(paramValue);imgbuf = new byte[fpWidth * fpHeight];mbStop = false;workThread = new WorkThread();workThread.start();// 启动线程*/return "打开成功";}
}

该示例仅为提供实现思路,且该示例为单击版,不支持联网,如需联网版,可自行修改,或换其它型号

ZKFinger Live20R 版对接java - B/S(联机版)https://blog.csdn.net/qq_27185879/article/details/125637890

ZKFinger Live20R 版对接java - B/S(ZKFinger SDK 5.0.0.32 )相关推荐

  1. ZKFinger Live20R 版对接java - B/S(网络版)

    查看此文章前请先查看ZKFinger Live20R 版对接java - B/S(ZKFinger SDK 5.0.0.32 )https://blog.csdn.net/qq_27185879/ar ...

  2. 安卓版的java程序代码

    正确例题 import java.util.*; public class Ha{ public static void main(String[] args) { String a[]={" ...

  3. 建立与ftp服务器的连接——完成版(java)

    建立与ftp服务器的连接--完成版(java) // ftp 程序Ftp.java // 此程序的功能是建立与ftp服务器的连接并实现文件传输 // 使用方法:java Ftp 服务器地址 //启动示 ...

  4. 我的世界java版和基岩版对比_我的世界:基岩版比Java多出的七个特性,都听过的非老mc莫属了!...

    你玩的是java版还是基岩版呢? 这两个版本是我们经常使用的版本,看似一模一样,其实在细节上也有些一些差别.对比Java版,基岩版多出了这七个特性.今天我们就来聊一聊基岩版当中特有的七个特性,堪称隐藏 ...

  5. 用java写ods系统_基于数据库的代码自动生成工具,生成JavaBean、生成数据库文档、生成前后端代码等(TableGo v7.0.0版)...

    TableGo是基于数据库的代码自动生成工具,低代码编程技术的实现,可以零代码自动生成SpringBoot项目工程.生成JavaBean.生成前后端分离的CRUD代码.生成MyBaits的Mapper ...

  6. 混合知识实例-本地GIS定位系统Web版(Java、vue、Geoserver)

    目录 系统运行截图 所使用的技术 前端 后端 Geoserver 数据库 系统运行截图 输入一个城市,比如乌鲁木齐,就会生成一个黄色的圆环,并且直接定位到那边! 点击左下角的table内的数据,也可以 ...

  7. java生成iso9660工具_基于数据库的代码自动生成工具,生成JavaBean、生成数据库文档、生成前后端代码等(TableGo v7.0.0版)...

    TableGo_20210212 v7.0.0 正式版发布,此次版本更新如下: 1.新增对DB2数据库的支持 2.新增按字段生成文件,支持把字段.JSON.XML数据转换成任何代码 3.新增大量新的自 ...

  8. 电信物联网开放平台_NB-IoT业务对接 Java 后台、Android 前端已完成预研

    电信物联网开放平台_NB-IoT业务对接 Java 后台.Android 前端已完成预研 一.NB-IoT : 硬件设备 BC28模组 二.Java 后台: SSH集成电信物联SDK.极光推送SDK. ...

  9. 快递员上门取件api接口技术对接java文档

    上门取件,是电商平台为寄件用户提供的通过一键下单到快递员,并在2小时上门取件的寄件服务.适用于散客在线寄件.电商退货上门取件等业务场景:通过API指令由系统自动将消息发送给物流公司和快递员,由快递员上 ...

  10. 最新5G时代投资区块链源码全修复版+对接免签支付+搭建视频

    最新5G时代投资区块链源码全修复版+对接免签支付+搭建视频教程 [亲测修复版]10月最新5G时代投资风口投资 区块链 源码全修复版订制UI完美版本+对接免签 支付 +搭建视频教程 现在5G是个热词,这 ...

最新文章

  1. 步步高vivo高通解锁工具_高通人工智能开放日,窥见5G+AI的未来
  2. 2.4操作系统之死锁详解(预防、避免、检测、解除)+思维导图
  3. 关于IE某些原因导致下拉列表弹出阻止窗口的解决办法
  4. 消息中间件--RabbitMQ --- 消费端限流 -- 非常重要
  5. 北京工业大学c语言期末考试题,北京工业大学C语言部分练习答案.docx
  6. DSP中两个延时函数的区别(转)
  7. MySQL基础篇(2)
  8. sql中exist()的用法
  9. java this和super_Java中超详细this与super的概念和用法_Java_软件编程
  10. OneDrive更换要同步文件夹
  11. PMP 考点 第十一章 项目风险管理
  12. 16行代码实现微信聊天机器人,自动智能回复,打团了让它来陪老婆聊天
  13. 银行客户流失分析预测
  14. Windows7 内部版本7601 此Windows副本不是正版
  15. 小白应该如何选择国内服务器?腾讯云、阿里云、小鸟云?
  16. 小米 信号测试软件,小米WiFi测试版
  17. Mac使用 automator 自动批量处理网站下载
  18. Android:EditText 设置弹出数字输入法键盘
  19. 自定义View之指南针(反编译别人的代码实现)
  20. 从零开始的WordPress个人博客搭建

热门文章

  1. 模块参考资料-硬件资料-Air720UG/UH-功耗指标
  2. 高等数学——多元函数极值的定义
  3. 吉他音阶训练——问题解答 (三)
  4. 软件供应链安全威胁:从“奥创纪元”到“无限战争”
  5. android 微信登陆功能,Android 实现微信登录详解
  6. centos6.5安装谷歌浏览器+谷歌浏览器flash插件安装+谷歌浏览器pdf阅读器安装
  7. python 计算均值、方差、标准差 Numpy,Pandas
  8. win10用计算机分区,win10怎么分区,详细教您win10怎么对磁盘进行分区
  9. 怎么用python编写个apk_python自动安装apk文件
  10. 一文教你如何对接【支付宝】支付接口,网友:666啊!