¿Cómo se lee la memoria de una etiqueta de tipo 2 página por página?
Con el comando READ, 0x30 seguido de un número de página, que devuelve dieciséis bytes: cuatro páginas de cuatro bytes cada una. Las páginas 0 a 2 contienen el identificador y los bits de bloqueo estáticos, la página 3 el contenedor de capacidad, y el contenido empieza en la página 4.
READ devuelve cuatro páginas
La memoria de tipo 2 se cuenta en páginas de cuatro bytes. READ, comando 0x30 seguido del número de la primera página, devuelve dieciséis bytes, esa página y las tres siguientes. WRITE, 0xA2 seguido de un número de página y cuatro bytes, escribe una sola página. Los dos valores están en las definiciones del código abierto de la pila NFC de Android; el texto normativo es la especificación de la etiqueta de tipo 2 del NFC Forum, que el Forum vende.
En Android, MifareUltralight.readPages() envía el READ y writePage() el WRITE. La clase es opcional, y un teléfono que no la tiene sigue enumerando NfcA para la misma etiqueta, cuyo transceive() envía el mismo comando. En iOS, una etiqueta de la familia Ultralight llega como NFCMiFareTag, y el comando pasa por sendMiFareCommand, con el CRC que pide la referencia de Apple.
Las últimas páginas piden cuidado. Según la referencia de MifareUltralight, un READ que se pasa de la última página legible devuelve páginas dadas la vuelta hasta la primera: en una MIFARE Ultralight original, leer desde la página 0x0E devuelve las páginas 0x0E, 0x0F, 0x00 y 0x01. Un código que lee el final de la memoria se queda solo con las páginas que pidió.
Las cuatro primeras páginas
Los primeros dieciséis bytes describen la etiqueta. Las páginas 0 a 2 contienen el identificador y bytes internos, y los dos últimos bytes de la página 2 son los bits de bloqueo estáticos, cuyos bits dejan páginas en solo lectura para siempre. La página 3 es el contenedor de capacidad, descrito en general en la página del contenedor de capacidad:
| Byte | Contiene | Valores en la pila de Android |
|---|---|---|
| 0 | Número mágico del NDEF | 0xE1 |
| 1 | Versión de la correspondencia | 0x10, 0x11 o 0x12 |
| 2 | Tamaño del área de datos, dividido entre 8 | 0x12 anuncia 144 bytes |
| 3 | Acceso al área de datos | 0x00 lectura y escritura, 0x0F solo lectura |
Una etiqueta cuyo byte 0 sea otra cosa que 0xE1 no está formateada para NDEF. El byte 3 importa tanto como los bits de bloqueo: la pila de Android se niega a escribir NDEF cuando no concede acceso de escritura, digan lo que digan los bits de bloqueo.
Encontrar el mensaje NDEF
Desde la página 4, el área de datos contiene una sucesión de bloques TLV: un byte de tipo, una longitud, y después el valor. Los tipos son pocos:
| Tipo | Bloque |
|---|---|
0x00 | NULL, relleno que los lectores se saltan |
0x01 | Lock Control, que describe los bytes de bloqueo |
0x02 | Memory Control, que marca áreas reservadas |
0x03 | El mensaje NDEF |
0xFD | Información propietaria |
0xFE | Terminator, el último bloque del área de datos |
La longitud ocupa un byte hasta 254, y tres bytes desde 255: 0xFF, y después la longitud en dos bytes. El código recorre los bloques desde la página 4, se salta los que no necesita, y lee el mensaje donde dice el bloque 0x03. No da por supuesto que el mensaje empieza en la página 4, ya que un bloque Lock Control o Memory Control puede ir antes.
El byte 2 del contenedor de capacidad acota el recorrido. Más allá de 64 bytes, el tamaño que la pila de Android trata como la disposición estática, una etiqueta tiene además bits de bloqueo dinámicos, y un bloque Lock Control, cuando lo hay, dice dónde están.
Donde toma el relevo el chip
Lo que sigue al área de datos pertenece al chip: bits de bloqueo dinámicos, configuración, contadores, la contraseña. Un NTAG213 tiene 45 páginas, sus bits de bloqueo dinámicos en la página 40 y su configuración en las páginas 41 a 44, según su ficha en wakdev.com; un NTAG215 tiene 135 páginas y guarda los mismos ajustes en las páginas 130 a 134. El código lee estas páginas en la ficha del chip que tiene delante, nunca en un número de página que funcionó en otro.
Leer puede cambiar algo por sí mismo. Un chip con contador de lecturas lo incrementa en la primera lectura tras entrar la etiqueta en el campo, como describe la ficha del NTAG213, y un chip cuya contraseña protege la lectura rechaza READ en las páginas protegidas hasta que el código se autentica, como explica la página de la autenticación.
Preguntas frecuentes
¿Puedo leer una etiqueta de tipo 2 sin la clase MifareUltralight?
Sí. Toda etiqueta así declara además NfcA, cuyo método transceive envía el mismo comando READ, 0x30 seguido del número de página.
¿Por qué los últimos bytes que leo repiten las primeras páginas?
El READ se pasó de la última página legible, y la referencia dice que las páginas se dan la vuelta hasta la primera. Quédate solo con las páginas que pediste.
¿Dónde empieza el mensaje NDEF?
Donde diga el bloque TLV de tipo 0x03, que no está forzosamente al principio del área de datos: un bloque Lock Control o Memory Control puede ir antes.
¿Los números de página valen para todos los chips?
Solo hasta el final del área de datos. La configuración, los contadores y la contraseña están en páginas propias de cada referencia, que da la ficha del chip.