Как сравнить блок секторов в RFID

Yer
Offline
Зарегистрирован: 12.02.2016

Здравтсвуйте всем, пробовал читать данные с RFID брелков и изменять определенные блок секторов.

Теперь хочу поставить замок который срабатывает при совпадении блок секторам а не UID коду.Кто сталкивался поделитесь опытом если имеется такой скетч 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Блин, ну какой Вам ещё скетч нужен? Как два числа сравнить? Читайте и сравнивайте побайтно. В чём проблема-то?

Yer
Offline
Зарегистрирован: 12.02.2016

Я записал данные в первый сектор 4 блок, а как его читать и сравнивать с текуюшей картой не знаю как

Вот скетч который записал данные в брелок:

#include <SPI.h>
#include <MFRC522.h>
#define RST_PIN         9           
#define SS_PIN          10          

MFRC522 mfrc522(SS_PIN, RST_PIN);   
MFRC522::MIFARE_Key key;

void setup() {
    Serial.begin(9600); 
    while (!Serial);    
    SPI.begin();        
    mfrc522.PCD_Init(); 

    // Подготовим ключ
    // используем ключ FFFFFFFFFFFFh который является стандартом для пустых карт
    for (byte i = 0; i < 6; i++) {
        key.keyByte[i] = 0xFF;
    }

    Serial.println(F("Scan a MIFARE Classic PICC to demonstrate read and write."));
    Serial.print(F("Using key (for A and B):"));
    dump_byte_array(key.keyByte, MFRC522::MF_KEY_SIZE);
    Serial.println();
    
    Serial.println(F("BEWARE: Data will be written to the PICC, in sector #1"));
}

