2016-04-30 6 views
1

Ich schreibe eine App zum Lesen von binären Infos von NFC-Tags. Hier ist der Code der NFC Absicht Handler-Funktion:Android NfcV erhalten Informationen Befehl gibt nur ein Byte

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) 
    { 
     ... 
    } 
} 

Wenn ich diese Funktion Lesen eines NFC-Tag auf einem Samsung S3 Neo alles laufen funktioniert gut, die Antwort Variable wird mit dem erwarteten Daten gefüllt:

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

Howewer wenn ich laufe die gleiche Funktion den gleichen NFC-Tag auf einem Huawei P8lite liest die Antwort Variable mit nur einem Byte gefüllt ist:

 
03 

Im Fall eines Fehlers, die ISO 1569 3-3 Standard sagt, dass ich etwas wie

empfangen sollte
 
01 03 

I.e. mindestens zwei Bytes, wobei das zweite Byte der Fehlercode ist. Die Antwort, die ich eigentlich bekomme, ist theoretisch nicht möglich.

Was mache ich falsch? Kommt es auf die mobile Hardware an? Und wie kann ich es reparieren?

Antwort

2

Da Sie keinen adressierten Befehl verwenden (Address_flag nicht gesetzt, kein UID-Feld in der Anfrage). Sie sollten keine Resonanzen erhalten, wenn ein optionaler Befehl vom Tag nicht unterstützt wird (nicht einmal ein Fehlercode). Daher sollten Sie weder 03 noch 01 03 gemäß der Norm erhalten.

Beachten Sie, dass NFC-Chipsätze in Android-Geräten häufig Einschränkungen in Bezug auf ISO/IEC 15693 aufweisen und den vollständigen Standard nicht unterstützen. Zum Beispiel ist bekannt, dass einige Chipsätze Probleme mit nicht adressierten Befehlen haben. Sie kann mit der adressierten Version des Befehls um die Arbeit:

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); 

Sie können auch mit verschiedenen Einstellungen für die Data_rate_flag testen wollen, da die NFC-Chipsatz auf Ihrem Gerät Probleme mit VICCs reagiert mit bei hohen Daten haben könnten Bewertung.

+0

Die angesprochene Version des Befehls löste das Problem. Vielen Dank! – Carlo

+1

@CarloCe Haben Sie auch verschiedene Einstellungen für die Data_rate_flag versucht? Es könnte für andere SO-Leser interessant sein zu wissen, ob beide Optionen auf dem P8lite unterstützt werden ... –

+2

Wenn ich adressierten Befehl verwende, akzeptiert er sowohl data_rate gesetzt als auch unset – Carlo