Blame view

tweekd_nfc.ino 3.87 KB
55af57c0   henyxia   Customized versio...
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
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
  #include <SPI.h>
  #include <PN532_SPI.h>
  #include "PN532.h"
  
  PN532_SPI pn532spi(SPI, 10);
  PN532 nfc(pn532spi);
  
  void setup(void) {
  	Serial.begin(115200);
  	Serial.println("Hello!");
  
  	nfc.begin();
  
  	uint32_t versiondata = nfc.getFirmwareVersion();
  	if (! versiondata)
  	{
  		Serial.print("Didn't find PN53x board");
  		while (1);
  	}
  	//Serial.print("Found chip PN5"); Serial.println((versiondata>>24) & 0xFF, HEX); 
  	Serial.print("Firmware ver. "); Serial.print((versiondata>>16) & 0xFF, DEC); 
  	Serial.print('.'); Serial.println((versiondata>>8) & 0xFF, DEC);
    
  	// configure board to read RFID tags
  	nfc.SAMConfig();
    
  	Serial.println("Waiting for an ISO14443A Card ...");
  }
  
  
  void loop(void)
  {
  	uint8_t success;
  	uint8_t uid[] = { 0, 0, 0, 0, 0, 0, 0 };  // Buffer to store the returned UID
  	uint8_t uidLength;                        // Length of the UID (4 or 7 bytes depending on ISO14443A card type)
      
  	// Wait for an ISO14443A type cards (Mifare, etc.).  When one is found
  	// 'uid' will be populated with the UID, and uidLength will indicate
  	// if the uid is 4 bytes (Mifare Classic) or 7 bytes (Mifare Ultralight)
  	success = nfc.readPassiveTargetID(PN532_MIFARE_ISO14443A, uid, &uidLength);
    
  	if(success)
  	{
  		// Display some basic information about the card
  		Serial.println("Found an ISO14443A card");
  		Serial.print("  UID Length: ");Serial.print(uidLength, DEC);Serial.println(" bytes");
  		Serial.print("  UID Value: ");
  		nfc.PrintHex(uid, uidLength);
  		Serial.println("");
      
  		if(uidLength == 4)
  		{
  			// We probably have a Mifare Classic card ... 
  			Serial.println("Seems to be a Mifare Classic card (4 byte UID)");
  	  
  			 // Now we need to try to authenticate it for read/write access
  			// Try with the factory default KeyA: 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF
  			Serial.println("Trying to authenticate block 4 with default KEYA value");
  			uint8_t keya[6] = { 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5 };
  	  
  			// Start with block 4 (the first block of sector 1) since sector 0
  			// contains the manufacturer data and it's probably better just
  			// to leave it alone unless you know what you're doing
  			success = nfc.mifareclassic_AuthenticateBlock(uid, uidLength, 44, 0, keya);
  	  
  			if(success)
  			{
  				Serial.println("Sector 1 (Blocks 4..7) has been authenticated");
  				uint8_t data[16];
  		
  				// If you want to write something to block 4 to test with, uncomment
  				// the following line and this text should be read back in a minute
  				// data = { 'a', 'd', 'a', 'f', 'r', 'u', 'i', 't', '.', 'c', 'o', 'm', 0, 0, 0, 0};
  				// success = nfc.mifareclassic_WriteDataBlock (4, data);
  
  				// Try to read the contents of block 4
  				success = nfc.mifareclassic_ReadDataBlock(44, data);
  		
  				if(success)
  				{
  					// Data seems to have been read ... spit it out
  					Serial.println("Reading Block 4:");
  					nfc.PrintHexChar(data, 16);
  					nfc.mifareclassic_ReadDataBlock(45, data);
  					nfc.PrintHexChar(data, 16);
  					nfc.mifareclassic_ReadDataBlock(46, data);
  					nfc.PrintHexChar(data, 16);
  					Serial.println("");
  		  
  					// Wait a bit before reading the card again
  					delay(1000);
  				}
  				else
  				{
  					Serial.println("Ooops ... unable to read the requested block.  Try another key?");
  				}
  			}
  			else
  			{
  				Serial.println("Ooops ... authentication failed: Try another key?");
  			}
  		}
      
  		if(uidLength == 7)
  		{
  			// We probably have a Mifare Ultralight card ...
  			Serial.println("Seems to be a Mifare Ultralight tag (7 byte UID)");
  	  
  			// Try to read the first general-purpose user page (#4)
  			Serial.println("Reading page 4");
  			uint8_t data[32];
  			success = nfc.mifareultralight_ReadPage (4, data);
  			if(success)
  			{
  				// Data seems to have been read ... spit it out
  				nfc.PrintHexChar(data, 4);
  				Serial.println("");
  		
  				// Wait a bit before reading the card again
  				delay(1000);
  			}
  			else
  			{
  				Serial.println("Ooops ... unable to read the requested page!?");
  			}
  		}
  	}
  }