Milan Jovanovic
/
readMifareORG
Test example
Fork of readMifare by
main.cpp@2:96f420fa4a6e, 2014-11-03 (annotated)
- Committer:
- shong2010
- Date:
- Mon Nov 03 05:48:29 2014 +0000
- Revision:
- 2:96f420fa4a6e
- Parent:
- 1:fb72a2f7cab5
- Child:
- 3:08251c301e26
RFID Prototype
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
nebgnahz | 1:fb72a2f7cab5 | 1 | /**************************************************************************/ |
nebgnahz | 1:fb72a2f7cab5 | 2 | /*! |
nebgnahz | 0:54bf4b21c7fa | 3 | |
nebgnahz | 1:fb72a2f7cab5 | 4 | @file main.cpp |
nebgnahz | 1:fb72a2f7cab5 | 5 | @author Adafruit Industries |
nebgnahz | 1:fb72a2f7cab5 | 6 | @modified_by Ben Zhang <benzh@eecs.berkeley.edu> |
nebgnahz | 1:fb72a2f7cab5 | 7 | @license BSD (see license.txt) |
nebgnahz | 1:fb72a2f7cab5 | 8 | |
nebgnahz | 0:54bf4b21c7fa | 9 | This example will wait for any ISO14443A card or tag, and |
nebgnahz | 0:54bf4b21c7fa | 10 | depending on the size of the UID will attempt to read from it. |
nebgnahz | 0:54bf4b21c7fa | 11 | |
nebgnahz | 0:54bf4b21c7fa | 12 | If the card has a 4-byte UID it is probably a Mifare |
nebgnahz | 0:54bf4b21c7fa | 13 | Classic card, and the following steps are taken: |
nebgnahz | 0:54bf4b21c7fa | 14 | |
nebgnahz | 0:54bf4b21c7fa | 15 | - Authenticate block 4 (the first block of Sector 1) using |
nebgnahz | 0:54bf4b21c7fa | 16 | the default KEYA of 0XFF 0XFF 0XFF 0XFF 0XFF 0XFF |
nebgnahz | 0:54bf4b21c7fa | 17 | - If authentication succeeds, we can then read any of the |
nebgnahz | 0:54bf4b21c7fa | 18 | 4 blocks in that sector (though only block 4 is read here) |
nebgnahz | 0:54bf4b21c7fa | 19 | |
nebgnahz | 0:54bf4b21c7fa | 20 | If the card has a 7-byte UID it is probably a Mifare |
nebgnahz | 0:54bf4b21c7fa | 21 | Ultralight card, and the 4 byte pages can be read directly. |
nebgnahz | 0:54bf4b21c7fa | 22 | Page 4 is read by default since this is the first 'general- |
nebgnahz | 0:54bf4b21c7fa | 23 | purpose' page on the tags. |
nebgnahz | 0:54bf4b21c7fa | 24 | |
nebgnahz | 0:54bf4b21c7fa | 25 | |
nebgnahz | 0:54bf4b21c7fa | 26 | This is an example sketch for the Adafruit PN532 NFC/RFID breakout boards |
nebgnahz | 0:54bf4b21c7fa | 27 | This library works with the Adafruit NFC breakout |
nebgnahz | 0:54bf4b21c7fa | 28 | ----> https://www.adafruit.com/products/364 |
nebgnahz | 0:54bf4b21c7fa | 29 | |
nebgnahz | 0:54bf4b21c7fa | 30 | Check out the links above for our tutorials and wiring diagrams |
nebgnahz | 0:54bf4b21c7fa | 31 | These chips use SPI to communicate, 4 required to interface |
nebgnahz | 0:54bf4b21c7fa | 32 | |
nebgnahz | 0:54bf4b21c7fa | 33 | Adafruit invests time and resources providing this open source code, |
nebgnahz | 0:54bf4b21c7fa | 34 | please support Adafruit and open-source hardware by purchasing |
nebgnahz | 0:54bf4b21c7fa | 35 | products from Adafruit! |
nebgnahz | 0:54bf4b21c7fa | 36 | |
nebgnahz | 0:54bf4b21c7fa | 37 | */ |
nebgnahz | 0:54bf4b21c7fa | 38 | /**************************************************************************/ |
nebgnahz | 0:54bf4b21c7fa | 39 | |
nebgnahz | 0:54bf4b21c7fa | 40 | #include "mbed.h" |
nebgnahz | 0:54bf4b21c7fa | 41 | #include "Adafruit_PN532.h" |
nebgnahz | 0:54bf4b21c7fa | 42 | |
nebgnahz | 0:54bf4b21c7fa | 43 | #define SS PTD0 |
nebgnahz | 1:fb72a2f7cab5 | 44 | // PTD1 is also LED_BLUE, it will blink during SPI communication. |
nebgnahz | 0:54bf4b21c7fa | 45 | #define SCK PTD1 |
nebgnahz | 0:54bf4b21c7fa | 46 | #define MOSI PTD2 |
nebgnahz | 0:54bf4b21c7fa | 47 | #define MISO PTD3 |
nebgnahz | 0:54bf4b21c7fa | 48 | |
nebgnahz | 0:54bf4b21c7fa | 49 | DigitalOut red(LED_RED); |
nebgnahz | 0:54bf4b21c7fa | 50 | DigitalOut green(LED_GREEN); |
shong2010 | 2:96f420fa4a6e | 51 | DigitalOut blue(LED_BLUE); |
nebgnahz | 0:54bf4b21c7fa | 52 | |
nebgnahz | 0:54bf4b21c7fa | 53 | Serial pc(USBTX, USBRX); |
nebgnahz | 0:54bf4b21c7fa | 54 | Adafruit_PN532 nfc(SCK, MISO, MOSI, SS); |
nebgnahz | 0:54bf4b21c7fa | 55 | |
nebgnahz | 0:54bf4b21c7fa | 56 | void loop(void); |
nebgnahz | 0:54bf4b21c7fa | 57 | |
nebgnahz | 0:54bf4b21c7fa | 58 | int main() { |
nebgnahz | 0:54bf4b21c7fa | 59 | pc.printf("Hello!\n"); |
shong2010 | 2:96f420fa4a6e | 60 | // By default, no color |
shong2010 | 2:96f420fa4a6e | 61 | green = 1; red = 1, blue = 1; |
nebgnahz | 0:54bf4b21c7fa | 62 | |
nebgnahz | 0:54bf4b21c7fa | 63 | nfc.begin(); |
nebgnahz | 0:54bf4b21c7fa | 64 | |
nebgnahz | 0:54bf4b21c7fa | 65 | uint32_t versiondata = nfc.getFirmwareVersion(); |
nebgnahz | 0:54bf4b21c7fa | 66 | if (! versiondata) { |
nebgnahz | 0:54bf4b21c7fa | 67 | pc.printf("Didn't find PN53x board"); |
nebgnahz | 0:54bf4b21c7fa | 68 | while (1); // halt |
nebgnahz | 0:54bf4b21c7fa | 69 | } |
nebgnahz | 0:54bf4b21c7fa | 70 | // Got ok data, print it out! |
nebgnahz | 0:54bf4b21c7fa | 71 | pc.printf("Found chip PN5%2X with Firmware ver. %d.%d\n", |
nebgnahz | 0:54bf4b21c7fa | 72 | versiondata >> 24, |
nebgnahz | 0:54bf4b21c7fa | 73 | (versiondata >> 16) & 0xFF, |
nebgnahz | 0:54bf4b21c7fa | 74 | (versiondata >> 8) & 0xFF); |
nebgnahz | 0:54bf4b21c7fa | 75 | |
nebgnahz | 0:54bf4b21c7fa | 76 | // configure board to read RFID tags |
nebgnahz | 0:54bf4b21c7fa | 77 | nfc.SAMConfig(); |
nebgnahz | 0:54bf4b21c7fa | 78 | |
nebgnahz | 0:54bf4b21c7fa | 79 | pc.printf("Waiting for an ISO14443A Card ...\n"); |
nebgnahz | 0:54bf4b21c7fa | 80 | |
nebgnahz | 0:54bf4b21c7fa | 81 | while(1) { loop(); } |
nebgnahz | 0:54bf4b21c7fa | 82 | } |
nebgnahz | 0:54bf4b21c7fa | 83 | |
nebgnahz | 0:54bf4b21c7fa | 84 | |
nebgnahz | 0:54bf4b21c7fa | 85 | void loop(void) { |
shong2010 | 2:96f420fa4a6e | 86 | // Turn back to no color |
shong2010 | 2:96f420fa4a6e | 87 | green = 1; red = 1, blue = 1; |
nebgnahz | 0:54bf4b21c7fa | 88 | |
nebgnahz | 0:54bf4b21c7fa | 89 | uint8_t success; |
nebgnahz | 0:54bf4b21c7fa | 90 | uint8_t uid[] = { 0, 0, 0, 0, 0, 0, 0 }; // Buffer to store the returned UID |
nebgnahz | 0:54bf4b21c7fa | 91 | uint8_t uidLength; // Length of the UID (4 or 7 bytes depending on ISO14443A card type) |
nebgnahz | 0:54bf4b21c7fa | 92 | |
nebgnahz | 0:54bf4b21c7fa | 93 | // Wait for an ISO14443A type cards (Mifare, etc.). When one is found |
nebgnahz | 0:54bf4b21c7fa | 94 | // 'uid' will be populated with the UID, and uidLength will indicate |
nebgnahz | 0:54bf4b21c7fa | 95 | // if the uid is 4 bytes (Mifare Classic) or 7 bytes (Mifare Ultralight) |
nebgnahz | 0:54bf4b21c7fa | 96 | success = nfc.readPassiveTargetID(PN532_MIFARE_ISO14443A, uid, &uidLength); |
nebgnahz | 0:54bf4b21c7fa | 97 | |
nebgnahz | 0:54bf4b21c7fa | 98 | if (success) { |
nebgnahz | 0:54bf4b21c7fa | 99 | // Turn off to indicate Card swipe |
shong2010 | 2:96f420fa4a6e | 100 | green = 1; red = 1, blue = 1; |
nebgnahz | 0:54bf4b21c7fa | 101 | // Display some basic information about the card |
nebgnahz | 0:54bf4b21c7fa | 102 | pc.printf("\n\nFound an ISO14443A card\n"); |
nebgnahz | 0:54bf4b21c7fa | 103 | pc.printf(" UID Length: %d bytes", uidLength); |
nebgnahz | 0:54bf4b21c7fa | 104 | pc.printf(" UID Value: "); |
nebgnahz | 0:54bf4b21c7fa | 105 | nfc.PrintHex(uid, uidLength); |
nebgnahz | 0:54bf4b21c7fa | 106 | pc.printf("\n"); |
nebgnahz | 0:54bf4b21c7fa | 107 | |
nebgnahz | 0:54bf4b21c7fa | 108 | if (uidLength == 4) |
nebgnahz | 0:54bf4b21c7fa | 109 | { |
nebgnahz | 0:54bf4b21c7fa | 110 | // We probably have a Mifare Classic card ... |
nebgnahz | 0:54bf4b21c7fa | 111 | pc.printf("Seems to be a Mifare Classic card (4 byte UID)\n"); |
nebgnahz | 0:54bf4b21c7fa | 112 | |
nebgnahz | 0:54bf4b21c7fa | 113 | // Now we need to try to authenticate it for read/write access |
nebgnahz | 0:54bf4b21c7fa | 114 | // Try with the factory default KeyA: 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF |
nebgnahz | 0:54bf4b21c7fa | 115 | pc.printf("Trying to authenticate block 4 with default KEYA value\n"); |
nebgnahz | 0:54bf4b21c7fa | 116 | uint8_t keya[6] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }; |
nebgnahz | 0:54bf4b21c7fa | 117 | |
nebgnahz | 0:54bf4b21c7fa | 118 | // Start with block 4 (the first block of sector 1) since sector 0 |
nebgnahz | 0:54bf4b21c7fa | 119 | // contains the manufacturer data and it's probably better just |
nebgnahz | 0:54bf4b21c7fa | 120 | // to leave it alone unless you know what you're doing |
nebgnahz | 0:54bf4b21c7fa | 121 | success = nfc.mifareclassic_AuthenticateBlock(uid, uidLength, 4, 0, keya); |
nebgnahz | 0:54bf4b21c7fa | 122 | |
nebgnahz | 0:54bf4b21c7fa | 123 | if (success) |
nebgnahz | 0:54bf4b21c7fa | 124 | { |
shong2010 | 2:96f420fa4a6e | 125 | // Turn colors to indicate which tag |
shong2010 | 2:96f420fa4a6e | 126 | //green = 0; red = 1; |
shong2010 | 2:96f420fa4a6e | 127 | uint8_t tag_1 = 250; |
shong2010 | 2:96f420fa4a6e | 128 | uint8_t tag_2 = 186; |
shong2010 | 2:96f420fa4a6e | 129 | uint8_t tag_3 = 106; |
shong2010 | 2:96f420fa4a6e | 130 | uint8_t tag_4 = 10; |
shong2010 | 2:96f420fa4a6e | 131 | if (uid[0] == tag_1) |
shong2010 | 2:96f420fa4a6e | 132 | green = 0; |
shong2010 | 2:96f420fa4a6e | 133 | else if (uid[0] == tag_2) |
shong2010 | 2:96f420fa4a6e | 134 | red = 0; |
shong2010 | 2:96f420fa4a6e | 135 | else if (uid[0] == tag_3) { |
shong2010 | 2:96f420fa4a6e | 136 | green = 0, red = 0; |
shong2010 | 2:96f420fa4a6e | 137 | } else if (uid[0] == tag_4) { |
shong2010 | 2:96f420fa4a6e | 138 | red = 0, blue = 0; |
shong2010 | 2:96f420fa4a6e | 139 | } |
shong2010 | 2:96f420fa4a6e | 140 | |
nebgnahz | 0:54bf4b21c7fa | 141 | pc.printf("Sector 1 (Blocks 4..7) has been authenticated\n"); |
nebgnahz | 0:54bf4b21c7fa | 142 | uint8_t data[16]; |
nebgnahz | 0:54bf4b21c7fa | 143 | |
nebgnahz | 0:54bf4b21c7fa | 144 | // If you want to write something to block 4 to test with, remove |
nebgnahz | 0:54bf4b21c7fa | 145 | // the definition of data above, and uncomment the following lines |
nebgnahz | 0:54bf4b21c7fa | 146 | /************************************************************************ |
nebgnahz | 0:54bf4b21c7fa | 147 | uint8_t data[16] = { 'b', 'e', 'n', ' ', 'z', 'h', 'a', 'n', 'g' }; |
nebgnahz | 0:54bf4b21c7fa | 148 | success = nfc.mifareclassic_WriteDataBlock (4, data); |
nebgnahz | 0:54bf4b21c7fa | 149 | if (success) |
nebgnahz | 0:54bf4b21c7fa | 150 | { |
nebgnahz | 0:54bf4b21c7fa | 151 | // Data seems to have been read ... spit it out |
nebgnahz | 0:54bf4b21c7fa | 152 | pc.printf("Data Written to Block 4:\n\t"); |
nebgnahz | 0:54bf4b21c7fa | 153 | nfc.PrintHexChar(data, 16); |
nebgnahz | 0:54bf4b21c7fa | 154 | pc.printf("\n"); |
nebgnahz | 0:54bf4b21c7fa | 155 | |
nebgnahz | 0:54bf4b21c7fa | 156 | // Wait a bit before reading the card again |
nebgnahz | 0:54bf4b21c7fa | 157 | wait(1); |
nebgnahz | 0:54bf4b21c7fa | 158 | } |
nebgnahz | 0:54bf4b21c7fa | 159 | else |
nebgnahz | 0:54bf4b21c7fa | 160 | { |
nebgnahz | 0:54bf4b21c7fa | 161 | pc.printf("Ooops ... unable to write the requested block.\n"); |
nebgnahz | 0:54bf4b21c7fa | 162 | } |
nebgnahz | 0:54bf4b21c7fa | 163 | return; |
nebgnahz | 0:54bf4b21c7fa | 164 | ************************************************************************/ |
nebgnahz | 0:54bf4b21c7fa | 165 | |
nebgnahz | 0:54bf4b21c7fa | 166 | // Try to read the contents of block 4 |
shong2010 | 2:96f420fa4a6e | 167 | /*success = nfc.mifareclassic_ReadDataBlock(4, data); |
nebgnahz | 0:54bf4b21c7fa | 168 | |
nebgnahz | 0:54bf4b21c7fa | 169 | if (success) |
nebgnahz | 0:54bf4b21c7fa | 170 | { |
nebgnahz | 0:54bf4b21c7fa | 171 | // Data seems to have been read ... spit it out |
nebgnahz | 0:54bf4b21c7fa | 172 | pc.printf("Reading Block 4:\n\t"); |
nebgnahz | 0:54bf4b21c7fa | 173 | nfc.PrintHexChar(data, 16); |
nebgnahz | 0:54bf4b21c7fa | 174 | pc.printf("\n"); |
nebgnahz | 0:54bf4b21c7fa | 175 | |
nebgnahz | 0:54bf4b21c7fa | 176 | // Wait a bit before reading the card again |
nebgnahz | 0:54bf4b21c7fa | 177 | wait(1); |
nebgnahz | 0:54bf4b21c7fa | 178 | } |
nebgnahz | 0:54bf4b21c7fa | 179 | else |
nebgnahz | 0:54bf4b21c7fa | 180 | { |
nebgnahz | 0:54bf4b21c7fa | 181 | pc.printf("Ooops ... unable to read the requested block. Try another key?\n"); |
shong2010 | 2:96f420fa4a6e | 182 | }*/ |
nebgnahz | 0:54bf4b21c7fa | 183 | } |
nebgnahz | 0:54bf4b21c7fa | 184 | else |
nebgnahz | 0:54bf4b21c7fa | 185 | { |
nebgnahz | 0:54bf4b21c7fa | 186 | pc.printf("Ooops ... authentication failed: Try another key?\n"); |
nebgnahz | 0:54bf4b21c7fa | 187 | } |
nebgnahz | 0:54bf4b21c7fa | 188 | } |
nebgnahz | 0:54bf4b21c7fa | 189 | |
nebgnahz | 0:54bf4b21c7fa | 190 | if (uidLength == 7) |
nebgnahz | 0:54bf4b21c7fa | 191 | { |
nebgnahz | 0:54bf4b21c7fa | 192 | // We probably have a Mifare Ultralight card ... |
nebgnahz | 0:54bf4b21c7fa | 193 | pc.printf("Seems to be a Mifare Ultralight tag (7 byte UID)\n"); |
nebgnahz | 0:54bf4b21c7fa | 194 | |
nebgnahz | 0:54bf4b21c7fa | 195 | // Try to read the first general-purpose user page (#4) |
nebgnahz | 0:54bf4b21c7fa | 196 | pc.printf("Reading page 4\n"); |
nebgnahz | 0:54bf4b21c7fa | 197 | uint8_t data[32]; |
nebgnahz | 0:54bf4b21c7fa | 198 | success = nfc.mifareultralight_ReadPage (4, data); |
nebgnahz | 0:54bf4b21c7fa | 199 | if (success) |
nebgnahz | 0:54bf4b21c7fa | 200 | { |
nebgnahz | 0:54bf4b21c7fa | 201 | // Data seems to have been read ... spit it out |
nebgnahz | 0:54bf4b21c7fa | 202 | nfc.PrintHexChar(data, 4); |
nebgnahz | 0:54bf4b21c7fa | 203 | pc.printf("\n"); |
nebgnahz | 0:54bf4b21c7fa | 204 | |
nebgnahz | 0:54bf4b21c7fa | 205 | // Wait a bit before reading the card again |
nebgnahz | 0:54bf4b21c7fa | 206 | wait(1); |
nebgnahz | 0:54bf4b21c7fa | 207 | } |
nebgnahz | 0:54bf4b21c7fa | 208 | else |
nebgnahz | 0:54bf4b21c7fa | 209 | { |
nebgnahz | 0:54bf4b21c7fa | 210 | pc.printf("Ooops ... unable to read the requested page!?\n"); |
nebgnahz | 0:54bf4b21c7fa | 211 | } |
nebgnahz | 0:54bf4b21c7fa | 212 | } |
nebgnahz | 0:54bf4b21c7fa | 213 | } |
nebgnahz | 0:54bf4b21c7fa | 214 | } |