//https://blog.csdn.net/Y_xianlin/article/details/141708176 #include #include // 定义RC522模块的引脚 #define SS_PIN 7 // SDA #define RST_PIN 3 // RST // 创建MFRC522对象 MFRC522 mfrc522(SS_PIN, RST_PIN); MFRC522::MIFARE_Key key; // 密钥 int blockAddrs[2] = {1,2};// 数据块 String errorValue = "r:rfid error"; String notRfid = "r:not rfid"; String writeValue = "r:write ok"; void rfidSetup(){ SPI.begin(); // 初始化SPI总线 mfrc522.PCD_Init(); // 初始化MFRC522模块 // 初始化密钥(全为0xFF) for (byte i = 0; i < 6; i++) { key.keyByte[i] = 0xFF; } Serial.println("RFID init ok..."); } String readRFID(int index){ int blockAddr = blockAddrs[index]; // 认证指定扇区 MFRC522::StatusCode status = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, blockAddr, &key, &(mfrc522.uid)); if (status != MFRC522::STATUS_OK) { Serial.println("rfid error"); //认证失败 return errorValue; } // 读取扇区数据 byte buffer[18]; byte size = sizeof(buffer); status = mfrc522.MIFARE_Read(blockAddr, buffer, &size); if (status != MFRC522::STATUS_OK) { Serial.println("rfid error"); //认证失败 return errorValue; } String str = ""; for (byte i = 0; i < 15; i++) { str += (char)buffer[i]; } Serial.println("read:" + str); return str; } void readRFID() { // 检查是否有新的RFID标签 if (!mfrc522.PICC_IsNewCardPresent()) { Serial.println("not rfid"); //没rfid pCharacteristic->setValue(notRfid.c_str()); return; } // 选择其中一个RFID标签 if (!mfrc522.PICC_ReadCardSerial()) { Serial.println("rfid fail"); //失败 pCharacteristic->setValue(errorValue.c_str()); return; } String str = ""; for(int i=0;i<2;i++){ String strData = readRFID(i); if(strData==errorValue){ pCharacteristic->setValue(errorValue.c_str()); // 停止与标签的通信 mfrc522.PICC_HaltA(); mfrc522.PCD_StopCrypto1(); return; }else{ str = str + strData; } } str = "r:" + str; Serial.println(str); pCharacteristic->setValue(str.c_str()); // 停止与标签的通信 mfrc522.PICC_HaltA(); mfrc522.PCD_StopCrypto1(); } String writeRFID(String data,int index){ if(index>=2)return writeValue; int blockAddr = blockAddrs[index]; int strLen = data.length() - index*15; if(strLen<=0)return writeValue; if(strLen>15)strLen=15; String strData = data.substring(index*15, index*15 + strLen); Serial.print("write data: "); Serial.println(strData); // 将数据转化为字节数组(最多16字节) byte dataBlock[16]; strData.getBytes(dataBlock, 16); // 认证指定扇区 MFRC522::StatusCode status = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, blockAddr, &key, &(mfrc522.uid)); if (status != MFRC522::STATUS_OK) { Serial.println("rfid error"); //认证失败 return errorValue; } // 写入数据到指定块 status = mfrc522.MIFARE_Write(blockAddr, dataBlock, 16); if (status != MFRC522::STATUS_OK) { Serial.println("rfid error"); //写入失败 return errorValue; } else { Serial.println("rfid ok"); //写入成功 return writeValue; } } void writeRFID(String data) { // 检查是否有新的RFID标签 if (!mfrc522.PICC_IsNewCardPresent()) { Serial.println("not rfid"); //没rfid pCharacteristic->setValue(notRfid.c_str()); return; } // 选择其中一个RFID标签 if (!mfrc522.PICC_ReadCardSerial()) { Serial.println("rfid fail"); //失败 pCharacteristic->setValue(errorValue.c_str()); return; } String strData = ""; int len = data.length()/15; if(data.length()%15>0)len=len+1; for(int i=0;isetValue(strData.c_str()); // 停止与标签的通信 mfrc522.PICC_HaltA(); mfrc522.PCD_StopCrypto1(); } //0:开头字符串读取 1:开头字符串写入 void rifdCommand(){ String command = pCharacteristic->getValue().c_str(); if (command.startsWith("0:")) { readRFID(); } else if (command.startsWith("1:")) { String data = command.substring(2); if(data.length()<=30){ writeRFID(data); } } } int loopRfidSize=1000; //loop间隔 int rfidMillisTime; void rfidLoop(){ //1秒读取一次指令 int rfidTimeCurrent = millis(); if(rfidTimeCurrent<=0)rfidMillisTime = rfidTimeCurrent; if((rfidTimeCurrent - rfidMillisTime)>loopRfidSize){ rfidMillisTime = rfidTimeCurrent; rifdCommand(); } }