JS使用Active Ocx控件读写IC卡、NFC标签

读写器介绍:https://item.taobao.com/item.htm?spm=a1z10.5-c.w4002-17663462238.11.1935789e9DJT8b&id=615391857885https://item.taobao.com/item.htm?spm=a1z10.5-c.w4002-17663462238.11.1935789e9DJT8b&id=615391857885

 ​​​​​​​

 

<html>

<head>
	<meta name="renderer" content="ie-stand"><!--页面默认用IE标准模式-->
    <meta http-equiv="Content-Language" content="zh-cn">
    <meta name="ProgId" content="FrontPage.Editor.Document">
    <title>USB IC 卡读卡器控件调用例程 V1.1</title>
	
	

	

<script language="javascript">
var strls = "";
var errorno = "";

//控制字定义,控制字指定,控制字的含义请查看本公司网站提供的动态库说明

//javascript无法自定义常量, 你可以使用变量代替

var BLOCK0_EN = 0x01;//读第一块的(16个字节)
var BLOCK1_EN = 0x02;//读第二块的(16个字节)
var BLOCK2_EN = 0x04;//读第三块的(16个字节)
var NEEDSERIAL = 0x08;//仅读指定序列号的卡
var EXTERNKEY = 0x10;//用明码认证密码,产品开发完成后,建议把密码放到设备的只写区,然后用该区的密码后台认证,这样谁都不知道密码是多少,需要这方面支持请联系
var NEEDHALT = 0x20;//读/写完卡后立即休眠该卡,相当于这张卡不在感应区。要相重新操作该卡必要拿开卡再放上去

var myctrlword = 0;
var myareano = 0;
var authmode = 0;

var mypiccserial = "";
var mypicckey = ""; 
var piccdata0_2 = ""; 

var mypicckey_old = "";//旧密码
var mypicckey_new = "";//新密码

var myblockaddr = 1;//本次读卡的开始块号
	
var myblocksize = 8;//读8个块

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 readcard()
{
	//指定控制字
	myctrlword=BLOCK0_EN + BLOCK1_EN + BLOCK2_EN + EXTERNKEY;
	//指定区号
	myareano = 8; //指定为第8区
	//批定密码模式
	authmode = 1; //大于0表示用A密码认证,推荐用A密码认证
	
	//指定序列号,未知卡序列号时可指定为8个0
	mypiccserial="00000000";

	//指定密码,以下密码为厂家出厂密码
	mypicckey = "ffffffffffff";
	
	strls=IcCardReader.piccreadex(myctrlword, mypiccserial,myareano,authmode,mypicckey);
	errorno = strls.substr(0,4);

	
	switch(errorno)
	{
		case "ER08":
			CardIDShower.value = CardIDShower.value +  "错误号:" + errorno + ",表示寻不到卡\r\n";
			break;	
		case "ER09":
			CardIDShower.value = CardIDShower.value +  "错误号:" + errorno + ",表示寻不到卡\r\n";
			break;	
		case "ER10":
			CardIDShower.value = CardIDShower.value +  "错误号:" + errorno + ",表示寻不到卡\r\n";
			break;	

		case "ER11":
			CardIDShower.value = "密码认证错误\r\n";
			CardIDShower.value = CardIDShower.value + strls + "\r\n";
			CardIDShower.value = CardIDShower.value + "其中错误号为:" + errorno + "\r\n";
			CardIDShower.value = CardIDShower.value + "卡十六进制序列号为:" + strls.substr(5,8) + "\r\n";
			alert("密码认证错误");
			break;	
		case "ER12":
			CardIDShower.value = "密码认证错误" + "\r\n";
			CardIDShower.value = CardIDShower.value + strls + "\r\n";
			CardIDShower.value = CardIDShower.value + "其中错误号为:" + errorno + "\r\n";
			CardIDShower.value = CardIDShower.value + "卡十六进制序列号为:" + strls.substr(5,8) + "\r\n";
			alert("密码认证错误");
			break;
		case "ER13":
			CardIDShower.value = "读卡错误" + "\r\n";
			CardIDShower.value = CardIDShower.value + strls + "\r\n";
			CardIDShower.value = CardIDShower.value + "其中错误号为:" + errorno + "\r\n";
			CardIDShower.value = CardIDShower.value + "卡十六进制序列号为:" + strls.substr(5,8) + "\r\n";
			alert("读卡错误");
			break;	
			
		case "ER21":

			CardIDShower.value = CardIDShower.value +  "错误号:" + errorno + ",表示没找到动态库\r\n";
			break;
			
		case "ER22":

			CardIDShower.value = CardIDShower.value +  "错误号:" + errorno + ",表示动态库或驱动程序异常\r\n";
			break;	
		
		case "ER23":

			CardIDShower.value = CardIDShower.value +  "错误号:" + errorno + ",表示读卡器未插上或动态库或驱动程序异常\r\n";
			break;	
		case "ER24":
			alert("");
			CardIDShower.value = CardIDShower.value +  "错误号:" + errorno + ",表示操作超时,一般是动态库没有反应\r\n";
			break;	
		case "ER25":

			CardIDShower.value = CardIDShower.value +  "错误号:" + errorno + ",表示发送字数不够\r\n";
			break;
		case "ER26":

			CardIDShower.value = CardIDShower.value +  "错误号:" + errorno + ",表示发送的CRC错\r\n";
			break;	
		case "ER27":
	
			CardIDShower.value = CardIDShower.value +  "错误号:" + errorno + ",表示接收的字数不够\r\n";
			break;	
		case "ER28":

			CardIDShower.value = CardIDShower.value +  "错误号:" + errorno + ",表示接收的CRC错\r\n";
			break;
		case "ER29":
			CardIDShower.value = CardIDShower.value +  "错误号:" + errorno + ",表示函数输入参数格式错误,请仔细查看\r\n";
			break;
			
		default :
			//读卡成功,其中ER00表示完全成功,ER01表示完全没读到卡数据,ER02表示仅读该卡的第一块成功,,ER02表示仅读该卡的第一二块成功,这是刷卡太快原因
			CardIDShower.value = "读卡成功" + "\r\n";
			CardIDShower.value = CardIDShower.value + strls + "\r\n";
			CardIDShower.value = CardIDShower.value + "其中错误号为:" + errorno + "\r\n";
			CardIDShower.value = CardIDShower.value + "卡十六进制序列号为:" + strls.substr(5,8) + "\r\n";
			CardIDShower.value = CardIDShower.value + "该区第一块十六进制数据为:" + strls.substr(14,32) + "\r\n";
			CardIDShower.value = CardIDShower.value + "该区第二块十六进制数据为:" + strls.substr(46,32) + "\r\n";
			CardIDShower.value = CardIDShower.value + "该区第三块十六进制数据为:" + strls.substr(78,32) + "\r\n";
			break;
	
		

	}



	
}

