1
0
mirror of https://github.com/xfjx/TonUINO.git synced 2025-08-23 05:32:59 +02:00

Support für Mifare Ultralight und NTAG hinzugefügt - Danke an @ASealion!

This commit is contained in:
Thorsten Voß
2019-01-26 20:56:10 +01:00
parent 062519d8a2
commit 250ec57a11

View File

@@ -932,7 +932,7 @@ void setupCard() {
writeCard(myCard); writeCard(myCard);
} }
bool readCard(nfcTagObject * nfcTag) { bool readCard(nfcTagObject *nfcTag) {
bool returnValue = true; bool returnValue = true;
// Show some details of the PICC (that is: the tag/card) // Show some details of the PICC (that is: the tag/card)
Serial.print(F("Card UID:")); Serial.print(F("Card UID:"));
@@ -946,9 +946,23 @@ bool readCard(nfcTagObject * nfcTag) {
byte size = sizeof(buffer); byte size = sizeof(buffer);
// Authenticate using key A // Authenticate using key A
Serial.println(F("Authenticating using key A...")); if ((piccType == MFRC522::PICC_TYPE_MIFARE_MINI ) ||
status = (MFRC522::StatusCode)mfrc522.PCD_Authenticate( (piccType == MFRC522::PICC_TYPE_MIFARE_1K ) ||
MFRC522::PICC_CMD_MF_AUTH_KEY_A, trailerBlock, &key, &(mfrc522.uid)); (piccType == MFRC522::PICC_TYPE_MIFARE_4K ) )
{
Serial.println(F("Authenticating Classic using key A..."));
status = mfrc522.PCD_Authenticate(
MFRC522::PICC_CMD_MF_AUTH_KEY_A, trailerBlock, &key, &(mfrc522.uid));
}
else if (piccType == MFRC522::PICC_TYPE_MIFARE_UL )
{
byte pACK[] = {0, 0}; //16 bit PassWord ACK returned by the NFCtag
// Authenticate using key A
Serial.println(F("Authenticating MIFARE UL..."));
status = mfrc522.PCD_NTAG216_AUTH(key.keyByte, pACK);
}
if (status != MFRC522::STATUS_OK) { if (status != MFRC522::STATUS_OK) {
returnValue = false; returnValue = false;
Serial.print(F("PCD_Authenticate() failed: ")); Serial.print(F("PCD_Authenticate() failed: "));
@@ -957,20 +971,63 @@ bool readCard(nfcTagObject * nfcTag) {
} }
// Show the whole sector as it currently is // Show the whole sector as it currently is
Serial.println(F("Current data in sector:")); // Serial.println(F("Current data in sector:"));
mfrc522.PICC_DumpMifareClassicSectorToSerial(&(mfrc522.uid), &key, sector); // mfrc522.PICC_DumpMifareClassicSectorToSerial(&(mfrc522.uid), &key, sector);
Serial.println(); // Serial.println();
// Read data from the block // Read data from the block
Serial.print(F("Reading data from block ")); if ((piccType == MFRC522::PICC_TYPE_MIFARE_MINI ) ||
Serial.print(blockAddr); (piccType == MFRC522::PICC_TYPE_MIFARE_1K ) ||
Serial.println(F(" ...")); (piccType == MFRC522::PICC_TYPE_MIFARE_4K ) )
status = (MFRC522::StatusCode)mfrc522.MIFARE_Read(blockAddr, buffer, &size); {
if (status != MFRC522::STATUS_OK) { Serial.print(F("Reading data from block "));
returnValue = false; Serial.print(blockAddr);
Serial.print(F("MIFARE_Read() failed: ")); Serial.println(F(" ..."));
Serial.println(mfrc522.GetStatusCodeName(status)); status = (MFRC522::StatusCode)mfrc522.MIFARE_Read(blockAddr, buffer, &size);
if (status != MFRC522::STATUS_OK) {
returnValue = false;
Serial.print(F("MIFARE_Read() failed: "));
Serial.println(mfrc522.GetStatusCodeName(status));
}
} }
else if (piccType == MFRC522::PICC_TYPE_MIFARE_UL )
{
byte buffer2[18];
byte size2 = sizeof(buffer2);
status = (MFRC522::StatusCode)mfrc522.MIFARE_Read(8, buffer2, &size2);
if (status != MFRC522::STATUS_OK) {
returnValue = false;
Serial.print(F("MIFARE_Read_1() failed: "));
Serial.println(mfrc522.GetStatusCodeName(status));
}
memcpy(buffer, buffer2, 4);
status = (MFRC522::StatusCode)mfrc522.MIFARE_Read(9, buffer2, &size2);
if (status != MFRC522::STATUS_OK) {
returnValue = false;
Serial.print(F("MIFARE_Read_2() failed: "));
Serial.println(mfrc522.GetStatusCodeName(status));
}
memcpy(buffer + 4, buffer2, 4);
status = (MFRC522::StatusCode)mfrc522.MIFARE_Read(10, buffer2, &size2);
if (status != MFRC522::STATUS_OK) {
returnValue = false;
Serial.print(F("MIFARE_Read_3() failed: "));
Serial.println(mfrc522.GetStatusCodeName(status));
}
memcpy(buffer + 8, buffer2, 4);
status = (MFRC522::StatusCode)mfrc522.MIFARE_Read(11, buffer2, &size2);
if (status != MFRC522::STATUS_OK) {
returnValue = false;
Serial.print(F("MIFARE_Read_4() failed: "));
Serial.println(mfrc522.GetStatusCodeName(status));
}
memcpy(buffer + 12, buffer2, 4);
}
Serial.print(F("Data in block ")); Serial.print(F("Data in block "));
Serial.print(blockAddr); Serial.print(blockAddr);
Serial.println(F(":")); Serial.println(F(":"));
@@ -991,7 +1048,6 @@ bool readCard(nfcTagObject * nfcTag) {
nfcTag->nfcFolderSettings.special = buffer[7]; nfcTag->nfcFolderSettings.special = buffer[7];
nfcTag->nfcFolderSettings.special2 = buffer[8]; nfcTag->nfcFolderSettings.special2 = buffer[8];
myFolder = &nfcTag->nfcFolderSettings;
return returnValue; return returnValue;
} }
@@ -1012,9 +1068,24 @@ void writeCard(nfcTagObject nfcTag) {
mifareType = mfrc522.PICC_GetType(mfrc522.uid.sak); mifareType = mfrc522.PICC_GetType(mfrc522.uid.sak);
// Authenticate using key B // Authenticate using key B
Serial.println(F("Authenticating again using key B...")); //authentificate with the card and set card specific parameters
status = (MFRC522::StatusCode)mfrc522.PCD_Authenticate( if ((mifareType == MFRC522::PICC_TYPE_MIFARE_MINI ) ||
MFRC522::PICC_CMD_MF_AUTH_KEY_B, trailerBlock, &key, &(mfrc522.uid)); (mifareType == MFRC522::PICC_TYPE_MIFARE_1K ) ||
(mifareType == MFRC522::PICC_TYPE_MIFARE_4K ) )
{
Serial.println(F("Authenticating again using key B..."));
status = mfrc522.PCD_Authenticate(
MFRC522::PICC_CMD_MF_AUTH_KEY_B, trailerBlock, &key, &(mfrc522.uid));
}
else if (mifareType == MFRC522::PICC_TYPE_MIFARE_UL )
{
byte pACK[] = {0, 0}; //16 bit PassWord ACK returned by the NFCtag
// Authenticate using key A
Serial.println(F("Authenticating UL..."));
status = mfrc522.PCD_NTAG216_AUTH(key.keyByte, pACK);
}
if (status != MFRC522::STATUS_OK) { if (status != MFRC522::STATUS_OK) {
Serial.print(F("PCD_Authenticate() failed: ")); Serial.print(F("PCD_Authenticate() failed: "));
Serial.println(mfrc522.GetStatusCodeName(status)); Serial.println(mfrc522.GetStatusCodeName(status));
@@ -1028,7 +1099,35 @@ void writeCard(nfcTagObject nfcTag) {
Serial.println(F(" ...")); Serial.println(F(" ..."));
dump_byte_array(buffer, 16); dump_byte_array(buffer, 16);
Serial.println(); Serial.println();
status = (MFRC522::StatusCode)mfrc522.MIFARE_Write(blockAddr, buffer, 16);
if ((mifareType == MFRC522::PICC_TYPE_MIFARE_MINI ) ||
(mifareType == MFRC522::PICC_TYPE_MIFARE_1K ) ||
(mifareType == MFRC522::PICC_TYPE_MIFARE_4K ) )
{
status = (MFRC522::StatusCode)mfrc522.MIFARE_Write(blockAddr, buffer, 16);
}
else if (mifareType == MFRC522::PICC_TYPE_MIFARE_UL )
{
byte buffer2[16];
byte size2 = sizeof(buffer2);
memset(buffer2, 0, size2);
memcpy(buffer2, buffer, 4);
status = (MFRC522::StatusCode)mfrc522.MIFARE_Write(8, buffer2, 16);
memset(buffer2, 0, size2);
memcpy(buffer2, buffer + 4, 4);
status = (MFRC522::StatusCode)mfrc522.MIFARE_Write(9, buffer2, 16);
memset(buffer2, 0, size2);
memcpy(buffer2, buffer + 8, 4);
status = (MFRC522::StatusCode)mfrc522.MIFARE_Write(10, buffer2, 16);
memset(buffer2, 0, size2);
memcpy(buffer2, buffer + 12, 4);
status = (MFRC522::StatusCode)mfrc522.MIFARE_Write(11, buffer2, 16);
}
if (status != MFRC522::STATUS_OK) { if (status != MFRC522::STATUS_OK) {
Serial.print(F("MIFARE_Write() failed: ")); Serial.print(F("MIFARE_Write() failed: "));
Serial.println(mfrc522.GetStatusCodeName(status)); Serial.println(mfrc522.GetStatusCodeName(status));
@@ -1041,6 +1140,7 @@ void writeCard(nfcTagObject nfcTag) {
} }
/** /**
Helper routine to dump a byte array as hex values to Serial. Helper routine to dump a byte array as hex values to Serial.
*/ */