通过 NFC 发送格式化的十六进制值
Send formatted hex values through NFC
我尝试通过 NFC
发送特定字符串。这个应用程序的关键是字符串应该被 TAG 作为 hex
值接收,而不是 ASCII
。所以,这就是问题所在。 NdefMessage()
将字符串格式化为十六进制,即使它已经是十六进制。
代码如下:
byte[] lang = new byte[0];
try {
lang = Locale.getDefault().getLanguage().getBytes("UTF-8");
} catch (UnsupportedEncodingException e1) {
e1.printStackTrace();
}
byte[] text = new byte[0]; // Content in UTF-8
try {
text = sendDdata.getBytes("UTF-8");
} catch (UnsupportedEncodingException e1) {
e1.printStackTrace();
}
int langSize = lang.length;
int textLength = text.length;
ByteArrayOutputStream payload = new ByteArrayOutputStream(1 + langSize + textLength);
payload.write((byte) (langSize & 0x1F));
payload.write(lang, 0, langSize);
payload.write(text,0,textLength);
byte[] message1 = payload.toByteArray();
NdefMessage record = null;
record = new NdefMessage(new NdefRecord(NdefRecord.TNF_WELL_KNOWN, new byte[0], new byte[0], message1));
if (tag != null) {
try {
Ndef ndefTag = Ndef.get(tag);
if (ndefTag == null) {
NdefFormatable nForm = NdefFormatable.get(tag);
if (nForm != null) {
nForm.connect();
nForm.format(record);
nForm.close();
Toast.makeText(MainActivity.this,"format",Toast.LENGTH_SHORT).show();
}
}
else {
ndefTag.connect();
ndefTag.writeNdefMessage(record);
ndefTag.close();
Toast.makeText(MainActivity.this,String.valueOf(record),Toast.LENGTH_SHORT).show();
}
}
catch(Exception e) {
e.printStackTrace();
Toast.makeText(this,"Please attach to Tag!",Toast.LENGTH_SHORT).show();
}
并且使用调试器 returns 类似于:
应发送的字符串:
"41542b5733322c340DFD020300"
有效负载:
"en41542b5733322c340DFD020300"
消息已发送:
NdefMessage [NdefRecord tnf=1 payload=02656E3431353432623537333333323263333430444644303230333030]
有没有什么方法可以像十六进制一样发送,而无需再次将其转换为十六进制?
第二个问题:没有 header 是否可以发送 Ndef 消息?只有有效载荷?
提前谢谢你。
您正在使用 tnf "TNF_EXTERNAL_TYPE" (NdefRecord definition) 创建记录。此 tnf 是为文本、URI 或 SmartPoster 的 RTD 定义的。二进制值不应该放在那里。
如果要存储二进制值,请考虑使用带有 tnf "TNF_UNKNOWN" 的记录。您可以自由地以任何您想要的格式存储数据。
但是,在这种情况下,读取标签的应用程序必须相应地解释数据。如果这是您的应用程序,您可以轻松做到这一点。如果阅读应用程序是其他东西,您可能必须符合应用程序理解的定义。
我尝试通过 NFC
发送特定字符串。这个应用程序的关键是字符串应该被 TAG 作为 hex
值接收,而不是 ASCII
。所以,这就是问题所在。 NdefMessage()
将字符串格式化为十六进制,即使它已经是十六进制。
代码如下:
byte[] lang = new byte[0];
try {
lang = Locale.getDefault().getLanguage().getBytes("UTF-8");
} catch (UnsupportedEncodingException e1) {
e1.printStackTrace();
}
byte[] text = new byte[0]; // Content in UTF-8
try {
text = sendDdata.getBytes("UTF-8");
} catch (UnsupportedEncodingException e1) {
e1.printStackTrace();
}
int langSize = lang.length;
int textLength = text.length;
ByteArrayOutputStream payload = new ByteArrayOutputStream(1 + langSize + textLength);
payload.write((byte) (langSize & 0x1F));
payload.write(lang, 0, langSize);
payload.write(text,0,textLength);
byte[] message1 = payload.toByteArray();
NdefMessage record = null;
record = new NdefMessage(new NdefRecord(NdefRecord.TNF_WELL_KNOWN, new byte[0], new byte[0], message1));
if (tag != null) {
try {
Ndef ndefTag = Ndef.get(tag);
if (ndefTag == null) {
NdefFormatable nForm = NdefFormatable.get(tag);
if (nForm != null) {
nForm.connect();
nForm.format(record);
nForm.close();
Toast.makeText(MainActivity.this,"format",Toast.LENGTH_SHORT).show();
}
}
else {
ndefTag.connect();
ndefTag.writeNdefMessage(record);
ndefTag.close();
Toast.makeText(MainActivity.this,String.valueOf(record),Toast.LENGTH_SHORT).show();
}
}
catch(Exception e) {
e.printStackTrace();
Toast.makeText(this,"Please attach to Tag!",Toast.LENGTH_SHORT).show();
}
并且使用调试器 returns 类似于: 应发送的字符串:
"41542b5733322c340DFD020300"
有效负载:
"en41542b5733322c340DFD020300"
消息已发送:
NdefMessage [NdefRecord tnf=1 payload=02656E3431353432623537333333323263333430444644303230333030]
有没有什么方法可以像十六进制一样发送,而无需再次将其转换为十六进制?
第二个问题:没有 header 是否可以发送 Ndef 消息?只有有效载荷?
提前谢谢你。
您正在使用 tnf "TNF_EXTERNAL_TYPE" (NdefRecord definition) 创建记录。此 tnf 是为文本、URI 或 SmartPoster 的 RTD 定义的。二进制值不应该放在那里。
如果要存储二进制值,请考虑使用带有 tnf "TNF_UNKNOWN" 的记录。您可以自由地以任何您想要的格式存储数据。
但是,在这种情况下,读取标签的应用程序必须相应地解释数据。如果这是您的应用程序,您可以轻松做到这一点。如果阅读应用程序是其他东西,您可能必须符合应用程序理解的定义。