对接海康5604设备,设置温度上限及下限,设备较多通过demo手动透传不可取,故采用代码方式进行透传. (代码记录,方便后续开发找方便)
public void setThermal(Map<String, Object> params){
Object ids = params.get("ids"); //设备id集
if (ComnUtil.isEmpty(ids)){
throw new ComnException(ComnStatusCode.ERROR_PARAM, "请选择设备!");
}
Object highestThermal = params.get("highestThermal"); //最高温度上限
Object lowestThermal = params.get("lowestThermal"); //最低温度上限
String[] split = ids.toString().split(",");
for (String id : split) {
Equipment equipment = equipmentMapper.selectById(Long.parseLong(id));
String ip = equipment.getIp();
String port = equipment.getPort();
String password = equipment.getPassword();
String brand = equipment.getBrand();
int loginRes = HCNetSDKApiHelper.login(ip, Integer.parseInt(port), "admin", password, HCNetSDKApiHelper.DEVICE_CATCH); //登录
HCNetSDK.NET_DVR_STRING_POINTER stringRequest = new HCNetSDK.NET_DVR_STRING_POINTER();
stringRequest.read();
stringRequest.byString = SEND_INFOMACTION_URL.getBytes();
stringRequest.write();
HCNetSDK.NET_DVR_STRING_POINTER stringInBuffer = new HCNetSDK.NET_DVR_STRING_POINTER();
stringInBuffer.read();
HashMap<String, Object> AcsCfg = new HashMap<>();
HashMap<String, Object> para = new HashMap<>();
para.put("highestThermalThreshold",Float.parseFloat(highestThermal.toString()));
para.put("lowestThermalThreshold",Float.parseFloat(lowestThermal.toString()));
AcsCfg.put("AcsCfg",para);
String strInbuffer = GsonHelper.obj2Json(AcsCfg); // 请求参数json
stringInBuffer.byString = strInbuffer.getBytes();
stringInBuffer.write();
HCNetSDK.NET_DVR_XML_CONFIG_INPUT struXMLInput = new HCNetSDK.NET_DVR_XML_CONFIG_INPUT();
struXMLInput.read();
struXMLInput.dwSize = struXMLInput.size();
struXMLInput.lpRequestUrl = stringRequest.getPointer();
struXMLInput.dwRequestUrlLen = stringRequest.byString.length;
struXMLInput.lpInBuffer = stringInBuffer.getPointer();
struXMLInput.dwInBufferSize = stringInBuffer.byString.length;
struXMLInput.write();
HCNetSDK.NET_DVR_STRING_POINTER stringXMLOut = new HCNetSDK.NET_DVR_STRING_POINTER();
stringXMLOut.read();
HCNetSDK.NET_DVR_STRING_POINTER struXMLStatus = new HCNetSDK.NET_DVR_STRING_POINTER();
struXMLStatus.read();
HCNetSDK.NET_DVR_XML_CONFIG_OUTPUT struXMLOutput = new HCNetSDK.NET_DVR_XML_CONFIG_OUTPUT();
stringInBuffer.read();
struXMLOutput.dwSize = struXMLOutput.size();
struXMLOutput.lpOutBuffer = stringXMLOut.getPointer();
struXMLOutput.dwOutBufferSize = stringXMLOut.size();
struXMLOutput.lpStatusBuffer = struXMLStatus.getPointer();
struXMLOutput.dwStatusSize = struXMLStatus.size();
stringInBuffer.write();
boolean setConfig = sdkInstance.NET_DVR_STDXMLConfig(loginRes, struXMLInput, struXMLOutput);
if (!setConfig) {
log.error(String.format("[%s]下发温度设置[%s]失败:%d", ip, strInbuffer, sdkInstance.NET_DVR_GetLastError()));
} else {
stringXMLOut.read();
String strOutJson = new String(stringXMLOut.byString).trim();
struXMLStatus.read();
System.out.println(strOutJson);
}
HCNetSDKApiHelper.logout(ip);
}
}
针对DS-K1F100-D8E 设备下发卡 ,读卡 的开发主要借鉴了别人代码,从中找到部分错误及代码不全,针对这些重新优化
package com.keyou.blzx.controller;
import com.keyou.blzx.controller.hksdk.callback.HCUsbSDK;
import com.sun.jna.NativeLong;
import com.sun.jna.Pointer;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import java.io.UnsupportedEncodingException;
import java.util.HashMap;
import java.util.Map;
/**
* @author ***
* @description 下发卡 读卡
* @date 2021-06-18 14:59
*/
public class CardMakeController extends BaseController {
private static final Log logger = LogFactory.getLog(CardMakeController.class);
static HCUsbSDK hcusbsdk = HCUsbSDK.INSTANCE;
static fDEVInfoCallBack fdeviceCallBack = null;
static HCUsbSDK.USB_SDK_DEVICE_INFO StruDevceInfo = new HCUsbSDK.USB_SDK_DEVICE_INFO();
static boolean bDevCallBack = false;
public static void main(String[] args) throws UnsupportedEncodingException {
//发卡
//make();
//读卡
NativeLong login = login();
String readKh = active(login );
valid(login );
String card = read(login);
System.out.println(card);
}
/**
* 枚举设备
* */
public static class fDEVInfoCallBack implements HCUsbSDK.fEnumDeviceCallBack {
public void invoke(HCUsbSDK.USB_SDK_DEVICE_INFO pDevceInfo, Pointer pUser) {
if ((pDevceInfo.szDeviceName[0] == 'D') && (pDevceInfo.szDeviceName[1] == 'S')
&& (pDevceInfo.szDeviceName[2] == '-') && (pDevceInfo.szDeviceName[3] == 'K')) {
StruDevceInfo = pDevceInfo;
String strName = new String(pDevceInfo.szDeviceName);
logger.info("枚举到的设备信息:" + strName);
bDevCallBack = true;
}
}
}
private static NativeLong login() {
int iError = 0;
boolean bInit = hcusbsdk.USB_SDK_Init();
if (bInit) {
hcusbsdk.USB_SDK_SetLogToFile(3, "C:/USBSDKLog", false);
}
if (fdeviceCallBack == null) {
fdeviceCallBack = new fDEVInfoCallBack();
}
boolean bEnum = hcusbsdk.USB_SDK_EnumDevice(fdeviceCallBack, null);
if (!bEnum) {
iError = hcusbsdk.USB_SDK_GetLastError();
logger.error("枚举获取设备失败,原因: " + iError);
return null;
}
HCUsbSDK.USB_SDK_USER_LOGIN_INFO struUserLoginInfo = new HCUsbSDK.USB_SDK_USER_LOGIN_INFO();
struUserLoginInfo.dwSize = struUserLoginInfo.size();
struUserLoginInfo.dwTimeout = 5000;
while (true) {
if (bDevCallBack) {
struUserLoginInfo.dwVID = StruDevceInfo.dwVID;
struUserLoginInfo.dwPID = StruDevceInfo.dwPID;
struUserLoginInfo.szUserName = "admin".getBytes();
struUserLoginInfo.szPassword = "12345".getBytes();
struUserLoginInfo.szSerialNumber = StruDevceInfo.szSerialNumber;
break;
}
}
struUserLoginInfo.write();
HCUsbSDK.USB_SDK_DEVICE_REG_RES struRegRes = new HCUsbSDK.USB_SDK_DEVICE_REG_RES();
struRegRes.dwSize = struRegRes.size();
struRegRes.write();
NativeLong lUserID = hcusbsdk.USB_SDK_Login(struUserLoginInfo, struRegRes);// 登录设备
if (lUserID.intValue() == -1) {
iError = hcusbsdk.USB_SDK_GetLastError();
logger.error("设备登陆失败,原因: " + iError);
hcusbsdk.USB_SDK_Logout(lUserID);
} else {
logger.info("登陆成功,lUserID: " + lUserID);
}
return lUserID;
}
/**
* 激活卡
* */
private static String active(NativeLong lUserID) {
int iError = 0;
HCUsbSDK.USB_SDK_WAIT_SECOND struWaitSecond = new HCUsbSDK.USB_SDK_WAIT_SECOND();
struWaitSecond.dwSize = struWaitSecond.size();
struWaitSecond.byWait = 0;
struWaitSecond.write();
HCUsbSDK.USB_SDK_ACTIVATE_CARD_RES struActivate = new HCUsbSDK.USB_SDK_ACTIVATE_CARD_RES();
struActivate.dwSize = struActivate.size();
struActivate.byCardType = 1;
struActivate.write();
HCUsbSDK.USB_CONFIG_INPUT_INFO struInput = new HCUsbSDK.USB_CONFIG_INPUT_INFO();
struInput.lpInBuffer = struWaitSecond.getPointer();
struInput.dwInBufferSize = struWaitSecond.size();
struInput.write();
HCUsbSDK.USB_CONFIG_OUTPUT_INFO struOutput = new HCUsbSDK.USB_CONFIG_OUTPUT_INFO();
struOutput.lpOutBuffer = struActivate.getPointer();
struOutput.dwOutBufferSize = struActivate.size();
struOutput.write();
boolean bRet =
hcusbsdk.USB_SDK_GetDeviceConfig(lUserID, HCUsbSDK.USB_SDK_GET_ACTIVATE_CARD, struInput, struOutput);
if (!bRet) {
iError = hcusbsdk.USB_SDK_GetLastError();
logger.error("激活失败,原因: " + iError);
return "";
}
struOutput.read();
struActivate.read();
String strSerial = "";
for (int i = 0; i < struActivate.bySerialLen; i++) {
int iSerial = struActivate.bySerial[i] & 0xff;
strSerial = strSerial + new String(Integer.toHexString(iSerial)) + " ";
}
logger.info("激活成功,卡号:" + strSerial);
return strSerial;
}
/**
* (M1卡) 验证扇区密码
* */
private static void valid(NativeLong lUserID) {
int iError = 0;
HCUsbSDK.USB_SDK_M1_PWD_VERIFY struWaitSecond = new HCUsbSDK.USB_SDK_M1_PWD_VERIFY();
struWaitSecond.dwSize = struWaitSecond.size();
struWaitSecond.bySectionNum = hexToByte("1");
struWaitSecond.byPasswordType = hexToByte("0");
struWaitSecond.byPassword = hexToByteArray("FFFFFFFFFFFF");
struWaitSecond.write();
HCUsbSDK.USB_CONFIG_INPUT_INFO struInput = new HCUsbSDK.USB_CONFIG_INPUT_INFO();
struInput.lpInBuffer = struWaitSecond.getPointer();
struInput.dwInBufferSize = struWaitSecond.size();
struInput.write();
HCUsbSDK.USB_CONFIG_OUTPUT_INFO struOutput = new HCUsbSDK.USB_CONFIG_OUTPUT_INFO();
struOutput.lpOutBuffer = struWaitSecond.getPointer();
struOutput.dwOutBufferSize = struWaitSecond.size();
struOutput.write();
boolean bRet =
hcusbsdk.USB_SDK_SetDeviceConfig(lUserID, HCUsbSDK.USB_SDK_SET_M1_PWD_VERIFY, struInput, struOutput);
if (!bRet) {
iError = hcusbsdk.USB_SDK_GetLastError();
logger.error("设备验证失败原因: " + iError);
return;
}
logger.info("验证成功");
}
/**
* 写卡操作
* @param lUserID 登录结果
* @param cardNo 卡号
* */
private static void write(NativeLong lUserID, String cardNo) {
int iError = 0;
while (cardNo.length() < 32) {
cardNo = "0" + cardNo;
}
if (cardNo.length() > 32) {
cardNo = cardNo.substring(0, 16);
}
HCUsbSDK.USB_SDK_M1_BLOCK_WRITE_DATA struWaitSecond = new HCUsbSDK.USB_SDK_M1_BLOCK_WRITE_DATA();
struWaitSecond.dwSize = struWaitSecond.size();
// struWaitSecond.wAddr = hexToByteArray("4");
struWaitSecond.wAddr = 4;
struWaitSecond.byDataLen = 16;
struWaitSecond.byData = hexToByteArray(cardNo);
struWaitSecond.write();
HCUsbSDK.USB_CONFIG_INPUT_INFO struInput = new HCUsbSDK.USB_CONFIG_INPUT_INFO();
struInput.lpInBuffer = struWaitSecond.getPointer();
struInput.dwInBufferSize = struWaitSecond.size();
struInput.write();
HCUsbSDK.USB_CONFIG_OUTPUT_INFO struOutput = new HCUsbSDK.USB_CONFIG_OUTPUT_INFO();
struOutput.lpOutBuffer = struWaitSecond.getPointer();
struOutput.dwOutBufferSize = struWaitSecond.size();
struOutput.write();
boolean bRet =
hcusbsdk.USB_SDK_SetDeviceConfig(lUserID, HCUsbSDK.USB_SDK_SET_M1_WRITE_BLOCK, struInput, struOutput);
if (!bRet) {
iError = hcusbsdk.USB_SDK_GetLastError();
logger.error("写卡失败,原因: " + iError);
makeDevice(lUserID, "3", "3", "2", "3"); //写卡错误是快鸣2下,闪烁2下红灯
return;
}
makeDevice(lUserID, "2", "1", "3", "2"); //写卡成功是慢鸣1下,闪烁2下蓝灯
logger.info("写卡成功,内容为" + cardNo);
}
/**
* 控制蜂鸣器及显示灯
* @param lUserID 登录
* @param buBeepType 蜂鸣类型 0无效,1连续,2慢鸣,3快鸣,4停止
* @param buBeepCount 鸣叫次数, (只对慢鸣、快鸣有效,且不能为0)
* @param byFlickerType 闪烁类型 0无效,1连续,2错误,3正确,4停止
* @param byFlickerCount 闪烁次数(只对错误、正确有效,且不能为0)
* */
public static Boolean makeDevice(NativeLong lUserID, String buBeepType, String buBeepCount, String byFlickerType, String byFlickerCount){
HCUsbSDK.USB_SDK_BEEP_AND_FLICKER fukcjer = new HCUsbSDK.USB_SDK_BEEP_AND_FLICKER();
fukcjer.dwSize = fukcjer.size();
fukcjer.byBeepType = hexToByte(buBeepType);
fukcjer.byBeepCount = hexToByte(buBeepCount);
fukcjer.byFlickerType = hexToByte(byFlickerType);
fukcjer.byFlickerCount = hexToByte(byFlickerCount);
fukcjer.write();
HCUsbSDK.USB_CONFIG_INPUT_INFO pInputInfo = new HCUsbSDK.USB_CONFIG_INPUT_INFO();
pInputInfo.lpInBuffer = fukcjer.getPointer();
pInputInfo.dwInBufferSize = fukcjer.size();
pInputInfo.write();
HCUsbSDK.USB_CONFIG_OUTPUT_INFO pOutInfo = new HCUsbSDK.USB_CONFIG_OUTPUT_INFO();
pOutInfo.dwOutBufferSize = fukcjer.size();
pOutInfo.write();
Boolean bb =hcusbsdk.USB_SDK_SetDeviceConfig(lUserID, HCUsbSDK.USB_SDK_SET_BEEP_AND_FLICKER,pInputInfo,pOutInfo);
return bb;
}
public static byte[] hexToByteArray(String inHex) {
int hexlen = inHex.length();
byte[] result;
if (hexlen % 2 == 1) {
// 奇数
hexlen++;
result = new byte[(hexlen / 2)];
inHex = "0" + inHex;
} else {
// 偶数
result = new byte[(hexlen / 2)];
}
int j = 0;
for (int i = 0; i < hexlen; i += 2) {
result[j] = hexToByte(inHex.substring(i, i + 2));
j++;
}
return result;
}
public static byte hexToByte(String inHex) {
return (byte)Integer.parseInt(inHex, 16);
}
public static String make(){
Map<String, Object> map = new HashMap<String, Object>();
int card = 10000;
String cardnum = "10000";
NativeLong lUserID = login();
try {
String readKh = active(lUserID);
valid(lUserID);
String cardNo = card+ String.valueOf(cardnum);
write(lUserID, Long.toHexString(Long.valueOf(cardNo)));
} catch (Exception e) {
e.printStackTrace();
}finally {
//退出登录
hcusbsdk.USB_SDK_Logout(lUserID);
}
return "";
}
private static String read(NativeLong lUserID) {
int iError = 0;
HCUsbSDK.USB_SDK_M1_BLOCK_ADDR struWaitSecond = new HCUsbSDK.USB_SDK_M1_BLOCK_ADDR();
struWaitSecond.dwSize = struWaitSecond.size();
struWaitSecond.wAddr = 4;
struWaitSecond.write();
HCUsbSDK.USB_SDK_M1_BLOCK_DATA struOut = new HCUsbSDK.USB_SDK_M1_BLOCK_DATA();
struOut.dwSize = struOut.size();
struOut.write();
HCUsbSDK.USB_CONFIG_INPUT_INFO struInput = new HCUsbSDK.USB_CONFIG_INPUT_INFO();
struInput.lpInBuffer = struWaitSecond.getPointer();
struInput.dwInBufferSize = struWaitSecond.size();
struInput.write();
HCUsbSDK.USB_CONFIG_OUTPUT_INFO struOutput = new HCUsbSDK.USB_CONFIG_OUTPUT_INFO();
struOutput.lpOutBuffer = struOut.getPointer();
struOutput.dwOutBufferSize = struOut.size();
struOutput.write();
boolean bRet =
hcusbsdk.USB_SDK_SetDeviceConfig(lUserID, HCUsbSDK.USB_SDK_GET_M1_READ_BLOCK, struInput, struOutput);
if (!bRet) {
iError = hcusbsdk.USB_SDK_GetLastError();
logger.error("读卡失败,原因为" + iError);
makeDevice(lUserID, "3", "3", "2", "3");
return "";
}
struOutput.read();
struOut.read();
String strSerial = "";
strSerial = bytes2hexStr(struOut.byData);
makeDevice(lUserID, "2", "1", "3", "2");
return String.valueOf(Long.parseLong(strSerial, 16));
}
private static final char[] HEX_CHARS = {'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};
/*
* byte[]数组转十六进制
*/
public static String bytes2hexStr(byte[] bytes) {
int len = bytes.length;
if (len == 0) {
return null;
}
char[] cbuf = new char[len * 2];
for (int i = 0; i < len; i++) {
int x = i * 2;
cbuf[x] = HEX_CHARS[(bytes[i] >>> 4) & 0xf];
cbuf[x + 1] = HEX_CHARS[bytes[i] & 0xf];
}
return new String(cbuf);
}
}
具体HCUsbSDK如下:
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package com.keyou.blzx.controller.hksdk.callback;
import com.sun.jna.Native;
import com.sun.jna.NativeLong;
import com.sun.jna.Pointer;
import com.sun.jna.Structure;
import com.sun.jna.win32.StdCallLibrary;
public interface HCUsbSDK extends StdCallLibrary {
HCUsbSDK INSTANCE = (HCUsbSDK) Native.loadLibrary("F:\\hu\\hik\\demo\\lib\\dll\\HCUsbSDK\\HCUsbSDK",HCUsbSDK.class); //根据自己位置放置
public static final int MAX_MANUFACTURE_LEN = 32;
public static final int MAX_DEVICE_NAME_LEN = 32;
public static final int MAX_SERIAL_NUM_LEN = 48;
public static final int MAX_USERNAME_LEN = 32;
public static final int MAX_PASSWORD_LEN = 16;
public static final int USB_SDK_GET_ACTIVATE_CARD = 0x0104; //激活卡
public static final int USB_SDK_GET_CERTIFICATE_INFO = 1000; //获取身份证信息
public static final int USB_SDK_SET_BEEP_AND_FLICKER = 0x0100;
public static final int USB_SDK_SET_M1_WRITE_BLOCK = 0x0108;
public static final int USB_SDK_SET_M1_PWD_VERIFY = 0x0106;
public static final int USB_SDK_GET_M1_READ_BLOCK = 0x0107;
public static class USB_SDK_DEVICE_INFO extends Structure{
public int dwSize; //结构体大小
public int dwVID; //设备VID
public int dwPID; //设备PID
public byte[] szManufacturer = new byte[MAX_MANUFACTURE_LEN/*32*/];//制造商(来自描述符)
public byte[] szDeviceName = new byte[MAX_DEVICE_NAME_LEN/*32*/];//设备名称(来自描述符)
public byte[] szSerialNumber = new byte[MAX_SERIAL_NUM_LEN/*48*/];//设备序列号(来自描述符)
public byte [] byRes = new byte[68];
}
public static class USB_SDK_USER_LOGIN_INFO extends Structure{
public int dwSize; //结构体大小
public int dwTimeout; //登录超时时间(单位:毫秒)
public int dwVID; //设备VID,枚举设备时得到
public int dwPID; //设备PID,枚举设备时得到
public byte[] szUserName = new byte[MAX_USERNAME_LEN/*32*/]; //用户名
public byte[] szPassword = new byte[MAX_PASSWORD_LEN/*16*/]; //密码
public byte[] szSerialNumber = new byte[MAX_SERIAL_NUM_LEN/*48*/]; //设备序列号,枚举设备时得到
public byte[] byRes = new byte[80];
}
public static class USB_SDK_DEVICE_REG_RES extends Structure{
public int dwSize; //结构体大小
public byte[] szDeviceName= new byte[MAX_DEVICE_NAME_LEN /*32*/]; //设备名称
public byte[] szSerialNumber= new byte[MAX_SERIAL_NUM_LEN /*48*/]; //设备序列号
public int dwSoftwareVersion; //软件版本号,高16位是主版本,低16位是次版本
public byte[] byRes = new byte[40];
}
public static class USB_CONFIG_INPUT_INFO extends Structure{
public Pointer lpCondBuffer; //指向条件缓冲区
public int dwCondBufferSize;//条件缓冲区大小
public Pointer lpInBuffer; //指向输出缓冲区
public int dwInBufferSize; //输入缓冲区大小
public byte[] byRes = new byte[48];
}
public static class USB_CONFIG_OUTPUT_INFO extends Structure{
public Pointer lpOutBuffer; //指向输出缓冲区
public int dwOutBufferSize; //输出缓冲区大小
public byte[] byRes = new byte[56];
}
public static class USB_SDK_WAIT_SECOND extends Structure{
public int dwSize; //结构体大小
public byte byWait; // 1Byte操作等待时间(0-一直执行直到有卡响应,其他对应1S单位)
public byte[] byRes = new byte[27];
}
public static class USB_SDK_ACTIVATE_CARD_RES extends Structure{
public int dwSize;
public byte byCardType;// 卡类型(0-TypeA m1卡,1-TypeA cpu卡,2-TypeB,3-125kHz Id卡)
public byte bySerialLen; //卡物理序列号字节长度
public byte[] bySerial = new byte[10];//卡物理序列号
public byte bySelectVerifyLen; //选择确认长度
public byte[] bySelectVerify = new byte[3]; //选择确认(3字节)
public byte[] byRes = new byte[12];
}
public static class USB_SDK_M1_BLOCK_WRITE_DATA extends Structure{
public int dwSize;
public short wAddr;
// public byte[] wAddr = new byte[8];
public byte byDataLen;
public byte byRes1;
public byte[] byData = new byte[16];
public byte[] byRes = new byte[8];
}
public static class USB_SDK_CERTIFICATE_INFO extends Structure{
public int dwSize; //结构体大小
public short wWordInfoSize; //文字信息长度
public short wPicInfoSize; //相片信息长度
public short wFingerPrintInfoSize; //指纹信息长度
public byte byCertificateType; //证件类型:0-身份证,1-中国绿卡
public byte byRes2;
// public byte [] byWordInfo =new byte[256];
public USB_WORD_INFORMATION byWordInfo; //文字信息
public byte [] byPicInfo = new byte[1024]; //相片信息
public byte [] byFingerPrintInfo = new byte[1024]; //指纹信息
public byte [] byRes = new byte[40]; //
}
public static class USB_WORD_INFORMATION extends Structure{
public byte[] byNmae = new byte [30]; //姓名
public short sex; //性别
public int nationalCode; //民族代码
public byte[] birthDay = new byte[16]; //出生日期
public byte[] address = new byte[70]; //住址
public byte[] byCertificateNumber = new byte[36]; //证件号码
public byte[] issuingAuthority = new byte[30]; //签发机关
public byte[] byEffectiveDate = new byte[16]; //起始有效日期
public byte[] byIneffectiveDate = new byte[16];//截止有效日期
public byte[] byRes = new byte[36]; //保留字节;
}
public static class USB_SDK_BEEP_AND_FLICKER extends Structure{
public int dwSize;
public byte byBeepType;
public byte byBeepCount;
public byte byFlickerType;
public byte byFlickerCount;
public byte[] byRes = new byte[24]; //保留字节;
}
public static class USB_SDK_M1_PWD_VERIFY extends Structure{
public int dwSize;
public byte byPasswordType;
public byte bySectionNum;
public byte[] byRes1 = new byte[2];
public byte[] byPassword = new byte[6];
public byte[] byRes = new byte[18];
}
public static class USB_SDK_M1_BLOCK_ADDR extends Structure{
public int dwSize;
public short wAddr;
public byte[] byRes = new byte[26];
}
public static class USB_SDK_M1_BLOCK_DATA extends Structure{
public int dwSize;
public byte[] byData = new byte[16];
public byte[] byRes = new byte[12];
}
public static interface fEnumDeviceCallBack extends StdCallCallback {
public void invoke(USB_SDK_DEVICE_INFO pDevceInfo, Pointer pUser);
}
boolean USB_SDK_Init();//USB_SDK的初始化
boolean USB_SDK_Cleanup();//USB_SDK的反初始化
boolean USB_SDK_SetLogToFile(int dwLogLevel, String strLogDir, boolean bAutoDel);
int USB_SDK_GetLastError();//获取错误码
String USB_SDK_GetErrorMsg(int dwErrorCode);//获取错误码对应的信息
boolean USB_SDK_EnumDevice(fEnumDeviceCallBack cbEnumDeviceCallBack, Pointer pUser);//枚举USB设备
NativeLong USB_SDK_Login(USB_SDK_USER_LOGIN_INFO pUsbLoginInfo, USB_SDK_DEVICE_REG_RES pDevRegRes);//登录设备
boolean USB_SDK_Logout(NativeLong lUserID);//关闭USB设备
boolean USB_SDK_SetDeviceConfig(NativeLong lUserID, int dwCommand, USB_CONFIG_INPUT_INFO pConfigInputInfo, USB_CONFIG_OUTPUT_INFO pConfigOutputInfo);
//激活卡:dwCommand对应为USB_SDK_GET_ACTIVATE_CARD,pInputInfo->lpInBuffer对应结构体USB_SDK_WAIT_SECOND,pOutputInfo->lpOutBuffer对应结构体USB_SDK_ACTIVATE_CARD_RES
boolean USB_SDK_GetDeviceConfig(NativeLong lUserID, int dwCommand, USB_CONFIG_INPUT_INFO pConfigInputInfo, USB_CONFIG_OUTPUT_INFO pConfigOutputInfo);
}
具体包已上传,可参考https://download.csdn.net/download/qq_40524941/19764369?spm=1001.2014.3001.5503