RFID 卡片型号及卡号获取 | 学习笔记

简介: 快速学习 RFID 卡片型号及卡号获取

开发者学堂课程【嵌入式之 RFID 开发与应用2020版:RFID 卡片型号及卡号获取】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/665/detail/11121


RFID 卡片型号及卡号获取

内容介绍:

一、RFID 协议工作状态

二、读取 ID

三、卡的型号

四、卡号

五、写入卡片的内容

 

接下来看它到底读到了什么样的类型的数据以及读到了些类型的数据之后,不同的卡类型是不一样的,所以 rfid_carda_request 函数主要是完成的是寻卡操作。寻卡表示已经跟卡建立起了通信关系,就是卡已经处于 ready 状态。

 

一、RFID 协议工作状态

image.png

工作状态包括上电、复位、寻卡、read,read 以后就可以读取 ID。ID 跟类型是不一样的,ID 跟类型是不一样的。先来看一下 ID,然后再去看怎么样去读取卡号。

 

二、读取 ID

进到第二个代码里面去看一下,先进行编译

[ root@qfedu 01_rfid_id] #cd ..

[root@qfedu rfid]#ls

01_rfid id  02_rfid readID   03_rfid_ Rw_block  04_rfid_inc_dec

[root@qfedu rfid]#cd 02_rfid_readID/

[root@qfedu 02_rfid_readID]#ls

Makefile                  rfid lib.h

Untitled Project.si4project  rfid lib.odemo

Demo                    uart _init.c      

main.                    uart_init.h

main.o                  uart init.o

rfid lib.c

[ root@qfedu 02_rfid_readID]#. / demo

version=88

1.白卡

首先看一下,拿了一张白卡贴上去

[ root@qfedu 02_ rfid readID]#. /demo

version=88

type = 0x0400

card ID:0x34 0xa9 0xa5 0x4d

image.png

可以看到明显情况了很多,贴上去之后在没有离开之前,那么它只打印了一个卡号和 ID,其它都没有多余的,它不像刚才在不断的输出一堆信息,是有问题的。其实,它的类型是 0400。那么 0400 代表的是 mifare_ones50 卡。

2.公交卡

再换一个公交再看一下。

type = 0x0800

card ID:0x43 0xe2 0x2f 0x4f

image.png

0800 属于 pro 卡,由于代码里面没有没有身份证,它不能读取 B 类卡,所以只能演示两个。

 

三、卡的型号

0x0400 ,Mi fare_ One (S50)

0x0800 ,Mifare Pro (x)

0x4400, 0x0200, 0x4403

类似于还有很多卡的型号,卡片肯定是有很多型号的,因为市场是很庞大的,种类也是繁多的大概了解一下。

 

四、卡号

卡号是需要通过防冲撞去获取,防冲撞指的是比如说两张卡或者多张卡,比如图中就有三张卡。

image.png

同时贴上去到底去读取哪一个就会很麻烦,所以说必须要通过防冲撞之后才能读到它想要的卡号。防冲撞其实就是串行读取,它的算法的话比较常用,算法特别的多,在实际的应用当中的话,有曼切斯特编码是用的比较多的,还有米乐码之类的非常多。它的些编码主要目的一个是为了安全,另外一个它是为了高效。

接下来看一下怎么通过进行防冲撞读取卡号,

reg_ clr _bit(Status2Reg, ex08);//清除加密位

reg_ set(BitF ramingReg, 0x00);

reg_ c1r bit (Col1Reg,

0x80); //发生冲突位之后的所有的接收位被清除

buf[0] = PICC_ ANTICOLLI; //s50 卡, 4 字节,级联为 1

