JavaScript读写FM1208 CPU卡源码

2023-12-22 10:32:53

本示例使用的发卡器:

https://item.taobao.com/item.htm?spm=a1z10.5-c-s.w4002-21818769070.11.23eb789efg450Y&id=615391857885icon-default.png?t=N7T8https://item.taobao.com/item.htm?spm=a1z10.5-c-s.w4002-21818769070.11.23eb789efg450Y&id=615391857885

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>FM1208CPU卡读写DEMO</title>

    <script language="javascript">
        var iswsrun = false;
        var ws;
        var received_msg = "";
        var mytimer;
        var strls = "";
        var errorno = "";

        var wsUri = "ws://127.0.0.1:39189";   //端口号必须与RFIDWebServer端口一致
		
        function isUIntNum(val) {
            var testval = /^\d+$/; // 非负整数
            return (testval.test(val));
        }

        function isHex(val) {
            var testval = /^(\d|[A-F]|[a-f])+$/; // 十六进制数
            return (testval.test(val));
        }				

        function beep() {				 //驱动发卡器响声令
            textarea.value = "";		
            WebSocketRun("pcdbeep,30");					
        }
		
        function getdevicenumber() {         //读取发卡器唯一出厂序号,可以当加密狗使用			
            textarea.value = "";		
            WebSocketRun("pcdgetdevicenumber");			
        }			
		
        function cpu_request() {			//激活发卡器感应区内的CPU卡,获取CPU卡卡号			
            textarea.value = "";	
			carduid.value="";	
            WebSocketRun("cpurequest,");
        }				
		
        function cpu_init() {
            textarea.value = "";
			if (che_clearcard.checked) {   //1表示先将卡片清空再初始化,0表示直接初始化
            	ClearCardYenNo = 1;  
			}else{ClearCardYenNo = 0}
						
            CardKey = cardkey.value.trim();       //16进制的卡密码,卡密码和文件没有任何关系,卡密码只是用来清空卡,读和写文件是无效的。一般不需要修改			
            if (!isHex(CardKey) || CardKey.length!=32) {
				textarea.value = "卡密钥输入错误,请输入正确的32位16进制卡密钥!";
				cardkey.focus();
                cardkey.select();
                return;
			}
			KeyLen = CardKey.length/2;            //卡密码长度
            spacesize = cardspace.value.trim();   //设定本次应用空间大小,单位是字节

            var CpuInitComm = "cpursinit," + ClearCardYenNo + "," + CardKey + "," + KeyLen + "," + spacesize;
            WebSocketRun(CpuInitComm);
        }		

        function cpu_fileadd_s() {
            textarea.value = "";
            FileNo = creatfile.selectedIndex;        //取值范围0-5,创建好的文件不能删除,只能重新初始化卡来清除所有文件
            ReadKey = readkey0.value.trim();         //16进制的只读密码
			if (!isHex(ReadKey) || ReadKey.length!=32) {
				textarea.value = "文件只读密钥输入错误,请输入正确的32位16进制文件只读密钥!";
				readkey0.focus();
                readkey0.select();
                return;
			}
            ReadKeyLen = ReadKey.length/2;           //只读密码长度
            WriteKey = writekey0.value.trim();       //16进制的读写密码
			if (!isHex(WriteKey) || WriteKey.length!=32) {
				textarea.value = "文件读写密钥输入错误,请输入正确的32位16进制文件读写密钥!";
				writekey0.focus();
                writekey0.select();
                return;
			}
            WriteKeyLen = WriteKey.length/2;         //读写密码长度
            spacesize = creatfilesize.value.trim();  //文件空间大小,要小于初始化时定义的空间,单位是字节

            var CpuFileAddComm = "cpursfileadd_s," + FileNo + "," + ReadKey + "," + ReadKeyLen + "," + WriteKey + "," + WriteKeyLen + "," + spacesize;
            WebSocketRun(CpuFileAddComm);
        }

        function cpu_filekeychg() {
            textarea.value = "";

            FileNo = changkeyfile.selectedIndex;            //需要更改密码的文件号,取值范围0-5,						
			var myctrlword =0;
			if (selenewkey.selectedIndex==0){
				myctrlword =0;  							//0 更改CPU卡文件只读密钥
			} else {myctrlword =1;}							//1 更改CPU卡文件读写密钥					
			
			if (changeauthkey.selectedIndex==0){
				myctrlword=myctrlword+0;					//0 用CPU卡文件只读密码认证
			} else {myctrlword=myctrlword+2}				//2 用CPU卡文件读写密钥认证						
			
            OldKey = authkey0.value.trim();    				//16进制的旧密码
			if (!isHex(OldKey) || OldKey.length!=32) {
				textarea.value = "文件认证密钥输入错误,请输入正确的32位16进制文件认证密钥!";
				authkey0.focus();
                authkey0.select();
                return;
			}
            OldKeyLen = OldKey.length/2;                    //旧密码长度			
            NewKey = newkey.value.trim();    				//16进制的新密码
			if (!isHex(NewKey) || NewKey.length!=32) {
				textarea.value = "文件新密钥输入错误,请输入正确的32位16进制文件新密钥!";
				newkey.focus();
                newkey.select();
                return;
			}
            NewKeyLen = NewKey.length/2;                    //新密码长度

            var CpuFileKeyChgComm = "cpursfilekeychg," + FileNo + "," + myctrlword + "," + OldKey + "," + OldKeyLen + "," + NewKey + "," + NewKeyLen;
            WebSocketRun(CpuFileKeyChgComm);
        }
		
        function cpu_filedataread() {
            textarea.value = "";
			rwtext.value="";

            FileNo = rwfile.selectedIndex;                 //需要读取数据的文件号,取值范围0-5,
			if (rwauthmode.selectedIndex==0){
            	myctrlword = 0;                            //OLDKEYR:0 用CPU卡文件只读密码认证,OLDKEYWR:2 用CPU卡文件读写密码认证
			}else {myctrlword = 2;}
			
            FileKey = rwauthkey.value.trim();              //16进制的文件认证密码
			if (!isHex(FileKey) || FileKey.length!=32) {
				textarea.value = "文件认证密钥输入错误,请输入正确的32位16进制文件认证密钥!";
				rwauthkey.focus();
                rwauthkey.select();
                return;
			}
            FileKeyLen = FileKey.length/2;                //密码长度
            DataStart = rwbegin.value.trim();             //读文件的起始地址
            DataLen = rwlen.value.trim();                 //读取数据长度     

            var CpuFileDataReadComm = "cpursfiledataread," + FileNo + "," + myctrlword + "," + FileKey + "," + FileKeyLen + "," + DataStart + "," + DataLen;
            WebSocketRun(CpuFileDataReadComm);
        }		

        function cpu_filedatawrite_s() {
            textarea.value = "";

            FileNo = rwfile.selectedIndex;                  //需要写入数据的文件号,取值范围0-5,
            if (rwauthmode.selectedIndex==0){
            	myctrlword = 0;                            //OLDKEYR:0 用CPU卡文件只读密码认证,OLDKEYWR:2 用CPU卡文件读写密码认证
			}else {myctrlword = 2;}
			
            FileKey = rwauthkey.value.trim();              //16进制的文件认证密码
			if (!isHex(FileKey) || FileKey.length!=32) {
				textarea.value = "文件认证密钥输入错误,请输入正确的32位16进制文件认证密钥!";
				rwauthkey.focus();
                rwauthkey.select();
                return;
			}
            FileKeyLen = FileKey.length/2;                //密码长度
            DataStart = rwbegin.value.trim();             //写文件的起始地址						
            DataInf = rwtext.value.trim();    			  //写入数据     
            if (!isHex(DataInf)) {
                textarea.value =  "写入数据错误\r\n";
				rwtext.focus();
                rwtext.select();
                return;
            }

            var CpuFileDataWriteComm = "cpursfiledatawrite_s," + FileNo + "," + myctrlword + "," + FileKey + "," + FileKeyLen + "," + DataStart + "," + DataInf;						
            WebSocketRun(CpuFileDataWriteComm);
        }
		
        function sendcpuapdu() {
            textarea.value = "";
			
            commstr = apducomm.value.replace(/\s/g, "");  //16进制的指令码
			if (!isHex(commstr) || (commstr.length % 2)!=0) {
				textarea.value = "APDU指令码输入错误,请输入正确的16进制指令码!";
				apducomm.focus();
                apducomm.select();
                return;
			}
			
            var CpuFileDataWriteComm = "cpuisoapdu," + commstr;						
            WebSocketRun(CpuFileDataWriteComm);
        }		

		function calcexauthkey(){
			textarea.value = "";
			resultstr.value="";
			
			randstr = randnum.value.replace(/\s/g, "");  //16进制的随机数
			if (!isHex(randstr) || randstr.length !=8) {
				textarea.value = "随机数输入错误,请输入正确的8位16进制随机数!";
				randnum.focus();
                randnum.select();
                return;
			}
			authkeystr=keystr.value.replace(/\s/g, "");  //16进制的文件认证密钥
			if (!isHex(authkeystr) || authkeystr.length !=32) {
				textarea.value = "认证密钥输入错误,请输入正确的32位16进制认证密钥!";
				keystr.focus();
                keystr.select();
                return;
			}
			WebSocketRun("cpucalcexauthkey,"+randstr+","+authkeystr);
		}

		function changeapdu(){
			switch (seleapdu.selectedIndex) {
				case 0:
					apducomm.value="00 A4 00 00 00";
					break;
				case 1:
					apducomm.value="00 A4 00 00 02 3F 00";
					break;
				case 2:
					apducomm.value="00 84 00 00 04";
					break;
				case 3:
					apducomm.value="00 82 00 00 08 [8字节密文数据(严重声明:如果密码错误多次,返回值从63CX变为63C0时卡将作废)]";
					break;
				case 4:
					apducomm.value="80 0E 00 00 00";
					break;
				case 5:
					apducomm.value="80 E0 00 00 07 3F 00 B0 01 F0 FF FF";
					break;
				case 6:
					apducomm.value="80 D4 01 00 0D 39 F0 F0 AA 55 FF FF FF FF FF FF FF FF";
					break;
				case 7:
					apducomm.value="80 D4 01 00 15 39 F0 F0 AA 55 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF";
					break;
				case 8:
					apducomm.value="80 D4 [不能为01,应输入密码类型,如39或36] 00 0D 39 F0 F0 AA 55 FF FF FF FF FF FF FF FF";
					break;
				case 9:
					apducomm.value="80 D4 [不能为01,应输入密码类型,如39或36] 00 15 39 F0 F0 AA 55 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF";
					break;
				case 10:
					apducomm.value="80 E0 3F 01 0D 38 05 20 F0 F0 95 FF FF 44 44 46 30 31";
					break;
				case 11:
					apducomm.value="80 E0 00 01 07 3F 01 8F 95 F0 FF FF";
					break;
				case 12:
					apducomm.value="80 D4 01 01 0D 3A F0 EF 44 55 12 34 56 78 12 34 56 78";
					break;
				case 13:
					apducomm.value="00 A4 00 00 02 3F 01";
					break;
				case 14:
					apducomm.value="80 E0 00 03 07 28 00 1E F0 F0 FF 01";
					break;
				case 15:
					apducomm.value="00 A4 00 00 02 00 03";
					break;
				case 16:
					apducomm.value="00 D6 00 00 05 01 02 03 04 05";
					break;
				case 17:
					apducomm.value="";
					break;
				case 18:
					apducomm.value="00 B0 00 00 00";
					break;
			}
		}
		
		function DispErrInfo(Errcode){
			var errstr = "";
            switch (Errcode) {
                case "ReturnCode:001":				
                    errstr = ",读写扇区数据失败!";
                    break;
                case "ReturnCode:002":
                    errstr = ",读写1、2块数据失败!";
                    break;
                case "ReturnCode:003":
                    errstr = ",请先激活CPU卡再继续操作!";
                    break;
                case "ReturnCode:008":
                    errstr = ",未寻到卡,请将卡放到发卡器的感应区!";
                    break;
                case "ReturnCode:009":
                    errstr = ",有多张卡在感应区,寻卡过程中防冲突失败,读卡失败!";
                    break;
                case "ReturnCode:010":
                    errstr = ",该卡可能已被休眠,无法选中卡片!";
                    break;
                case "ReturnCode:011":
                    errstr = ",密码装载失败!";
                    break;
                case "ReturnCode:012":
                    errstr = ",卡密码认证失败!";
                    break;
                case "ReturnCode:013":
                    errstr = ",读块操作失败,原因是刷卡太快或本块所对应的区还没通过密码认证!";
                    break;
                case "ReturnCode:014":
                    errstr = ",写块操作失败,原因是刷卡太快或本块所对应的区还没通过密码认证!";
                    break;
                case "ReturnCode:018":
                    errstr = ",写块操作失败!";
                    break;
                case "ReturnCode:021":
                    errstr = ",没有动态库!";
                    break;
                case "ReturnCode:022":
                    errstr = ",动态库或驱动程序异常!";
                    break;
                case "ReturnCode:023":
                    errstr = ",驱动程序错误或发卡器未连接!";
                    break;
                case "ReturnCode:024":
                    errstr = ",操作超时,一般是动态库没有反映!";
                    break;
                case "ReturnCode:025":
                    errstr = ",发送字数不够!";
                    break;
                case "ReturnCode:026":
                    errstr = ",发送的CRC错!";
                    break;
                case "ReturnCode:027":
                    errstr = ",接收的字数不够!";
                    break;
                case "ReturnCode:028":
                    errstr = ",接收的CRC错!";
                    break;
                case "ReturnCode:029":
                    errstr = ",函数输入参数格式错误!";
                    break;
				case "ReturnCode:045":
                    errstr = ",此卡不支持更改UID号或UID块已被锁定!";
                    break;
                case "ReturnCode:046":
                    errstr = ",信息过大,标签容量不足!";
                    break;
                case "ReturnCode:050":
                    errstr = ",RATS错误,厂家调试代码,用户不需理会!";
                    break;
                case "ReturnCode:051":
                    errstr = ",PPS错误,厂家调试代码,用户不需理会!";
                    break;
                case "ReturnCode:052":
                    errstr = ",已进入了14443-4协议状态,可进行CPU卡功能所有操作!";
                    break;
                case "ReturnCode:053":
                    errstr = ",未寻到卡,请将卡放到发卡器的感应区!";
                    break;
                case "ReturnCode:054":
                    errstr = ",CPU卡功能通讯错误!";
                    break;
                case "ReturnCode:055":
                    errstr = ",发送ACK指令给卡,让卡接着发送数据回来!";
                    break;
                case "ReturnCode:056":
                    errstr = ",清空根目录失败!";
                    break;
                case "ReturnCode:057":
                    errstr = ",卡片不支持此功能!";
                    break;
                case "ReturnCode:058":
                    errstr = ",卡片初始化失败!";
                    break;
                case "ReturnCode:059":
                    errstr = ",分配的空间不足!";
                    break;
                case "ReturnCode:060":
                    errstr = ",本次操作的实体已存在!";
                    break;
                case "ReturnCode:061":
                    errstr = ",无足够空间!";
                    break;
                case "ReturnCode:062":
                    errstr = ",文件不存在!";
                    break;
                case "ReturnCode:063":
                    errstr = ",权限不足,有可能是用只读密码认证,导致无法更改读写密码或无法写文件!";
                    break;
                case "ReturnCode:064":
                    errstr = ",密码不存在,或密钥文件未创建!";
                    break;
                case "ReturnCode:065":
                    errstr = ",传送长度错误!";
                    break;
                case "ReturnCode:066":
                    errstr = ",接收长度错误,即接收的数据长度指定过大!";
                    break;
                case "ReturnCode:067":
                    errstr = ",功能不支持、或卡中无MF、或卡片已锁定!";
                    break;
                case "ReturnCode:068":
                    errstr = ",密码认证错识次数过多,该密码已被锁死!";
                    break;
                case "ReturnCode:070":
                case "ReturnCode:071":
                case "ReturnCode:072":
                case "ReturnCode:073":
                case "ReturnCode:074":
                case "ReturnCode:075":
                case "ReturnCode:076":
                case "ReturnCode:077":
                case "ReturnCode:078":
                case "ReturnCode:079":
                case "ReturnCode:080":
                case "ReturnCode:081":
                case "ReturnCode:082":
                case "ReturnCode:083":
                case "ReturnCode:084":
                case "ReturnCode:085":
                    var lastnum = errcode.slice(-2) - 70;
                    errstr = ",密码错误,剩余次数为:" + lastnum + ",如剩余次数为0,该密码将锁死,无法再认证!";
                    break;
                case "ReturnCode:086":
                    errstr = ",更改后的密码长度必须和创建时的长度一致!";
                    break;
                case "ReturnCode:087":
                    errstr = ",应用目录不存在!";
                    break;
                case "ReturnCode:088":
                    errstr = ",应用文件不存在!";
                    break;
                case "ReturnCode:089":
                    errstr = ",文件号不能超过 5 !";
                    break;
                case "ReturnCode:090":
                    errstr = ",读取文件时返回的长度不足,数据可能不正确!";
                    break;
                case "ReturnCode:091":
                    errstr = ",一次读文件的长度不能超过255 !";
                    break;
                case "ReturnCode:092":
                    errstr = ",一次写文件的长度不能超过247 !";
                    break;
                case "ReturnCode:444":
                    errstr = ",RFIDWebServer系统文件错误!";
                    break;
                case "ReturnCode:555":
                    errstr = ",未发现有效的NFC标签!";
                    break;					
                default:
                    errstr = ",未知的错误!";
            }
            return errstr;
		}			
		
		
        window.onerror = function (e) {
            alert("不好意思,出错了!");
            return true;//屏蔽系统事件
        }

        function timeoutevent() {
            ws.close();
            textarea.value = "websockket返回超时";
        }

        //websockket数据处理
        function WebSocketRev(evt) {
            clearTimeout(mytimer);
            received_msg = evt.data;
            ws.close();

            //在这里解析返回数据
            var strlist = received_msg.split(",");
            if (strlist.length > 1) {
                var dispstr = "";
                switch (strlist[0]) {
                    case "pcdbeep":
                    case "idr_beep":
                        dispstr = "函数名称:" + strlist[0] + "\r\n";
                        if (strlist[1] == "ReturnCode:000") {
                            dispstr = dispstr + "操作结果:" + strlist[1];
                            dispstr = dispstr + ",已执行蜂鸣响声操作!\r\n"
                        } else {
                            dispstr = dispstr + "操作结果:" + strlist[1];
                            dispstr = dispstr + DispErrInfo(strlist[1]);
                        }
                        textarea.value = dispstr;
                        break;

                    case "pcdgetdevicenumber":
                        dispstr = "函数名称:" + strlist[0] + "\r\n";
                        if (strlist[1] == "ReturnCode:000") {
                            dispstr = dispstr + "操作结果:" + strlist[1];
                            dispstr = dispstr + ",已读取设备编号!\r\n"
                        } else {
                            dispstr = dispstr + "操作结果:" + strlist[1];
                            dispstr = dispstr + DispErrInfo(strlist[1]);
                        }
                        if (strlist.length > 2) {
                            dispstr = dispstr + "设备编号:" + strlist[2] + "\r\n";
                        }
                        textarea.value = dispstr;
                        break;

                    case "cpurequest":
                        dispstr = "函数名称:" + strlist[0] + "\r\n";
                        if (strlist[1] == "ReturnCode:000" || strlist[1] == "ReturnCode:052") {
                            dispstr = dispstr + "操作结果:" + strlist[1];
                            dispstr = dispstr + ",卡已激活!\r\n";
                            dispstr = dispstr + "16进制卡号:" + strlist[2] + "\r\n";
                            dispstr = dispstr + "10进制卡号:" + strlist[3] + "\r\n";
                            dispstr = dispstr + "卡片参数:" + strlist[4] + "\r\n";
                            dispstr = dispstr + "卡片版本:" + strlist[5] + "\r\n";
                            dispstr = dispstr + "厂家代码:" + strlist[6] + "\r\n";
							carduid.value=strlist[3];
                        } else {
                            dispstr = dispstr + "操作结果:" + strlist[1];
                            dispstr = dispstr + DispErrInfo(strlist[1]);
                        }
                        textarea.value = dispstr;
                        break;

                    case "cpursinit":
                        dispstr = "函数名称:" + strlist[0] + "\r\n";
                        if (strlist[1] == "ReturnCode:000" ) {
                            dispstr = dispstr + "操作结果:" + strlist[1];
                            dispstr = dispstr + ",卡片初始化成功!\r\n";
                        } else {
                            dispstr = dispstr + "操作结果:" + strlist[1];
                            dispstr = dispstr + DispErrInfo(strlist[1]);
                        }
                        textarea.value = dispstr;
                        break;

                    case "cpursfileadd_s":
                        dispstr = "函数名称:" + strlist[0] + "\r\n";
                        if (strlist[1] == "ReturnCode:000") {
                            dispstr = dispstr + "操作结果:" + strlist[1];
                            dispstr = dispstr + ",文件创建成功!\r\n";
                        } else {
                            dispstr = dispstr + "操作结果:" + strlist[1];
                            dispstr = dispstr + DispErrInfo(strlist[1]);
                        }
                        textarea.value = dispstr;
                        break;

                    case "cpursfilekeychg":
                        dispstr = "函数名称:" + strlist[0] + "\r\n";
                        if (strlist[1] == "ReturnCode:000") {
                            dispstr = dispstr + "操作结果:" + strlist[1];
                            dispstr = dispstr + ",文件密码修改成功!\r\n";
                        } else {
                            dispstr = dispstr + "操作结果:" + strlist[1];
                            dispstr = dispstr + DispErrInfo(strlist[1]);
                        }
                        textarea.value = dispstr;
                        break;

                    case "cpursfiledataread":
                        dispstr = "函数名称:" + strlist[0] + "\r\n";
                        if (strlist[1] == "ReturnCode:000") {
                            dispstr = dispstr + "操作结果:" + strlist[1];
                            dispstr = dispstr + ",读文件数据成功!\r\n";
                            //dispstr = dispstr + "卡内数据:" + strlist[2] + "\r\n";
							rwtext.value=strlist[2];
                        } else {
                            dispstr = dispstr + "操作结果:" + strlist[1];
                            dispstr = dispstr + DispErrInfo(strlist[1]);
                        }
                        textarea.value = dispstr;
                        break;

                    case "cpursfiledatawrite_s":
                        dispstr = "函数名称:" + strlist[0] + "\r\n";
                        if (strlist[1] == "ReturnCode:000") {
                            dispstr = dispstr + "操作结果:" + strlist[1];
                            dispstr = dispstr + ",写文件成功!\r\n";
                        } else {
                            dispstr = dispstr + "操作结果:" + strlist[1];
                            dispstr = dispstr + DispErrInfo(strlist[1]);
                        }
                        textarea.value = dispstr;
                        break;
						
                    case "cpuisoapdu":
                        dispstr = "函数名称:" + strlist[0] + "\r\n";
                        if (strlist[1] == "ReturnCode:000") {
                            dispstr = dispstr + "操作结果:" + strlist[1];
                            dispstr = dispstr + ",返回数据:"+strlist[2];
                        } else {
                            dispstr = dispstr + "操作结果:" + strlist[1];
                            dispstr = dispstr + DispErrInfo(strlist[1]);
                        }
                        textarea.value = dispstr;
                        break;						

                    case "cpucalcexauthkey":
                        dispstr = "函数名称:" + strlist[0] + "\r\n";
                        if (strlist[1] == "ReturnCode:000") {
                            dispstr = dispstr + "操作结果:" + strlist[1];
                            dispstr = dispstr + ",返回数据:"+strlist[2];
							resultstr.value=strlist[2];
                        } else {
                            dispstr = dispstr + "操作结果:" + strlist[1];
                            dispstr = dispstr + DispErrInfo(strlist[1]);
                        }
                        textarea.value = dispstr;
                        break;						

                    case "cpurscardclr":
                        dispstr = "函数名称:" + strlist[0] + "\r\n";
                        if (strlist[1] == "ReturnCode:000") {
                            dispstr = dispstr + "操作结果:" + strlist[1];
                            dispstr = dispstr + ",强制清空卡成功!\r\n";
                        } else {
                            if (strlist[1] == "ReturnCode:064") {
                                dispstr = dispstr + "操作结果:" + strlist[1];
                                dispstr = dispstr + ",此卡未经过cpursinit函数成功初始化!\r\n";
                            }
                            else {
                                dispstr = dispstr + "操作结果:" + strlist[1];
                                dispstr = dispstr + DispErrInfo(strlist[1]);
                            }
                        }
                        textarea.value = dispstr;
                        break;
                }
            }
        }		
		
        function WebSocketRun(sendinfo) {
            iswsrun = false;

            try {
                if ("WebSocket" in window) {
                    ws = new WebSocket(wsUri);
                }
                else if ("MozWebSocket" in window) {
                    ws = new MozWebSocket(wsUri);
                }
                else {
                    received_msg = "您的浏览器不支持WebSocket,请选用支持WebSocket的浏览器!";
                    return;
                }

                clearTimeout(mytimer);

                ws.onopen = function (evt) {
                    ws.send(sendinfo);
                    iswsrun = true;

                    mytimer = setTimeout("timeoutevent()", 2000);
                };

                ws.onmessage = WebSocketRev;

                ws.onerror = function (e) {
                    if (iswsrun != true) {
                        received_msg = "请先在当前电脑下载>安装>运行我们的服务程序......";
                        window.open("http://www.icmcu.com/ICID15693-02V2test/RFIDWebServerSetup.exe", "top");//打开新窗口

                        alert("请先下载>安装>运行我们的服务程序,再刷新本页面......");
                    }
                };
            }
            catch (ex) {
                if (iswsrun != true) {
                    received_msg = "请先在当前电脑下载>安装>运行我们的服务程序......";
                    window.open("http://www.icmcu.com/ICID15693-02V2test/RFIDWebServerSetup.exe", "top");//打开新窗口

                    alert("请先下载>安装>运行我们的服务程序,再刷新本页面......");
                }
            }
        }
				
	</script>
