QAQ ==!

Dependencies:   mbed QEI-1 nRF24L01P xiugai

Committer:
AlexQian
Date:
Sat Dec 14 05:45:16 2019 +0000
Revision:
15:934289377f7a
Parent:
9:d03b1af2b8d8
Balance_Car;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
zhangyx 9:d03b1af2b8d8 1 /*
zhangyx 9:d03b1af2b8d8 2 读取标签卡uid的基本程序.
zhangyx 9:d03b1af2b8d8 3 可以使用i2c, spi, hsu中的某种通讯接口.
zhangyx 9:d03b1af2b8d8 4 */
zhangyx 9:d03b1af2b8d8 5
zhangyx 9:d03b1af2b8d8 6 #include "mbed.h"
zhangyx 9:d03b1af2b8d8 7 #include "PN532.h"
zhangyx 9:d03b1af2b8d8 8 #include "PN532_HSU.h"
zhangyx 9:d03b1af2b8d8 9 #include "PN532_SPI.h"
zhangyx 9:d03b1af2b8d8 10 #include "PN532_I2C.h"
zhangyx 9:d03b1af2b8d8 11 #include <string>
zhangyx 9:d03b1af2b8d8 12
zhangyx 9:d03b1af2b8d8 13 #define PN532_DBG_PRINT(...) do{}while(0)
zhangyx 9:d03b1af2b8d8 14 //#define PN532_DBG_PRINT(...) pc.printf(##__VA_ARGS__)
zhangyx 9:d03b1af2b8d8 15
zhangyx 9:d03b1af2b8d8 16 class PN532Checker
zhangyx 9:d03b1af2b8d8 17 {
zhangyx 9:d03b1af2b8d8 18 private:
zhangyx 9:d03b1af2b8d8 19 PN532_HSU *pn532_if;
zhangyx 9:d03b1af2b8d8 20 PN532 *nfc;
zhangyx 9:d03b1af2b8d8 21 uint8_t passwd[64], userid[64];
zhangyx 9:d03b1af2b8d8 22 uint8_t passwd_len, userid_len;
zhangyx 9:d03b1af2b8d8 23
zhangyx 9:d03b1af2b8d8 24 // card related
zhangyx 9:d03b1af2b8d8 25 uint8_t key[6];
zhangyx 9:d03b1af2b8d8 26 uint8_t uid[7];
zhangyx 9:d03b1af2b8d8 27 uint8_t uidLength; // UID的长度(根据ISO14443A卡类型4或7个字节)
zhangyx 9:d03b1af2b8d8 28 uint8_t passwd_block;
zhangyx 9:d03b1af2b8d8 29 uint8_t userid_block;
zhangyx 9:d03b1af2b8d8 30
zhangyx 9:d03b1af2b8d8 31 public:
zhangyx 9:d03b1af2b8d8 32 PN532Checker(HardwareSerial *pn532_hsu)
zhangyx 9:d03b1af2b8d8 33 {
zhangyx 9:d03b1af2b8d8 34 key[0] = 0xFF;
zhangyx 9:d03b1af2b8d8 35 key[1] = 0xFF;
zhangyx 9:d03b1af2b8d8 36 key[2] = 0xFF;
zhangyx 9:d03b1af2b8d8 37 key[3] = 0xFF;
zhangyx 9:d03b1af2b8d8 38 key[4] = 0xFF;
zhangyx 9:d03b1af2b8d8 39 key[5] = 0xFF;
zhangyx 9:d03b1af2b8d8 40 passwd_block = 5;
zhangyx 9:d03b1af2b8d8 41 userid_block = 6;
zhangyx 9:d03b1af2b8d8 42 pn532_if = new PN532_HSU(*pn532_hsu);
zhangyx 9:d03b1af2b8d8 43 nfc = new PN532(*pn532_if);
zhangyx 9:d03b1af2b8d8 44 }
zhangyx 9:d03b1af2b8d8 45
zhangyx 9:d03b1af2b8d8 46 ~PN532Checker()
zhangyx 9:d03b1af2b8d8 47 {
zhangyx 9:d03b1af2b8d8 48 delete nfc;
zhangyx 9:d03b1af2b8d8 49 delete pn532_if;
zhangyx 9:d03b1af2b8d8 50 }
zhangyx 9:d03b1af2b8d8 51
zhangyx 9:d03b1af2b8d8 52 inline void redLedOn()
zhangyx 9:d03b1af2b8d8 53 {
zhangyx 9:d03b1af2b8d8 54 nfc->writeGPIOP3(0);
zhangyx 9:d03b1af2b8d8 55 nfc->writeGPIOP7((1 << PN532_GPIO_P71)); //MISO P71
zhangyx 9:d03b1af2b8d8 56 }
zhangyx 9:d03b1af2b8d8 57
zhangyx 9:d03b1af2b8d8 58 inline void beep()
zhangyx 9:d03b1af2b8d8 59 {
zhangyx 9:d03b1af2b8d8 60 nfc->writeGPIOP7(0);
zhangyx 9:d03b1af2b8d8 61 nfc->writeGPIOP3((1 << PN532_GPIO_P30)|(1 << PN532_GPIO_P31)); //DBGRXD P30 //DBGTXD P31
zhangyx 9:d03b1af2b8d8 62 }
zhangyx 9:d03b1af2b8d8 63
zhangyx 9:d03b1af2b8d8 64 inline int setup()
zhangyx 9:d03b1af2b8d8 65 {
zhangyx 9:d03b1af2b8d8 66 wait_ms (100); //等待,初始化pn532过程
zhangyx 9:d03b1af2b8d8 67
zhangyx 9:d03b1af2b8d8 68 nfc->begin();
zhangyx 9:d03b1af2b8d8 69 uint32_t versiondata = nfc->getFirmwareVersion();
zhangyx 9:d03b1af2b8d8 70 if(!versiondata){
zhangyx 9:d03b1af2b8d8 71 PN532_DBG_PRINT("Didn't find PN53x board\r\n");
zhangyx 9:d03b1af2b8d8 72 return false;
zhangyx 9:d03b1af2b8d8 73 }
zhangyx 9:d03b1af2b8d8 74
zhangyx 9:d03b1af2b8d8 75 // 获取ok数据,打印出来!
zhangyx 9:d03b1af2b8d8 76 PN532_DBG_PRINT ("Found chip PN5%02X , Firmware ver. %d.%d\r\n",
zhangyx 9:d03b1af2b8d8 77 (versiondata >> 24) & 0xFF,
zhangyx 9:d03b1af2b8d8 78 (versiondata >> 16) & 0xFF,
zhangyx 9:d03b1af2b8d8 79 (versiondata >> 8) & 0xFF);
zhangyx 9:d03b1af2b8d8 80
zhangyx 9:d03b1af2b8d8 81 // 设置从卡片读取的c重复尝试的最大重试次数。
zhangyx 9:d03b1af2b8d8 82 // 这使我们避免永远的等待读取一个卡,永远等待是PN532默认行为
zhangyx 9:d03b1af2b8d8 83 //nfc->setPassiveActivationRetries(0xFF);
zhangyx 9:d03b1af2b8d8 84
zhangyx 9:d03b1af2b8d8 85 // 配置板读取RFID标签
zhangyx 9:d03b1af2b8d8 86 nfc->SAMConfig();
zhangyx 9:d03b1af2b8d8 87
zhangyx 9:d03b1af2b8d8 88 //亮红灯
zhangyx 9:d03b1af2b8d8 89 redLedOn();
zhangyx 9:d03b1af2b8d8 90
zhangyx 9:d03b1af2b8d8 91 return true;
zhangyx 9:d03b1af2b8d8 92 }
zhangyx 9:d03b1af2b8d8 93
zhangyx 9:d03b1af2b8d8 94 inline int start_check(int timeout) // polling
zhangyx 9:d03b1af2b8d8 95 {
zhangyx 9:d03b1af2b8d8 96 // Input:
zhangyx 9:d03b1af2b8d8 97 // timeout: ms
zhangyx 9:d03b1af2b8d8 98 // Output:
zhangyx 9:d03b1af2b8d8 99 // true/false
zhangyx 9:d03b1af2b8d8 100 // if true, you can then call get_userid/get_passwd
zhangyx 9:d03b1af2b8d8 101 bool read_done = false;
zhangyx 9:d03b1af2b8d8 102 bool time_count = 0;
zhangyx 9:d03b1af2b8d8 103 while (!read_done && time_count < timeout) {
zhangyx 9:d03b1af2b8d8 104 bool success;
zhangyx 9:d03b1af2b8d8 105 uint16_t timeo = 50;
zhangyx 9:d03b1af2b8d8 106
zhangyx 9:d03b1af2b8d8 107 // 配置板读取RFID标签
zhangyx 9:d03b1af2b8d8 108 //nfc->SAMConfig();
zhangyx 9:d03b1af2b8d8 109
zhangyx 9:d03b1af2b8d8 110 // 等待一个ISO14443A类型的卡(如Mifare卡等). 当发现一个时,'uid'会被UID填充,并且uid长度会指出该uid是4字节(典型的Mifare)或7字节(超轻Mifare),100是超时时间(单位是毫秒,ms)
zhangyx 9:d03b1af2b8d8 111 success = nfc->readPassiveTargetID(PN532_MIFARE_ISO14443A, &uid[0], &uidLength, timeo);
zhangyx 9:d03b1af2b8d8 112 if (success) {
zhangyx 9:d03b1af2b8d8 113 PN532_DBG_PRINT("Found a Mifare card!\r\n");
zhangyx 9:d03b1af2b8d8 114 PN532_DBG_PRINT("UID Length: %d bytes\r\n", uidLength);
zhangyx 9:d03b1af2b8d8 115 PN532_DBG_PRINT("UID Value:");
zhangyx 9:d03b1af2b8d8 116 for (int i = 0; i < uidLength; i++)
zhangyx 9:d03b1af2b8d8 117 PN532_DBG_PRINT(" 0x%02X", uid[i]);
zhangyx 9:d03b1af2b8d8 118 PN532_DBG_PRINT("\r\n");
zhangyx 9:d03b1af2b8d8 119
zhangyx 9:d03b1af2b8d8 120 success = nfc->mifareclassic_AuthenticateBlock(uid, uidLength, 7, 0, key); // TODO
zhangyx 9:d03b1af2b8d8 121 if (success) {
zhangyx 9:d03b1af2b8d8 122 PN532_DBG_PRINT("Authen success!\r\n");
zhangyx 9:d03b1af2b8d8 123 }
zhangyx 9:d03b1af2b8d8 124 PN532_DBG_PRINT("read block\r\n");
zhangyx 9:d03b1af2b8d8 125 success = nfc->mifareclassic_ReadDataBlock(passwd_block, passwd) & \
zhangyx 9:d03b1af2b8d8 126 nfc->mifareclassic_ReadDataBlock(userid_block, userid);
zhangyx 9:d03b1af2b8d8 127 if (success) {
zhangyx 9:d03b1af2b8d8 128 passwd_len = 8;
zhangyx 9:d03b1af2b8d8 129 userid_len = 10;
zhangyx 9:d03b1af2b8d8 130 PN532_DBG_PRINT("read success!\r\n");
zhangyx 9:d03b1af2b8d8 131 read_done = true;
zhangyx 9:d03b1af2b8d8 132 beep();
zhangyx 9:d03b1af2b8d8 133 wait_ms (50);
zhangyx 9:d03b1af2b8d8 134
zhangyx 9:d03b1af2b8d8 135 for (int i = 0; i < 16; ++i) {
zhangyx 9:d03b1af2b8d8 136 PN532_DBG_PRINT("0x%x ", passwd[i]);
zhangyx 9:d03b1af2b8d8 137 }
zhangyx 9:d03b1af2b8d8 138 PN532_DBG_PRINT("\r\n");
zhangyx 9:d03b1af2b8d8 139 }
zhangyx 9:d03b1af2b8d8 140
zhangyx 9:d03b1af2b8d8 141 nfc->inRelease(0); //Release all cards
zhangyx 9:d03b1af2b8d8 142
zhangyx 9:d03b1af2b8d8 143 //wait_ms (50);
zhangyx 9:d03b1af2b8d8 144 redLedOn();
zhangyx 9:d03b1af2b8d8 145
zhangyx 9:d03b1af2b8d8 146 // 等到移开卡时
zhangyx 9:d03b1af2b8d8 147 //while (nfc->readPassiveTargetID(PN532_MIFARE_ISO14443A, &uid[0], &uidLength, 50)) {}
zhangyx 9:d03b1af2b8d8 148
zhangyx 9:d03b1af2b8d8 149 } else {
zhangyx 9:d03b1af2b8d8 150 // PN532可能等待卡片超时
zhangyx 9:d03b1af2b8d8 151 PN532_DBG_PRINT("Timed out waiting for Mifare card\r\n");
zhangyx 9:d03b1af2b8d8 152 //wait_ms (200);
zhangyx 9:d03b1af2b8d8 153 }
zhangyx 9:d03b1af2b8d8 154
zhangyx 9:d03b1af2b8d8 155 uint8_t AFI[] = {0};
zhangyx 9:d03b1af2b8d8 156 success = nfc->inListPassiveTarget(PN532_106KBPS_ISO14443B, sizeof(AFI) , AFI, 200);
zhangyx 9:d03b1af2b8d8 157 if (success) {
zhangyx 9:d03b1af2b8d8 158 uint8_t expire[3];
zhangyx 9:d03b1af2b8d8 159 nfc->inRelease();
zhangyx 9:d03b1af2b8d8 160
zhangyx 9:d03b1af2b8d8 161 success = nfc->readTsighuaStuCard(uid, expire,(char*) userid);
zhangyx 9:d03b1af2b8d8 162 if(success){
zhangyx 9:d03b1af2b8d8 163 uidLength = 3;
zhangyx 9:d03b1af2b8d8 164 userid_len = 10;
zhangyx 9:d03b1af2b8d8 165 passwd_len = 0;
zhangyx 9:d03b1af2b8d8 166 PN532_DBG_PRINT("Found a student card!\r\n");
zhangyx 9:d03b1af2b8d8 167 PN532_DBG_PRINT("Student Number: %s\r\n", userid);
zhangyx 9:d03b1af2b8d8 168 read_done = true;
zhangyx 9:d03b1af2b8d8 169 beep();
zhangyx 9:d03b1af2b8d8 170 wait_ms (50);
zhangyx 9:d03b1af2b8d8 171 redLedOn();
zhangyx 9:d03b1af2b8d8 172 }
zhangyx 9:d03b1af2b8d8 173 nfc->resetConfigFor14443B();
zhangyx 9:d03b1af2b8d8 174 } else {
zhangyx 9:d03b1af2b8d8 175 PN532_DBG_PRINT("Timed out waiting for student card\r\n");
zhangyx 9:d03b1af2b8d8 176 }
zhangyx 9:d03b1af2b8d8 177
zhangyx 9:d03b1af2b8d8 178
zhangyx 9:d03b1af2b8d8 179 time_count += timeo;
zhangyx 9:d03b1af2b8d8 180 }
zhangyx 9:d03b1af2b8d8 181 return read_done;
zhangyx 9:d03b1af2b8d8 182 }
zhangyx 9:d03b1af2b8d8 183
zhangyx 9:d03b1af2b8d8 184 std::string get_passwd() { return std::string((char*)passwd, passwd_len); }
zhangyx 9:d03b1af2b8d8 185 std::string get_userid() { return std::string((char*)userid, userid_len); }
zhangyx 9:d03b1af2b8d8 186
zhangyx 9:d03b1af2b8d8 187 inline int get_passwd(uint8_t *passwd)
zhangyx 9:d03b1af2b8d8 188 {
zhangyx 9:d03b1af2b8d8 189 for (int i = 0; i < passwd_len; ++i) {
zhangyx 9:d03b1af2b8d8 190 passwd[i] = this->passwd[i];
zhangyx 9:d03b1af2b8d8 191 }
zhangyx 9:d03b1af2b8d8 192 return passwd_len;
zhangyx 9:d03b1af2b8d8 193 }
zhangyx 9:d03b1af2b8d8 194
zhangyx 9:d03b1af2b8d8 195 inline int get_userid(uint8_t *userid)
zhangyx 9:d03b1af2b8d8 196 {
zhangyx 9:d03b1af2b8d8 197 for (int i = 0; i < userid_len; ++i) {
zhangyx 9:d03b1af2b8d8 198 userid[i] = this->userid[i];
zhangyx 9:d03b1af2b8d8 199 }
zhangyx 9:d03b1af2b8d8 200 return userid_len;
zhangyx 9:d03b1af2b8d8 201 }
zhangyx 9:d03b1af2b8d8 202 };
zhangyx 9:d03b1af2b8d8 203