function writecard()
{
	//指定控制字
	myctrlword=BLOCK0_EN + BLOCK1_EN + BLOCK2_EN + EXTERNKEY;
	
	//指定区号
	myareano = 8; //指定为第8区
	
	//批定密码模式
	authmode = 1; //大于0表示用A密码认证,推荐用A密码认证
	
	//指定序列号,未知卡序列号时可指定为8个0
	mypiccserial="00000000";

	//指定密码,以下密码为厂家出厂密码
	mypicckey = "ffffffffffff";

	//指定写卡内容,长度为48个字节,其中每个字节以两个字符表示为十六进制数
	piccdata0_2 = "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F";
	strls=IcCardReader.piccwriteex(myctrlword, mypiccserial,myareano,authmode,mypicckey,piccdata0_2);
	errorno = strls.substr(0,4);
	switch(errorno)
	{
		case "ER08":
			CardIDShower.value = CardIDShower.value +  "错误号:" + errorno + ",表示寻不到卡\r\n";
			break;	
		case "ER09":
			CardIDShower.value = CardIDShower.value +  "错误号:" + errorno + ",表示寻不到卡\r\n";
			break;	
		case "ER10":
			CardIDShower.value = CardIDShower.value +  "错误号:" + errorno + ",表示寻不到卡\r\n";
			break;	
		case "ER11":
			CardIDShower.value = "密码认证错误" + "\r\n";
			CardIDShower.value = CardIDShower.value + strls + "\r\n";
			CardIDShower.value = CardIDShower.value + "其中错误号为:" + errorno + "\r\n";
			CardIDShower.value = CardIDShower.value + "卡十六进制序列号为:" + strls.substr(5,8) + "\r\n";
			alert("密码认证错误");
			break;
		case "ER12":
			CardIDShower.value = "密码认证错误" + "\r\n";
			CardIDShower.value = CardIDShower.value + strls + "\r\n";
			CardIDShower.value = CardIDShower.value + "其中错误号为:" + errorno + "\r\n";
			CardIDShower.value = CardIDShower.value + "卡十六进制序列号为:" + strls.substr(5,8) + "\r\n";
			alert("密码认证错误");
			break;
		case "ER13":
			CardIDShower.value = "读卡错误" + "\r\n";
			CardIDShower.value = CardIDShower.value + strls + "\r\n";
			CardIDShower.value = CardIDShower.value + "其中错误号为:" + errorno + "\r\n";
			CardIDShower.value = CardIDShower.value + "卡十六进制序列号为:" + strls.substr(5,8) + "\r\n";
			alert("读卡错误");	
			break;
			
		case "ER14":
			CardIDShower.value = "写卡错误" + "\r\n";
			CardIDShower.value = CardIDShower.value + strls + "\r\n";
			CardIDShower.value = CardIDShower.value + "其中错误号为:" + errorno + "\r\n";
			CardIDShower.value = CardIDShower.value + "卡十六进制序列号为:" + strls.substr(5,8) + "\r\n";
			alert("写卡错误");
			break;	
			
		case "ER21":

			CardIDShower.value = CardIDShower.value +  "错误号:" + errorno + ",表示没找到动态库\r\n";
			break;
			
		case "ER22":

			CardIDShower.value = CardIDShower.value +  "错误号:" + errorno + ",表示动态库或驱动程序异常\r\n";
			break;	
		
		case "ER23":

			CardIDShower.value = CardIDShower.value +  "错误号:" + errorno + ",表示读卡器未插上或动态库或驱动程序异常\r\n";
			break;	
		case "ER24":
			alert("");
			CardIDShower.value = CardIDShower.value +  "错误号:" + errorno + ",表示操作超时,一般是动态库没有反应\r\n";
			break;	
		case "ER25":

			CardIDShower.value = CardIDShower.value +  "错误号:" + errorno + ",表示发送字数不够\r\n";
			break;
		case "ER26":

			CardIDShower.value = CardIDShower.value +  "错误号:" + errorno + ",表示发送的CRC错\r\n";
			break;	
		case "ER27":
	
			CardIDShower.value = CardIDShower.value +  "错误号:" + errorno + ",表示接收的字数不够\r\n";
			break;	
		case "ER28":

			CardIDShower.value = CardIDShower.value +  "错误号:" + errorno + ",表示接收的CRC错\r\n";
			break;

		case "ER29":
		
			alert("");
			CardIDShower.value = CardIDShower.value +  "错误号:" + errorno + ",表示函数输入参数格式错误,请仔细查看\r\n";
			break;
		default ://写卡成功,其中ER00表示完全成功,ER01表示完全没写到卡数据,ER02表示仅写该卡的第一块成功,,ER02表示仅写该卡的第一二块成功,这是刷卡太快原因
			CardIDShower.value = "写卡成功" + "\r\n";
			CardIDShower.value = CardIDShower.value + strls + "\r\n";
			CardIDShower.value = CardIDShower.value + "其中错误号为:" + errorno + "\r\n";
			CardIDShower.value = CardIDShower.value + "卡十六进制序列号为:" + strls.substr(5,8) + "\r\n";
			break;
	}
}

