package com.netsdk.demo.module;
|
|
import java.io.UnsupportedEncodingException;
|
|
import com.sun.jna.Memory;
|
|
import com.netsdk.lib.NetSDKLib;
|
import com.netsdk.lib.ToolKits;
|
import com.netsdk.lib.NetSDKLib.*;
|
|
/**
|
* \if ENGLISH_LANG
|
* Attendance Interface
|
* contains:smart subscribe、CRUD of user&&fingerprint and collection fingerprint
|
* \else
|
* 考勤机接口实现
|
* 包含: 智能订阅、考勤用户及信息的增删改查、信息采集
|
* \endif
|
*/
|
public class AttendanceModule {
|
|
public static final int TIME_OUT = 3000;
|
public static final int nMaxFingerPrintSize = 2048;
|
public static LLong m_hAttachHandle = new LLong(0);
|
|
/**
|
* 智能订阅
|
* @param callback 智能订阅回调函数
|
*/
|
public static boolean realLoadPicture(fAnalyzerDataCallBack callback) {
|
|
int bNeedPicture = 0; // 不需要图片
|
|
m_hAttachHandle = LoginModule.netsdk.CLIENT_RealLoadPictureEx(LoginModule.m_hLoginHandle, -1,
|
NetSDKLib.EVENT_IVS_ALL, bNeedPicture, callback, null, null);
|
|
if(m_hAttachHandle.longValue() == 0) {
|
System.err.printf("CLIENT_RealLoadPictureEx Failed!" + ToolKits.getErrorCodePrint());
|
}
|
|
return m_hAttachHandle.longValue() != 0;
|
}
|
|
/**
|
* 停止智能订阅
|
*/
|
public static void stopRealLoadPicture(){
|
if (m_hAttachHandle.longValue() == 0) {
|
return;
|
}
|
|
LoginModule.netsdk.CLIENT_StopLoadPic(m_hAttachHandle);
|
m_hAttachHandle.setValue(0);
|
}
|
|
/**
|
* 考勤新增加用户
|
* @param userId 用户ID
|
* @param userName 用户名
|
* @param cardNo 卡号
|
*/
|
public static boolean addUser(String userId, String userName, String cardNo) {
|
|
/*
|
* 入参
|
*/
|
NET_IN_ATTENDANCE_ADDUSER stuIn = new NET_IN_ATTENDANCE_ADDUSER();
|
stringToByteArray(userId, stuIn.stuUserInfo.szUserID);
|
stringToByteArray(userName, stuIn.stuUserInfo.szUserName);
|
stringToByteArray(cardNo, stuIn.stuUserInfo.szCardNo);
|
|
/*
|
* 出参
|
*/
|
NET_OUT_ATTENDANCE_ADDUSER stuOut = new NET_OUT_ATTENDANCE_ADDUSER();
|
|
boolean bRet = LoginModule.netsdk.CLIENT_Attendance_AddUser(LoginModule.m_hLoginHandle, stuIn, stuOut, TIME_OUT);
|
if (!bRet) {
|
System.err.printf("CLIENT_Attendance_AddUser Failed!" + ToolKits.getErrorCodePrint());
|
}
|
|
return bRet;
|
}
|
|
/**
|
* 考勤删除用户
|
* @param userId 用户ID
|
*/
|
public static boolean deleteUser(String userId) {
|
|
removeFingerByUserId(userId); // 先去删除信息
|
|
/*
|
* 入参
|
*/
|
NET_IN_ATTENDANCE_DELUSER stuIn = new NET_IN_ATTENDANCE_DELUSER();
|
stringToByteArray(userId, stuIn.szUserID);
|
|
/*
|
* 出参
|
*/
|
NET_OUT_ATTENDANCE_DELUSER stuOut = new NET_OUT_ATTENDANCE_DELUSER();
|
|
boolean bRet = LoginModule.netsdk.CLIENT_Attendance_DelUser(LoginModule.m_hLoginHandle, stuIn, stuOut, TIME_OUT);
|
if (!bRet) {
|
System.err.printf("CLIENT_Attendance_DelUser Failed!" + ToolKits.getErrorCodePrint());
|
}
|
|
return bRet;
|
}
|
|
/**
|
* 考勤修改用户
|
* @param userId 用户ID
|
* @param userName 用户名
|
* @param cardNo 卡号
|
*/
|
public static boolean modifyUser(String userId, String userName, String cardNo) {
|
|
/*
|
* 入参
|
*/
|
NET_IN_ATTENDANCE_ModifyUSER stuIn = new NET_IN_ATTENDANCE_ModifyUSER();
|
stringToByteArray(userId, stuIn.stuUserInfo.szUserID);
|
stringToByteArray(userName, stuIn.stuUserInfo.szUserName);
|
stringToByteArray(cardNo, stuIn.stuUserInfo.szCardNo);
|
|
/*
|
* 出参
|
*/
|
NET_OUT_ATTENDANCE_ModifyUSER stuOut = new NET_OUT_ATTENDANCE_ModifyUSER();
|
|
boolean bRet = LoginModule.netsdk.CLIENT_Attendance_ModifyUser(LoginModule.m_hLoginHandle, stuIn, stuOut, TIME_OUT);
|
if (!bRet) {
|
System.err.printf("CLIENT_Attendance_ModifyUser Failed!" + ToolKits.getErrorCodePrint());
|
}
|
|
return bRet;
|
}
|
|
/**
|
* 考勤机 查找用户
|
* @param nOffset 查询偏移
|
* @param nPagedQueryCount 查询个数
|
* @return UserData[] 用户信息组
|
*/
|
public static UserData[] findUser(int nOffset, int nPagedQueryCount) {
|
|
/*
|
* 入参
|
*/
|
NET_IN_ATTENDANCE_FINDUSER stuIn = new NET_IN_ATTENDANCE_FINDUSER();
|
stuIn.nOffset = nOffset;
|
stuIn.nPagedQueryCount = nPagedQueryCount;
|
|
/*
|
* 出参
|
*/
|
NET_OUT_ATTENDANCE_FINDUSER stuOut = new NET_OUT_ATTENDANCE_FINDUSER();
|
NET_ATTENDANCE_USERINFO[] userInfo = new NET_ATTENDANCE_USERINFO[nPagedQueryCount];
|
for(int i = 0; i < nPagedQueryCount; i++) {
|
userInfo[i] = new NET_ATTENDANCE_USERINFO();
|
}
|
stuOut.nMaxUserCount = nPagedQueryCount;
|
stuOut.stuUserInfo = new Memory(userInfo[0].size() * stuOut.nMaxUserCount);
|
stuOut.stuUserInfo.clear(userInfo[0].size() * stuOut.nMaxUserCount);
|
ToolKits.SetStructArrToPointerData(userInfo, stuOut.stuUserInfo); // 将数组内存拷贝到Pointer
|
stuOut.nMaxPhotoDataLength = 128;
|
stuOut.pbyPhotoData = new Memory(stuOut.nMaxPhotoDataLength); // 申请内存
|
|
boolean bRet = LoginModule.netsdk.CLIENT_Attendance_FindUser(LoginModule.m_hLoginHandle, stuIn, stuOut, TIME_OUT);
|
if (!bRet) {
|
System.err.printf("CLIENT_Attendance_FindUser Failed!" + ToolKits.getErrorCodePrint());
|
return null;
|
}
|
|
ToolKits.GetPointerDataToStructArr(stuOut.stuUserInfo, userInfo); // 将 Pointer 的内容 输出到 数组
|
|
UserData[] userData = new UserData[stuOut.nRetUserCount];
|
for(int i = 0; i < stuOut.nRetUserCount; i++) {
|
userData[i] = new UserData();
|
try {
|
userData[i].userId = new String(userInfo[i].szUserID, "GBK").trim();
|
userData[i].userName = new String(userInfo[i].szUserName, "GBK").trim();
|
userData[i].cardNo = new String(userInfo[i].szCardNo, "GBK").trim();
|
}catch(Exception e) { // 如果转化失败就采用原始数据
|
userData[i].userId = new String(userInfo[i].szUserID).trim();
|
userData[i].userName = new String(userInfo[i].szUserName).trim();
|
userData[i].cardNo = new String(userInfo[i].szCardNo).trim();
|
}
|
|
// getFingerByUserId(userData[i].userId, userData[i]); // 获取信息信息
|
}
|
|
UserData.nTotalUser = stuOut.nTotalUser;
|
|
return userData;
|
}
|
|
/**
|
* 考勤获取用户信息
|
* @param userId 用户ID
|
* @return UserData 用户信息
|
*/
|
public static UserData getUser(String userId) {
|
|
/*
|
* 入参
|
*/
|
NET_IN_ATTENDANCE_GetUSER stuIn = new NET_IN_ATTENDANCE_GetUSER();
|
stringToByteArray(userId, stuIn.szUserID);
|
|
/*
|
* 出参
|
*/
|
NET_OUT_ATTENDANCE_GetUSER stuOut = new NET_OUT_ATTENDANCE_GetUSER();
|
stuOut.nMaxLength = 128;
|
stuOut.pbyPhotoData = new Memory(stuOut.nMaxLength); // 申请内存
|
stuOut.pbyPhotoData.clear(stuOut.nMaxLength);
|
|
boolean bRet = LoginModule.netsdk.CLIENT_Attendance_GetUser(LoginModule.m_hLoginHandle, stuIn, stuOut, TIME_OUT);
|
if (!bRet) {
|
System.err.printf("CLIENT_Attendance_GetUser Failed!" + ToolKits.getErrorCodePrint());
|
return null;
|
}
|
|
UserData userData = new UserData();
|
try {
|
userData.userId = new String(stuOut.stuUserInfo.szUserID, "GBK").trim();
|
userData.userName = new String(stuOut.stuUserInfo.szUserName, "GBK").trim();
|
userData.cardNo = new String(stuOut.stuUserInfo.szCardNo, "GBK").trim();
|
}catch(Exception e) { // 如果转化失败就采用原始数据
|
userData.userId = new String(stuOut.stuUserInfo.szUserID).trim();
|
userData.userName = new String(stuOut.stuUserInfo.szUserName).trim();
|
userData.cardNo = new String(stuOut.stuUserInfo.szCardNo).trim();
|
}
|
|
// getFingerByUserId(userId, userData); // 获取信息信息
|
|
return userData;
|
}
|
|
/**
|
* 考勤机 通过用户ID插入信息数据
|
* @param userId 用户ID
|
* @param szFingerPrintInfo 信息信息
|
*/
|
public static boolean insertFingerByUserId(String userId, byte[] szFingerPrintInfo) {
|
|
/*
|
* 入参
|
*/
|
NET_IN_FINGERPRINT_INSERT_BY_USERID stuIn = new NET_IN_FINGERPRINT_INSERT_BY_USERID();
|
stringToByteArray(userId, stuIn.szUserID);
|
stuIn.nPacketCount = 1;
|
stuIn.nSinglePacketLen = szFingerPrintInfo.length;
|
stuIn.szFingerPrintInfo = new Memory(stuIn.nPacketCount * stuIn.nSinglePacketLen); // 申请内存
|
stuIn.szFingerPrintInfo.clear(stuIn.nPacketCount * stuIn.nSinglePacketLen);
|
stuIn.szFingerPrintInfo.write(0, szFingerPrintInfo, 0, szFingerPrintInfo.length);
|
|
/*
|
* 出参
|
*/
|
NET_OUT_FINGERPRINT_INSERT_BY_USERID stuOut = new NET_OUT_FINGERPRINT_INSERT_BY_USERID();
|
|
boolean bRet = LoginModule.netsdk.CLIENT_Attendance_InsertFingerByUserID(LoginModule.m_hLoginHandle, stuIn, stuOut, TIME_OUT);
|
if (!bRet) {
|
System.err.printf("CLIENT_Attendance_InsertFingerByUserID Failed!" + ToolKits.getErrorCodePrint());
|
}
|
|
return bRet;
|
}
|
|
/**
|
* 考勤机 删除单个用户下所有信息数据
|
* @param userId 用户ID
|
*/
|
public static boolean removeFingerByUserId(String userId) {
|
|
/*
|
* 入参
|
*/
|
NET_CTRL_IN_FINGERPRINT_REMOVE_BY_USERID stuIn = new NET_CTRL_IN_FINGERPRINT_REMOVE_BY_USERID();
|
stringToByteArray(userId, stuIn.szUserID);
|
|
/*
|
* 出参
|
*/
|
NET_CTRL_OUT_FINGERPRINT_REMOVE_BY_USERID stuOut = new NET_CTRL_OUT_FINGERPRINT_REMOVE_BY_USERID();
|
|
boolean bRet = LoginModule.netsdk.CLIENT_Attendance_RemoveFingerByUserID(LoginModule.m_hLoginHandle, stuIn, stuOut, TIME_OUT);
|
if (!bRet) {
|
System.err.printf("CLIENT_Attendance_RemoveFingerByUserID Failed!" + ToolKits.getErrorCodePrint());
|
}
|
|
return bRet;
|
}
|
|
/**
|
* 考勤机 通过信息ID删除信息数据
|
* @param nFingerPrintID 信息ID
|
*/
|
public static boolean removeFingerRecord(int nFingerPrintID) {
|
|
/*
|
* 入参
|
*/
|
NET_CTRL_IN_FINGERPRINT_REMOVE stuIn = new NET_CTRL_IN_FINGERPRINT_REMOVE();
|
stuIn.nFingerPrintID = nFingerPrintID;
|
|
/*
|
* 出参
|
*/
|
NET_CTRL_OUT_FINGERPRINT_REMOVE stuOut = new NET_CTRL_OUT_FINGERPRINT_REMOVE();
|
|
boolean bRet = LoginModule.netsdk.CLIENT_Attendance_RemoveFingerRecord(LoginModule.m_hLoginHandle, stuIn, stuOut, TIME_OUT);
|
if (!bRet) {
|
System.err.printf("CLIENT_Attendance_RemoveFingerRecord Failed!" + ToolKits.getErrorCodePrint());
|
}
|
|
return bRet;
|
}
|
|
/**
|
* 考勤机 通过信息ID获取信息数据
|
* @param nFingerPrintID 信息ID
|
* @return userData 用户数据
|
*/
|
public static UserData getFingerRecord(int nFingerPrintID) {
|
|
/*
|
* 入参
|
*/
|
NET_CTRL_IN_FINGERPRINT_GET stuIn = new NET_CTRL_IN_FINGERPRINT_GET();
|
stuIn.nFingerPrintID = nFingerPrintID;
|
|
/*
|
* 出参
|
*/
|
NET_CTRL_OUT_FINGERPRINT_GET stuOut = new NET_CTRL_OUT_FINGERPRINT_GET();
|
stuOut.nMaxFingerDataLength = nMaxFingerPrintSize;
|
stuOut.szFingerPrintInfo = new Memory(stuOut.nMaxFingerDataLength); // 申请内存
|
stuOut.szFingerPrintInfo.clear(stuOut.nMaxFingerDataLength);
|
|
boolean bRet = LoginModule.netsdk.CLIENT_Attendance_GetFingerRecord(LoginModule.m_hLoginHandle, stuIn, stuOut, TIME_OUT);
|
if (!bRet) {
|
System.err.printf("CLIENT_Attendance_GetFingerRecord Failed!" + ToolKits.getErrorCodePrint());
|
return null;
|
}
|
|
if (stuOut.nRetLength == 0) {
|
System.err.println("GetFingerRecord Failed nRetLength == 0!");
|
}
|
|
UserData userData = new UserData();
|
userData.userId = new String(stuOut.szUserID).trim();
|
userData.nFingerPrintIDs = new int[1];
|
userData.nFingerPrintIDs[0] = nFingerPrintID;
|
userData.szFingerPrintInfo = new byte[1][stuOut.nRetLength];
|
stuOut.szFingerPrintInfo.read(0, userData.szFingerPrintInfo[0], 0, stuOut.nRetLength);
|
|
return userData;
|
}
|
|
/**
|
* 考勤机 通过用户ID查找该用户下的所有信息数据
|
* @param userId 用户ID
|
* @param userData 用户数据
|
*/
|
public static boolean getFingerByUserId(String userId, UserData userData) {
|
|
/*
|
* 入参
|
*/
|
NET_IN_FINGERPRINT_GETBYUSER stuIn = new NET_IN_FINGERPRINT_GETBYUSER();
|
stringToByteArray(userId, stuIn.szUserID);
|
|
/*
|
* 出参
|
*/
|
NET_OUT_FINGERPRINT_GETBYUSER stuOut = new NET_OUT_FINGERPRINT_GETBYUSER();
|
stuOut.nMaxFingerDataLength = NetSDKLib.NET_MAX_FINGER_PRINT * nMaxFingerPrintSize;
|
stuOut.pbyFingerData = new Memory(stuOut.nMaxFingerDataLength); // 申请内存
|
stuOut.pbyFingerData.clear(stuOut.nMaxFingerDataLength);
|
|
boolean bRet = LoginModule.netsdk.CLIENT_Attendance_GetFingerByUserID(LoginModule.m_hLoginHandle, stuIn, stuOut, TIME_OUT);
|
if (!bRet) {
|
System.err.printf("CLIENT_Attendance_GetFingerByUserID Failed!" + ToolKits.getErrorCodePrint());
|
}else {
|
userData.nFingerPrintIDs = new int[stuOut.nRetFingerPrintCount];
|
userData.szFingerPrintInfo = new byte[stuOut.nRetFingerPrintCount][stuOut.nSinglePacketLength];
|
int offset = 0;
|
for (int i = 0; i < stuOut.nRetFingerPrintCount; ++i) {
|
userData.nFingerPrintIDs[i] = stuOut.nFingerPrintIDs[i];
|
stuOut.pbyFingerData.read(offset, userData.szFingerPrintInfo[i], 0, stuOut.nSinglePacketLength);
|
offset += stuOut.nSinglePacketLength;
|
}
|
}
|
|
return bRet;
|
}
|
|
/**
|
* 信息采集
|
* @param nChannelID 门禁序号
|
* @param szReaderID 读卡器ID
|
*/
|
public static boolean collectionFinger(int nChannelID, String szReaderID) {
|
/*
|
* 入参
|
*/
|
NET_CTRL_CAPTURE_FINGER_PRINT stuCollection = new NET_CTRL_CAPTURE_FINGER_PRINT();
|
stuCollection.nChannelID = nChannelID;
|
stringToByteArray(szReaderID, stuCollection.szReaderID);
|
|
stuCollection.write();
|
boolean bRet = LoginModule.netsdk.CLIENT_ControlDeviceEx(LoginModule.m_hLoginHandle, NetSDKLib.CtrlType.CTRLTYPE_CTRL_CAPTURE_FINGER_PRINT, stuCollection.getPointer(), null, 5000);
|
if (!bRet) {
|
System.err.printf("CLIENT_ControlDeviceEx CAPTURE_FINGER_PRINT Failed!" + ToolKits.getErrorCodePrint());
|
}
|
return bRet;
|
}
|
|
/**
|
* 字符串转字符数组
|
* @param src 源字符串
|
* @param dst 目标字符数组
|
*/
|
public static void stringToByteArray(String src, byte[] dst) {
|
|
if (src == null || src.isEmpty()) {
|
return;
|
}
|
|
for(int i = 0; i < dst.length; i++) {
|
dst[i] = 0;
|
}
|
|
byte []szSrc;
|
|
try {
|
szSrc = src.getBytes("GBK");
|
} catch (UnsupportedEncodingException e) {
|
szSrc = src.getBytes();
|
}
|
|
if (szSrc != null) {
|
int len = szSrc.length >= dst.length ? dst.length-1:szSrc.length;
|
System.arraycopy(szSrc, 0, dst, 0, len);
|
}
|
}
|
|
/**
|
* 用户信息
|
* */
|
public static class UserData {
|
public static int nTotalUser; // 用户总数
|
|
public String userId; // 用户ID
|
public String userName; // 用户名
|
public String cardNo; // 卡号
|
public int[] nFingerPrintIDs; // 信息ID数组
|
public byte[][] szFingerPrintInfo; // 信息数据数组
|
}
|
|
/**
|
* 门禁事件信息
|
* */
|
public static class AccessEventInfo {
|
public String userId; // 用户ID
|
public String cardNo; // 卡号
|
public String eventTime; // 事件发生时间
|
public int openDoorMethod; // 开门方式
|
}
|
|
/**
|
* 操作类型
|
* */
|
public enum OPERATE_TYPE {
|
UNKNOWN, // 未知
|
SEARCH_USER, // 搜索用户(第一页)
|
PRE_SEARCH_USER, // 搜索用户(上一页)
|
NEXT_SEARCH_USER, // 搜索用户(下一页)
|
SEARCH_USER_BY_USERID, // 通过用户ID搜索用户
|
ADD_USER, // 添加用户
|
DELETE_USER, // 删除用户
|
MODIFIY_USER, // 修改用户
|
FINGERPRINT_OPEARTE_BY_USERID, // 通过用户ID操作信息
|
FINGERPRINT_OPEARTE_BY_ID, // 通过信息ID操作信息
|
SEARCH_FINGERPRINT_BY_USERID, // 通过用户ID搜索信息
|
SEARCH_FINGERPRINT_BY_ID, // 通过信息ID搜索信息
|
ADD_FINGERPRINT, // 添加信息
|
DELETE_FINGERPRINT_BY_USERID, // 通过用户ID删除信息
|
DELETE_FINGERPRINT_BY_ID // 通过信息ID删除信息
|
};
|
}
|