首页 > 解决方案 > 使用 Node.js 模块 nfc-pcsc 编写后,NFC Tag 的扇区不再工作

问题描述

我正在使用 Node.js 模块 nfc-pcsc 进行一些实验,但我不知道这是如何产生问题的。在下面的代码中,当卡片放在读卡器上时,程序会在前四个可用扇区中写入“a”、“b”、“c”和“d”。完成后,它会打印出“写入的数据”(无论是否真的有效),然后打印出 的值arr2,其中程序存储了写入数据的扇区数:

const { NFC, TAG_ISO_14443_3, TAG_ISO_14443_4, KEY_TYPE_A, KEY_TYPE_B } = require('nfc-pcsc');
const nfc = new NFC();

nfc.on('reader', async reader => {
    reader.on('card', async card => {
        const arr = ['a', 'b', 'c', 'd'];
        const arr2 = [];
        let len = arr.length;
        for (let i = 4, j = 0; i < 64 && j < len; i++) {
            try {
                let data = Buffer.allocUnsafe(16).fill(0);
                data.write(arr[j]);

                await reader.authenticate(i, KEY_TYPE_B, 'ffffffffffff');
                await reader.write(i, data, 16);

                j++;
                arr2.push(i);
            } catch { }
        }
        console.log('data written');
        console.log(arr2);
    });

    reader.on('error', err => {
        console.log(err);
    });
    reader.on('end', () => {
        //
    });
});

nfc.on('error', err => {
    console.log(err);
});

所以完成后我想检查结果。我尝试运行以下代码,它遍历所有扇区,读取它们的数据并将其打印出来:

        ...
        for (let i = 4; i < 64; i++) {
            try {
                await reader.authenticate(i, KEY_TYPE_B, 'ffffffffffff');
                let data = (await reader.read(i, 16, 16)).toString();

                console.log(`Sector ${i}: ${data}`);
            } catch { }
        }
        ...

结果呢?先前存储在arr2变量中的扇区号不再出现:它们未通过身份验证。
但是,我尝试使用另一种代码仅写入一个扇区,这里是:

        ...
        try {
            let data = Buffer.allocUnsafe(16).fill(0);
            data.write('a');

            await reader.authenticate(28, KEY_TYPE_B, 'ffffffffffff');
            await reader.write(28, data, 16);

            console.log('data written');
        } catch (err) {
            console.log(err);
        }
        ...

当运行与以前相同的代码来检查结果时,它现在可以工作并且该扇区保持不变。这怎么可能?还有,有什么办法可以恢复那些似乎消失的扇区?

标签: node.jsnfc

解决方案


推荐阅读