function changecardkeyex()
{
	//指定控制字
	myctrlword= EXTERNKEY;
	
	//指定区号
	myareano = 8; //指定为第8区
	
	//批定密码模式
	authmode = 1; //大于0表示用A密码认证,推荐用A密码认证
	
	//指定序列号,未知卡序列号时可指定为8个0
	mypiccserial="00000000";

	//旧密码
	mypicckey_old = "ffffffffffff";

	//新密码
	mypicckey_new = "ffffffffffffFF078069ffffffffffff";//其中最前面的ffffffffffff为A密码,中间的FF078069为访问控制位,最后面的ffffffffffff为B密码

	strls=IcCardReader.piccchangesinglekeyex(myctrlword, mypiccserial,myareano,authmode,mypicckey_old,mypicckey_new)
	errorno = strls.substr(0,4);
	
	if(errorno == "ER00")
	{
		CardIDShower.value = "修改密码成功,卡序列为:" + strls.substr(strls.length - 8,8) + "\r\n";
	} 
	else if((errorno == "ER08") || (errorno == "ER09") || (errorno == "ER10"))
	{
		CardIDShower.value = CardIDShower.value +  "错误号:" + errorno + ",表示寻不到卡\r\n";
	} 
	else
	{
		CardIDShower.value = CardIDShower.value + "错误号:" + errorno  + "\r\n";
	}

}

function getdevicenumber()
{
	strls=IcCardReader.pcdgetdevicenumber();
	errorno = strls.substr(0,4);
	if(errorno == "ER00")
    {

		CardIDShowerdev.value = CardIDShowerdev.value + "读取成功,设备硬件号为:" + strls.substr(strls.length - 8,8) + "\r\n";
	
	}
	else if(errorno == "ER23")
	{
		CardIDShowerdev.value = CardIDShowerdev.value + "请先用USB接口连接读写器" + "\r\n";
	}
	else 
	{
		CardIDShowerdev.value = CardIDShowerdev.value + "错误号:" + errorno + "\r\n";
	}
}

function beep()
{
	IcCardReader.pcdbeep(100);//100表示响100毫秒
}

function clears1()
{
	CardIDShower.value = "";
}

function clearsntag()
{
	CardIDShowerNtag.value = "";
}

function clearsdev()
{
	CardIDShowerdev.value = "";
}

