海康设备xml透传以及DS-K1F100-D8E 设备下发卡 ,读卡

2023-05-16

对接海康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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

海康设备xml透传以及DS-K1F100-D8E 设备下发卡 ,读卡 的相关文章

  • Android 中的列表(特别是 RecyclerView 和 CardView)如何工作

    请原谅我问这个问题 但我是 Android 开发新手 尽管我正在尝试了解developer android com 网站上的基础知识 但大多数示例 即使他们说它们是为 Android Studio 构建的 尚未设置为使用 Gradle 因此
  • Java - 从 XML 文件读取注释

    我必须从 XML 文件中提取注释 我找不到使用 JDOM 或其他东西来让它们使用的方法 目前我使用 Regex 和 FileReader 但我不认为这是正确的方法 您可以使用 JDOM 之类的东西从 XML 文件中获取注释吗 或者它仅限于元
  • 如何在iPhone上读入并解析XML文件?

    我有一个返回 XML 文件的 Web 服务器 可以说http www foo bar foo php wantXML 1 http www foo bar foo php wantXML 1 我如何从服务器获取该文件 然后解析它以访问数据
  • 在另一个布局中以编程方式膨胀布局

    我的 Android 应用程序需要帮助 我需要在另一个布局中膨胀一个布局 但我不知道该怎么做 我的xml代码是这样的 item xml 我需要膨胀多个 xml 取决于可变数量
  • Inno Setup:使用缩进保存 XML 文档

    我正在尝试在 Inno Setup 中向 XML 文件添加一个新节点 节点添加正确 但下一个标记之前的换行符被删除或未添加换行符 这是我的添加节点代码 NewNode XMLDoc createElement Test XMLDoc set
  • 如何使用 XML 序列化更改 XML 根名称?

    我试图在使用 C 进行 XML 序列化时更改根名称 它始终采用类名称 而不是我试图设置它的名称 using System using System Collections Generic using System Linq using Sy
  • 将属性值指定为 CDATA

    可以将 XML 属性值指定为 CDATA 吗 如果是的话 相同的模式是什么 如果不是 为什么 XML 中没有解决这个限制 不 你不能这样做 在什么构成属性和什么构成子元素之间存在非常细的界限 并且存在很大的争论 看here https st
  • 对象 xml 反序列化问题?

    我的对象具有父子关系 每个子对象都有一个Parent指向其容器的属性 当这个对象在应用程序中创建时 它就被设置了 因此没有问题 此 Parent 属性标记有 XmlIgnore 属性 因为它需要设置为其运行时父实例 那么 在对象反序列化后初
  • 用于 RSS feed 解析的 Objective-C 库?

    我正在为 iOS 应用程序寻找一个 Objective C 库 该库将解析并显示 RSS 提要中的文章 具体来说 我正在寻找为新闻网站制作一个应用程序 如果可能的话 该框架应该能够使用各种 RSS XML 结构 嗯 有两个不同的新闻网站 一
  • 如何在 xslt 2.0 中获取与此场景相关的特定 XML 元素索引?

    我想使用 XSLT2 0 将一个 xml 转换为另一个 xml 在这样做时 我想找到一些与我在此处解释的场景相关的 XML 元素索引 这是 XML 文档
  • xpath 根据子值选择父级

    我希望选择状态为 实时 的每个活动 我在 Drupal 的 XPath XML 解析器中使用它 并具有上下文基本查询和 xpath 查询字段 上下文 这是基本查询 所有其他查询都将在此上下文中运行 我目前有 语境 event status
  • JaxB2Marshaller 未将 XML 绑定到 Kotlin 数据类

    我正在编写一个批处理作业来解析 XML 提取字段并将它们保存在数据库中 解析 XML 时 它会选取 2 个根元素 但将所有字段保留为空 因此在我的数据库中 我有 2 条记录将为空字段 似乎无法弄清楚为什么它无法读取元素 TIA Bean f
  • Xml、xsl Javascript 排序

    我正在寻找一种使用 javascript 对 xml 数据进行排序的方法 并希望最终过滤掉数据 我知道这一切都可以在 xsl 文件中实现 但我想在客户端进行 我已经搜索了多个使用 javascript 进行排序的地方 但其中大部分要么太特定
  • XSLT——将文本节点的值解释为 XPath 查询(并在转换中使用它)

    我一直在试图想出一个像样的解决方案来解决这个问题 但我什至找不到一个不雅的解决方案 我有一个 XML 文件 看起来有点像这样
  • Android Studio图形界面中的ViewFlipper切换?

    感谢您抽出时间并在有时间的情况下回答我的问题 我对 Android 编程相当陌生 所以任何帮助都很棒 我正在使用 Android Studio 并且编写了一个包含多个布局的 XML 布局 我可以在使用 ViewFlipper showNex
  • Python:将 xml 文件转换为图像

    我希望使用 python 脚本将 xml 文件转换为图像 最好是 png 文件 我没有从我的在线研究中找到太多信息 我正在尝试使用 PIL 从这个帖子 https stackoverflow com questions 5741803 co
  • 在方法/数据成员中向 WCF 添加限制

    我是 WCF 新手 我尝试对数据成员添加限制 例如在这个方法中 DataMember public string StringValue get return stringValue set stringValue value 我想设置最大
  • 将新的 XElement 添加到 Xdocument

    我有以下代码 它成功写入 XML 文件 但是 由于进行了 tagRegistry Save 调用 它每次都会被覆盖 如何将新的 XElement 添加到现有文件 目前该文件只是被覆盖 public void saveTag if File
  • 即使使用 标记,XSL 也会忽略我的空格

    我在 XSL 代码中创建一个标头 其中包含多个信息字段 即 姓名 Bob 出生日期 1900 年 1 月 1 日 等 我将它们包含在标签中 如下所示
  • 如何保留标记?

    我有一个包含新闻报道的 XML 文档 并且新闻报道的 body 元素在纯文本中包含 p 标签 当我使用 XSL 检索正文时 例如

