rfid.h 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228
  1. //https://blog.csdn.net/Y_xianlin/article/details/141708176
  2. #include <SPI.h>
  3. #include <MFRC522.h>
  4. // 定义RC522模块的引脚
  5. #define SS_PIN 7 // SDA
  6. #define RST_PIN 3 // RST
  7. // 创建MFRC522对象
  8. MFRC522 mfrc522(SS_PIN, RST_PIN);
  9. MFRC522::MIFARE_Key key; // 密钥
  10. int blockAddrs[2] = {1,2};// 数据块
  11. String errorValue = "r:rfid error";
  12. String notRfid = "r:not rfid";
  13. String writeValue = "r:write ok";
  14. void rfidSetup(){
  15. SPI.begin(); // 初始化SPI总线
  16. mfrc522.PCD_Init(); // 初始化MFRC522模块
  17. // 初始化密钥(全为0xFF)
  18. for (byte i = 0; i < 6; i++) {
  19. key.keyByte[i] = 0xFF;
  20. }
  21. Serial.println("RFID init ok...");
  22. }
  23. String readRFID(int index){
  24. int blockAddr = blockAddrs[index];
  25. // 认证指定扇区
  26. MFRC522::StatusCode status = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, blockAddr, &key, &(mfrc522.uid));
  27. if (status != MFRC522::STATUS_OK) {
  28. Serial.println("rfid error"); //认证失败
  29. return errorValue;
  30. }
  31. // 读取扇区数据
  32. byte buffer[18];
  33. byte size = sizeof(buffer);
  34. status = mfrc522.MIFARE_Read(blockAddr, buffer, &size);
  35. if (status != MFRC522::STATUS_OK) {
  36. Serial.println("rfid error"); //认证失败
  37. return errorValue;
  38. }
  39. String str = "";
  40. for (byte i = 0; i < 15; i++) {
  41. str += (char)buffer[i];
  42. }
  43. Serial.println("read:" + str);
  44. return str;
  45. }
  46. void readRFID() {
  47. // 检查是否有新的RFID标签
  48. if (!mfrc522.PICC_IsNewCardPresent()) {
  49. Serial.println("not rfid"); //没rfid
  50. pCharacteristic->setValue(notRfid.c_str());
  51. return;
  52. }
  53. // 选择其中一个RFID标签
  54. if (!mfrc522.PICC_ReadCardSerial()) {
  55. Serial.println("rfid fail"); //失败
  56. pCharacteristic->setValue(errorValue.c_str());
  57. return;
  58. }
  59. String str = "";
  60. for(int i=0;i<2;i++){
  61. String strData = readRFID(i);
  62. if(strData==errorValue){
  63. pCharacteristic->setValue(errorValue.c_str());
  64. // 停止与标签的通信
  65. mfrc522.PICC_HaltA();
  66. mfrc522.PCD_StopCrypto1();
  67. return;
  68. }else{
  69. str = str + strData;
  70. }
  71. }
  72. str = "r:" + str;
  73. Serial.println(str);
  74. pCharacteristic->setValue(str.c_str());
  75. // 停止与标签的通信
  76. mfrc522.PICC_HaltA();
  77. mfrc522.PCD_StopCrypto1();
  78. }
  79. String writeRFID(String data,int index){
  80. if(index>=2)return writeValue;
  81. int blockAddr = blockAddrs[index];
  82. int strLen = data.length() - index*15;
  83. if(strLen<=0)return writeValue;
  84. if(strLen>15)strLen=15;
  85. String strData = data.substring(index*15, index*15 + strLen);
  86. Serial.print("write data: ");
  87. Serial.println(strData);
  88. // 将数据转化为字节数组(最多16字节)
  89. byte dataBlock[16];
  90. strData.getBytes(dataBlock, 16);
  91. // 认证指定扇区
  92. MFRC522::StatusCode status = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, blockAddr, &key, &(mfrc522.uid));
  93. if (status != MFRC522::STATUS_OK) {
  94. Serial.println("rfid error"); //认证失败
  95. return errorValue;
  96. }
  97. // 写入数据到指定块
  98. status = mfrc522.MIFARE_Write(blockAddr, dataBlock, 16);
  99. if (status != MFRC522::STATUS_OK) {
  100. Serial.println("rfid error"); //写入失败
  101. return errorValue;
  102. } else {
  103. Serial.println("rfid ok"); //写入成功
  104. return writeValue;
  105. }
  106. }
  107. void writeRFID(String data) {
  108. // 检查是否有新的RFID标签
  109. if (!mfrc522.PICC_IsNewCardPresent()) {
  110. Serial.println("not rfid"); //没rfid
  111. pCharacteristic->setValue(notRfid.c_str());
  112. return;
  113. }
  114. // 选择其中一个RFID标签
  115. if (!mfrc522.PICC_ReadCardSerial()) {
  116. Serial.println("rfid fail"); //失败
  117. pCharacteristic->setValue(errorValue.c_str());
  118. return;
  119. }
  120. String strData = "";
  121. int len = data.length()/15;
  122. if(data.length()%15>0)len=len+1;
  123. for(int i=0;i<len;i++){
  124. strData = writeRFID(data,i);
  125. }
  126. pCharacteristic->setValue(strData.c_str());
  127. // 停止与标签的通信
  128. mfrc522.PICC_HaltA();
  129. mfrc522.PCD_StopCrypto1();
  130. }
  131. //0:开头字符串读取 1:开头字符串写入
  132. void rifdCommand(){
  133. String command = pCharacteristic->getValue().c_str();
  134. if (command.startsWith("0:")) {
  135. readRFID();
  136. } else if (command.startsWith("1:")) {
  137. String data = command.substring(2);
  138. if(data.length()<=30){
  139. writeRFID(data);
  140. }
  141. }
  142. }
  143. int loopRfidSize=1000; //loop间隔
  144. int rfidMillisTime;
  145. void rfidLoop(){
  146. //1秒读取一次指令
  147. int rfidTimeCurrent = millis();
  148. if(rfidTimeCurrent<=0)rfidMillisTime = rfidTimeCurrent;
  149. if((rfidTimeCurrent - rfidMillisTime)>loopRfidSize){
  150. rfidMillisTime = rfidTimeCurrent;
  151. rifdCommand();
  152. }
  153. }