2011-03-13 14 views
18

El nuevo 2.3.3 SDK incluye compatibilidad mejorada con NFC, y me gustaría escribir una aplicación que se base en esto. En última instancia, me gustaría poder leer datos de varias etiquetas que ingresan al campo simultáneamente, pero Android solo parece activarse en la primera que ingresa al campo; las siguientes se ignoran.Lectura de varias etiquetas NFC simultáneamente en Android

Después de leer las especificaciones NFC (ISO/IEC 14443-3) para las etiquetas que estoy usando (Mifare Classic), debería poder enviar un comando 'alto' a la etiqueta, lo que hará que se detenga respondiendo, y me permite leer la siguiente etiqueta en el campo. Android no admite el comando de detención directamente en ninguna de las subclases TagTechnology, así que traté de enviarlo directamente usando transceive(new byte[] {0x50, 0x00}). Esto arroja un IOException, con el mensaje 'transceptor fallido'.

Es cierto que estoy haciendo todo esto desde el hilo principal, lo cual entiendo es una mala idea, pero solo quiero probar el concepto lo más fácilmente posible.

¿Es posible comunicarse con varias etiquetas en el campo al mismo tiempo? ¿Qué estoy haciendo mal?

Respuesta

8

Lo que queremos no es desgraciadamente posible por el momento, a menos que haga un poco de hackery bastante avanzado, que casi nunca es una buena idea :)

Probablemente se podría detener la tarjeta si envía los bytes correctos en el transceive(), como intentas hacer ahora. Pero dado que el alto (o más bien, el HLTA que está tratando de enviar) es un comando ISO14443-3A, esto no funcionará a través de la interfaz MifareClassic, que usa un conducto "encriptado". La transmisión directa a través de la interfaz NfcA desafortunadamente tampoco funciona con la pila actual.

Incluso si pudieras detener la tarjeta, esto no provocará que el chip NFC en el teléfono reanude el sondeo de las nuevas etiquetas, ya que estás "revisando" la pila.

+0

¡Gracias por la respuesta definitiva! –

0

¿Ha tenido éxito enviando otros comandos usando transceive como leer bloque (0x30, 0x (bloque)) o autenticar comandos de sector? Solo estoy pensando en que querrás estar seguro de estar usando transceptor correctamente en primer lugar.

+0

Buen punto. No he intentado hacer nada más directamente con Transcieve; Voy a darle una oportunidad. –

+0

Llamar a 'readBlock()' (después de la autenticación) funciona bien; al igual que llamar a 'transceive()' con los mismos bytes que las salidas 'readblock()'. Sin embargo, intentar detener la tarjeta todavía produce la 'IOException'. –

1

Dependiendo de mi corta experiencia, no puede trabajar con varias etiquetas. Si hay dos etiquetas en el campo, no recibe una identificación de la etiqueta, es cero cero. Así que mi suposición es que, en este punto, solo puede acceder a una etiqueta y no más de una puede estar en el campo.

+0

El protocolo de RF admite la resolución de colisiones y la resolución de varias etiquetas, así que la pregunta es, ¿por qué recibo un error al intentar detener la etiqueta que ya estoy leyendo? –

+0

Simplemente porque el SDK no admite colisiones o múltiples transpondedores al mismo tiempo. No sé sobre el error, pero en este momento recibe un Intento cuando un transpondedor entra al campo, la intención es exactamente para una sola etiqueta. Según el protocolo de etiqueta, en este momento, no puede encontrar los UID de otras etiquetas porque el SDK es demasiado limitado. Una solución limpia implicará un SDK actualizado que admite más de una etiqueta. Por supuesto, podría imaginar algunos "hacks" o utilizar el NDK para superar la limitación actual. – Nolife

+0

Como parece que esto es lo más cerca que vamos a llegar a una respuesta, ¿puede actualizar su pregunta con la información adicional? –

Cuestiones relacionadas