RFID这个原理我就不讲了,详细的自己去看网蜂科技的RFID讲的很详细
主要讲一讲如何区使用mfrc522去区分复制卡(UID卡和M1卡)
UID卡可以完美复制M1卡,所以区分UID卡和M1卡的时候,只能根据UID卡可以更改卡号的这个特性去判断UID卡和MI卡
Sent bits: 26 (7 bits) //寻卡 0x26 / 0x52 都可以
Received bits: 04 00
Sent bits: 93 20 //防碰撞
Received bits: 01 23 45 67 00
Sent bits: 93 70 01 23 45 67 00 d0 6f //选卡
Received bits: 08 b6 dd (SAK)
(不可以进行3轮认证,不然后门打不开)
好,重点來了,
Sent bits: 50 00 57 cd //休眠,50 00 就是 PcdHalt()
Sent bits: 40 (7 bits) (特殊指令)//开后门第一条指令,要设定 BitFramingReg 使传送 7 个位元,必须要 7 个
eceived bits: a (4 bits)
Sent bits: 43 (特殊指令)//开后门二条指令
Received bits: 0a
Sent bits: a0 00 5f b1 //正常的写区块第一次交握
Received bits: 0a
Sent bits: 00 dc 44 20 b8 08 04 00 46 59 25 58 49 10 23 02 c0 10 //正常的写 block 0 资料
Received bits: 0a
重點就是要:
1. 不可以進行 3 Pass Authenticaiton
2. 发 PcdHalt()
3. 发 0x40 in 7-bit
4. 发 0x43
int uid_hanshu()
{
char status;
unsigned char ulen;
unsigned char zhilin1[1]={0x40};
unsigned char zhilin2[1]={0x43};
unsigned char test_num[2]={0xa0,0x00};
unsigned char rfid_num[16]={0xf2,0x7b,0x24,0x3c,
0x91,0x08,0x04,0x00,
0x01,0x6f,0x01,0x6d,
0x45,0x68,0xf8,0x1d };
unsigned char card_num[4];
unsigned char buff[3];
unsigned char s;//读出2个字节数据TagType--卡片类型代码
unsigned char card_type[2];
unsigned char typeIC[2];
unsigned char card_num22[2]={0x00,0x00}; //M1卡
unsigned char card_num23[2]={0x0a,0x0a}; //UID卡
status=PcdRequest(0x52,&s); //搜索卡片类型
status=PcdAnticoll(card_num); //读卡号
status=PcdSelect(card_num); //选卡
status=PcdHalt();//休眠
setBitMask(BitFramingReg, 0x87);
status=PcdComMF522(PCD_TRANSCEIVE,zhilin1,1,buff,&ulen);
printf("tesu zhilin1\n%x\n",buff[0]);
card_type[0]=buff[0];
setBitMask(BitFramingReg, 0x80);
status=PcdComMF522(PCD_TRANSCEIVE,zhilin2,1,buff,&ulen);
printf("tesu zhilin2\n%x\n",buff[0]);
card_type[1]=buff[0];
CalulateCRC(test_num,2,&test_num[2]);
status=PcdComMF522(PCD_TRANSCEIVE,test_num,4,buff,&ulen);
printf("tesu zhilin3\n%x\n",buff[0]);
typeIC[1]=buff[0];
CalulateCRC(rfid_num,16,&rfid_num[16]);
status=PcdComMF522(PCD_TRANSCEIVE,rfid_num,18,buff,&ulen);
printf("tesu zhilin4\n%x\n",buff[0]);
typeIC[2]=buff[0];
if(memcmp(card_type,card_num22,2)==0)
{
printf("\nM1 card\n");
return 1;
}
if(memcmp(card_type,card_num23,2)==0)
{
printf("\nUID card\n");
return 0;
}
return 0;
}
这里使用的环境是树莓派加RFID (使用的是树莓派的辅助SPI)
P1-38(MOSI) –MOSI
P1-35(MISO) –MISO
P1-40(CLK) –SCK
P1-36(CE2) – SDA
也可以直接 git clone https://github.com/UAVmlxh/rfid.git