2016-04-30 5 views
1

J'écris une application pour lire les infos binaires de tags NFC. Voici le code de la fonction de gestionnaire intention NFC:Android NfcV obtenir la commande d'information retourne un seul octet

protected void onNewIntent(@NonNull Intent intent) 
{ 
    try 
    { 
     Tag tag  = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG); 
     NfcV nfcV = NfcV.get(tag); 
     byte[] cmdInfo = new byte[]{(byte) 0x02, (byte) 0x2b}; // 'Get info' command 
     byte[] answer = nfcV.transceive(cmdInfo); // Read info from tag. 

     ... 
    } 
    catch(IOException e) 
    { 
     ... 
    } 
} 

Si je lance cette fonction la lecture d'un tag NFC sur tout Samsung S3 Neo fonctionne très bien, la variable de réponse est remplie avec les données attendues:

 
00 04 4B A0 14 01 00 A0 07 E0 F3 07 

Howewer si je lance la même fonction lisant le même tag NFC sur un Huawei P8lite la variable de réponse est remplie d'un seul octet:

 
03 

en cas d'erreur, l'ISO 1569 La norme 3-3 dit que je devrais recevoir quelque chose comme

 
01 03 

I.e. au moins deux octets, où le deuxième octet est le code d'erreur. Donc, la réponse que je reçois est théoriquement impossible.

Qu'est-ce que je fais mal? Cela dépend-il du matériel mobile? Et comment puis-je le réparer?

Répondre

2

Puisque vous n'utilisez pas de commande adressée (adresse_flag non définie, pas de champ UID dans la requête). Vous ne devriez pas recevoir de réponse du tout si une commande facultative n'est pas supportée par l'étiquette (pas même un code d'erreur). Par conséquent, vous ne devez pas recevoir 03 ni 01 03 selon la norme.

Notez que les chipsets NFC sur les appareils Android ont souvent des limitations en ce qui concerne ISO/IEC 15693 et ​​ne supportent pas la norme complète. Par exemple, certains chipsets sont connus pour avoir des problèmes avec les commandes non-adressées. Vous pouvez travailler autour de ce en utilisant la version adressée de la commande:

Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG); 
NfcV nfcV = NfcV.get(tag); 
byte[] cmdInfo = new byte[]{ 
     (byte)0x20, 
     (byte)0x2B, 
     (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00 }; 
System.arraycopy(tag.getId(), 0, cmdInfo, 2, 8); 
byte[] answer = nfcV.transceive(cmdInfo); 

Vous pouvez également tester avec des réglages différents pour le Data_rate_flag depuis le chipset NFC sur votre appareil pourrait avoir des problèmes avec VICCs répondre avec à haut données taux.

+0

L'utilisation de la version adressée de la commande a résolu le problème. Merci beaucoup! – Carlo

+1

@CarloCe Avez-vous également essayé différents paramètres pour le Data_rate_flag? Il pourrait être intéressant pour les autres lecteurs SO de savoir si les deux options sont supportées sur la P8lite ... –

+2

Si j'utilise la commande adressée, elle accepte à la fois l'ensemble data_rate et l'ensemble – Carlo