//Ntag21x测试
function readcard_ntag()
{
	//指定序列号,未知卡序列号时可指定为14个0,因为NTAG21x卡是7个字节的卡序列号
	strls = ntagserial.value.trim();
	if(strls=="")
	{
		mypiccserial="00000000000000";
	}
	else
	{
		if(!isHex(strls))
		{
			CardIDShowerNtag.value = CardIDShowerNtag.value +  "卡号输入错误\r\n";
			ntagserial.focus();
			ntagserial.select();
			return;
		}
		mypiccserial = strls;
	}

	//指定密码,NTAG21x卡密码为4个字节,卡出厂时密码功能不启用,这样无需密码也能读写卡
	if(check3.checked)
	{
		//指定控制字
		myctrlword=EXTERNKEY;//无需密码为0,当需要密码时为EXTERNKEY;
		strls = ntagkey3.value.trim();
		if(!isHex(strls))
		{
			CardIDShowerNtag.value = CardIDShowerNtag.value +  "密码输入错误\r\n";
			ntagkey3.focus();
			ntagkey3.select();
			return;
		}
		mypicckey = strls;
	}
	else
	{
		//指定控制字
		myctrlword = 0;//无需密码为0,当需要密码时为EXTERNKEY;
	}
	
	//起始页号
	strls = ntagstartno.value.trim();
	
	if(!isUIntNum(strls))
	{
		CardIDShowerNtag.value = CardIDShowerNtag.value +  "起始页号输入错误\r\n";
		ntagstartno.focus();
		ntagstartno.select();
		return;
	}

	myblockaddr = parseInt(strls);//本次读卡的开始块号
	
	//页数
	strls = ntagpagenumber.value.trim();
	
	if(!isUIntNum(strls))
	{
		CardIDShowerNtag.value = CardIDShowerNtag.value +  "页数输入错误\r\n";
		ntagpagenumber.focus();
		ntagpagenumber.select();
		return;
	}
	myblocksize = parseInt(strls);//读4个块
	
	strls=IcCardReader.piccreadex_ntag(myctrlword,mypiccserial,mypicckey,myblockaddr,myblocksize);

	errorno = strls.substr(0,4);
	
	switch(errorno)
	{
		case "ER08":
			CardIDShowerNtag.value = CardIDShowerNtag.value +  "错误号:" + errorno + ",表示寻不到卡\r\n";
			break;	
		case "ER09":
			CardIDShowerNtag.value = CardIDShowerNtag.value +  "错误号:" + errorno + ",表示寻不到卡\r\n";
			break;	
		case "ER10":
			CardIDShowerNtag.value = CardIDShowerNtag.value +  "错误号:" + errorno + ",表示寻不到卡\r\n";
			break;		

		case "ER11":
			CardIDShowerNtag.value = "密码认证错误\r\n";
			CardIDShowerNtag.value = CardIDShowerNtag.value + strls + "\r\n";
			CardIDShowerNtag.value = CardIDShowerNtag.value + "其中错误号为:" + errorno + "\r\n";
			CardIDShowerNtag.value = CardIDShowerNtag.value + "卡十六进制序列号为:" + strls.substr(5,14) + "\r\n";

			break;	
		case "ER12":
			CardIDShowerNtag.value = "密码认证错误" + "\r\n";
			CardIDShowerNtag.value = CardIDShowerNtag.value + strls + "\r\n";
			CardIDShowerNtag.value = CardIDShowerNtag.value + "其中错误号为:" + errorno + "\r\n";
			CardIDShowerNtag.value = CardIDShowerNtag.value + "卡十六进制序列号为:" + strls.substr(5,14) + "\r\n";

			break;
		case "ER13":
			CardIDShowerNtag.value = "读卡错误" + "\r\n";
			CardIDShowerNtag.value = CardIDShowerNtag.value + strls + "\r\n";
			CardIDShowerNtag.value = CardIDShowerNtag.value + "其中错误号为:" + errorno + "\r\n";
			CardIDShowerNtag.value = CardIDShowerNtag.value + "卡十六进制序列号为:" + strls.substr(5,14) + "\r\n";

			break;	
			
		case "ER21":

			CardIDShowerNtag.value = CardIDShowerNtag.value +  "错误号:" + errorno + ",表示没找到动态库\r\n";
			break;
			
		case "ER22":

			CardIDShowerNtag.value = CardIDShowerNtag.value +  "错误号:" + errorno + ",表示动态库或驱动程序异常\r\n";
			break;	
		
		case "ER23":

			CardIDShowerNtag.value = CardIDShowerNtag.value +  "错误号:" + errorno + ",表示读卡器未插上或动态库或驱动程序异常\r\n";
			break;	
		case "ER24":
			alert("");
			CardIDShowerNtag.value = CardIDShowerNtag.value +  "错误号:" + errorno + ",表示操作超时,一般是动态库没有反应\r\n";
			break;	
		case "ER25":

			CardIDShowerNtag.value = CardIDShowerNtag.value +  "错误号:" + errorno + ",表示发送字数不够\r\n";
			break;
		case "ER26":

			CardIDShowerNtag.value = CardIDShowerNtag.value +  "错误号:" + errorno + ",表示发送的CRC错\r\n";
			break;	
		case "ER27":
	
			CardIDShowerNtag.value = CardIDShowerNtag.value +  "错误号:" + errorno + ",表示接收的字数不够\r\n";
			break;	
		case "ER28":

			CardIDShowerNtag.value = CardIDShowerNtag.value +  "错误号:" + errorno + ",表示接收的CRC错\r\n";
			break;

		case "ER29":
			CardIDShowerNtag.value = CardIDShowerNtag.value +  "错误号:" + errorno + ",函数输入参数格式错误,请仔细查看\r\n";
			break;
		case "ER00":
			//读卡成功
			CardIDShowerNtag.value = "读卡成功" + "\r\n";
			CardIDShowerNtag.value = CardIDShowerNtag.value + strls + "\r\n";
			CardIDShowerNtag.value = CardIDShowerNtag.value + "其中错误号为:" + errorno + "\r\n";
			CardIDShowerNtag.value = CardIDShowerNtag.value + "卡十六进制序列号为:" + strls.substr(5,14) + "\r\n";
			CardIDShowerNtag.value = CardIDShowerNtag.value + "本次读取的十六进制数据为:" + strls.substr(20) + "\r\n";
			
			ntagserial.value = strls.substr(5,14);
			ntagdata.value = strls.substr(20);

			break;
	}

}

