¿Cómo se lee y se escribe NFC desde tu propio código?
A través de la API de la plataforma sobre la que corre el código: el marco de trabajo NFC en Android, Core NFC en el iPhone, Web NFC en Chrome para Android y PC/SC para un lector conectado a un ordenador. Cada una decide qué puede enviar un programa a una etiqueta, cuándo puede escucharla y qué tiene que declarar antes.
Cuatro vías de entrada, cuatro juegos de reglas
En Android, el marco de trabajo NFC entrega una etiqueta descubierta a una actividad, que puede leer y escribir NDEF, enviar comandos en bruto a la etiqueta o responder a un lector mediante la emulación de tarjeta host.
En el iPhone, Core NFC permite a una aplicación leer dentro de una sesión que el sistema muestra y termina, el modelo que este sitio describe en la página de la hoja de lectura.
En un navegador, Web NFC lee y escribe NDEF desde una página web. Chrome lo documenta como disponible en Android a partir de Chrome 89, y lo limita a NDEF a propósito: sin comandos en bruto y sin emulación de tarjeta.
En un ordenador, a un lector USB se llega mediante PC/SC, la especificación que los ordenadores usan para hablar con lectores de tarjetas inteligentes, y el programa habla con la etiqueta a través del lector y no a través de un teléfono.
Difieren en lo que pueden enviar a una etiqueta, y difieren todavía más en cuándo se les permite escuchar. Esa segunda diferencia es la que un traslado de una plataforma a otra se equivoca.
Lo que el código tiene que declarar
Ninguna alcanza la radio sin anunciarse. Una aplicación Android pide android.permission.NFC, que la referencia de los permisos clasifica como normal, así que se concede al instalar y sin preguntar.
Desde Android 17, una aplicación que apunta a un SDK más reciente tiene que proteger además cada actividad que recibe etiquetas con android.permission.DISPATCH_NFC_MESSAGE, según la guía del marco de trabajo NFC, para que solo el servicio NFC pueda arrancarla.
Una aplicación de iPhone declara la capacidad de lectura de etiquetas y una descripción de uso antes de que Core NFC abra una sesión, y una sesión de etiqueta que lee etiquetas ISO 7816 enumera además los identificadores de aplicación que va a seleccionar. La página de las declaraciones cubre las tres.
Una página web necesita un origen seguro, un marco de primer nivel y un gesto de quien la visita, como tocar un botón, antes de que Chrome pida el permiso nfc.
Lo que el campo le hace al código
Una etiqueta está presente mientras una mano la sostenga quieta, y el código corre dentro de esa ventana. La referencia de TagTechnology marca cada intercambio como bloqueante y lo prohíbe en el hilo principal, y una etiqueta que se va a mitad de intercambio levanta TagLostException.
Las pruebas en una mesa esconden esto. El teléfono está plano, la etiqueta no se mueve y la ventana no se cierra nunca. El mismo código en la mano de quien visita se encuentra con una ventana que se cierra a la mitad, y un código que nunca ha visto ese caso lo trata como un fallo.
La etiqueta tampoco es lo que era hace un segundo. Android guarda lo que leyó al descubrirla y no actualiza nunca esos valores, así que un programa que escribe y luego se fía de la copia guardada lee su propia suposición.
Comprobar lo que el código ha escrito
Vuelve a leer el resultado con una herramienta que no sea el código que estás probando. Un fallo que escribe el tipo de registro equivocado puede volver a leerlo como el correcto, porque es el mismo fallo el que lo descodifica.
NFC Tools, publicada por la misma empresa que este sitio, muestra los registros que contiene una etiqueta y las tecnologías que declara, lo que zanja la mayoría de los desacuerdos entre un programa y quien lo escribió.
Después lee la etiqueta en la otra plataforma. Un mensaje que un analizador de Android acepta puede no hacer nada en un iPhone, una decisión de plataforma que cubre la página de los registros en iOS.
Todas las guías de esta sección
- Android
- iOS y Core NFC
- Web NFC y multiplataforma
- Por debajo de NDEF
- Emulación de tarjeta en código
- Lectores y dispositivos
- Pruebas y puesta a punto
Android
- ¿Modo lector o despacho en primer plano en una app Android?
- ¿Cómo se declaran las etiquetas que debe recibir una app Android?
- ¿Qué clase de tecnología debe abrir el código Android para una etiqueta?
- ¿Cómo se escribe un mensaje NDEF desde una app Android?
- ¿Puede una app Android reaccionar a una etiqueta sin enseñar pantalla?
- ¿Cómo se trata una etiqueta que llega con la actividad abierta?
- ¿Qué límites del controlador debe comprobar el código Android?
iOS y Core NFC
- ¿Sesión NDEF o sesión de etiqueta en una app iOS?
- ¿Qué tiene que declarar una app iOS antes de leer una etiqueta?
- ¿Cómo se escribe y se bloquea una etiqueta NDEF desde una app iOS?
- ¿Cómo recibe una app iOS una etiqueta leída en segundo plano?
- ¿Cómo se leen varias etiquetas en una sesión iOS?
- ¿Puede una app iOS leer el identificador de una etiqueta?
Web NFC y multiplataforma
Por debajo de NDEF
- ¿Cómo se envía un comando en bruto a una etiqueta?
- ¿Qué es una APDU, y cuándo la necesita tu código?
- ¿Cómo se lee la memoria de una etiqueta de tipo 2 página por página?
- ¿Cómo se leen los bloques de una etiqueta ISO/IEC 15693?
- ¿Cómo encuentra el código el archivo NDEF de una etiqueta de tipo 4?
- ¿Cómo se autentica el código ante una etiqueta con contraseña?
- ¿Cómo se detecta que una etiqueta ha salido del campo?
- ¿Cómo se escribe una etiqueta para que una escritura cortada no pase por válida?
- ¿Cómo se escriben las páginas de configuración sin estropear la etiqueta?
- ¿Cómo lee un servidor el identificador que una etiqueta refleja en su URL?
Emulación de tarjeta en código
- ¿Cómo emula una tarjeta una aplicación de Android con Host Card Emulation?
- ¿Por qué un lector llega a otra aplicación en vez de a la tuya?
- ¿Qué necesita una aplicación de iOS para emular una tarjeta?
- ¿Puede un teléfono emular una etiqueta NDEF para otro teléfono?
- ¿Funciona Host Card Emulation con la pantalla apagada?
Lectores y dispositivos
- ¿Cómo habla un ordenador con un lector NFC por USB?
- ¿Qué chip lector le conviene a un proyecto con microcontrolador?
- ¿Por qué un módulo lector de aficionado se deja etiquetas?
- ¿Qué es una etiqueta dinámica, y cuándo la necesita un aparato?
- ¿Puede un teléfono configurar un aparato que está apagado?
- ¿Cómo se diseña una antena NFC para tu propia placa?
- ¿Puede tu propio aparato hacer de etiqueta para un teléfono?
Pruebas y puesta a punto
- ¿Por qué una lectura falla con un error de etiqueta perdida?
- ¿Por qué una sesión de Core NFC termina sola?
- ¿Por qué expira un comando, y cuánto debe esperar el código?
- ¿Se puede probar código NFC sin una etiqueta en la mano?
- ¿Qué etiquetas conviene guardar para probar?
- ¿Cómo se ve lo que una app y una etiqueta intercambian de verdad?
- ¿Qué debe hacer una app cuando el NFC está apagado o no existe?
- ¿Por qué el código escrito para un chip se rompe en otro del mismo tipo?
- ¿Debe instalarse una app NFC en teléfonos sin NFC?
Preguntas frecuentes
¿A qué plataforma debería apuntar un primer proyecto NFC?
A Android, si el proyecto necesita hablar con la etiqueta misma. Su marco de trabajo alcanza NDEF, los comandos en bruto y la emulación de tarjeta, y una etiqueta puede arrancar una aplicación que no está abierta. iOS añade una sesión que controla el sistema y Web NFC se queda en NDEF, así que las dos son más fáciles de añadir una vez que el intercambio funciona.
¿Leer etiquetas exige pedir un permiso?
En Android no, donde el permiso NFC es normal y se concede al instalar. Web NFC lo pide a quien visita, y solo como respuesta a un gesto, por ejemplo tocar un botón.
¿Se puede probar código NFC sin un teléfono?
Analizar y construir mensajes NDEF sí. Todo lo que depende del campo, como los tiempos, una etiqueta que se va a mitad de escritura o un controlador que rechaza un comando, solo aparece con etiquetas reales en teléfonos reales.
¿De dónde salen los comandos propios de un chip?
De la hoja de datos de ese chip. Esta sección cubre los comandos que definen los tipos de etiqueta del NFC Forum, y deja el mapa de memoria de cada chip a las hojas de datos de wakdev.com.