</head>

<body>
<table width="1100" height="678" border="1" align="center">
  <tr>
    <th width="128" height="45" scope="row"><input name="butt_beep" type="submit" id="butt_beep" onclick="beep()" value="驱动发卡器响声" /></th>
    <td width="934"><input name="butt_getdevnum" type="submit" id="butt_getdevnum" onclick="getdevicenumber()" value="读取发卡器唯一出厂序列号" /></td>
  </tr>
  <tr>
    <th height="47" scope="row"><input name="butt_request" type="submit" id="butt_request" onclick="cpu_request()" value="激活CPU卡" /></th>
    <td>卡号:
    <input name="carduid" type="text" id="carduid" size="11" maxlength="10" />
    ,每次卡片重新进入感应区,都必须先激活卡片才能继续以下的操作!</td>
  </tr>
  <tr>
    <th height="52" scope="row"><input name="butt_cpu_init" type="submit" id="butt_cpu_init" onclick="cpu_init()" value="初始化CPU卡" /></th>
    <td><input type="checkbox" name="che_clearcard" id="che_clearcard" />
      选择先将卡片清空再初始化,本次设定可应用的空间大小:
      <input name="cardspace" type="text" id="cardspace" value="1024" size="6" maxlength="6" />
      ,设置卡片密钥:
      <input name="cardkey" type="text" id="cardkey" value="FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" size="34" maxlength="32" /></td>
  </tr>
  <tr>
    <th height="89" scope="row"><input name="butt_cpu_fileadd_s" type="submit" id="butt_cpu_fileadd_s" onclick="cpu_fileadd_s()" value="创建易写文件" /></th>
    <td><p>文件号:
      <select name="creatfile" id="creatfile">
        <option>1号文件</option>
        <option>2号文件</option>
        <option>3号文件</option>
        <option>4号文件</option>
        <option>5号文件</option>
        <option>6号文件</option>
      </select>
    ,16进制只读密钥:
    <input name="readkey0" type="text" id="readkey0" value="FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" size="34" maxlength="32" />
    </p>
    <p>文件大小:
      <input name="creatfilesize" type="text" id="creatfilesize" value="256" size="5" maxlength="5" />
    ,16进制读写密钥:
    <label for="writekey0"></label>
    <input name="writekey0" type="text" id="writekey0" value="FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" size="34" maxlength="32" />
    </p></td>
  </tr>
  <tr>
    <th height="76" scope="row"><input name="butt_cpu_filekeychg" type="submit" id="butt_cpu_filekeychg" onclick="cpu_filekeychg()" value="修改文件密钥" /></th>
    <td><p>文件号:
      <select name="changkeyfile" id="changkeyfile">
        <option>1号文件</option>
        <option>2号文件</option>
        <option>3号文件</option>
        <option>4号文件</option>
        <option>5号文件</option>
        <option>6号文件</option>
      </select>
      <label for="changeauthkey"></label>
      <select name="changeauthkey" id="changeauthkey">
        <option>用只读密钥认证</option>
        <option selected="selected">用读写密钥认证</option>
      </select>
      <label for="newkey"></label>
      <select name="selenewkey" id="selenewkey">
        <option>修改只读密钥</option>
        <option>修改读写密钥</option>
      </select>
    ,文件认证密钥:
    <label for="authkey0"></label>
    <input name="authkey0" type="text" id="authkey0" value="FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" size="34" maxlength="32" />
    </p>
    <p>新密钥:
      <label for="newkey"></label>
      <input name="newkey" type="text" id="newkey" value="FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" size="34" maxlength="32" />
    </p></td>
  </tr>
  <tr>
    <th height="110" scope="row"><p>
      <input name="butt_readfile" type="submit" id="butt_readfile" onclick="cpu_filedataread()" value="从文件内读取数据" />
      </p>
