使用 react-native-nfc-manager 写入标签上的指定扇区
Write to specified sector on tag using react-native-nfc-manager
我正在使用 NTAG I2C plus 2k 内存标签并使用 react-native-nfc-manager 库与标签交互。
有没有办法指定您要写入的扇区?
我知道有一个API来指定要写入的页面偏移量,但是你如何指定页面偏移量所在的扇区?
(已更新以包含以下代码示例)
let tech = Platform.OS === 'ios' ? NfcTech.MifareIOS : NfcTech.NfcA;
await NfcManager.requestTechnology(tech, {
alertMessage: 'Hold your phone close to the NFC tag.',
});
let fullLength = data.length + 7;
let payloadLength = data.length + 3;
let cmd =
Platform.OS === 'ios'
? NfcManager.sendMifareCommandIOS
: NfcManager.transceive;
// select sector 2 prior to writing data
await cmd([0xc2, 0xff]);
await cmd([0x02, 0x00, 0x00, 0x00]);
await cmd([
0xa2,
MEMORY_MAPPING[`${chunkToWriteTo}`][1],
0x03,
fullLength,
0xd1,
0x01,
]);
await cmd([
0xa2,
MEMORY_MAPPING[`${chunkToWriteTo}`][2],
payloadLength,
0x54,
0x02,
0x65,
]);
let currentPage = MEMORY_MAPPING[`${chunkToWriteTo}`][0] + 2;
let currentPayload = [0xa2, currentPage, 0x6e];
for (let i = 0; i < data.length; i++) {
currentPayload.push(parseInt(data[i]));
if (currentPayload.length == 6) {
try {
await cmd(currentPayload);
} catch (error) {
console.log(error);
}
currentPage += 1;
currentPayload = [0xa2, currentPage];
}
}
提前致谢。
所以“NTAG I2C plus 2k”似乎是使用 NfcA 通信的 Certified Type 2 标签。
此标签对 select 扇区的 2 类标准有额外的命令,因为 2 类标签通常没有扇区。
因此,阅读数据表第 10.12 节,您将收发以下命令字节示例
C2h FFh
- Select 扇区
03h 00h 00h 00h
- 扇区 3
然后使用 A2h
命令字节
正常写入页面地址
react-native-nfc-manage offers an nfcAHandler
with a transceive 向 NFC 芯片发送和接收这些低级命令的方法。
更新:
对于 iOS 它将 Type 2 标签视为 Mifare Ultralight 的标签,因此 API 的 sendMifareCommandIOS
发送相同的命令。
(Android 和 iOS 都有 nfcAHandler
)
请注意,我没有尝试过这个,我只是使用普通的 Type 2 标签
我正在使用 NTAG I2C plus 2k 内存标签并使用 react-native-nfc-manager 库与标签交互。
有没有办法指定您要写入的扇区?
我知道有一个API来指定要写入的页面偏移量,但是你如何指定页面偏移量所在的扇区?
(已更新以包含以下代码示例)
let tech = Platform.OS === 'ios' ? NfcTech.MifareIOS : NfcTech.NfcA;
await NfcManager.requestTechnology(tech, {
alertMessage: 'Hold your phone close to the NFC tag.',
});
let fullLength = data.length + 7;
let payloadLength = data.length + 3;
let cmd =
Platform.OS === 'ios'
? NfcManager.sendMifareCommandIOS
: NfcManager.transceive;
// select sector 2 prior to writing data
await cmd([0xc2, 0xff]);
await cmd([0x02, 0x00, 0x00, 0x00]);
await cmd([
0xa2,
MEMORY_MAPPING[`${chunkToWriteTo}`][1],
0x03,
fullLength,
0xd1,
0x01,
]);
await cmd([
0xa2,
MEMORY_MAPPING[`${chunkToWriteTo}`][2],
payloadLength,
0x54,
0x02,
0x65,
]);
let currentPage = MEMORY_MAPPING[`${chunkToWriteTo}`][0] + 2;
let currentPayload = [0xa2, currentPage, 0x6e];
for (let i = 0; i < data.length; i++) {
currentPayload.push(parseInt(data[i]));
if (currentPayload.length == 6) {
try {
await cmd(currentPayload);
} catch (error) {
console.log(error);
}
currentPage += 1;
currentPayload = [0xa2, currentPage];
}
}
提前致谢。
所以“NTAG I2C plus 2k”似乎是使用 NfcA 通信的 Certified Type 2 标签。
此标签对 select 扇区的 2 类标准有额外的命令,因为 2 类标签通常没有扇区。
因此,阅读数据表第 10.12 节,您将收发以下命令字节示例
C2h FFh
- Select 扇区
03h 00h 00h 00h
- 扇区 3
然后使用 A2h
命令字节
react-native-nfc-manage offers an nfcAHandler
with a transceive 向 NFC 芯片发送和接收这些低级命令的方法。
更新:
对于 iOS 它将 Type 2 标签视为 Mifare Ultralight 的标签,因此 API 的 sendMifareCommandIOS
发送相同的命令。
(Android 和 iOS 都有 nfcAHandler
)
请注意,我没有尝试过这个,我只是使用普通的 Type 2 标签