前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java调用海康HCUsbSDK制卡刷卡读卡

Java调用海康HCUsbSDK制卡刷卡读卡

作者头像
sunonzj
发布2022-06-21 10:18:33
1.5K0
发布2022-06-21 10:18:33
举报
文章被收录于专栏:zjblogzjblog

根据HCUsbSDK接口文档和JAVADEMO开发的一个发卡、读卡、刷卡的程序

淘宝买的空白UID卡,卡里需要存入员工工号和卡编号,在web后台来操作制卡、刷卡

简单记录下,方便以后开发相似的功能可以直接拿去用

发卡器型号是【海康威视DS-K1F100-D8E】

卡.jpg
卡.jpg

Mifare卡操作

image.png
image.png

登录设备、激活卡、密码验证

代码语言:javascript
复制
/**
 * @param args the command line arguments
 */
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 class fDEVInfoCallBack implements HCUsbSDK.fEnumDeviceCallBack {
    @Override
    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);
            System.out.println("枚举到的设备信息:" + 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();
        System.out.println("枚举失败,错误码为" + 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();

    // System.out.println("dwSize:" +struUserLoginInfo.dwSize );
    // System.out.println("dwVID:" +struUserLoginInfo.dwVID );
    // System.out.println("dwPID:" +struUserLoginInfo.dwPID );
    // System.out.println("szUserName:" + new String(struUserLoginInfo.szUserName).trim() );
    // System.out.println("szPassword:" +new String(struUserLoginInfo.szPassword).trim() );
    // System.out.println("szSerialNumber:" +new String(struUserLoginInfo.szSerialNumber).trim() );

    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();
        System.out.println("登陆失败,错误码为" + iError);
        hcusbsdk.USB_SDK_Logout(lUserID);
    } else {
        System.out.println("登陆成功");
    }

    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();
        System.out.println("激活失败,错误码为" + 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)) + " ";
    }

    System.out.println("激活成功,卡号:" + strSerial);
    return strSerial;
}

//密码验证
private static void valid(NativeLong lUserID) {
    int iError = 0;
    HCUsbSDK.USB_SDK_SET_M1_PWD_VERIFY struWaitSecond = new HCUsbSDK.USB_SDK_SET_M1_PWD_VERIFY();
    struWaitSecond.dwSize = struWaitSecond.size();
    struWaitSecond.bySectionNum = hexToByte("1");
    struWaitSecond.byCardType = 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();
        System.out.println("验证失败,错误码为" + iError);
        return;
    }
    System.out.println("验证成功");
}

写卡、读卡

代码语言:javascript
复制
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.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();
        System.out.println("写卡失败,错误码为" + iError);
        makeDevice(lUserID, "3", "3", "2", "3");  //写卡错误是快鸣2下,闪烁2下红灯
        return;
    }
    makeDevice(lUserID, "2", "1", "3", "2");  //写卡成功是慢鸣1下,闪烁2下蓝灯
    System.out.println("写卡成功,内容为" + cardNo);
}

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 = hexToByteArray("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();
        System.out.println("读卡失败,错误码为" + iError);
        makeDevice(lUserID, "3", "3", "2", "3");
        return "";
    }
    struOutput.read();
    struOut.read();
    String strSerial = "";

    /*for (int i = 0; i < struOut.byData.length; i++) {
        int iSerial = struOut.byData[i] & 0xff;
        System.out.println(struOut.byData[i]+"____"+iSerial+"___"+Integer.toHexString(iSerial));

        strSerial = strSerial + new String(Integer.toHexString(iSerial)) + "";
    }*/
    strSerial = bytes2hexStr(struOut.byData);

    System.out.println(strSerial);
    makeDevice(lUserID, "2", "1", "3", "2");
    System.out.println("读卡成功,内容为" + Long.parseLong(strSerial, 16));
    return  String.valueOf(Long.parseLong(strSerial, 16));
}

控制蜂鸣器及显示灯(自定义声音和显示灯闪烁提示)

代码语言:javascript
复制
public static Boolean makeDevice(NativeLong lUserID, String buBeepType, String buBeepCount, String byFlickerType, String byFlickerCount){
    HCUsbSDK.USB_SDK_SET_BEEP_AND_FLICKER fukcjer = new HCUsbSDK.USB_SDK_SET_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);
    System.out.println(bb);
    return bb;
}

上面就是调用sdk的部分了,都是根据接口文档写的,下面是业务代码

获取唯一卡号、写卡、读卡