void loop() {
    // Ждем новую карту
    if ( ! mfrc522.PICC_IsNewCardPresent())
        return;

    // Выбираем одну из карт
    if ( ! mfrc522.PICC_ReadCardSerial())
        return;

    // Показываем подробности карты
    Serial.print(F("Card UID:"));
    dump_byte_array(mfrc522.uid.uidByte, mfrc522.uid.size);
    Serial.println();
    Serial.print(F("PICC type: "));
    byte piccType = mfrc522.PICC_GetType(mfrc522.uid.sak);
    Serial.println(mfrc522.PICC_GetTypeName(piccType));

    // Проверяем совместимость
    if (    piccType != MFRC522::PICC_TYPE_MIFARE_MINI
        &&  piccType != MFRC522::PICC_TYPE_MIFARE_1K
        &&  piccType != MFRC522::PICC_TYPE_MIFARE_4K) {
        Serial.println(F("This sample only works with MIFARE Classic cards."));
        return;
    }

    // В этом примере мы используем первый сектор данных карты, блок 4
    byte sector         = 1;
    byte blockAddr      = 4;
    byte dataBlock[]    = { // Данные, которые мы запишем на карту
        0x01, 0x02, 0x03, 0x04, //  1,  2,   3,  4,
        0x05, 0x06, 0x07, 0x08, //  5,  6,   7,  8,
        0x09, 0x0A, 0x0B, 0x0c, //  9, 10, 11, 12,
        0x0d, 0x0e, 0x0f, 0x10  // 13, 14,  15, 16
    };
    byte trailerBlock   = 7;
    byte status;
    byte buffer[18];
    byte size = sizeof(buffer);

    // Аутентификация
    Serial.println(F("Authenticating using key A..."));
    status = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, trailerBlock, &key, &(mfrc522.uid));
    if (status != MFRC522::STATUS_OK) {
        Serial.print(F("PCD_Authenticate() failed: "));
        Serial.println(mfrc522.GetStatusCodeName(status));
        return;
    }

    // Показываем текущие данные сектора
    Serial.println(F("Current data in sector:"));
    mfrc522.PICC_DumpMifareClassicSectorToSerial(&(mfrc522.uid), &key, sector);
    Serial.println();

    // Читаем данные из блока
    Serial.print(F("Reading data from block ")); Serial.print(blockAddr);
    Serial.println(F(" ..."));
    status = mfrc522.MIFARE_Read(blockAddr, buffer, &size);
    if (status != MFRC522::STATUS_OK) {
        Serial.print(F("MIFARE_Read() failed: "));
        Serial.println(mfrc522.GetStatusCodeName(status));
    }
    Serial.print(F("Data in block ")); Serial.print(blockAddr); Serial.println(F(":"));
    dump_byte_array(buffer, 16); Serial.println();
    Serial.println();

    // Аутентификация
    Serial.println(F("Authenticating again using key B..."));
    status = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_B, trailerBlock, &key, &(mfrc522.uid));
    if (status != MFRC522::STATUS_OK) {
        Serial.print(F("PCD_Authenticate() failed: "));
        Serial.println(mfrc522.GetStatusCodeName(status));
        return;
    }

    // Записываем данные в блок
    Serial.print(F("Writing data into block ")); Serial.print(blockAddr);
    Serial.println(F(" ..."));
    dump_byte_array(dataBlock, 16); Serial.println();
    status = mfrc522.MIFARE_Write(blockAddr, dataBlock, 16);
    if (status != MFRC522::STATUS_OK) {
        Serial.print(F("MIFARE_Write() failed: "));
        Serial.println(mfrc522.GetStatusCodeName(status));
    }
    Serial.println();

    // Читаем данные снова, чтобы проверить, что запись прошла успешно
    Serial.print(F("Reading data from block ")); Serial.print(blockAddr);
    Serial.println(F(" ..."));
    status = mfrc522.MIFARE_Read(blockAddr, buffer, &size);
    if (status != MFRC522::STATUS_OK) {
        Serial.print(F("MIFARE_Read() failed: "));
        Serial.println(mfrc522.GetStatusCodeName(status));
    }
    Serial.print(F("Data in block ")); Serial.print(blockAddr); Serial.println(F(":"));
    dump_byte_array(buffer, 16); Serial.println();
       
    Serial.println(F("Checking result..."));
    byte count = 0;
    for (byte i = 0; i < 16; i++) {
        if (buffer[i] == dataBlock[i])
            count++;
    }
    Serial.print(F("Number of bytes that match = ")); Serial.println(count);
    if (count == 16) {
        Serial.println(F("Success :-)"));
    } else {
        Serial.println(F("Failure, no match :-("));
        Serial.println(F("  perhaps the write didn't work properly..."));
    }
    Serial.println();
        
    // Выводим данные
    Serial.println(F("Current data in sector:"));
    mfrc522.PICC_DumpMifareClassicSectorToSerial(&(mfrc522.uid), &key, sector);
    Serial.println();

    mfrc522.PICC_HaltA();
    mfrc522.PCD_StopCrypto1();
}

void dump_byte_array(byte *buffer, byte bufferSize) {
    for (byte i = 0; i < bufferSize; i++) {
        Serial.print(buffer[i] < 0x10 ? " 0" : " ");
        Serial.print(buffer[i], HEX);
    }
}

 

b707
Offline
Зарегистрирован: 26.05.2017

Yer пишет:

Я записал данные в первый сектор 4 блок, а как его читать и сравнивать с текуюшей картой не знаю как

Yer, вам сколько лет-то? 12? Детский сад какой-то

У вас. В ВАШЕМ ЖЕ скетче!!!!! есть и чтение данных из блока. и сравнение их с ранее сохраненными.

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Yer пишет:

как его читать 

строки 85 и 117

Yer пишет:

и сравнивать 

строки 125-130 ...

того самого скетча, который Вы где-то взяли и в котором не понимаете ни строчки, и даже не в состоянии прочитать написанные по-русски комментарии.

Вы уже полтора года "ардуините" - научитесь наконец хотя бы азам программирования. Неужели самому комфортно скачивать непонятные "иероглифы", вгружать их и каждый раз гадать "заработает - не заработает"?

 

Yer
Offline
Зарегистрирован: 12.02.2016

Спасибо что откликнулись, ну никак не могу вникнуть как происходит чтение и запись на RFID. Описание где можно найти какие команды за что отвечают более подробно узнать про RFID заранее спасибо!

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Да, не про RFID Вам надо читать. Читайте для начала про язык программирования - Вы же ни одной буквы в программе не понимаете.

Yer
Offline
Зарегистрирован: 12.02.2016

