生活随笔
收集整理的這篇文章主要介紹了
记录一下web端调用IC卡读卡器的大致流程
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
總結(jié)一下web端IC卡讀卡器的調(diào)用方法
公司項目中用到了IC卡,需要實現(xiàn)讀寫IC卡,并且與服務(wù)端交互。IC卡讀卡器用的是德卡的D8型號,SDK可以在德卡官網(wǎng)找到,下載鏈接:德卡SDK下載。
官方提供了多種語言的SDK,web端調(diào)用首先會想到頁面調(diào)用OCX的方式。HTML內(nèi)調(diào)用OCX的方法不在贅述,具體可以查看HTML調(diào)用OCX。IE瀏覽器在打開響應(yīng)頁面上需要點“允許阻止的內(nèi)容”才能成功加載OCX控件,否則無法調(diào)用OCX。Chrome及其他瀏覽器相對復(fù)雜,請自行百度。
在操作IC卡之前先了解一下IC卡的一些基礎(chǔ)(本文以M1卡為例):
M1卡有16個扇區(qū),即0到15扇區(qū),要讀取扇區(qū)中的數(shù)據(jù),首先要進行密碼校驗(校驗讀卡設(shè)備中的密碼和卡上的密碼);要讀取哪個扇區(qū)的數(shù)據(jù)就要校驗?zāi)膫€扇區(qū)的密碼,dc_read或dc_read_hex方法是用的地址是絕對地址(每個扇區(qū)4個地址,16個扇區(qū)共64個地址,即0到63),校驗完0扇區(qū)的密碼后,能讀取0到3地址上的數(shù)據(jù),校驗完1扇區(qū)的密碼后,能讀取4到7地址上的數(shù)據(jù),以此類推。假設(shè)扇區(qū)號是 sNo,數(shù)據(jù)塊號是bNo,則:sNo號扇區(qū)的最小區(qū)塊號為:4 * sNo,最大區(qū)塊號為:4 * sNo + 3。
對卡的操作基本步驟:
初始化 -> 尋卡 -> 校驗密碼 -> 操作(讀、寫、其他操作) -> dc_exit(不執(zhí)行 exit的話OCX調(diào)用會出錯)
function writeCard(){var st
; var lSnr
; var messageText
= document
.getElementById("messageText");st
= rd
.dc_init(100, 115200);if(st
<= 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_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"; messageText
.value
= messageText
.value
+= "卡序列號(ASCII):" + rd
.get_bstrRBuffer_asc
+ "\r\n"; rd
.put_bstrSBuffer_asc
= "00000000000000000000000000000007";st
= rd
.dc_write(8); if(st
< 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
; var messageText
= document
.getElementById("messageText");st
= rd
.dc_init(100, 115200);if(st
<= 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";st
= rd
.dc_card_n(0, lSnr
);if(st
< 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"; messageText
.value
= messageText
.value
+= "卡序列號(ASCII):" + 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 error!\r\n\r\n";rd
.dc_exit();return;}messageText
.value
= messageText
.value
+= "dc_authentication ok!\r\n";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;
}
初始化過程可以封裝成一個函數(shù)統(tǒng)一處理。要寫入哪些數(shù)據(jù)、寫到哪個扇區(qū)、哪個數(shù)據(jù)塊由根據(jù)業(yè)務(wù)需求確定,本文僅僅記錄 德卡D8 型號讀卡器的調(diào)用過程。
PS:代碼內(nèi)用到的JS函數(shù)可以查找德卡提供的SDK包內(nèi)的文檔
總結(jié)
以上是生活随笔為你收集整理的记录一下web端调用IC卡读卡器的大致流程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。