代码语言:javascript
复制
@RequestMapping(value = "/getKh.do")
@ResponseBody
public Object getKh() {
    NativeLong lUserID = login();
    String readKh = active(lUserID);
    valid(lUserID);
    Boolean ss =hcusbsdk.USB_SDK_Logout(lUserID);
    System.out.println("只获取卡号方法:"+readKh);
    System.out.println("退出登录:"+ss);
    return Ret.ok("获取成功").put("kh",readKh).put("lUserID",lUserID).build();
}

@RequestMapping(value = "/make.do")
@ResponseBody
public Object make() {
    Map<String, Object> map = new HashMap<String, Object>();
    PageData pd = this.getPageData();
    NativeLong lUserID = login();
    try {
        int cardnum = pd.getInteger("cardnum")+1;
        String number = pd.getString("number");

        String readKh = active(lUserID);
        valid(lUserID);
        String cardNo = number+ String.valueOf(cardnum);
        System.out.println("写入卡号:" + cardNo+"----"+Long.toHexString(Long.valueOf(cardNo)));
        write(lUserID, Long.toHexString(Long.valueOf(cardNo)));
        map.put("kh", readKh);
        map.put("cardNo", cardNo);
        //退出登录
        Boolean ss =hcusbsdk.USB_SDK_Logout(lUserID);
        pd.put("cardnum", cardnum);
        pd.put("status", "1");
        memberService.edit(pd);
        System.out.println("退出登录:"+ss);
        return Ret.ok("获取成功").put("kh",readKh).put("cardnum", cardnum).build();
    } catch (Exception e) {
        //退出登录
        hcusbsdk.USB_SDK_Logout(lUserID);
        logger.error(e.toString(), e);
    }
    return "";
}

@RequestMapping(value = "/showmakeRecord.do")
@ResponseBody
public Object showmakeRecord() {
    Map<String, Object> map = new HashMap<String, Object>();
    PageData pd = this.getPageData();
    NativeLong lUserID = login();
    try {

        String readKh = active(lUserID);
        map.put("kh", readKh);
        if(Tools.isEmpty(readKh)){
            map.put("cardid", "");
        }else{
            valid(lUserID);
            String cardid =  read(lUserID);
            if(Tools.isEmpty(cardid)||cardid.equals("0")){
                map.put("cardid", "0");
                hcusbsdk.USB_SDK_Logout(lUserID);
                return map;
            }
            System.out.println("读卡内容:"+cardid);
            String number = cardid.substring(0,4);
            pd.put("number",number);
            List<PageData> list = memberService.listAll(pd);
            map.put("lUserID", lUserID);
            map.put("info", list.get(0));
            map.put("cardid", cardid);
            //查询该卡当天是否已存记录
            PageData rpd = new PageData();
            rpd.put("cardNumber", cardid);
            Date now = new Date();
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
            rpd.put("createTime", sdf.format(now));
            List<PageData> rList = cardRecordService.listAll(rpd);
            //如该卡当天未刷,则新增记录
            if(rList.size()==0){
                PageData savePd = new PageData();
                savePd.put("id", Tools.getUniqueId());
                savePd.put("name", list.get(0).getString("name"));
                savePd.put("cardNumber", cardid);
                savePd.put("number", number);
                savePd.put("status", "0");
                savePd.put("type", "0");
                savePd.put("createTime", now);
                savePd.put("modifiedTime",now);
                savePd.put("isDeleted", 0);
                cardRecordService.save(savePd);
            }

        }
        hcusbsdk.USB_SDK_Logout(lUserID);

    } catch (Exception e) {
        hcusbsdk.USB_SDK_Logout(lUserID);
        logger.error(e.toString(), e);
    }
    return map;
}

前端写卡、刷卡操作

代码语言:javascript
复制
var num ;
var totalnum ;
var datetime ;
var overnum ;
var kh ;
var rtkh ;

