树莓派之RFID

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

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值