123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228 |
- //https://blog.csdn.net/Y_xianlin/article/details/141708176
- #include <SPI.h>
- #include <MFRC522.h>
- // 定义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;i<len;i++){
- strData = writeRFID(data,i);
- }
- pCharacteristic->setValue(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();
- }
- }
|