• JavaScript WebSocket NFC读写器示例源码


     

     读写器介绍:RFID读写器NFC发卡器WEB可编程NDEF文本/网址/智能海报/电话/启动-淘宝网 (taobao.com)icon-default.png?t=M5H6https://item.taobao.com/item.htm?spm=a1z10.5-c.w4002-17663462238.11.2de6789eHCsr50&id=615391857885

    <html>

    <head>
        
        <meta http-equiv="Content-Language" content="zh-cn">
        <meta name="ProgId" content="FrontPage.Editor.Document">
        <title>USB IC、Ntag卡、ID、15693卡读卡器调用例程 通用插件版 V2.0</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端口一致

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

    //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个块

    var afi="00"; 

    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 ReadID()
    {
        CardIDShowerdev.value="";
        var ReadIDComm="idr_read,";
                    WebSocketRun(ReadIDComm);    
    }

    function ReadIDOne()
    {
        CardIDShowerdev.value="";
        var ReadIDComm="idr_read_once,";
                    WebSocketRun(ReadIDComm);    
    }

    function readcard()
    {
        myctrlword=BLOCK0_EN + BLOCK1_EN + BLOCK2_EN + EXTERNKEY;    //指定控制字,十进制
        myareano = 8;                     //指定为本次读取第8区,十进制
        authmode = 1;                     //指定密码模式,十进制,大于0表示用A密码认证,推荐用A密码认证
        mypiccserial="00000000";     //指定本次操作的卡序列号,十六进制,未知时可指定为8个0    
        mypicckey = "ffffffffffff";     //指定卡片密码,十六进制,ffffffffffff为卡片厂家出厂密码
        
        CardIDShower.value = "";    
        
                    //用parseInt转为十六进制数
        var ReadCardComm="piccreadex,"+myctrlword+","+mypiccserial+","+myareano+","+authmode+","+mypicckey;
                    WebSocketRun(ReadCardComm);            
    }

    function writecard()
    {
        myctrlword=BLOCK0_EN + BLOCK1_EN + BLOCK2_EN + EXTERNKEY;    //指定控制字,十进制
        myareano = 8;                     //指定为本次读取第8区,十进制
        authmode = 1;                     //指定密码模式,十进制,大于0表示用A密码认证,推荐用A密码认证
        mypiccserial="00000000";     //指定本次操作的卡序列号,十六进制,未知时可指定为8个0    
        mypicckey = "ffffffffffff";     //指定卡片密码,十六进制,ffffffffffff为卡片厂家出厂密码
        
        //指定写卡内容,长度为48个字节,其中每个字节以两个字符表示为十六进制数
        piccdata0_2 = "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F";
        
        CardIDShower.value = "";
        var WriteCardComm="piccwriteex,"+myctrlword+","+mypiccserial+","+myareano+","+authmode+","+mypicckey+","+piccdata0_2;
                    WebSocketRun(WriteCardComm);    
    }

    function writecarduid() 
    {
                  myctrlword = BLOCK0_EN;      //指定控制字,十进制
                   authmode = 1;                       //指定密码模式,十进制,大于0表示用A密码认证,推荐用A密码认证
                   mypiccserial = "00000000";     //指定本次操作的卡序列号,十六进制,未知时可指定为8个0
                   mypicckey = "ffffffffffff";       //指定卡片密码,十六进制,ffffffffffff为卡片厂家出厂密码

                   piccdata0 = "12345678000102030405060708090A0B";    //指定写卡内容,长度为16个字节,其中前面四个字节是卡号,第五字节必须为卡号的异或和校验字,后面为厂家标识

        CardIDShower.value = "";
        var WriteCardComm="piccwriteserial,"+myctrlword+","+mypiccserial+","+authmode+","+mypicckey+","+piccdata0;
                    WebSocketRun(WriteCardComm);
    }


    function changecardkeyex()
    {
        myctrlword=EXTERNKEY;           //指定控制字
        myareano = 8;                   //指定为本次读取第8区
        authmode = 1;                   //批定密码模式,大于0表示用A密码认证,推荐用A密码认证
        mypiccserial="00000000";        //指定本次操作的卡序列号,未知时可指定为8个0
        mypicckey_old = "ffffffffffff"; //旧密码
        mypicckey_new = "ffffffffffffFF078069ffffffffffff03";//新密码,其中最前面的ffffffffffff为A密码,中间的FF078069为访问控制位,后面的ffffffffffff为B密码,03是表示同时更改A、B、密码权限访问字,为02表示密码权限访问字不更改,只改A、B密码,为00表示只改A密码

                    CardIDShower.value = "";
        var ChangeKeyComm="piccchangesinglekeyex,"+myctrlword+","+mypiccserial+","+myareano+","+authmode+","+mypicckey_old+","+mypicckey_new;    
                    WebSocketRun(ChangeKeyComm);
    }

    function getdevicenumber()
    {
        CardIDShowerdev.value = "";
        WebSocketRun("pcdgetdevicenumber");
    }

    function IDgetdevicenumber()
    {
        CardIDShowerdev.value = "";
        WebSocketRun("IDpcdgetdevicenumber");
    }

    function beep()
    {    
        CardIDShowerdev.value = "";
        WebSocketRun("pcdbeep,30");    
    }

    function IDbeep()
    {    
        CardIDShowerdev.value = "";
        WebSocketRun("idr_beep,30");    
    }

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

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

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

    //Ntag21x测试
    function readcard_ntag()
    {            
        strls = ntagserial.value.trim();      //指定序列号,未知卡序列号时可指定为14个0,因为NTAG21x卡是7个字节的卡序列号
        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
        {    
                                    mypicckey = "00000000";    
            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个块

                    var ReadNtagComm="piccreadex_ntag,"+myctrlword+","+mypiccserial+","+mypicckey+","+myblockaddr+","+myblocksize;
                    WebSocketRun(ReadNtagComm);      
    }


    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
        {
            mypicckey = "00000000";    
            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;
        }

                    var WriteNtagComm="piccwriteex_ntag,"+myctrlword+","+mypiccserial+","+mypicckey+","+myblockaddr+","+myblocksize+","+strls;
                    WebSocketRun(WriteNtagComm);    
    }

    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
        {
            mypicckey = "00000000"; 
            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 + "000000000000000000000000";
            myctrlword = myctrlword + 0x02; //更新控制字    
            
        }

                    var WriteNtagComm="piccinit_ntag,"+myctrlword+","+mypiccserial+","+mypicckey+","+mypiccdata;
                    WebSocketRun(WriteNtagComm);    
    }

    function readcard_15693()
    {    
        myctrlword=0;                                    //读任何卡,不需指定卡号,读完后不静止该卡,可赋值NEEDSERIAL及NEEDHALT的组合模式,或为0
        afi="00";                                             //16进制,一般取00
        mypiccserial="0000000000000000";     //指定序列号,未知卡序列号时可指定为18个0,因为15693卡是8个字节的卡序列号
            
        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); //最大取值12

                    var Read15693Comm="iso15693readex,"+myctrlword+","+afi+","+myblockaddr+","+myblocksize+","+mypiccserial;
                    WebSocketRun(Read15693Comm);      
    }

    function writecard_15693()
    {    
        myctrlword=0;                                    //读任何卡,不需指定卡号,读完后不静止该卡,可赋值NEEDSERIAL及NEEDHALT的组合模式,或为0
        afi="00";                                             //16进制,一般取00
        mypiccserial="0000000000000000";     //指定序列号,未知卡序列号时可指定为18个0,因为15693卡是8个字节的卡序列号
        
        //起始页号
        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;
        }

                    var WriteNtagComm="iso15693writeex,"+myctrlword+","+afi+","+myblockaddr+","+myblocksize+","+mypiccserial+","+strls;
                    WebSocketRun(WriteNtagComm);    
    }

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

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


    //websockket数据处理
    function WebSocketRev(evt)
    {
        clearTimeout(mytimer);
        received_msg = evt.data;
        ws.close();
        
        //在这里解析返回数据
                   //CardIDShowerdev.value = received_msg;

                    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 +M1ErrInfo(strlist[1]);
                                           }
                                           CardIDShowerdev.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 +M1ErrInfo(strlist[1]);
                                          }
                                          if(strlist.length>2){
                                                 dispstr =dispstr +"设备编号:"+strlist[2]+"\r\n";
                                          }                                        
                                          CardIDShowerdev.value =dispstr;
                                          break;        

                                  case "idr_read":
                                  case "idr_read_once":
                                           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 +M1ErrInfo(strlist[1]);
                                           }
                                            if(strlist.length>2){
                                                 dispstr =dispstr +"原始16进制卡号:"+strlist[2]+"\r\n";
                                            } 
                                            if(strlist.length>3){
                                                 dispstr =dispstr +"转换08H10D卡号:"+strlist[3]+"\r\n";
                                            }     
                                            CardIDShowerdev.value =dispstr;
                                            break;   
                              
                                   case "piccreadex":
                                           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 +M1ErrInfo(strlist[1]);
                                           }
                                            if(strlist.length>2){
                                                 dispstr =dispstr +"卡序列号:"+strlist[2]+"\r\n";
                                            } 
                                            if(strlist.length>3){
                                                 dispstr =dispstr +"卡内数据:"+strlist[3]+"\r\n";
                                            }     
                                            CardIDShower.value =dispstr;
                                            break;   
                                   case "piccreadex_ntag":
                       case "iso15693readex":
                                           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 +NtagErrInfo(strlist[1]);
                                           }
                                            if(strlist.length>2){
                                                 dispstr =dispstr +"卡序列号:"+strlist[2]+"\r\n";
                                            } 
                                            if(strlist.length>3){
                                                 dispstr =dispstr +"卡内数据:"+strlist[3]+"\r\n";
                                            }     
                                            CardIDShowerNtag.value =dispstr;
                                            break;   

                                   case "piccwriteex":                                       
                                   case "piccchangesinglekeyex":         
                                   case "piccwriteserial": 
                                            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 +M1ErrInfo(strlist[1]);
                                           }
                                            if(strlist.length>2){
                                                 dispstr =dispstr +"卡序列号:"+strlist[2]+"\r\n";
                                          } 
                                          CardIDShower.value =dispstr;
                                         break;    

                                   case "piccwriteex_ntag":  
                                   case "piccinit_ntag":
                       case "iso15693writeex":
                                            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 +NtagErrInfo(strlist[1]);
                                           }
                                            if(strlist.length>2){
                                                 dispstr =dispstr +"卡序列号:"+strlist[2]+"\r\n";
                                          } 
                                         CardIDShowerNtag.value =dispstr;
                                         break;         
                          }
                    } 
    }


    function M1ErrInfo(errcode){
    var errstr="";
        switch(errcode){
              case "ReturnCode:001":
                     errstr=",读扇区数据失败!";
                     break;
              case "ReturnCode:002":
                     errstr=",读1、2块数据失败!";
                     break;
              case "ReturnCode:003":
                     errstr=",读第2块数据失败!";
                     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:444":
                      errstr=",RFIDWebServer系统文件错误!";
                      break;
              default:
                      errstr=",未知的错误!";
        }
    return errstr;
    }

    function NtagErrInfo(errcode){
    var errstr="";
        switch(errcode){
              case "ReturnCode:008":
              case "ReturnCode:009":
              case "ReturnCode:010":
                     errstr=",未寻到卡,请将卡放到发卡器的感应区!";
                     break;
              case "ReturnCode:011":
              case "ReturnCode:012":
                     errstr=",卡密码认证失败!";
                     break;
              case "ReturnCode:013":
                     errstr=",读卡失败,可能需要验证密码!";
                     break;
              case "ReturnCode:014":
                     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:444":
                      errstr=",RFIDWebServer系统文件错误!";
                      break;
              default:
                      errstr=",未知的错误!";
        }
    return errstr;
    }

    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()", 1000);
            };
            
            ws.onmessage = WebSocketRev;

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


    </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%">
            <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="4" cols="98" id="CardIDShowerdev" name="S3" style="width:100%;overflow:auto;"></textarea>
                    <input type="button" value="IC读写器蜂鸣器响" οnclick="beep()">
                    <input type="button" value="IC读写器读取读写器硬件号" οnclick="getdevicenumber()">

                    <input type="button" value="清空提示" οnclick="clearsdev()">
                    <br/>                
                </div>
            </div>
            <div style="width:100%; float:left;">
                                                    <div style="border-top: 2px solid #ff9800;padding: 2px 5px;color: #2196f3;">
                    <input type="button" value="ID读卡器蜂鸣器响" οnclick="IDbeep()">
                    <input type="button" value="ID读卡器读取读写器硬件号" οnclick="IDgetdevicenumber()">        
                    <input type="button" value="连续读取ID卡号" οnclick="ReadID()">
                    <input type="button" value="需重新取放卡才能第二次读取ID卡号" οnclick="ReadIDOne()">                                        
                </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="4" cols="98" id="CardIDShower" name="S1" style="width: 100%;overflow:auto;"></textarea>
                    
                    <br/>
                    <input type="button" value=" 读 卡 " οnclick="readcard()" />
                    <input type="button" value=" 写 卡 " οnclick="writecard()" />
                    <input type="button" value="更改卡密码" οnclick="changecardkeyex()" />
                    <input type="button" value="写卡UID号为12345678" οnclick="writecarduid()" />
                    
                    <input type="button" value="清空提示" οnclick="clears1()" />
                    
                </div>
            </div>
            
            <div style=" float:left; COLOR: #FFF;BACKGROUND-COLOR: #FF9800;padding: 2px 5px;">
                Ntag2x卡、15693卡测试
            </div>

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

                    <span>提示:</span>
                    <br>
                    <textarea rows="4" cols="98" id="CardIDShowerNtag" name="S2" style="width: 100%;overflow:auto;"></textarea>
                    <br/>
                    <input type="button" value=" 设置Ntag2x卡密码及保护机制(写错卡作废,千万小心) " οnclick="piccinit_ntag()">
                    <input type="button" value="清空提示" οnclick="clearsntag()">
                    <br/>
                    <div style="width:100%; float:left;">

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


                        <div style="width:100%; float:left;border-top: 3px solid #eaebdc;"></div>
                        <br/>
                        <label>
                            <input id="check3" type="checkbox" style="float:none;margin-right:0px;padding:0px;vertical-align:middle" />
                            <span style="vertical-align:middle">需要认证卡密码才能继续操作,密码:</span>
                        </label> 
                        <input type="text" id="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" id="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" id="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" id="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" id="ntagdata" value="" style="width:100%;float:none;margin-right:0px;padding:0px;vertical-align:middle;overflow:auto; ">
                                </td>
                                
                            </tr>    
                        </table>
                        

                        <input type="button" value=" 轻松读Ntag2x卡,最多一次12页 " οnclick="readcard_ntag()">
                        <input type="button" value=" 轻松写Ntag2x卡,最多一次11页 " οnclick="writecard_ntag()">
                        <input type="button" value=" 轻松读15693卡,最多一次12页 " οnclick="readcard_15693()">
                        <input type="button" value=" 轻松写15693卡,最多一次12页 " οnclick="writecard_15693()">
                        <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>
                            运行本例程前,需先在当前电脑下载安装我们的服务程序,并且运行该服务程序。</p>
                        </td>
                        
                    </tr>
                    <tr>
                        <td valign="top">
                        2、
                        </td>
                        
                        <td valign="top">
                        <p>
                            <p>兼容360、搜狗、QQ、UC、猎豹、IE、Microsoft Edge、Google Chrome、Firefox火狐等浏览器。</p>
                        </td>
                        
                    </tr>
                    
                    <tr>
                        <td valign="top">
                        2、
                        </td>
                        
                        <td valign="top">
                        <p>
                            <p>兼容http及https安全浏览协议。</p>
                        </td>
                        
                    </tr>

                    
                </table>
                
            </div>
        
        </div>
        


    </body>
    </html>

  • 相关阅读:
    git恢复commit过的代码
    tcp拥塞控制原理
    2023年湘潭大学OJ作业2 2023年下学期《C语言》作业0x01-数学计算 XTU OJ 1080,1081,1082,1083,1084
    Springboot信息泄露以及heapdump的利用
    海量数据处理
    一文深入底层分析Redis对象结构
    支付宝小程序云亮相!向小程序生态开放全面云服务
    提示计算机丢失msvcp140.dll怎么办,缺少msvcp140.dll一键修复
    Python打包exe等高效工具Nuitka
    2022年5月20日最全摸鱼游戏导航
  • 原文地址:https://blog.csdn.net/zhangjin7422/article/details/125428671