function writecard_ntag()
{
	//指定序列号,未知卡序列号时可指定为14个0,因为NTAG21x卡是7个字节的卡序列号
	strls = ntagserial.value.trim();
	if(strls=="")
	{
		mypiccserial="00000000000000";
	}
	else
	{
		if(!isHex(strls))
		{
			CardIDShowerNtag.value = CardIDShowerNtag.value +  "卡号输入错误\r\n";
			ntagserial.focus();
			ntagserial.select();
			return;
		}
		mypiccserial = strls;
	}

	//指定密码,NTAG21x卡密码为4个字节,卡出厂时密码功能不启用,这样无需密码也能读写卡
	if(check3.checked)
	{
		//指定控制字
		myctrlword=EXTERNKEY;//无需密码为0,当需要密码时为EXTERNKEY;
		strls = ntagkey3.value.trim();
		if(!isHex(strls))
		{
			CardIDShowerNtag.value = CardIDShowerNtag.value +  "密码输入错误\r\n";
			ntagkey3.focus();
			ntagkey3.select();
			return;
		}
		mypicckey = strls;
	}
	else
	{
		//指定控制字
		myctrlword = 0;//无需密码为0,当需要密码时为EXTERNKEY;
	}
	
	//起始页号
	strls = ntagstartno.value.trim();
	
	if(!isUIntNum(strls))
	{
		CardIDShowerNtag.value = CardIDShowerNtag.value +  "起始页号输入错误\r\n";
		ntagstartno.focus();
		ntagstartno.select();
		return;
	}

	myblockaddr = parseInt(strls);//本次读卡的开始块号
	
	//页数
	strls = ntagpagenumber.value.trim();
	
	if(!isUIntNum(strls))
	{
		CardIDShowerNtag.value = CardIDShowerNtag.value +  "页数输入错误\r\n";
		return;
	}
	myblocksize = parseInt(strls);
	
	//数据
	strls = ntagdata.value.trim();
	
	if(!isHex(strls))
	{
		CardIDShowerNtag.value = CardIDShowerNtag.value +  "数据输入错误\r\n";
		ntagdata.focus();
		ntagdata.select();
		return;
	}
	
	strls=IcCardReader.piccwriteex_ntag(myctrlword,mypiccserial,mypicckey,myblockaddr,myblocksize,strls);

	errorno = strls.substr(0,4);
	
	switch(errorno)
	{
		case "ER08":
			CardIDShowerNtag.value = CardIDShowerNtag.value +  "错误号:" + errorno + ",表示寻不到卡\r\n";
			break;	
		case "ER09":
			CardIDShowerNtag.value = CardIDShowerNtag.value +  "错误号:" + errorno + ",表示寻不到卡\r\n";
			break;	
		case "ER10":
			CardIDShowerNtag.value = CardIDShowerNtag.value +  "错误号:" + errorno + ",表示寻不到卡\r\n";
			break;		

		case "ER11":
			CardIDShowerNtag.value = "密码认证错误\r\n";
			CardIDShowerNtag.value = CardIDShowerNtag.value + strls + "\r\n";
			CardIDShowerNtag.value = CardIDShowerNtag.value + "其中错误号为:" + errorno + "\r\n";
			CardIDShowerNtag.value = CardIDShowerNtag.value + "卡十六进制序列号为:" + strls.substr(5,14) + "\r\n";
			alert("密码认证错误");
			break;	
		case "ER12":
			CardIDShowerNtag.value = "密码认证错误" + "\r\n";
			CardIDShowerNtag.value = CardIDShowerNtag.value + strls + "\r\n";
			CardIDShowerNtag.value = CardIDShowerNtag.value + "其中错误号为:" + errorno + "\r\n";
			CardIDShowerNtag.value = CardIDShowerNtag.value + "卡十六进制序列号为:" + strls.substr(5,14) + "\r\n";

			break;

		case "ER14":
			CardIDShowerNtag.value = "写卡错误" + "\r\n";
			CardIDShowerNtag.value = CardIDShowerNtag.value + strls + "\r\n";
			CardIDShowerNtag.value = CardIDShowerNtag.value + "其中错误号为:" + errorno + "\r\n";
			CardIDShowerNtag.value = CardIDShowerNtag.value + "卡十六进制序列号为:" + strls.substr(5,14) + "\r\n";

			break;	
		case "ER20":
			CardIDShowerNtag.value = "写卡错误,禁止写配置页或页号超过此卡最大页" + "\r\n";
			CardIDShowerNtag.value = CardIDShowerNtag.value + strls + "\r\n";
			CardIDShowerNtag.value = CardIDShowerNtag.value + "其中错误号为:" + errorno + "\r\n";
			CardIDShowerNtag.value = CardIDShowerNtag.value + "卡十六进制序列号为:" + strls.substr(5,14) + "\r\n";

			break;
			
		case "ER21":

			CardIDShowerNtag.value = CardIDShowerNtag.value +  "错误号:" + errorno + ",表示没找到动态库\r\n";
			break;
			
		case "ER22":

			CardIDShowerNtag.value = CardIDShowerNtag.value +  "错误号:" + errorno + ",表示动态库或驱动程序异常\r\n";
			break;	
		
		case "ER23":

			CardIDShowerNtag.value = CardIDShowerNtag.value +  "错误号:" + errorno + ",表示读卡器未插上或动态库或驱动程序异常\r\n";
			break;	
		case "ER24":
			alert("");
			CardIDShowerNtag.value = CardIDShowerNtag.value +  "错误号:" + errorno + ",表示操作超时,一般是动态库没有反应\r\n";
			break;	
		case "ER25":

			CardIDShowerNtag.value = CardIDShowerNtag.value +  "错误号:" + errorno + ",表示发送字数不够\r\n";
			break;
		case "ER26":

			CardIDShowerNtag.value = CardIDShowerNtag.value +  "错误号:" + errorno + ",表示发送的CRC错\r\n";
			break;	
		case "ER27":
	
			CardIDShowerNtag.value = CardIDShowerNtag.value +  "错误号:" + errorno + ",表示接收的字数不够\r\n";
			break;	
		case "ER28":

			CardIDShowerNtag.value = CardIDShowerNtag.value +  "错误号:" + errorno + ",表示接收的CRC错\r\n";
			break;

		case "ER29":

			CardIDShowerNtag.value = CardIDShowerNtag.value +  "错误号:" + errorno + ",函数输入参数格式错误,请仔细查看\r\n";
			break;
		case "ER00":
			//写卡成功
			CardIDShowerNtag.value = "写卡成功" + "\r\n";
			CardIDShowerNtag.value = CardIDShowerNtag.value + strls + "\r\n";
			CardIDShowerNtag.value = CardIDShowerNtag.value + "其中错误号为:" + errorno + "\r\n";
			CardIDShowerNtag.value = CardIDShowerNtag.value + "卡十六进制序列号为:" + strls.substr(5,14) + "\r\n";
			
			ntagserial.value = strls.substr(5,14);
			ntagdata.value = strls.substr(20);
			
			break;
	}
}

