Problème lecture et écriture tag NFC MifareUltralight
Bonjour, Je suis actuellement en stage pour ma dernière année d'étude. Pour ce stage je doit réaliser une application Android utilisant des tag NFC, plus précisément des NTAG216.
Ces tag sont protégés en lecture et en écriture par un mot de passe. Lorsqu'un tag est a porté, je doit lire son contenu puis ensuite réécrire par dessus. Voici actuellement mon code :
Activity
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| @Override
protected void onNewIntent(Intent intent){
String tagUID = "";
if(NfcAdapter.ACTION_TAG_DISCOVERED.equals(intent.getAction())&&connect&&rondeEnCours&&!scanEnCours){
scanEnCours=true;
mytag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
try {
TagTypeFound tagType = new TagTypeFound(mytag);//récupération du type de tag
int nombrePage=tagType.getNombrePage();//récupération du nombre de pages
EcritureLectureTag ecritureLectureTag=new EcritureLectureTag(mytag,nombrePage);
calendrier.miseAJourCalendrier();//mise à jour de l'heure
String dateEtHeure=client.getLogin()+"/"+calendrier.getJour()+"/"+calendrier.getMois()+"/"+calendrier.getAnnee()+"/"+calendrier.getHeure()+"/"+calendrier.getMin();
String allHistorique = ecritureLectureTag.read();//lecture du contenu du tag
ecritureLectureTag.writeHistorique(allHistorique,dateEtHeure);//enregistrement du nouvelle historique
tagUID = ByteArrayToHexString(intent.getByteArrayExtra(NfcAdapter.EXTRA_ID));//récupération de l'uid
} catch (Exception e) {
error(e.toString());
}
scanEnCours=false;
}
} |
Classe EcritureLectureTag
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76
| public class EcritureLectureTag {
Tag tag;
int nombrePage;
boolean flagEnCours = false;
public EcritureLectureTag(Tag mytag, int nbPage) {
tag = mytag;
nombrePage = nbPage;
}
public void write(String message) {
MifareUltralight mifare = MifareUltralight.get(tag);
int nombreCaractètre = message.length();
try {
mifare.connect();
//authentification
byte[] response = mifare.transceive(new byte[]{
(byte) 0x1B, // PWD_AUTH
0x10, 0x10, 0x10, 0x10
});
for (int i = 0; i <= (nombreCaractètre / 4) && i < nombrePage; i++) {
int end = (i + 1) * 4;
if (end > nombreCaractètre) {
end = nombreCaractètre;
}
String stringMessage = message.substring(i * 4, end);
while (stringMessage.length() < 4) {
stringMessage = stringMessage + " ";
}
byte[] byteMessage = stringMessage.getBytes(Charset.forName("US-ASCII"));
if (mifare.isConnected()) {
mifare.writePage(i + 4, byteMessage);
}
}
mifare.close();
} catch (IOException e) {
Log.i("WRITE", e.getMessage());
} catch (InterruptedException e) {
Log.i("WRITE", e.getMessage());
}
}
public String read() {
MifareUltralight mifare = MifareUltralight.get(tag);
String message = "";
try {
mifare.connect();
//authentification
byte[] response = mifare.transceive(new byte[]{
(byte) 0x1B, // PWD_AUTH
0x10, 0x10, 0x10, 0x10
});
for (int i = 1; i < (nombrePage / 4); i++) {
byte[] ligne = mifare.readPages(i * 4);
String nouvelleLigne = new String(ligne, Charset.forName("US-ASCII"));
message = message + nouvelleLigne;
}
mifare.close();
} catch (IOException e) {
e.printStackTrace();
}
return message;
}
public void writeHistorique(String allHistorique, String dateEtHeure) {
String[] mess = allHistorique.split(":");
String nouveauMessage = "";
int nombreHistoriqe = 0;
for (String historique : mess) {
nombreHistoriqe = nombreHistoriqe + 1;
nouveauMessage = nouveauMessage + ":" + historique;
}
nouveauMessage = dateEtHeure + nouveauMessage;
write(nouveauMessage);
}
} |
problème
Le code fonctionne dans le sens ou j'arrive à récupérer la valeur et à l'enregistrer. Cependant cella ne fonctionne qu'une foi sur 2, dans les cas ou cela ne fonctionne pas, lorsqu'un tag est détecté l'application va dans le try catch et j’obtiens l'erreur suivante : java.lang.illegalStateException : Close other technology first!. Quelqu'un saurait-il pourquoi j'obtiens cette erreur ou aurait une piste de résolution ?