c++ - 无法检索添加到 1k Mifare Classic 标签的 390 个字符的文本记录
问题描述
我在1k Mifare Classic卡中添加了一条390字符长的文本记录,我可以成功写入,但读取时记录为空。我将 NDEF 库与 PN532 和 Ardunio uno 一起使用。
我的代码:
#include <Wire.h>
#include <PN532_I2C.h>
#include <PN532.h>
#include <NfcAdapter.h>
PN532_I2C pn532_i2c(Wire);
NfcAdapter nfc = NfcAdapter(pn532_i2c);
void setup()
{
Serial.begin(115200);
Serial.println("Serial Start");
nfc.begin();
Serial.println("NFC Start");
}
void loop()
{
if (nfc.tagPresent()) {
NfcTag tag = nfc.read();
tag.print();
}
if (nfc.tagPresent()) {
NdefMessage message = NdefMessage();
message.addTextRecord("denemedenemedenemedenemedenemedenemedenemedenemedenemedenemedenemedenemedenemedenemeden");
bool success = nfc.write(message);
if (success)
{
Serial.println("Write Success");
}
else
{
Serial.println("Error");
}
}
}
我使用此处显示的示例,但它不起作用。
解决方案
您在标签中添加文本“记录”的代码是正确的。然而,从标签读取消息有效负载不是。到达“记录”需要更多的时间。返回一个由消息对象组成的标签对象,该nfc.read()
对象可能包含多个记录,并且在每个记录中,它具有有效负载长度和有效负载(即您添加的文本节点),需要进行一些解析才能获取您的数据写进去。
请注意,数据存储的前缀表示用于编码记录的字符集,我添加了代码以丢弃前缀,记录存储在 中byte
,需要将其转换为char
之前Serial.print()
。
#include <Wire.h>
#include <PN532_I2C.h>
#include <PN532.h>
#include <NfcAdapter.h>
PN532_I2C pn532_i2c(Wire);
NfcAdapter nfc = NfcAdapter(pn532_i2c);
void setup()
{
Serial.begin(115200);
Serial.println("Serial Start");
nfc.begin();
Serial.println("NFC Start");
}
void loop()
{
// read from the tag for NDEF message payload
char tagMsg[100]={'\0'}; // make sure this is longer than your added text
if (nfc.tagPresent()) {
NfcTag tag = nfc.read();
if (tag.hasNdefMessage()) { // an empty tag won't have any message
NdefMessage message = tag.getNdefMessage();
NdefRecord record = message.getRecord(0); // only get the first records
int payloadLength = record.getPayloadLength();
uint8_t payload[payloadLength];
record.getPayload(payload);
// drop the first 3 bytes, which specify the language e.g. en=English
for (uint8_t s = 3, d=0; s < payloadLength; s++, d++) {
tagMsg[d] = (char)payload[s];
}
Serial.println(tagMsg); //this will be the text msg you added
}
}
// add a text message to the NDEF tag
if (nfc.tagPresent()) {
NdefMessage message = NdefMessage();
message.addTextRecord("denemedenemedenemedenemedenemedenemedenemedenemedenemedenemedenemedenemedenemedenemeden");
if (nfc.write(message))
{
Serial.println("Write Success");
}
else
{
Serial.println("Error");
}
}
}
推荐阅读
- r - 如何在依赖列上使用收集
- reactjs - 如何在 Jest 中测试 Tonejs 时修复“TypeError:无法读取 null 的属性‘createGain’”?
- mysql - 使用 Sequelize 的 Google App Engine 与 Cloud SQL 部署错误
- c# - 在使用实体框架创建 docker 应用期间访问 Sqlite 数据库
- python - 使日期更改功能化,而不是使用 pandas 数据手动更改代码中的日期
- angular - 如何在 Angular 中从节点模块导入单个脚本
- python - 使用所有包含的小部件隐藏和显示“QGridLayout”
- regex - 用于在 Sublime 中匹配具有多个固定边界的模式的正则表达式
- javascript - 对于诸如套接字通信之类的事情,utf-8 编码需要什么?
- javascript - 如何在此代码中获取目标元素的索引?