Android NFC:收发方法如何与内存一起工作?

Android NFC: How transceive method working with memory?

我有ntag213。我试图了解如何工作块,我的标签的内存部分。 我找到项目 https://github.com/lepunk/react-native-nfc-demo/blob/master/RNNFCDemo/App.js 但无法理解什么是收发方法的参数:

let text = this.state.text;
        let fullLength = text.length + 7;
        let payloadLength = text.length + 3;

        let cmd = Platform.OS === 'ios' ? NfcManager.sendMifareCommandIOS : NfcManager.transceive;

        resp = await cmd([0xA2, 0x04, 0x03, fullLength, 0xD1, 0x01]); // 0x0C is the length of the entry with all the fluff (bytes + 7)
        resp = await cmd([0xA2, 0x05, payloadLength, 0x54, 0x02, 0x65]); // 0x54 = T = Text block, 0x08 = length of string in bytes + 3

每个 cmd 中的参数是什么?

您需要阅读卡数据表的第 10 节,例如https://www.nxp.com/docs/en/data-sheet/NTAG213_215_216.pdf

基本上是写命令(数组的0xA2第一个字节),然后你需要给它块地址,在第一个命令中这是块4然后是块5(注意块4是第一个你可以写入的)然后是接下来的 4 个字节的数据(因为你一次只能写入一个 4 字节的块)。

所以基本上命令是

[Write Command, Block Address, Data1 Byte, Data2 Byte, Data3 Byte, Data4 Byte]

总的来说,该代码正在将一些文本以自定义格式编码到卡片中。 块 4 和 5 是自定义格式的 header 块,然后它将 4 字节的文本写入块 6 之后,所有这些都没有检查每次写入是否成功(除了记录响应)

更新:回答问题

let currentPage = 6;
            let currentPayload = [0xA2, currentPage, 0x6E];

            for(let i=0; i<text.length; i++){
                currentPayload.push(text.charCodeAt(i));
                if (currentPayload.length == 6){
                    resp = await cmd(currentPayload);
                    currentPage += 1;
                    currentPayload = [0xA2, currentPage];
                }
            }

此循环从 headers (page/block 6)

之后的下一个可用页面开始

如前所述,有效的收发命令长度为 6 个字节。

它定义了一个currentPayload作为3字节长的部分命令。
然后它在一个循环中迭代文本字符串,一次添加一个字符,直到收发命令达到 6 个字节长,然后发送它。之后它会增加页码并将基本部分命令重置为 2 个字节长。

payload.length == 6 是它如何检测写入命令具有它可以获取的所有数据(1 字节命令 + 1 字节地址 + 4 字节数据 = 6 字节长度)

这是一种拆分可变长度文本字符串以适应多个 6 字节写入命令(具有 4 字节数据)的方法。

进一步思考这可能看起来像是在尝试编写 NDEF 文本记录,但我需要更详细地检查 NDEF 规范以确认它。