function piccinit_ntag()
{
	//指定序列号,未知卡序列号时可指定为14个0,因为NTAG21x卡是7个字节的卡序列号
	mypiccserial="00000000000000";
	
	//指定密码,NTAG21x卡密码为4个字节,卡出厂时密码功能不启用,这样无需密码也能读写卡
	if(check1.checked)
	{
		//指定控制字
		myctrlword=EXTERNKEY;//无需密码为0,当需要密码时为EXTERNKEY;
		strls = ntagkey1.value.trim();
		if(!isHex(strls))
		{
			CardIDShowerNtag.value = CardIDShowerNtag.value +  "密码输入错误\r\n";
			ntagkey1.focus();
			ntagkey1.select();
			return;
		}
		mypicckey = strls;
	}
	else
	{
		//指定控制字
		myctrlword = 0;//无需密码为0,当需要密码时为EXTERNKEY;
	}
	
	//数据准备
	if(select1.selectedIndex==1)
	{//开启密码保护功能,写保护功能生效,但读保护需要下面的数据设定
		//取新密码
		strls = ntagkey2.value.trim();

		if(strls.length != 8)
		{
			CardIDShowerNtag.value = CardIDShowerNtag.value +  "新密码长度必须为8位\r\n";
			ntagkey2.focus();
			ntagkey2.select();
			return;
		}
		
		strls = ntagkey2.value.trim();
		if(!isHex(strls))
		{
			CardIDShowerNtag.value = CardIDShowerNtag.value +  "新密码输入错误\r\n";
			ntagkey2.focus();
			ntagkey2.select();
			return;
		}
		
		
		strls1=protectpageno.value.trim();//起始保护页号
		if(!isUIntNum(strls1))
		{
			CardIDShowerNtag.value = CardIDShowerNtag.value +  "起始保护页号输入错误\r\n";
			protectpageno.focus();
			protectpageno.select();
			return;
		}
		
		strls1 = "0"+parseInt(strls1).toString(16);
		strls1 = strls1.substring(strls1.length-2);
		
		mypiccdata = "000000" + strls1;
		myctrlword = myctrlword + 0x01; //更新控制字
		
		//计数器
		strls1=keyerrortimes.value.trim();//允许密码错误次数
		if(!isUIntNum(strls1))
		{
			CardIDShowerNtag.value = CardIDShowerNtag.value +  "允许密码错误次数输入错误\r\n";
			protectpageno.focus();
			protectpageno.select();
			return;
		}
		
		i = parseInt(strls1);

                i = i % 8;
		
		if(check2.checked)
		{
			i = i + 128;
		}
		strls1 = "0"+i.toString(16);
		strls1 = strls1.substring(strls1.length-2);
		
		mypiccdata = mypiccdata + strls1;
		
		mypiccdata = mypiccdata + "000000";
		
		mypiccdata = mypiccdata + strls;//新密码
		
		//PACK
		//PACK
		//RFUI
		//RFUI
		mypiccdata = mypiccdata + "16160000";
		
		myctrlword = myctrlword + 0x02; //更新控制字	
	}
	else
	{
		mypiccdata = "000000FF";//MIRROR,RFUI,MIRROR_PAGE,AUTH0
		
		myctrlword = myctrlword + 0x01; //更新控制字	
		
		mypiccdata = mypiccdata + "00000000";
		myctrlword = myctrlword + 0x02; //更新控制字	
		
	}

	strls=IcCardReader.piccinit_ntag(myctrlword,mypiccserial,mypicckey,mypiccdata);

	errorno = strls.substr(0,4);
	
	switch(errorno)
	{
		case "ER08":
			CardIDShowerNtag.value = CardIDShowerNtag.value +  "错误号:" + errorno + ",表示寻不到卡\r\n";
			break;	
		case "ER09":
			CardIDShowerNtag.value = CardIDShowerNtag.value +  "错误号:" + errorno + ",表示寻不到卡\r\n";
			break;	
		case "ER10":
			CardIDShowerNtag.value = CardIDShowerNtag.value +  "错误号:" + errorno + ",表示寻不到卡\r\n";
			break;		

		case "ER11":
			CardIDShowerNtag.value = "密码认证错误\r\n";
			CardIDShowerNtag.value = CardIDShowerNtag.value + strls + "\r\n";
			CardIDShowerNtag.value = CardIDShowerNtag.value + "其中错误号为:" + errorno + "\r\n";
			CardIDShowerNtag.value = CardIDShowerNtag.value + "卡十六进制序列号为:" + strls.substr(5,14) + "\r\n";
			alert("密码认证错误");
			break;	
		case "ER12":
			CardIDShowerNtag.value = "密码认证错误" + "\r\n";
			CardIDShowerNtag.value = CardIDShowerNtag.value + strls + "\r\n";
			CardIDShowerNtag.value = CardIDShowerNtag.value + "其中错误号为:" + errorno + "\r\n";
			CardIDShowerNtag.value = CardIDShowerNtag.value + "卡十六进制序列号为:" + strls.substr(5,14) + "\r\n";

			break;

		case "ER14":
			CardIDShowerNtag.value = "设置失败,可能需要验证密码" + "\r\n";
			CardIDShowerNtag.value = CardIDShowerNtag.value + strls + "\r\n";
			CardIDShowerNtag.value = CardIDShowerNtag.value + "其中错误号为:" + errorno + "\r\n";
			CardIDShowerNtag.value = CardIDShowerNtag.value + "卡十六进制序列号为:" + strls.substr(5,14) + "\r\n";

			break;	

		case "ER21":

			CardIDShowerNtag.value = CardIDShowerNtag.value +  "错误号:" + errorno + ",表示没找到动态库\r\n";
			break;
			
		case "ER22":

			CardIDShowerNtag.value = CardIDShowerNtag.value +  "错误号:" + errorno + ",表示动态库或驱动程序异常\r\n";
			break;	
		
		case "ER23":

			CardIDShowerNtag.value = CardIDShowerNtag.value +  "错误号:" + errorno + ",表示读卡器未插上或动态库或驱动程序异常\r\n";
			break;	
		case "ER24":
			alert("");
			CardIDShowerNtag.value = CardIDShowerNtag.value +  "错误号:" + errorno + ",表示操作超时,一般是动态库没有反应\r\n";
			break;	
		case "ER25":

			CardIDShowerNtag.value = CardIDShowerNtag.value +  "错误号:" + errorno + ",表示发送字数不够\r\n";
			break;
		case "ER26":

			CardIDShowerNtag.value = CardIDShowerNtag.value +  "错误号:" + errorno + ",表示发送的CRC错\r\n";
			break;	
		case "ER27":
	
			CardIDShowerNtag.value = CardIDShowerNtag.value +  "错误号:" + errorno + ",表示接收的字数不够\r\n";
			break;	
		case "ER28":

			CardIDShowerNtag.value = CardIDShowerNtag.value +  "错误号:" + errorno + ",表示接收的CRC错\r\n";
			break;

		case "ER29":

			CardIDShowerNtag.value = CardIDShowerNtag.value +  "错误号:" + errorno + ",函数输入参数格式错误,请仔细查看\r\n";
			break;
		case "ER00":
			//初始化卡成功
			CardIDShowerNtag.value = "初始化卡成功" + "\r\n";
			CardIDShowerNtag.value = CardIDShowerNtag.value + strls + "\r\n";
			CardIDShowerNtag.value = CardIDShowerNtag.value + "其中错误号为:" + errorno + "\r\n";
			CardIDShowerNtag.value = CardIDShowerNtag.value + "卡十六进制序列号为:" + strls.substr(5,14) + "\r\n";
			
			break;
	}
}