Можете обяснить как понять вот этот код в скетче: mfrc522.PICC_GetType(mfrc522.uid.sak)

оно нигде не обявляется и каким образом можно понять если оно не обявляется  

b707
Offline
Зарегистрирован: 26.05.2017

Yer пишет:

Можете обяснить как понять вот этот код в скетче: mfrc522.PICC_GetType(mfrc522.uid.sak) оно нигде не обявляется и каким образом можно понять если оно не обявляется  

Это метод библиотеки MFRC522, он обьявляется в файле MFRC522.h, который вы подключаете в самом начале своего скетча. Смотрите исходный код библиотеки

Yer
Offline
Зарегистрирован: 12.02.2016

Исходный код библиотеки где можно найти 

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

В файле MFRC522.h

b707
Offline
Зарегистрирован: 26.05.2017

Yer пишет:

Исходный код библиотеки где можно найти 

Если у вас эти скетчи компилируются - значит библиотека есть на вашем компе. Либо в системной папке Arduino, либо в вашей пользовательской (простите, не могу сейчас сказать точные пути, на работе у меня ардуина не установлена)

Yer
Offline
Зарегистрирован: 12.02.2016

Открыл библиотеку RFID через атмел студио 

b707
Offline
Зарегистрирован: 26.05.2017

Yer пишет:

Открыл библиотеку RFID через атмел студио 

вот вас колбасит-то... Если вы знаете, что такое атмел студио, почему ж вопросы такие тупые....

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

b707 пишет:

Если вы знаете, что такое атмел студио, почему ж вопросы такие тупые....

А чего там острого - скачать, да поставить? :)

b707
Offline
Зарегистрирован: 26.05.2017

ЕвгенийП пишет:

b707 пишет:

Если вы знаете, что такое атмел студио, почему ж вопросы такие тупые....

А чего там острого - скачать, да поставить? :)

а нафига? без знания Си в ней вообще ничего не получится, это ж не ардуина

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

b707 пишет:

а нафига?

1. cлышал на форуме, что это круто;
2. есть слабая надежда, что там окажется "application wizard", который сам программы делает
3. зуд заниматься МК есть, а читать Кернигана и Ритчи неохота (скучно и "работать надо") - а тут вроде активность, зуд утихает.

Yer
Offline
Зарегистрирован: 12.02.2016

С атмел студии недавно начал работать. Пробовал таймеры включать,узнал как нужно расчитовать частоту мк и настроит таймер.Все примеры на атмел студио видел в ютубе,теорию закреплял с практикой. Теперь нужно было сделать замок по RFID а в ютубе нету тем более в атмел студио. Нашел только в ардуино готовые скетчи поэтому не могу понять коды команды откуда берутся за что отвечают  

b707
Offline
Зарегистрирован: 26.05.2017

Yer пишет:

С атмел студии недавно начал работать. Пробовал таймеры включать,узнал как нужно расчитовать частоту мк и настроит таймер.Все примеры на атмел студио видел в ютубе,теорию закреплял с практикой. Теперь нужно было сделать замок по RFID а в ютубе нету тем более в атмел студио. Нашел только в ардуино готовые скетчи поэтому не могу понять коды команды откуда берутся за что отвечают  

книжки читать не пробовали? изучать программирование (да вообще что-либо интеллектуальное) по ютубу - это, знаете ли, диагноз....

Yer
Offline
Зарегистрирован: 12.02.2016

Не подскажите именно какие книжки поможет по освоению программирование мк.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Yer, нет такого понятия "программирование МК". Вернее, есть, но на совсем другом уровне. А так как Вы это используете - это примерно как "вождение жигулей". Либо человек водит машину, либо нет, а так, что водит жигули, а "фокус" - нет - не бывает. Вы уже второй раз подобную чущь заявляете, то Вам дай почитать про РФИД, то про программирование МК. Поймите Вы, наконец, Вы ещё не доросли до книг по специфике программирования МК. Вы видите опреацию сравнения и прашиваете "а как сравнивать?". Читайте просто книги по программированию, просто книги по С. Чтобы Вы, наконец не спашивали здесь как два числа сравнить. А МК и рфиды сами придут.

 

