NTAG216 — это метка NFC Forum Type 2. Следовательно, вы должны следовать форуму NFC Теговая операция типа 2. спецификация при записи данных в этот тип метки NFC.
Поэтому вам нужно будет следовать нескольким правилам, чтобы тег можно было обнаружить как тег NDEF (тег типа 2):
Во-первых, необходимо настроить контейнер возможностей (расположенный в блоке 3).
- Байт 0 должен быть установлен в «магическое» значение
0xE1
.
- Байт 1 должен быть установлен на
0x10
, чтобы указать версию отображения 1.0.
- Байт 2 должен быть установлен на
0x6D
, чтобы указать размер памяти NTAG216.
- Байт 3 может быть установлен на
0x00
, чтобы указать доступ для чтения/записи к данным NDEF, или на 0x0F
, чтобы указать доступ только для чтения (обратите внимание, что это разрешения на прикладном уровне).
Таким образом, вы можете написать контейнер возможностей как:
byte[] response = nfc.transceive(new byte[] {
(byte)0xA2, // WRITE
(byte)3, // block address
(byte)0xE1, (byte)0x10, (byte)0x6D, (byte)0x00
});
NTAG216 уже поставляется с правильно настроенным контейнером возможностей, поэтому нет необходимости делать это вручную. Также обратите внимание, что блок 3 программируется один раз, что означает, что биты могут быть установлены только на единицу, но не могут быть снова очищены до нуля. Поэтому, если вы уже перезаписали контейнер возможностей другим значением, этот тег, скорее всего, больше нельзя будет использовать в качестве тега NDEF.
Данные должны быть записаны в блоки данных, начиная с блока 4. Сообщения NDEF должны быть заключены в структуру сообщения NDEF TLV (значение длины тега). Тег для этого TLV — 0x03
. Длина может быть либо в однобайтовом формате (для сообщений NDEF длиной от 0 до 254 байтов), либо в трехбайтовом формате (для сообщений NDEF длиной 255 и более байтов). Данные этого блока TLV являются фактическим сообщением NDEF (которое вы можете получить от ndefMessage.toByteArray()
).
Например, для сообщения NDEF D1 01 0C 55 01 65 78 61 6D 70 6C 65 2E 63 6F 6D 2F
(которое представляет собой запись URI с URL-адресом "http://www.example.com/"), вы получите следующую структуру TLV:
03 11 D1010C55016578616D706C652E636F6D2F
Если у вас есть более длинное сообщение NDEF (например, с 259 байтами), вы должны использовать трехбайтовый формат длины:
03 FF0103 D101FF5501...
Далее следует пометить конец данных в теге с помощью Terminator TLV (тег 0xFE
, без полей длины и данных):
FE
Затем вы можете записать эти данные в тег как:
byte[] ndefMessage = new byte[] {
(byte)0xD1, (byte)0x01, (byte)0x0C, (byte)0x55, (byte)0x01, (byte)0x65, (byte)0x78, (byte)0x61, (byte)0x6D, (byte)0x70, (byte)0x6C, (byte)0x65, (byte)0x2E, (byte)0x63, (byte)0x6F, (byte)0x6D, (byte)0x2F
};
// wrap into TLV structure
byte[] tlvEncodedData = null;
if (ndefMessage.length < 255) {
tlvEncodedData = new byte[ndefMessage.length + 3];
tlvEncodedData[0] = (byte)0x03; // NDEF TLV tag
tlvEncodedData[1] = (byte)(ndefMessage.length & 0x0FF); // NDEF TLV length (1 byte)
System.arraycopy(ndefMessage, 0, tlvEncodedData, 2, ndefMessage.length);
tlvEncodedData[2 + ndefMessage.length] = (byte)0xFE; // Terminator TLV tag
} else {
tlvEncodedData = new byte[ndefMessage.length + 5];
tlvEncodedData[0] = (byte)0x03; // NDEF TLV tag
tlvEncodedData[1] = (byte)0xFF; // NDEF TLV length (3 byte, marker)
tlvEncodedData[2] = (byte)((ndefMessage.length >>> 8) & 0x0FF); // NDEF TLV length (3 byte, hi)
tlvEncodedData[3] = (byte)(ndefMessage.length & 0x0FF); // NDEF TLV length (3 byte, lo)
System.arraycopy(ndefMessage, 0, tlvEncodedData, 4, ndefMessage.length);
tlvEncodedData[4 + ndefMessage.length] = (byte)0xFE; // Terminator TLV tag
}
// fill up with zeros to block boundary:
tlvEncodedData = Arrays.copyOf(tlvEncodedData, (tlvEncodedData.length / 4 + 1) * 4);
for (int i = 0; i < tlvEncodedData.length; i += 4) {
byte[] command = new byte[] {
(byte)0xA2, // WRITE
(byte)((4 + i / 4) & 0x0FF), // block address
0, 0, 0, 0
};
System.arraycopy(tlvEncodedData, i, command, 2, 4);
byte[] response = nfc.transceive(command);
}
Наконец, имейте в виду, что вы не можете использовать тег в качестве тега NDEF, если у вас установлен пароль для чтения в области данных NDEF, поскольку спецификация NFC Forum Type 2 Tag Operation требует, чтобы тег был свободно читаемым.
person
Michael Roland
schedule
08.02.2017