总结一下web端IC卡读卡器的调用方法

公司项目中用到了IC卡,需要实现读写IC卡,并且与服务端交互。IC卡读卡器用的是德卡的D8型号,SDK可以在德卡官网找到,下载链接:德卡SDK下载。

官方提供了多种语言的SDK,web端调用首先会想到页面调用OCX的方式。HTML内调用OCX的方法不在赘述,具体可以查看HTML调用OCX。IE浏览器在打开响应页面上需要点“允许阻止的内容”才能成功加载OCX控件,否则无法调用OCX。Chrome及其他浏览器相对复杂,请自行百度。

在操作IC卡之前先了解一下IC卡的一些基础(本文以M1卡为例):
M1卡有16个扇区,即0到15扇区,要读取扇区中的数据,首先要进行密码校验(校验读卡设备中的密码和卡上的密码);要读取哪个扇区的数据就要校验哪个扇区的密码,dc_read或dc_read_hex方法是用的地址是绝对地址(每个扇区4个地址,16个扇区共64个地址,即0到63),校验完0扇区的密码后,能读取0到3地址上的数据,校验完1扇区的密码后,能读取4到7地址上的数据,以此类推。假设扇区号是 sNo,数据块号是bNo,则:sNo号扇区的最小区块号为:4 * sNo,最大区块号为:4 * sNo + 3

对卡的操作基本步骤:
初始化 -> 寻卡 -> 校验密码 -> 操作(读、写、其他操作) -> dc_exit(不执行 exit的话OCX调用会出错)

  • 写卡示例函数
function writeCard(){var st; //主要用于返回值var lSnr; //本用于取序列号,但在javascript只是当成dc_card函数的一个临时变量var messageText = document.getElementById("messageText");st = rd.dc_init(100, 115200);if(st <= 0) //返回值小于等于0表示失败{rd.dc_exit();messageText.value = messageText.value += "dc_init error!\r\n\r\n";return;}messageText.value = messageText.value += "dc_init ok!\r\n";//寻卡,能返回在工作区域内某张卡的序列号var snrlen;st = rd.dc_card_n(0,snrlen);if(st != 0){messageText.value = messageText.value + "dc_card_n error!"+ "\r\n";rd.dc_exit();return;}messageText.value = messageText.value + "dc_card_n ok!"+ "\r\n";//messageText.value = messageText.value + rd.get_bstrRBuffer+ "\r\n";messageText.value = messageText.value + rd.get_bstrRBuffer_asc + "\r\n";rd.put_bstrSBuffer_asc = "FFFFFFFFFFFF";st = rd.dc_authentication_passaddr(0, 11);  //区块地址号根据需求确定if (st != 0) {messageText.value = messageText.value + "dc_authentication_passaddr error!" + "\r\n\r\n";rd.dc_exit();return;} else {messageText.value = messageText.value + "dc_authentication_passaddr ok!" + "\r\n";}messageText.value = messageText.value += "dc_card ok!\r\n";messageText.value = messageText.value += "卡序列号:" + rd.get_bstrRBuffer + "\r\n"; //序列号为rd.get_bstrRBuffer,一般有不可显示字符出现messageText.value = messageText.value += "卡序列号(ASCII):" + rd.get_bstrRBuffer_asc + "\r\n"; //序列号十六进制ascll码字符串表示为rd.get_bstrRBuffer_asc//向卡中写入数据,一次必须写一个块//第一个参数为块地址//在调用dc_write必须前先设置属性rd.put_bstrSBuffer或rd.put_bstrSBuffer_ascrd.put_bstrSBuffer_asc = "00000000000000000000000000000007";st = rd.dc_write(8);  //区块地址号根据需求确定if(st < 0) //返回值小于0表示失败{messageText.value = messageText.value += "dc_write error!\r\n\r\n";rd.dc_exit();return;}messageText.value = messageText.value += "dc_write ok!\r\n";st = rd.dc_beep(50);st = rd.dc_exit();if(st < 0){messageText += "dc_exit error!\r\n\r\n";} else {messageText += "dc_exit OK!\r\n\r\n";}
}
  • 读卡示例函数:
