RFIDの特定の領域を読み取る(シムシムのArduinoスケッチ詳細)

RFIDの特定の領域を読み取る

RFIDタグの特定の領域は自由な値を読み書きできるので、これを読み取って特定の文言が入っていれば開錠するという、鍵として利用できるRFIDタグの判別に利用した。
最初はRFIDのUIDを利用して開錠していたのだが、UIDの複製をするには特殊なRFIDタグが必要で、コストは2000円以上するものだったので、断念した。

もともと、防犯目的ではないので、いくらでも複製可能なことのほうがメリットある。
もし、鍵を盗難されて問題が発生したのなら、内部の判定文言を変えて、鍵も書き換えればよいだけのこと。

  MFRC522::PICC_Type piccType = rfid.PICC_GetType(rfid.uid.sak);
 
  // 認証用
  // Prepare key - all keys are set to FFFFFFFFFFFFh at chip delivery from the factory.
  for (byte i = 0; i < 6; i++) key.keyByte[i] = 0xFF;
 
  byte block;
  MFRC522::StatusCode status;
  byte len;
 
  // Check is the PICC of Classic MIFARE type
  if (piccType != MFRC522::PICC_TYPE_MIFARE_MINI &&  
    piccType != MFRC522::PICC_TYPE_MIFARE_1K &&
    piccType != MFRC522::PICC_TYPE_MIFARE_4K) {
    //Serial.println(F("Your tag is not of type MIFARE Classic."));
    return;
  }
 
  block = 1;
  //Serial.println(F("Authenticating using key A..."));
  status = rfid.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, block, &key, &(rfid.uid));
  if (status != MFRC522::STATUS_OK) {
    //Serial.print(F("PCD_Authenticate() failed: "));
    //Serial.println(rfid.GetStatusCodeName(status));
    return;
  }
  // else Serial.println(F("PCD_Authenticate() success: "));
 
  // RFIDの1blockを読み取るために大きい配列を定義。16+2
  byte buffer_read[18];
  char buffer_char[18];
  status = rfid.MIFARE_Read(block, buffer_read, &len);
  if (status != MFRC522::STATUS_OK) {
    //Serial.print(F("Reading failed: "));
    //Serial.println(rfid.GetStatusCodeName(status));
    return;
  }
 
  // byte型をchar型に変換してStringインスタンス作成
  strcpy((char *)buffer_char,buffer_read);
  String get_string = String(buffer_char);