随机推荐

  • c语言| |strstr函数的源代码以及自我实现

    strstr函数 strstr函数 xff1a strstr str1 str2 函数用于判断字符串str2是否是str1的子串 如果是 xff0c 则该函数返回str2在str1中首次出现的地址 xff1b 否则 xff0c 返回NULL
  • 如何在Linux下用vim编写代码

    1 首先进入到一个目录下 xff0c 输入命令 vim test c 2 便会在该目录下 xff0c 创建一个test c xff08 test c不存在 xff09 的文件 xff0c 如果test c存在的话 xff0c 那么就打开该文
  • C语言| |c语言下如何输出彩色的字

    c语言下如何输出彩色的字 使用格式 xff1a 样式开始 43 被修饰字符串 43 样式结束 样式开始 xff1a 033 43 参数1 43 xff1a 43 参数2 43 xff1a 43 参数3 43 m 参数1 xff1a 代表背景
  • Linux| |对于UDP的学习

    UDP 前序 UDP xff08 用户数据报协议 xff09 没有连接的 xff0c 是面向数据报的 xff0c 是不可靠 套接字 就是IP地址 43 端口号 IP地址 xff1a 4字节 端口号 xff1a 2字节 xff0c 也就是说范
  • 数据结构| |各类排序的时间复杂度以及稳定性

    各类排序的时间复杂度以及稳定性 插入排序 xff1a 直接插入排序 xff1a O N 2 稳定 希尔排序 xff1a O N 1 3 不稳定 选择排序 xff1a 选择排序 xff1a O N 2 不稳定 堆排序 xff1a O Nlog
  • 安装Nvidia显卡驱动和CUDA

    原链接 http community bwbot org topic 152 网上看到的 xff0c 但是原链接 不过这里安装的是CUDA7 5 xff0c 现在最新的是8 0 可以到官网进行下载 xff0c 记住一定不要选择deb方式 x
  • Linux| |IP地址的三类私有地址

    IP地址的三类私有地址 对于IP地址来说有着三种私有地址 三种私有地址如下 xff1a 10 0 0 0 10 255 255 255 172 16 0 0 172 16 255 255 192 168 0 0 192 168 255 25
  • Linux| |如何高效切换目录

    Linxu如何高效切换目录 前言 Linux下对于目录的切换 xff0c 大家肯定会想到一个命令 xff1a cd命令 cd命令确实方便 xff0c 但是当需要频繁的切换目录的时候 xff0c cd命令可能比较麻烦了 比如 xff1a ho
  • C++| |四种强制类型转化(剖析)

    四种强制类型转换 1 出现的原因 C语言的强制类型转换 xff0c 有着两种 隐式类型转换 显示的强制类型转换 举例 xff1a int main int i 61 1 double d 61 i 隐式类型转换 int p 61 amp i
  • 数据结构| |快速排序,二路快排,三路快排

    快速排序 二路快排 三路快排 1 快速排序 1 概念 快速排序采用分治的思想对数据进行排序 选择一个基准值 将比基准值小的放在基准值的左边 xff0c 其余的 xff08 大于或者等于 xff09 放在右边 然后再对左边和右边继续进行划分
  • socket编程中write、read和send、recv

    write xff08 xff09 与read xff08 xff09 函数send xff08 xff09 与recv xff08 xff09 函数 一旦 xff0c 我们建立好了tcp连接之后 xff0c 我们就可以把得到的fd当作文件
  • Ubuntu上火狐浏览器无法上网的解决方法

    网上有的方法是在浏览器中选择更新 xff0c 后来找到了更加直接好用的方法 xff0c 只需要几行命令就可以 1 在终端中输入sudo apt get update 如果在这一步出现错误 xff0c 显示暂时不能解析域名的情况 xff0c
  • 实现字符串连接函数(strcat)

    在字符串的操作中strcat函数的使用是频繁的 xff0c 那么下面我们来自己实现strcat函数的功能 自定义一个函数将要连接的两个字符串作为参数传入 xff0c 然后将str1赋值给临时变量p 然后p一直向后指 xff0c 直到str1
  • C#开发简单的串口上位机

    采用C 开发上位机非常方便 xff0c 具体步骤如下 xff1a 1 绘制一个上位机的界面 xff0c 如下图所示 xff1a 不要忘记还有下面的串口模块serialPort1 2 初始化部分 xff1a 波特率编辑框中加入需要的波特率 实
  • STM32读取匿名光流数据——与Guidance的光流和超声波做对比测试

    使用两个串口同时读取匿名光流和Guidance数据 xff1a 用以比较两个光流的效果 Github链接 xff1a https github com W yt YuTian Pro tree master Guidance 26Ano R
  • UDP编程笔记

    1 字节序 1 1 概念 是指多字节数据的存储顺序 1 2 分类 小端格式 xff1a 将低位字节数据存储在低地址 大端格式 xff1a 将高位字节数据存储在低地址 1 3 注意 LSB xff1a 低地址 MSB xff1a 高地址 2
  • rviz的简单使用

    原链接 xff1a http community bwbot org 运行测试平台 小强ROS机器人 rviz是ros自带的一个图形化工具 xff0c 可以方便的对ros的程序进行图形化操作 其使用也是比较简单 整体界面如下图所示 界面主要
  • c语言_结构体封装寄存器的用法,以及typedef、 volatile、static、 inline关键字用法

    define span class token constant ELFIN TIMER BASE span span class token number 0xE2500000 span span class token comment
  • Ros—RPLIDAR A2激光雷达安装(hector_mapping算法建图同cartographer_ros建图对比)

    Ros RPLIDAR A2激光雷达安装 hector mapping算法建图同cartographer ros建图对比 因为大部分教程复杂繁琐 xff0c 而且容易失败 便整理总结了一下网上的资料 xff0c 感谢 Cayla和 口袋里的
  • 海康设备xml透传以及DS-K1F100-D8E 设备下发卡 ,读卡

    对接海康5604设备 设置温度上限及下限 设备较多通过demo手动透传不可取 故采用代码方式进行透传 代码记录 方便后续开发找方便 public void setThermal Map lt String Object gt params