¿Cómo se ve lo que una app y una etiqueta intercambian de verdad?
Anótalo tú: cada comando enviado, cada respuesta recibida, con una marca de tiempo, a los dos lados de la interfaz que envuelve las llamadas de radio. Android guarda además un registro de su propio tráfico con el controlador, filtrado por defecto. iOS no ofrece nada equivalente, solo errores.
El registro que escribes tú
El registro que existe siempre es el que produce tu código. Cada comando en bytes, cada respuesta en bytes, la excepción cuando la hay, y una marca de tiempo en cada uno: con eso basta para reproducir un intercambio, contar las idas y vueltas y ver dónde se perdió una etiqueta.
Va en el mismo sitio que recomienda la página de las pruebas, alrededor de las llamadas que tocan la radio, lo que significa que cuesta un sitio en el código y no una línea por cada llamada. Guarda los bytes en hexadecimal y guárdalos enteros: un registro truncado de un intercambio que falla no responde a nada.
El registro que guarda Android
La plataforma guarda el suyo. El registro NCI de Android, en la pila NFC de código abierto, guarda los paquetes intercambiados con el controlador en una memoria intermedia circular de 256 KB, en los dos sentidos, cada uno con su marca de tiempo, y el servicio lo vuelca cuando se le pide.
Dos propiedades deciden qué hay dentro. El modo, persist.nfc.snoop_log_mode, está filtrado salvo que se ponga en completo, y una compilación depurable escribe además la memoria a un archivo bajo /data/misc/nfc/logs. En un teléfono de tienda corriente, lo que se obtiene es por tanto una vista filtrada; en una compilación de desarrollo se ven las tramas.
Esto es el tráfico del controlador, no las llamadas de tu app. Responde a otra pregunta, y a la útil: si el comando que tu código cree haber enviado es el comando que ha salido.
Lo que te da iOS
Core NFC informa de errores, no de tramas. La lista es lo bastante precisa para diagnosticar con ella, una conexión perdida, demasiados reintentos, una etiqueta que ha respondido con un error, un paquete más largo de lo que la etiqueta acepta, una sesión invalidada por debajo de la llamada, y la página de la invalidación cubre el lado de la sesión.
Así que en iOS el registro que escribes tú es todo lo que hay, lo que es un argumento para escribirlo antes de necesitarlo.
Leer lo que vuelve
Sabe qué pone cada protocolo en una respuesta. Una APDU termina con dos bytes de estado, y 90 00 es el único que significa completado, cosa que la página de las APDU tabula. Una respuesta ISO 15693 abre con un byte de marcas cuyo bit más bajo significa error, seguido de un código, como describe la página de la 15693.
Y lee las marcas de tiempo, no solo los bytes. Un hueco de decenas de milisegundos entre un comando y el siguiente es tu propio código pensando, y es la parte de un toque lento que sí puedes arreglar.
Preguntas frecuentes
¿Necesito un analizador de radio para ver el intercambio?
Para casi todos los fallos no. Un registro de los comandos y las respuestas que tu código envía y recibe los responde, y funciona en las dos plataformas.
¿Qué contiene el registro de Android?
Los paquetes intercambiados con el controlador, en una memoria circular, con marca de tiempo en los dos sentidos, filtrados salvo que la propiedad del modo esté en completo.
¿Hay un equivalente en iOS?
No. Core NFC da errores en vez de tramas, así que el registro en iOS es el que escribe la app.
¿Qué debe anotar el registro?
Los bytes enviados, los bytes recibidos, la excepción si la hay, y una marca de tiempo en cada línea, enteros en vez de truncados.