日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發(fā)布時間:2024/3/12 编程问答 53 豆豆
生活随笔 收集整理的這篇文章主要介紹了 记录一下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)用會出錯)


  • 寫卡示例函數(shù)
function writeCard(){var st; //主要用于返回值var lSnr; //本用于取序列號,但在javascript只是當(dāng)成dc_card函數(shù)的一個臨時變量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";//尋卡,能返回在工作區(qū)域內(nèi)某張卡的序列號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); //區(qū)塊地址號根據(jù)需求確定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,一般有不可顯示字符出現(xiàn)messageText.value = messageText.value += "卡序列號(ASCII):" + rd.get_bstrRBuffer_asc + "\r\n"; //序列號十六進制ascll碼字符串表示為rd.get_bstrRBuffer_asc//向卡中寫入數(shù)據(jù),一次必須寫一個塊//第一個參數(shù)為塊地址//在調(diào)用dc_write必須前先設(shè)置屬性rd.put_bstrSBuffer或rd.put_bstrSBuffer_ascrd.put_bstrSBuffer_asc = "00000000000000000000000000000007";st = rd.dc_write(8); //區(qū)塊地址號根據(jù)需求確定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";} }
  • 讀卡示例函數(shù):
function readCard(){var st; //主要用于返回值var lSnr; //本用于取序列號,但在javascript只是當(dāng)成dc_card函數(shù)的一個臨時變量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";//尋卡,能返回在工作區(qū)域內(nèi)某張卡的序列號//第一個參數(shù)一般設(shè)置為0,表示IDLE模式,一次只對一張卡操作//第二個參數(shù)在javascript只是當(dāng)成dc_card函數(shù)的一個臨時變量,僅在vbscript中調(diào)用后能正確返回序列號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,一般有不可顯示字符出現(xiàn)messageText.value = messageText.value += "卡序列號(ASCII):" + rd.get_bstrRBuffer_asc + "\r\n"; //序列號十六進制ascll碼字符串表示為rd.get_bstrRBuffer_asc//核對密碼函數(shù)//第一個參數(shù)為密碼驗證模式//第二個參數(shù)為扇區(qū)號rd.put_bstrSBuffer_asc = "FFFFFFFFFFFF";//st = rd.dc_authentication_passaddr(0, 7);st = rd.dc_authentication_passaddr(0, 11); //區(qū)塊地址號根據(jù)需求確定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); //區(qū)塊地址號根據(jù)需求確定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)容還不錯,歡迎將生活随笔推薦給好友。