记录一下web端调用IC卡读卡器的大致流程
总结一下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卡读卡器的大致流程相关推荐
- web端 刷卡器_在WEB浏览器使用IC卡读卡器的几种方案的对比
随着现在BS结构的程序越来越多,在BS结构的web浏览器中使用IC卡读卡器也就变得更常见了.在web浏览器中集成IC卡读卡器目前有以下几种方案: 1.使用只读读卡器将IC卡的卡号输入到焦点处. 2.使 ...
- web调用IC卡读卡器开发第一章(转载)
web调用IC卡读卡器 了解web用IC卡读卡器插件 IC卡读卡器WEB插件的自动感应和安装 IC卡读卡器WEB插件的回调函数 了解web用IC卡读卡器插件 友我科技的web用IC卡读卡器插件支持的浏 ...
- web调用IC卡读卡器开发第一章
web调用IC卡读卡器 了解web用IC卡读卡器插件 IC卡读卡器WEB插件的自动感应和安装 IC卡读卡器WEB插件的回调函数 了解web用IC卡读卡器插件 友我科技的web用IC卡读卡器插件支持的浏 ...
- Java JNI调用IC卡读卡器
Java JNI调用IC卡读卡器 Java调用IC卡读卡器的DLL一般有以下2种方式: 1.使用JNative第三方库调用IC卡读卡器dll的接口. 2.使用JNI调用IC卡读卡器dll的接口. JN ...
- web调用IC卡读卡器开发第三章--高频卡读卡号
高频卡介绍 读取ISO14443A卡号 读取ISO14443B卡号 ISO15693标签的寻卡操作 目前的高频智能卡分为3种,分别为ISO14443A, ISO14443B和ISO15693协议的,这 ...
- web调用IC卡读卡器开发第八章--DES和3DES加解密
DES和3DES加解密 关于DES和3DES IC卡web插件支持的3DES DES和3DES接口 IC中如果使用DES和3DES CPU卡中如何使用3DES 关于DES和3DES DES是一种标准加 ...
- web调用IC卡读卡器开发第四章--读写IC卡数据
IC卡读卡器WEB读写IC卡数据 IC卡WEB读数据 IC卡网页自动读数据 IC卡网页写数据 采用友我科技IC卡读卡器web插件可以对普通IC卡进行读和写操作,根据实际业务需求,可以手动点击读写和在w ...
- web调用IC卡读卡器开发第六章--CPU卡APDU操作
CPU卡APDU的web操作 CPU卡介绍 友我科技IC卡读卡器web插件 CPU卡复位 CPU卡APDU操作 操作例程 CPU卡介绍 CPU卡与M1卡不同, 他不是一种逻辑存储卡,一张空白的CPU卡 ...
- 跨web浏览器的IC卡读卡器解决方案
BS结构的程序,如果要与IC卡读卡器通信本身就是件不容易解决的事情.微软的activex ocx技术将这种应用限制在IE浏览器上了,不兼容其它的浏览器.而Chrome使用插件也不兼容IE和其他的浏览器 ...
最新文章
- head和tail命令详解
- 电机驱动板测试:是否可以输出150kHz高频信号?
- 打开组策略时提示inetres.admx管理模板解析出错解决方法
- ML in Action 决策树
- JAVA BIO与NIO、AIO的区别
- 小程序音视频能力技术负责人解读“小程序直播”
- 奇异值分解(Singular Value Decomposition,SVD)
- LeetCode 1046. 最后一块石头的重量(priority_queue 堆)
- Android之记住密码与自动登陆实现
- 容器编排技术 -- Kubernetes kubectl create secret 命令详解
- 备份恢复:如何让xtrabackup恢复速度提升20倍?
- 本地提交到yarn_Yarn运行Flink作业 0449
- JS实现单源点最短路径、动态规划分段图算法
- 【Spring-AOP】底层类ProxyConfig,ProxyProcessorSupport分析
- dirent.h和dirent.c下载
- 计算机退出域后无法加域,win10退出域后无法再加入域
- source命令用法详解
- 讲解图层样式中的混合颜色带
- 马斯克把飞船方向盘用在特斯拉新车上!乞丐版80万起
- 微信公纵平台基本配置php_php微信公众平台开发(一) 配置接口