function readCard(){var st; //主要用于返回值var lSnr; //本用于取序列号,但在javascript只是当成dc_card函数的一个临时变量var messageText = document.getElementById("messageText");st = rd.dc_init(100, 115200);if(st <= 0) //返回值小于等于0表示失败{rd.dc_exit();messageText.value = messageText.value += "dc_init error!\r\n\r\n";return;}messageText.value = messageText.value += "dc_init ok!\r\n";//寻卡,能返回在工作区域内某张卡的序列号//第一个参数一般设置为0,表示IDLE模式,一次只对一张卡操作//第二个参数在javascript只是当成dc_card函数的一个临时变量,仅在vbscript中调用后能正确返回序列号st = rd.dc_card_n(0, lSnr);if(st < 0) //返回值小于0表示失败{messageText.value = messageText.value += "dc_card error!\r\n\r\n";rd.dc_exit();return;}messageText.value = messageText.value += "dc_card ok!\r\n";messageText.value = messageText.value += "卡序列号:" + rd.get_bstrRBuffer + "\r\n"; //序列号为rd.get_bstrRBuffer,一般有不可显示字符出现messageText.value = messageText.value += "卡序列号(ASCII):" + rd.get_bstrRBuffer_asc + "\r\n"; //序列号十六进制ascll码字符串表示为rd.get_bstrRBuffer_asc//核对密码函数//第一个参数为密码验证模式//第二个参数为扇区号rd.put_bstrSBuffer_asc = "FFFFFFFFFFFF";//st = rd.dc_authentication_passaddr(0, 7);st = rd.dc_authentication_passaddr(0, 11); //区块地址号根据需求确定if(st < 0) //返回值小于0表示失败{messageText.value = messageText.value += "dc_authentication error!\r\n\r\n";rd.dc_exit();return;}messageText.value = messageText.value += "dc_authentication ok!\r\n";//st = rd.dc_read(4);st = rd.dc_read(8);  //区块地址号根据需求确定if(st < 0){messageText.value = messageText.value += "dc_read error!\r\n\r\n";rd.dc_exit();return;}messageText.value = messageText.value += "卡信息: " + rd.get_bstrRBuffer_asc + "\r\n";st = rd.dc_beep(50);st = rd.dc_exit();if(st < 0) {messageText.value = messageText.value += "dc_exit error!\r\n\r\n";} else {messageText.value = messageText.value += "dc_exit OK!\r\n\r\n";}return;
}

初始化过程可以封装成一个函数统一处理。要写入哪些数据、写到哪个扇区、哪个数据块由根据业务需求确定,本文仅仅记录 德卡D8 型号读卡器的调用过程。

PS:代码内用到的JS函数可以查找德卡提供的SDK包内的文档