function khf(i){
    console.log("i="+i+"——————num="+num);
    if(i>num){
        $('.btn-primary').removeAttr('disabled');
        return;
    }else{
        $.ajax({
            url: '<%=basePath%>cardMake/getKh.do',
            type: "POST",
            data:$('#form').serialize(),
            dataType: "json",
            async: true,
            success: function(data){
                rtkh = data.kh;
                $('#lUserID').val(data.lUserID);
                console.log("rtkh="+rtkh+"______kh="+kh);
                if(rtkh==""){
                    var now = new Date().getTime();
                    Alert("请将卡放置在卡机上", 1000,false);
                    var tt = now - datetime;
                    if(tt>10000){
                        $('#showinfo').html("<h4 style='color:red;'>由于长时间未操作,制卡已停止,已制卡"+overnum+"张,还剩"+totalnum+"张,请重新选择制卡张数开始制卡</h4>");
                        return;
                    }
                    khf(i);
                }else{
                    if(kh != rtkh){
                        $.ajax({
                            url: '<%=basePath%>cardMake/make.do',
                            type: "POST",
                            data: $('#form').serialize(),
                            dataType: "json",
                            async: true,
                            success: function(data){
                                kh = data.kh;
                                datetime = new Date().getTime();
                                totalnum--;
                                overnum++;
                                $('#cardnum').val(data.cardnum);
                                $('#cardnumover').text(data.cardnum);
                                //  Alert("制卡成功!", 2000);
                                if(overnum == num){
                                    $('#showinfo').html("<h4 style='color:red;'>制卡完成,本轮共制卡"+overnum+"张</h4>");
                                }else{
                                    $('#showinfo').html("<h4 style='color:red;'>制卡成功,已制卡"+overnum+"张</h4>");
                                }
                                khf(i+1);
                            }
                        })
                    }else{
                        Alert("该卡已制卡成功,请换一张卡!", 1000,false);
                        var tt = new Date().getTime() - datetime;
                        if(tt>10000){
                            $('#showinfo').html("<h4 style='color:red;'>由于长时间未操作,制卡已停止,已制卡"+overnum+"张,还剩"+totalnum+"张,请重新选择制卡张数开始制卡</h4>");
                            $('.btn-primary').removeAttr('disabled');
                            return;
                        }
                        khf(i);
                    }
                }
            }
        })
    }
}

function save(){
    $('.btn-primary').attr('disabled', 'disabled');
    $('#showinfo').html("<h4 style='color:red;'>请将卡放置在卡机上</h4>");
    if($('#form').valid()){

         num = $('#num').val();
         totalnum = $('#num').val();
         datetime = new Date().getTime();
         overnum = 0;
         kh = "";
         rtkh = "";
        khf(1);
    }else{
        $('.btn-primary').removeAttr('disabled');
    }
}

var datetime ;
var rtkh="" ;
var kh = "";
var i = 0;
function khf(){
   $.ajax({
        url: '<%=basePath%>cardMake/getKh.do',
        type: "POST",
        data:$('#form').serialize(),
        dataType: "json",
        async: true,
        success: function(data){
            rtkh = data.kh;
            console.log(data.lUserID);
            $('#lUserID').val(data.lUserID);
            console.log("kh="+kh+"___rtkh="+rtkh);
            if(kh != rtkh){
                $.ajax({
                    url: '<%=basePath%>cardMake/showmakeRecord.do',
                    type: "POST",
                    data:$('#form').serialize(),
                    dataType: "json",
                    async: true,
                    success: function(data){
                        kh = data.kh;
                        console.log(data);
                        datetime = new Date().getTime();
                        if(data.cardid==""){
                            var str = "<h3 style='margin-left: 12px;color:red;'>读卡失败,请重试</h3><hr>";
                            $('#showinfo').html(str);
                        }else if(data.cardid=="0"){
                            var str = "<h3 style='margin-left: 12px;color:red;'>读卡失败,该卡为空卡</h3><hr>";
                            $('#showinfo').html(str);
                        }else {
                            i++;
                            var str = "<h3 style='margin-left: 12px;'>读卡成功 + " + i + "</h3><hr>";
                            str += "<p style='margin-left: 12px;'>姓名:<span style='color:red;'>" + data.info.name + "</span></p>";
                            str += "<p style='margin-left: 12px;'>工号:<span style='color:red;'>" + data.info.number + "</span></p>";
                            str += "<p style='margin-left: 12px;'>卡ID:<span style='color:red;'>" + data.cardid + "</span></p>";
                            $('#showinfo').html(str);
                        }
                        khf()
                    }
                })
            }else{
                var t2 = new Date().getTime() - datetime;
                if(t2>10000){
                    $('#showinfo').html("<h4 style='color:red;margin-left: 12px;'>读卡完成</h4>");
                    $('.button1').removeAttr('disabled');
                    return;
                }
                khf()
            }
        }
    })

}

function ck(){
    $('.button1').attr('disabled', 'disabled');
    $('#showinfo').html("<h4 style='color:red;margin-left: 12px;'>请将卡放置在卡机上</h4>");
    datetime = new Date().getTime();
    khf();
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-11-18 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档