<input name="butt_writefile_s" type="submit" id="butt_writefile_s" onclick="cpu_filedatawrite_s()" value="写数据到易写文件" /></th>
    <td><p>文件号:
        <select name="rwfile" id="rwfile">
          <option>1号文件</option>
          <option>2号文件</option>
          <option>3号文件</option>
          <option>4号文件</option>
          <option>5号文件</option>
          <option>6号文件</option>
        </select>
        <select name="rwauthmode" id="rwauthmode">
          <option>用只读密钥认证</option>
          <option selected="selected">用读写密钥认证</option>
        </select>
      ,起始位置:
      <label for="rwbegin"></label>
    <input name="rwbegin" type="text" id="rwbegin" value="0" size="5" maxlength="4" />
    ,长度:
    <label for="rwlen"></label>
    <input name="rwlen" type="text" id="rwlen" value="10" size="4" maxlength="3" />
    ,密钥:
    <label for="rwauthkey"></label>
    <input name="rwauthkey" type="text" id="rwauthkey" value="FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" size="34" maxlength="32" />
    </p>
    <p>
      <label for="rwtext"></label>
      <textarea name="rwtext" id="rwtext" cols="130" rows="4"></textarea>
    </p></td>
  </tr>
  <tr>
    <th height="57" scope="row"><input name="butt_sendapdu" type="submit" id="butt_sendapdu" onclick="sendcpuapdu()" value="发送APDU调试指令" /></th>
    <td><select name="seleapdu" id="seleapdu" onchange="changeapdu()">
      <option selected="selected">选择 MF 下的根目录</option>	
      <option>选择 MF 下的根目录(从子目录下返回)</option>
      <option>取 4 个字节的随机数</option>
      <option>外部认证(如密码错误多次卡将作废)</option>
      <option>擦除 当前目录下的所有文件</option>
      <option>建立 当前目录下的密钥文件</option>
      <option>密钥文件建好后给其增加8字节密钥</option>
      <option>密钥文件建好后给其增加16字节密钥</option>
      <option>修改8字节密钥</option>
      <option>修改16字节密钥</option>
      <option>建立目录文件 DF</option>
      <option>建立 DF目录下密钥文件</option>
      <option>在 DF目录下密钥文件里增加口令密钥</option>
      <option>选择 DF 目录</option>
      <option>建立二进制文件</option>
      <option>选择要操作的二进制文件</option>
      <option>写二进制数据进文件</option>
      <option>验证口令密钥</option>
      <option>读出二进制文件</option>
    </select>
    <input name="apducomm" type="text" id="apducomm" value="00 A4 00 00 00" size="90" /></td>
  </tr>
  <tr>
    <th height="59" scope="row"><input name="butt_calcexauthkey" type="submit" id="butt_calcexauthkey" onclick="calcexauthkey()" value="随机数+密钥计算" /></th>
    <td>随机数:
    <input name="randnum" type="text" id="randnum" value="11 22 33 44" size="13" maxlength="11" />
    ,密钥:
    <input name="keystr" type="text" id="keystr" value="FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" size="34" maxlength="32" />
    ,计算结果:
    <input name="resultstr" type="text" id="resultstr" size="26" maxlength="24" /></td>
  </tr>
  <tr>
    <th height="121" scope="row"><p>操作提示</p>
    <p>&nbsp;</p>
    <p>&nbsp;</p></th>
    <td><textarea name="textarea" id="textarea" cols="130" rows="8" ></textarea></td>
  </tr>
</table>
</body>
</html>

?USB免驱动CPU卡读写器CPU-02B_广州荣士电子公司

文章来源:https://blog.csdn.net/zhangjin7422/article/details/135144910
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。