记录一下web端调用IC卡读卡器的大致流程相关推荐

  1. web端 刷卡器_在WEB浏览器使用IC卡读卡器的几种方案的对比

    随着现在BS结构的程序越来越多,在BS结构的web浏览器中使用IC卡读卡器也就变得更常见了.在web浏览器中集成IC卡读卡器目前有以下几种方案: 1.使用只读读卡器将IC卡的卡号输入到焦点处. 2.使 ...

  2. web调用IC卡读卡器开发第一章(转载)

    web调用IC卡读卡器 了解web用IC卡读卡器插件 IC卡读卡器WEB插件的自动感应和安装 IC卡读卡器WEB插件的回调函数 了解web用IC卡读卡器插件 友我科技的web用IC卡读卡器插件支持的浏 ...

  3. web调用IC卡读卡器开发第一章

    web调用IC卡读卡器 了解web用IC卡读卡器插件 IC卡读卡器WEB插件的自动感应和安装 IC卡读卡器WEB插件的回调函数 了解web用IC卡读卡器插件 友我科技的web用IC卡读卡器插件支持的浏 ...

  4. Java JNI调用IC卡读卡器

    Java JNI调用IC卡读卡器 Java调用IC卡读卡器的DLL一般有以下2种方式: 1.使用JNative第三方库调用IC卡读卡器dll的接口. 2.使用JNI调用IC卡读卡器dll的接口. JN ...

  5. web调用IC卡读卡器开发第三章--高频卡读卡号

    高频卡介绍 读取ISO14443A卡号 读取ISO14443B卡号 ISO15693标签的寻卡操作 目前的高频智能卡分为3种,分别为ISO14443A, ISO14443B和ISO15693协议的,这 ...

  6. web调用IC卡读卡器开发第八章--DES和3DES加解密

    DES和3DES加解密 关于DES和3DES IC卡web插件支持的3DES DES和3DES接口 IC中如果使用DES和3DES CPU卡中如何使用3DES 关于DES和3DES DES是一种标准加 ...

  7. web调用IC卡读卡器开发第四章--读写IC卡数据

    IC卡读卡器WEB读写IC卡数据 IC卡WEB读数据 IC卡网页自动读数据 IC卡网页写数据 采用友我科技IC卡读卡器web插件可以对普通IC卡进行读和写操作,根据实际业务需求,可以手动点击读写和在w ...

  8. web调用IC卡读卡器开发第六章--CPU卡APDU操作

    CPU卡APDU的web操作 CPU卡介绍 友我科技IC卡读卡器web插件 CPU卡复位 CPU卡APDU操作 操作例程 CPU卡介绍 CPU卡与M1卡不同, 他不是一种逻辑存储卡,一张空白的CPU卡 ...

  9. 跨web浏览器的IC卡读卡器解决方案

    BS结构的程序,如果要与IC卡读卡器通信本身就是件不容易解决的事情.微软的activex ocx技术将这种应用限制在IE浏览器上了,不兼容其它的浏览器.而Chrome使用插件也不兼容IE和其他的浏览器 ...

最新文章

  1. head和tail命令详解
  2. 电机驱动板测试:是否可以输出150kHz高频信号?
  3. 打开组策略时提示inetres.admx管理模板解析出错解决方法
  4. ML in Action 决策树
  5. JAVA BIO与NIO、AIO的区别
  6. 小程序音视频能力技术负责人解读“小程序直播”
  7. 奇异值分解(Singular Value Decomposition,SVD)
  8. LeetCode 1046. 最后一块石头的重量(priority_queue 堆)
  9. Android之记住密码与自动登陆实现
  10. 容器编排技术 -- Kubernetes kubectl create secret 命令详解
  11. 备份恢复:如何让xtrabackup恢复速度提升20倍?
  12. 本地提交到yarn_Yarn运行Flink作业 0449
  13. JS实现单源点最短路径、动态规划分段图算法
  14. 【Spring-AOP】底层类ProxyConfig,ProxyProcessorSupport分析
  15. dirent.h和dirent.c下载
  16. 计算机退出域后无法加域,win10退出域后无法再加入域
  17. source命令用法详解
  18. 讲解图层样式中的混合颜色带
  19. 马斯克把飞船方向盘用在特斯拉新车上!乞丐版80万起
  20. 微信公纵平台基本配置php_php微信公众平台开发(一) 配置接口

热门文章

  1. 黄健翔:观看欧冠决赛的建议!
  2. 甲方乙方项目管理的差别
  3. 51单片机控制小舵机
  4. 传智播客成都java培训中心的发展
  5. 为什么说测试岗位是巨坑?10年测试人告诉你千万别上当
  6. 嵌入式系统导论(彭蔓蔓等·人民邮电出版社)课后习题答案
  7. Vos作曲家的不完全介绍[枫叶飘零]
  8. python in finance大作业及作答
  9. 手把手教弟弟写了个扫雷demo,弟弟竟拿去跟大学同学装* 附(思路注释+源码)
  10. 大脑是如何编码外界各种信息的?