static void prvRfidTask(void * parameters) { RfidMessage rfidMessage; MFRC522_PCD_Init(); for (;;) { // Look for new cards, and select one if present if (MFRC522_PICC_IsNewCardPresent() && MFRC522_PICC_ReadCardSerial()) { uint32_t i; rfidMessage.size = uid.size; for(i = 0; i < 10; i++) { rfidMessage.uidByte[i] = uid.uidByte[i]; } xQueueSendToBack(rfidEventQueue, &rfidMessage, 10); for (i = 0; i < uid.size; i++) { UARTprintf("%x", uid.uidByte[i]); } UARTprintf("\n"); MFRC522_PICC_HaltA(); } delay(50); } }
/* * Try using the PICC (the tag/card) with the given key to access block 0. * On success, it will show the key details, and dump the block data on Serial. * * @return true when the given key worked, false otherwise. */ bool try_key(MFRC522_MIFARE_Key *key) { bool result = false; uint8_t buffer[18]; uint8_t block = 0; MFRC522_StatusCode status; // http://arduino.stackexchange.com/a/14316 // if (!MFRC522_PICC_IsNewCardPresent()) { // return FALSE; // } // if (!MFRC522_PICC_ReadCardSerial()) { // return FALSE; // } CLS1_SendStr("Authenticating using key A...\r\n", CLS1_GetStdio()->stdOut); status = MFRC522_PCD_Authenticate(MFRC522_PICC_CMD_MF_AUTH_KEY_A, block, key, MFRC522_GetUid()); if (status != STATUS_OK) { CLS1_SendStr("PCD_Authenticate() failed: ", CLS1_GetStdio()->stdErr); CLS1_SendStr(MFRC522_GetStatusCodeName(status), CLS1_GetStdio()->stdErr); CLS1_SendStr("\r\n", CLS1_GetStdio()->stdErr); return false; } // Read block uint8_t byteCount = sizeof(buffer); status = MFRC522_MIFARE_Read(block, buffer, &byteCount); if (status != STATUS_OK) { CLS1_SendStr("MIFARE_Read() failed: ", CLS1_GetStdio()->stdErr); CLS1_SendStr(MFRC522_GetStatusCodeName(status), CLS1_GetStdio()->stdErr); } else { // Successful read result = true; CLS1_SendStr("Success with key:", CLS1_GetStdio()->stdOut); dump_byte_array((*key).keyByte, MF_KEY_SIZE, TRUE); CLS1_SendStr("\r\n", CLS1_GetStdio()->stdOut); // Dump block data CLS1_SendStr("Block ", CLS1_GetStdio()->stdOut); CLS1_SendNum8u(block, CLS1_GetStdio()->stdOut); CLS1_SendStr(":", CLS1_GetStdio()->stdOut); dump_byte_array(buffer, 16, TRUE); CLS1_SendStr("\r\n", CLS1_GetStdio()->stdOut); } CLS1_SendStr("\r\n", CLS1_GetStdio()->stdOut); MFRC522_PICC_HaltA(); // Halt PICC MFRC522_PCD_StopCrypto1(); // Stop encryption on PCD return result; }
static void RfidTask(void *pvParameters) { MFRC522_StatusCode status; uint8_t last_uidBytes[MFRC522_UID_MAX_NOF_BYTES]; int i; bool newCardDetected = FALSE; (void)pvParameters; /* not used */ init_uid_bytes(last_uidBytes); RFID_uid = NULL; vTaskDelay(pdMS_TO_TICKS(1000)); /* give hardware some time to power-up */ MFRC522_PCD_Init(); //MFRC522_SetAntennaGain(MFRC522_RxGain_max); for(;;) { newCardDetected = FALSE; RFID_GetLock(); if (RFID_DoSelfTest) { if (!MFRC522_PCD_PerformSelfTest()) { CLS1_SendStr("Selftest failed()!\r\n", CLS1_GetStdio()->stdErr); } } if (MFRC522_PICC_IsNewCardPresent()) { /* check if a card responds to PICC_CMD_REQA */ //CLS1_SendStr("Card detected...\r\n", CLS1_GetStdio()->stdOut); if (MFRC522_PICC_ReadCardSerial()) { //CLS1_SendStr("Read card serial...\r\n", CLS1_GetStdio()->stdOut); RFID_uid = MFRC522_GetUid(); newCardDetected = TRUE; if (RFID_dumpNewCardInformation) { MFRC522_PICC_DumpToSerial(RFID_uid); } else if (RFID_changeUID) { /* only works with Chinese cards which have the UID writeable! */ if (!MFRC522_MIFARE_SetUid(RFID_newUID4, sizeof(RFID_newUID4), TRUE)) { CLS1_SendStr("Setting new uid failed!\r\n", CLS1_GetStdio()->stdOut); } else { CLS1_SendStr("Set New ID to card!\r\n", CLS1_GetStdio()->stdOut); } } else if (RFID_authUID) { /* only for NTAG216! */ AuthNTag216(RFID_uid); } else if (RFID_WriteUltraLight) { WriteUltraLight(RFID_uid); } else if (RFID_WriteMifare) { WriteMifare(RFID_uid); } else if (RFID_TryKnownKeys) { TryKnownKeys(); } else if (!same_uid_bytes(last_uidBytes, &RFID_uid->uidByte[0], RFID_uid->size)) { CLS1_SendStr("\r\nCard UID:", CLS1_GetStdio()->stdOut); dump_byte_array(RFID_uid->uidByte, RFID_uid->size, TRUE); CLS1_SendStr("\r\n", CLS1_GetStdio()->stdOut); init_uid_bytes(last_uidBytes); set_uid_bytes(last_uidBytes, &RFID_uid->uidByte[0], RFID_uid->size); CLS1_SendStr("PICC type: ", CLS1_GetStdio()->stdOut); PICC_Type piccType = MFRC522_PICC_GetType(RFID_uid->sak); CLS1_SendStr(MFRC522_PICC_GetTypeName(piccType), CLS1_GetStdio()->stdOut); CLS1_SendStr("\r\n", CLS1_GetStdio()->stdOut); } else { /* same card again */ CLS1_SendStr(".", CLS1_GetStdio()->stdOut); } } MFRC522_PICC_HaltA(); /* Halt PICC */ MFRC522_PCD_StopCrypto1(); /* Stop encryption on PCD */ } /* new card present */ RFID_ReleaseLock(); if (!newCardDetected) { vTaskDelay(pdMS_TO_TICKS(500)); } else { vTaskDelay(pdMS_TO_TICKS(2000)); } } }