mirror of
https://github.com/xfjx/TonUINO.git
synced 2025-08-23 15:33:19 +02:00
Support für Mifare Ultralight und NTAG hinzugefügt - Danke an @ASealion!
This commit is contained in:
116
Tonuino.ino
116
Tonuino.ino
@@ -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 ) ||
|
||||||
|
(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));
|
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,11 +971,15 @@ 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
|
||||||
|
if ((piccType == MFRC522::PICC_TYPE_MIFARE_MINI ) ||
|
||||||
|
(piccType == MFRC522::PICC_TYPE_MIFARE_1K ) ||
|
||||||
|
(piccType == MFRC522::PICC_TYPE_MIFARE_4K ) )
|
||||||
|
{
|
||||||
Serial.print(F("Reading data from block "));
|
Serial.print(F("Reading data from block "));
|
||||||
Serial.print(blockAddr);
|
Serial.print(blockAddr);
|
||||||
Serial.println(F(" ..."));
|
Serial.println(F(" ..."));
|
||||||
@@ -971,6 +989,45 @@ bool readCard(nfcTagObject * nfcTag) {
|
|||||||
Serial.print(F("MIFARE_Read() failed: "));
|
Serial.print(F("MIFARE_Read() failed: "));
|
||||||
Serial.println(mfrc522.GetStatusCodeName(status));
|
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
|
||||||
|
//authentificate with the card and set card specific parameters
|
||||||
|
if ((mifareType == MFRC522::PICC_TYPE_MIFARE_MINI ) ||
|
||||||
|
(mifareType == MFRC522::PICC_TYPE_MIFARE_1K ) ||
|
||||||
|
(mifareType == MFRC522::PICC_TYPE_MIFARE_4K ) )
|
||||||
|
{
|
||||||
Serial.println(F("Authenticating again using key B..."));
|
Serial.println(F("Authenticating again using key B..."));
|
||||||
status = (MFRC522::StatusCode)mfrc522.PCD_Authenticate(
|
status = mfrc522.PCD_Authenticate(
|
||||||
MFRC522::PICC_CMD_MF_AUTH_KEY_B, trailerBlock, &key, &(mfrc522.uid));
|
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();
|
||||||
|
|
||||||
|
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);
|
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.
|
||||||
*/
|
*/
|
||||||
|
Reference in New Issue
Block a user