buf[1j = 0x20;// 国金融集成电路( IC )卡规范-与应用无关的非接触式规范p28

status = rfid_ cmd(PCD_ TRANSCEIVE, buf, 2, buf, &1en);

if(status == CMD_ SUCCESS){

for(i=0; i<4; i++){

*(card_ _num+i) = buf[i];

snr_ check^= buf[i];

}

增加另一个指令叫 picc,这条指令是针对卡的操作,#define PICC ANTICOLL 0x93 / /防冲撞

指令值的话是 93,防冲撞获取卡有两种方式,93 95 都是支持的,93 是属于级联为 1 的防冲撞获取卡号。

第二个是 buf[1] = ex20;/,附带一个参数,参数的作用需要去参考做中国金融集成电路的规范,里面有解释。

 

五、写入卡片的内容

rfid_ carda_ init();

while(1){

ret = rfid_ carda_ request(PICC_ REQALL, type); .

if(ret == 0K){

printf("type = 0x%02x%02x\n", type[0],type[1]);

/ /WaitCard0ff() ;

}else continue ;

ret = rfid_ _anticoll(card_ _id);

if(ret == 0K){

printf("card ID:");

for(i=0;i<4;i++)

printf("0x%02x ",card_ _id[i]);

puts("");

WaitCard0ff();

}else continue;

}

return 0;

要写入的卡片的内容,有两个内容,一个是防冲撞获取卡号,另外是它携带的参数两个字节号,PCD_ TRANSCEIVE 参数几乎是不变的,都叫做 TRANSCEIVE 是传输的意思,就是发送并接收数据。总之就是传进去之后它能拿到一个 buf,而 buf 里面,如果说是状态为 success 的话,那么是能得到它的卡号的,把卡号放到card_num 里面。返回就能够把卡的 ID 打印出来。看到卡号之后同时明白了一个道理,就是为什么当刷一次卡,在卡没有离开之前,它并不会连续输出卡号,就是下面的用到的是 WaitCard0ff(); 接口的主要作用其实就是等待卡的离开,如果卡不离开,它会进行阻塞,不会继续往下执行。它的操作其实非常简单, rfid_ carda_ request 就是寻卡指令。

:void WaitCard0ff(、

void)

unsigned char status, TagType[2];

while(1)

{

statusI= rfid_ carda_ request(PICC_ REQALL, TagType);//需 要多次判断才准确

if(status){

status = rfid_ _carda_ request(PICC_ _REQALL, TagType);

if(status){

status = rfid_ carda_ request(PICC_ REQALL, TagType);

if(status)

return;

}

}

usleep(30*1000) ;

}

如果够寻到卡,那就让它循环。那如果寻不到张卡的时候,就进行 return。意思就是没有卡了,可以走了。因为它寻的是所有的卡,所有的卡都不在就可以退出了。调三次是为了提高可靠性。如股票有第一次误判了的话,那还有第二次还有第三次。绝对的保障了卡片不会重复写入,以上就是的第二个代码有关卡的类型和卡的ID 的录取的流程。

相关文章
|
域名解析 网络协议 算法
2022阿里云免费SSL证书申请全过程(图文详解)
阿里云SSL证书免费申请流程:先0元支付SSL证书资源包,每个阿里云账号可以一年可以申请20个免费SSL证书,然后域名DNS验证,提交CA审核后就可以下载SSL证书到本地了
51662 4
2022阿里云免费SSL证书申请全过程(图文详解)
|
3月前
|
存储 供应链 数据可视化
RFID传送带智能采集带来意想不到效果
RFID技术融合传送带,实现物品自动识别、追踪与数据联动,广泛应用于物流、制造、零售、医疗等领域,大幅提升分拣、追溯与管理效率,降低人工错误,推动智能化升级。
|
6月前
|
安全 JavaScript Java
Python中None与NoneType的真相:从单例对象到类型系统的深度解析
本文通过10个真实场景,深入解析Python中表示“空值”的None与NoneType。从单例模式、函数返回值,到类型注解、性能优化,全面揭示None在语言设计与实际编程中的核心作用,帮助开发者正确高效地处理“无值”状态,写出更健壮、清晰的Python代码。
651 3
|
6月前
|
存储 边缘计算 物联网
RFID技术是如何让仓库实现无人化管理?
RFID技术通过自动识别、实时数据交互和智能调度,实现仓库无人化管理。结合物联网与自动化设备,RFID可完成无人出入库、盘点、分拣与货位管理,提升效率、降低成本,广泛应用于电商、制造、冷链等领域,是智能仓储的核心支撑技术。
|
8月前
|
NoSQL 测试技术 Redis
Redis批量删除Key的三种方式
Redis批量删除Key是优化数据库性能的重要操作,本文介绍三种高效方法:1) 使用通配符匹配(KEYS/SCAN+DEL),适合不同数据规模;2) Lua脚本实现原子化删除,适用于需要事务保障的场景;3) 管道批量处理提升效率。根据实际需求选择合适方案,注意操作不可逆,建议先备份数据,避免内存溢出或阻塞。
|
存储 安全 API
基于FreeRTOS中的串口不定长接收(使用队列进行数据传输)
基于FreeRTOS中的串口不定长接收(使用队列进行数据传输)
1861 0
|
机器学习/深度学习 数据挖掘 TensorFlow
使用Python实现深度学习模型:智能农业与精准农业技术
【7月更文挑战第28天】 使用Python实现深度学习模型:智能农业与精准农业技术
379 9
|
11月前
|
供应链 JavaScript 前端开发
TreeSize:免费的磁盘清理与管理神器,解决C盘爆满的燃眉之急
博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
设计模式 安全 数据库连接
【C++11】包装器:深入解析与实现技巧
本文深入探讨了C++中包装器的定义、实现方式及其应用。包装器通过封装底层细节,提供更简洁、易用的接口,常用于资源管理、接口封装和类型安全。文章详细介绍了使用RAII、智能指针、模板等技术实现包装器的方法,并通过多个案例分析展示了其在实际开发中的应用。最后,讨论了性能优化策略,帮助开发者编写高效、可靠的C++代码。
409 2
|
Ubuntu 安全 网络协议