Comandos NFC en bruto: APDU, lecturas de página y qué envía la Consola de Comandos

Los comandos NFC en bruto son bytes que envías directamente al chip. Así funcionan READ, WRITE y las APDU de ISO 7816-4, y qué envía la Consola de Comandos.

Published

Un comando NFC en bruto es una cadena corta de bytes que envías directamente al chip, sin nada que la descodifique por el camino. En lugar de pedirle a la etiqueta "la URL" o "la tarjeta de contacto", pides bytes concretos de direcciones concretas y lees exactamente lo que devuelve el silicio. En realidad hay dos lenguajes de bytes en juego: los comandos cortos de página que entienden las etiquetas Type 2 y las APDU más largas de ISO 7816-4 que esperan las tarjetas inteligentes. Saber cuál habla una etiqueta es casi toda la batalla.

Qué es realmente un comando en bruto

La mayoría de las apps NFC te entregan un resultado ya descodificado. Mantienen la conversación de bajo nivel, interpretan los registros NDEF y te muestran un enlace o un texto ordenado. El modo en bruto elimina esa capa de traducción. Tú escribes los bytes del comando, el lector añade la comprobación de errores y los tiempos, y la etiqueta responde en bytes. Nada se interpreta por ti, que es justo lo que quieres cuando necesitas ver los bytes de bloqueo, un contenedor de capacidades o un contador que la vista amable oculta.

El conjunto de comandos Type 2 — READ, FAST_READ, WRITE

Las etiquetas de consumo como NTAG213, NTAG215 y NTAG216 son chips NFC Forum Type 2, y su memoria se organiza en páginas de exactamente cuatro bytes cada una, según la hoja de datos NTAG de NXP. Los comandos son cortos:

READ       0x30 <página>            -> 16 bytes (cuatro páginas)
FAST_READ  0x3A <inicio> <fin>      -> todas las páginas de ese rango
WRITE      0xA2 <página> <4 bytes>  -> escribe una página
GET_VERSION 0x60                    -> bytes de producto/versión del chip

El detalle que confunde: READ 0x30 siempre devuelve dieciséis bytes —cuatro páginas consecutivas— aunque solo te interesara una. FAST_READ 0x3A es la forma eficiente de sacar un volcado de memoria completo en un solo intercambio, porque le das una página de inicio y otra de fin y transmite todo lo que hay entre ellas. WRITE 0xA2 es lo contrario: toca exactamente una página de cuatro bytes, así que cambiar un registro más grande implica varias escrituras seguidas.

APDU — el formato ISO 7816-4

Las tarjetas inteligentes y las etiquetas más capaces hablan un formato distinto y más largo llamado APDU. Una APDU de comando empieza con una cabecera de cuatro bytes —CLA, INS, P1, P2— y luego lleva opcionalmente Lc (cuántos bytes de datos siguen), los datos en sí y Le (cuántos bytes esperas de vuelta), tal como describe la referencia de APDU de ISO 7816-4. La respuesta es un campo de datos opcional seguido de un terminador obligatorio de dos bytes, SW1 y SW2. Cuando ves 90 00 al final de una respuesta, ese es el estado convencional de "comando correcto".

Aquí también es donde diverge la familia MIFARE. MIFARE Classic usa bloques de dieciséis bytes y exige un paso de autenticación antes de leer o escribir, y algunos chips usan una secuencia COMP_WRITE en dos partes en vez de la simple escritura de página de un solo paso. La misma idea, más ceremonia.

Dónde lo verás — iOS frente a Android

En Android, el acceso en bruto es directo: abres la clase de tecnología de la etiqueta y llamas a transceive con tu arreglo de bytes. NfcA, IsoDep, NfcV y el ayudante MifareUltralight exponen esto, como muestra la referencia de NfcA de Android. En iOS, Core NFC también admite comandos en bruto, mediante tipos como NFCMiFareTag y NFCISO7816Tag, pero la pila de lector/escritor es más estrecha que la de Android, así que algunas operaciones de bajo nivel simplemente no están disponibles.

Consejos, trampas y un cómo rápido con NFCore

Algunas cosas ahorran tiempo. Los comandos Type 2 direccionan páginas, no bytes, así que multiplica por cuatro para encontrar un desplazamiento. El lector añade el CRC y gestiona los tiempos, de modo que solo envías los bytes del comando mostrados arriba. Las páginas protegidas con contraseña responden a las lecturas con bytes a cero en vez de un error, lo que puede parecer una etiqueta vacía cuando en realidad solo está bloqueada.

En NFCore, la Consola de Comandos te deja escribir estos bytes directamente y ver la respuesta en bruto, hex y ASCII en paralelo —útil para confirmar que una escritura se aplicó o para comprobar qué páginas están protegidas antes de cambiar nada. Limítate a etiquetas que te pertenezcan: tus propias pegatinas, tarjetas de visita y disparadores para el hogar inteligente. Pruébalo desde la App Store o Google Play.

Preguntas frecuentes

¿Cuál es la diferencia entre una lectura de página y una APDU? Una lectura de página es un comando Type 2 diminuto (como 0x30) que devuelve páginas fijas de cuatro bytes. Una APDU es el formato más largo de ISO 7816-4 con cabecera CLA/INS/P1/P2 que usan las tarjetas inteligentes y las etiquetas más ricas.

¿Por qué mi READ devuelve 16 bytes si pedí una sola página? Es por diseño. READ 0x30 siempre responde con cuatro páginas consecutivas —dieciséis bytes— empezando por la página que nombraste.

¿Puedo enviar comandos en bruto en un iPhone? Sí, mediante Core NFC, pero el conjunto de comandos admitido es más estrecho que el de Android, así que algunas operaciones son exclusivas de Android.

¿Qué significa 90 00? Es el terminador de estado SW1 SW2 que convencionalmente significa que el comando se completó correctamente.


¿Listo para Comenzar?

Descarga NFCore y comienza a gestionar tus etiquetas NFC como un profesional.