Leer datos de la etiqueta NFC (IsoDep)
Soy novato en Android NFC API.
Actualmente, tengo una etiqueta NFC, estoy haciendo una aplicación de Android para leer los datos de ella. Mi sencilla aplicación se inicia cuando mi teléfono se acerca lo suficiente a la etiqueta NFC. Pero no tengo idea de cómo leer los datos dentro de la etiqueta NFC. La etiqueta utiliza la tecnología IsoDep .
- Modos de envío y recepción de DES para la autenticación DESFire
- "Nueva etiqueta recopilada" en lugar de leer etiquetas de aplicación - NFC android
- Preguntas y respuestas sobre el desarrollo móvil Android y Symbian NFC (FAQ)
- ¿Cómo encuesta de Android para dispositivos NFC
- Personaje extraño en la carga útil del registro NDEF de Android
Mi código actual:
@Override protected void onResume (){ super.onResume(); Intent intent = getIntent(); Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG); IsoDep isoDep = IsoDep.get(tag); // How to read data from IsoDep instance?
I googled en Internet, me doy cuenta de la gente está enviando comandos a IsoDep
para obtener la respuesta de NFC Tag, supongo que a partir de la respuesta, podemos analizar los datos en la etiqueta, vi a la gente haciendo esto:
//What is the 'command' ? How to define the command? //eg: byte command = (byte) 0x6A isoDep.transceive(command)
Pero, el comando es sólo un byte
, como un novato, es demasiado difícil de entender lo que está sucediendo. No tengo ni idea de cómo definir el comando para leer datos? ¿Alguien me puede explicar? O hay un documento que puedo aprender sobre el comando?
En general, necesito una guía sobre cómo definir comandos y cómo analizar los datos de la respuesta, me gustaría leer los datos almacenados en la etiqueta y mostrar los datos en formato de cadena en el elemento de interfaz de usuario (por ejemplo, TextView
).
*Y***
No tengo ningún problema con esas configuraciones (eg AnroidManifest.xml), por favor no me guíen en cómo configurar 🙂
- Android NFC: Excepción "transceive failed" al usar transceive ()
- Emparejamiento Bluetooth sin confirmación del usuario
- Phonegap NFC no funciona
- Emulación de etiquetas RFID en el emulador de Android
- Cómo probar api NFC?
- ¿Hay una manera de agarrar una etiqueta de NFC sin tener onPause / onResume el fuego?
- Posibilidad de lanzamiento de falsos NFC (Near Field Communication)
- Open NFC Simulator no funciona para el emulador de Android
IsoDep le permite comunicarse a través de una conexión ISO-14443-4 con la operación de transceive
. Sobre este protocolo se intercambian unidades de datos de aplicación (APDU). El formato se especifica, usted encuentra una descripción en Wikipedia.
Para exaple, para seleccionar una aplicación en una tarjeta inteligente con un identificador de aplicación particular (AID), ejecuta el siguiente comando APDU. El resultado indica simplemente ok (9000) o un error.
byte[] SELECT = { (byte) 0x00, // CLA Class (byte) 0xA4, // INS Instruction (byte) 0x04, // P1 Parameter 1 (byte) 0x00, // P2 Parameter 2 (byte) 0x0A, // Length 0x63,0x64,0x63,0x00,0x00,0x00,0x00,0x32,0x32,0x31 // AID }; Tag tagFromIntent = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG); IsoDep tag = IsoDep.get(tagFromIntent); tag.connect(); byte[] result = tag.transceive(SELECT); if (!(result[0] == (byte) 0x90 && result[1] == (byte) 0x00)) throw new IOException("could not select applet");
Una vez seleccionada la aplicación, puede ejecutar comandos específicos de la aplicación. Los programas se escriben típicamente en JavaCard que sigue la especificación de GlobalPlatorm. El ejemplo siguiente ejecuta en la aplicación seleccionada anteriormente el método 4 (0x04) que devuelve una matriz de bytes de como máximo 11 bytes. Este resultado se convierte en una cadena.
byte[] GET_STRING = { (byte) 0x80, // CLA Class 0x04, // INS Instruction 0x00, // P1 Parameter 1 0x00, // P2 Parameter 2 0x10 // LE maximal number of bytes expected in result }; result = tag.transceive(GET_STRING); int len = result.length; if (!(result[len-2]==(byte)0x90&&result[len-1]==(byte) 0x00)) throw new RuntimeException("could not retrieve msisdn"); byte[] data = new byte[len-2]; System.arraycopy(result, 0, data, 0, len-2); String str = new String(data).trim(); tag.close();
- ¿Por qué estoy recibiendo HttpResponse diferente de un navegador en android?
- La aplicación de Android A quiere realizar el seguimiento de los datos de referencia de Google Play para la instalación de la aplicación Android B