rfid IC卡
先了解IC卡一些前置知识。
首先我们会有一张ic卡(M1类型IC卡,一般买到的都是1K存储空间),在rc522代码中会出现这个,就是对IC卡进行检查PICC_TYPE_MIFARE_4K
和PICC_TYPE_MIFARE_1K
就是一种卡片类型不同大小
//检查兼容性
if (piccType != MFRC522::PICC_TYPE_MIFARE_MINI && piccType != MFRC522::PICC_TYPE_MIFARE_1K && piccType != MFRC522::PICC_TYPE_MIFARE_4K)
{
Serial.println("无效卡!");
return;
}
RC522模块就是阅读器天线以及处理器和寄存器,这些不是写代码关注的重点。
在使用arduinoIDE+esp32 的MFrc522库中,尽管他没有写支持esp32,但是在MFrc522 V2库中SPI的连线可以作用在MFrc522中
SPI的连线是根据ESP32引脚功能来设置的,但是有文章说可以通过SPI来自己自定义设置(库作者没有提供定义的功能),读者可以自行设置
IC卡内部空间
一个ic的存储结构就是上面的样子,而我们在读取ic卡会选取一个扇区,这个扇区中设置的密钥可以用于ic卡的验证,而ic卡总共有16个,这样可以为一个IC卡提供多个功能,实现一卡多用
同时每个扇区还有其他存储尚未使用,这些存储区可以为IC卡功能分类提供有利的标识,以及权限的标识
读取扇区代码分析
1.读取指定扇区的内容
status = (MFRC522::StatusCode)mfrc522.MIFARE_Read(blockAddr, buffer, &size);
三个参数:1.blockAddr
,要读取扇区号
2.buffer
,自行设置缓冲区(将IC卡扇区中读取的数据放入的地方)
3.size
,读取数据大小
返回值:status,操作状态码,判断条件可以看内容3
2.将内容写入扇区
status = mfrc522.MIFARE_Write(blockAddr, buffer, 16);
三个参数:1.blockAddr
,要写入扇区号
2.buffer
,自行设置缓冲区
3.size
,读取数据大小
返回值:status,操作状态码,判断条件可以看内容3
3.判断写入或者读取操作是否成功
if (status != MFRC522::STATUS_OK)
{
Serial.print("写入失败:");
Serial.println(mfrc522.GetStatusCodeName(status)); //打印错误码
return;
}
4.用密钥进行卡片验证
status= (MFRC522::StatusCode)mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, blockAddr, &keyA, &(mfrc522.uid));
三个参数:1.PICC_CMD_MF_AUTH_KEY_A
,使用密钥A位置进行验证
2.blockAddr
,扇区号
3.keyA
,密钥A
4.mfrc522.uid
,uid号UID是用户身份证明(User Identification)的缩写,是每一个卡片的唯一有效识别编码。
返回值:status,操作状态码
卡片密钥(可以自行搜索):
//准备卡片密钥A,B
MFRC522::MIFARE_Key keyA;
MFRC522::MIFARE_Key keyB;
byte KEYA[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; //密钥A
byte KEYB[6] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; //密钥B
如果这个扇区没有经过密钥的解锁是没办法读取的,有兴趣的可以了解一下IC卡的破译(比如说水卡,一些门禁的验证)。
大致上面的函数就能完成我们的基本的需求了,一些功能的完成,使用这三个函数就足够了
整体代码以及其他内容,可以参考这个作者的其他文章,他的内容比较详细一点
会飞的豹豹豹 https://www.bilibili.com/read/cv18457914?spm_id_from=…0.0
出处:bilibili