JavaScript WebSocket NFC读写器示例源码

此网页演示了如何使用JavaScript通过WebSocket与RFID读写器进行交互,包括读取ID卡、M1卡、Ntag21x卡和15693卡的操作,如读卡、写卡、更改卡密码等功能。用户可以输入卡号、密码等信息,点击按钮执行相应操作,页面会显示操作结果和错误信息。

 读写器介绍:

RFID读写器NFC发卡器WEB可编程NDEF文本/网址/智能海报/电话/启动-淘宝网 (taobao.com)icon-default.png?t=N7T8https://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
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

广州荣士电子_18002295132

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

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

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

打赏作者

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

抵扣说明:

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

余额充值