通过 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" 的记录。您可以自由地以任何您想要的格式存储数据。

但是,在这种情况下,读取标签的应用程序必须相应地解释数据。如果这是您的应用程序,您可以轻松做到这一点。如果阅读应用程序是其他东西,您可能必须符合应用程序理解的定义。