window.onerror=function()
{
	alert("不好意思,出错了!");
	return true;//屏蔽系统事件
}

</script>

<style type="text/css">
	input {float: left;margin-right: 10px;margin-top: 10px;margin-bottom: 10px;padding: 5px 10px}
	input[type="text"]:focus {border:2px solid #ff9800}
</style>

</head>
<body>
	<div style="width:100%">
		<object classid="clsid:05782014-9FF7-468C-BE96-8EDC73084202" id="IcCardReader" viewastext="" width="0" height="0"></object>
		
		<div style=" float:left; COLOR: #FFF;BACKGROUND-COLOR: #FF9800;padding: 2px 5px;">
			设备操作
		</div>
		<div style="width:100%; float:left;">
			<div style="border-top: 2px solid #ff9800;padding: 2px 5px;color: #2196f3;">
				<span>提示:</span>
				<br/>
				<textarea rows="3" cols="98" id="CardIDShowerdev" name="S3" style="width:100%;overflow:auto;"></textarea>
				<br/>
				<input type="button" value="蜂鸣器响" onclick="beep()">
				<input type="button" value="读取读写器硬件号" onclick="getdevicenumber()">
				<input type="button" value="清空提示" onclick="clearsdev()">
				
			</div>
		</div>
		
		<div style=" float:left; COLOR: #FFF;BACKGROUND-COLOR: #FF9800;padding: 2px 5px;">
			M1卡测试
		</div>
		<div style="width:100%; float:left;">
			<div style="border-top: 2px solid #ff9800;padding: 2px 5px;color: #2196f3;">
				<span>提示:</span>
				<br/>
				<textarea rows="10" cols="98" id="CardIDShower" name="S1" style="width: 100%;overflow:auto;"></textarea>
				
				<br/>
				<input type="button" value=" 读 卡 " onclick="readcard()">
				<input type="button" value=" 写 卡 " onclick="writecard()">
				<input type="button" value="更改卡密码" onclick="changecardkeyex()">
				<input type="button" value="清空提示" onclick="clears1()">
				
			</div>
		</div>
		
		<div style=" float:left; COLOR: #FFF;BACKGROUND-COLOR: #FF9800;padding: 2px 5px;">
			Ntag21x卡测试
		</div>

		<div style="width:100%; float:left;">
			<div style="border-top: 2px solid #ff9800;padding: 2px 5px;color: #2196f3;">

				<span>提示:</span>
				<br>
				<textarea rows="10" cols="98" id="CardIDShowerNtag" name="S2" style="width: 100%;overflow:auto;"></textarea>
				<br/>
				<input type="button" value="清空提示" onclick="clearsntag()">
				<br/>
				<div style="width:100%; float:left;">

					<label>
						<input name="check1" type="checkbox" style="float:none;margin-right:0px;padding:0px;vertical-align:middle" />
						<span style="vertical-align:middle">需要认证卡密码才能继续操作,密码:</span>
					</label> 
					
					<input type="text" name="ntagkey1"  value ="12345678" style="width:6em;float:none;margin-right:0px;padding:0px;vertical-align:middle"/>
					<br/>
					<select name="select1" style="width:12em;">
						<option>取消密码保护功能</option>
						<option>开启密码保护功能</option>
					</select>
					<br/>
					<label>
						<span style="vertical-align:middle">从</span>
						<input type="text" name="protectpageno"  value ="144" style="width:2em;float:none;margin-right:0px;padding:0px;vertical-align:middle"/>
						<span style="vertical-align:middle">页开始有密码保护</span>
						
					</label> 
					
					<label>
						<input name="check2" type="checkbox" style="float:none;margin-right:0px;padding:0px;vertical-align:middle" />
						<span style="vertical-align:middle">开启读操作密码保护</span>
					</label>
					
					<br/>

					<span style="vertical-align:middle">新密码:</span>
					<input type="text" name="ntagkey2"  value ="12345678" style="width:6em;float:none;margin-right:0px;padding:0px;vertical-align:middle"/>
					<span style="vertical-align:middle">允许密码错误次数(0为不限次):</span>
					<input type="text" name="keyerrortimes"  value ="0" style="width:2em;float:none;margin-right:0px;padding:0px;vertical-align:middle"/>

					<br/>
					<input type="button" value=" 设置卡密码及保护机制(写错卡作废,千万小心) " onclick="piccinit_ntag()">
					<br/>
					<div style="width:100%; float:left;border-top: 3px solid #eaebdc;"></div>
					<br/>
					<label>
						<input name="check3" type="checkbox" style="float:none;margin-right:0px;padding:0px;vertical-align:middle" />
						<span style="vertical-align:middle">需要认证卡密码才能继续操作,密码:</span>
					</label> 
					<input type="text" name="ntagkey3"  value ="12345678" style="width:6em;float:none;margin-right:0px;padding:0px;vertical-align:middle"/>
					
					<table style="color:#e58800;width:100%;table-layout:fixed;">
						<colgroup>
							<col width="85">
							<col width="50">
							<col width="50">
							<col width="auto">
						</colgroup>
						<tr>
							<td style="text-align:right">
								<span style="vertical-align:middle">起始页号:</span>
							</td>
							
							<td>
								<input type="text" name="ntagstartno"  value ="8" style="width:2em;float:none;margin-right:0px;padding:0px;vertical-align:middle"/>
							</td>
							<td>
								<span style="vertical-align:middle">卡号:</span>
							</td>
							
							<td>
								<input type="text" name="ntagserial" value="" style="max-width: 16em;width:100%;float:none;margin-right:0px;padding:0px;vertical-align:middle;overflow:auto;">
							</td>
							
						</tr>
						
						<tr>
							<td style="text-align:right">
								<span style="vertical-align:middle">页数:</span>
							</td>
							
							<td>
								<input type="text" name="ntagpagenumber"  value ="4" style="width:2em;float:none;margin-right:0px;padding:0px;vertical-align:middle;" />
							</td>
							<td>
								<span style="vertical-align:middle;">数据:</span>
							</td>
							
							<td>

								<input type="text" name="ntagdata" value="" style="width:100%;float:none;margin-right:0px;padding:0px;vertical-align:middle;overflow:auto; ">
							</td>
							
						</tr>	
					</table>
					

					<input type="button" value=" 轻松读卡,最多一次12页 " onclick="readcard_ntag()">
					<input type="button" value=" 轻松写卡,最多一次11页 " onclick="writecard_ntag()">
					<br/>
					
					<div style="width:100%; float:left;border-top: 3px solid #eaebdc;"></div>
					
					<br/>
					
				</div>
				

				

			</div>
		</div>

		<div style="width:100%; float:left;">
		
			<table style="color:#e58800">
			
				<colgroup>
					<col width="20">
					<col width="auto">
				</colgroup>
				<tr>
					<td colspan="2">
					说明:
					</td>
					
				</tr>
				
				<tr>
					<td valign="top">
					1、
					</td>
					
					<td valign="top">
					<p>
						运行本例程前,需先注册 IcCardReader 控件,注册方法:如果64位操作系统,以管理员身份运行"复制及注册IcCardReader控件win10_64.bat",如果是32位操作系统,以管理员身份运行"复制及注册IcCardReader控件win_32.bat",这两个文件在当前目录下。</p>
					</td>
					
				</tr>
				<tr>
					<td valign="top">
					2、
					</td>
					
					<td valign="top">
					<p>
						<p>在IE的Internet 属性设定,让浏览器允许运行 ActiveX 控件。</p>
					</td>
					
				</tr>
				<tr>
					<td valign="top">
					3、
					</td>
					
					<td valign="top">
					<p>
						<p>如果是在服务器端运行本网页,还需在IE的Internet 属性中设定,将服务器网址设为可信站点,否则网页无权运行本地控件。</p>
					</td>
					
				</tr>
				<tr>
					<td valign="top">
					4、
					</td>
					
					<td valign="top">
					<p>
						<p>如果是用IE以外的浏览器,如360浏览器,需开启兼容模式(可在网上加&lt;meta name="renderer" content="ie-stand"&gt;),不能用极速模式。</p>
					</td>
					
				</tr>
				
			</table>
			
		</div>
	
	</div>
	


</body>
</html>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

vx_13822155058

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值