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 规范以确认它。
我有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 规范以确认它。