Yer
Offline
Зарегистрирован: 12.02.2016

Спасибо что ответили, может я не правильно задал вопрос как сравнить два числа имеется ввиду нужно взять с кароточки данные блоков секторов а именно с первого сектора четвертого блока и сравнить который записан в еепром если совпадает доступ открыт если нет доступ закрыт. По UID коду у меня получилось но нужно сравнивать по секторам вот какая задача стояла а не тупо просто сравнивать два числа

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Yer пишет:

нужно сравнивать по секторам вот какая задача стояла а не тупо просто сравнивать два числа

Это как раз то, о чём я говорю. Ваши сектора состоят из байтов (чисел) и эти числа нужно просто сравнить в цикле. Более того, это сравнение ЕСТЬ в Вашем коде и я Вам даже написал в каких именно строках. Но даже это не помогло. И не помогло не потому, что Вы не знаете чего-то про РФИД или про МК, а потом, что просто не понимаете. что написано в программе. Учитесь программировать. А когда научитесь. Вам будет по барабану что там - рфид, МК или, прости господи, BLDC, как умеющему водить машину всё равно что вести, жигули, запор или тойоту. Вы понимаете, о чём я вообще говорю?

Yer
Offline
Зарегистрирован: 12.02.2016

ок, понял 

Yer
Offline
Зарегистрирован: 12.02.2016

Здравствуйте ,немножко переделал скетч. Принцип такой когда ставлю ключ на последний значение last записываю 100 и при каждом считование отнимаю на одно значение когда  значение last меньше 95 включает 6 выход на 7 секунд.Но когда савлю другой ключ он туда ж записывает то значение который сохранился на первом ключе а того мне не надо.Мне нужно чтобы определился последние значение и сравнивался с уставкой 

Yer
Offline
Зарегистрирован: 12.02.2016
#include <EEPROM.h>
#include <SPI.h>
#include <MFRC522.h>
#define RST_PIN         9           
#define SS_PIN          10          
  byte last=100;
MFRC522 mfrc522(SS_PIN, RST_PIN);   
MFRC522::MIFARE_Key key;

void setup() {
    Serial.begin(9600); 
    while (!Serial);    
    SPI.begin();        
    mfrc522.PCD_Init(); 
 pinMode(6, OUTPUT);
  digitalWrite(6, LOW);
    // Подготовим ключ
    // используем ключ FFFFFFFFFFFFh который является стандартом для пустых карт
    for (byte i = 0; i < 6; i++) {
        key.keyByte[i] = 0xFF;
    }

    Serial.println(F("Scan a MIFARE Classic PICC to demonstrate read and write."));
    Serial.print(F("Using key (for A and B):"));
    dump_byte_array(key.keyByte, MFRC522::MF_KEY_SIZE);
    Serial.println();
    
    Serial.println(F("BEWARE: Data will be written to the PICC, in sector #1"));
}

