通过NFC发送格式化的十六进制值

时间:2016-03-31 15:53:46

标签: android hex nfc message ndef

我尝试通过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();
  }

并使用调试器返回如下内容: 应该发送的字符串:

" 41542b5733322c340DFD020300"

有效载荷:

" en41542b5733322c340DFD020300"

消息发送:

NdefMessage [NdefRecord tnf=1 payload=02656E3431353432623537333333323263333430444644303230333030]

有没有办法像十六进制一样发送,而不再将其转换为十六进制?

第二个问题:是否可以在没有标题的情况下发送Ndef消息?只有有效载荷?

提前谢谢。

1 个答案:

答案 0 :(得分:1)

您正在使用tnf" TNF_EXTERNAL_TYPE"创建记录。 (NdefRecord definition)。此tnf是为文本,URI或SmartPoster的RTD定义的。二进制值不应该去那里。

如果要存储二进制值,请考虑使用带有tnf" TNF_UNKNOWN"的记录。在那里,您可以自由地以您想要的任何格式存储数据。

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