void loop() {
    // Ждем новую карту
    if ( ! mfrc522.PICC_IsNewCardPresent())
        return;

    // Выбираем одну из карт
    if ( ! mfrc522.PICC_ReadCardSerial())
        return;

    // Показываем подробности карты
    Serial.print(F("Card UID:"));
    dump_byte_array(mfrc522.uid.uidByte, mfrc522.uid.size);
    Serial.println();
    Serial.print(F("PICC type: "));
    byte piccType = mfrc522.PICC_GetType(mfrc522.uid.sak);
    Serial.println(mfrc522.PICC_GetTypeName(piccType));

    // Проверяем совместимость
    if (    piccType != MFRC522::PICC_TYPE_MIFARE_MINI
        &&  piccType != MFRC522::PICC_TYPE_MIFARE_1K
        &&  piccType != MFRC522::PICC_TYPE_MIFARE_4K) {
        Serial.println(F("This sample only works with MIFARE Classic cards."));
        return;
    }

    // В этом примере мы используем первый сектор данных карты, блок 4
    byte sector         = 1;
    byte blockAddr      = 4;
    byte dataBlock[]    = { // Данные, которые мы запишем на карту
        0x01, 0x02, 0x03, 0x04, //  1,  2,   3,  4,
        0x05, 0x06, 0x07, 0x08, //  5,  6,   7,  8,
        0x09, 0x0A, 0x0B, 0x0c, //  9, 10, 11, 12,
        0x0d, 0x0e, 0x0f, last  // 13, 14,  15, 16
    };
    byte trailerBlock   = 7;
    byte status;
    byte buffer[18];
    byte size = sizeof(buffer);

    // Аутентификация
    Serial.println(F("Authenticating using key A..."));
    status = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, trailerBlock, &key, &(mfrc522.uid));
    if (status != MFRC522::STATUS_OK) {
        Serial.print(F("PCD_Authenticate() failed: "));
        Serial.println(mfrc522.GetStatusCodeName(status));
        return;
    }

    // Показываем текущие данные сектора
    Serial.println(F("Current data in sector:"));
    mfrc522.PICC_DumpMifareClassicSectorToSerial(&(mfrc522.uid), &key, sector);
    Serial.println();

    // Читаем данные из блока
    Serial.print(F("Reading data from block ")); Serial.print(blockAddr);
    Serial.println(F(" ..."));
    status = mfrc522.MIFARE_Read(blockAddr, buffer, &size);
    if (status != MFRC522::STATUS_OK) {
        Serial.print(F("MIFARE_Read() failed: "));
        Serial.println(mfrc522.GetStatusCodeName(status));
    }
    Serial.print(F("Data in block ")); Serial.print(blockAddr); Serial.println(F(":"));
    dump_byte_array(buffer, 16); Serial.println();
    Serial.println();

    // Аутентификация
    Serial.println(F("Authenticating again using key B..."));
    status = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_B, trailerBlock, &key, &(mfrc522.uid));
    if (status != MFRC522::STATUS_OK) {
        Serial.print(F("PCD_Authenticate() failed: "));
        Serial.println(mfrc522.GetStatusCodeName(status));
        return;
    }

    // Записываем данные в блок
    Serial.print(F("Writing data into block ")); Serial.print(blockAddr);
    Serial.println(F(" ..."));
    dump_byte_array(dataBlock, 16); Serial.println();
    status = mfrc522.MIFARE_Write(blockAddr, dataBlock, 16);
    if (status != MFRC522::STATUS_OK) {
        Serial.print(F("MIFARE_Write() failed: "));
        Serial.println(mfrc522.GetStatusCodeName(status));
    }
    Serial.println();

    // Читаем данные снова, чтобы проверить, что запись прошла успешно
    Serial.print(F("Reading data from block ")); Serial.print(blockAddr);
    Serial.println(F(" ..."));
    status = mfrc522.MIFARE_Read(blockAddr, buffer, &size);
    if (status != MFRC522::STATUS_OK) {
        Serial.print(F("MIFARE_Read() failed: "));
        Serial.println(mfrc522.GetStatusCodeName(status));
    }
    Serial.print(F("Data in block ")); Serial.print(blockAddr); Serial.println(F(":"));
    dump_byte_array(buffer, 16); Serial.println();
       
    Serial.println(F("Checking result..."));
    byte count = 0;
    for (byte i = 0; i < 16; i++) {
        if (buffer[i] == dataBlock[i])
            count++;
    }
    Serial.print(F("Number of bytes that match = ")); Serial.println(count);
    if (count == 16) {
        Serial.println(F("Success :-)"));
        last=last-1;
        if (last < 95 )
       { digitalWrite(6, HIGH);
       delay(7000);
       digitalWrite(6, LOW); 
         }
    } else {
        Serial.println(F("Failure, no match :-("));
        Serial.println(F("  perhaps the write didn't work properly..."));
    }
    Serial.println();
        
    // Выводим данные
    Serial.println(F("Current data in sector:"));
    mfrc522.PICC_DumpMifareClassicSectorToSerial(&(mfrc522.uid), &key, sector);
    Serial.println();

    mfrc522.PICC_HaltA();
    mfrc522.PCD_StopCrypto1();
}

void dump_byte_array(byte *buffer, byte bufferSize) {
    for (byte i = 0; i < bufferSize; i++) {
        Serial.print(buffer[i] < 0x10 ? " 0" : " ");
        Serial.print(buffer[i], HEX);
    }
}