RC522射频卡模块与IC卡完成充值消费查询的技术实现思路
本文分享自华为云社区《鍗庝负浜戣鍧沖浜戣绠楄鍧沖寮鍙戣呰鍧沖鎶鏈鍧鍗庝负浜》,作者:DS小龙哥。一、IC卡介绍
常用的IC卡一般是M1卡,也称为S50卡,购买RC522刷卡模块送的白卡,蓝色钥匙扣、公交卡、地铁卡都是S50卡。S50卡内部有16个分区,每分区有AB两组密码,总容量为8Kbit。
第0个扇区第0块用于存放厂商代码,意见固话,不可更改。
每个扇区的块0、块1、块2为数据块,可以用于存储数据。数据块可以进行读写操作。
每个扇区的块3为控制块,包括了密码A、存储控制、密码B。具体结构如下:
每个扇区的密码和控制位都是独立的,可以根据实际需求设定各自的密码及存取控制。存取控制为4个字节,共32位,扇区中的每个块(包括数据和控制块)存取条件是由密码和存取控制共同决定的,在存取控制中每个块都有一个相应的三个控制位。
重点总结:
(1)M1卡分为16个扇区,每个扇区由4块(0、1、2、3)组成。在实际操作时,将16个扇区分为64个块,按绝对地址编号为063进行访问,也就是程序里需要填块的位置时,范围是063。
(2)每个块的大小是16字节,每个扇区里有3个数据块,数据块可以存放自己的自定义数据。二、一卡通消费机实现原理2。1封装核心函数
(1)主要的硬件:单片机选择STM32,刷卡模块采用RC522。
(2)实现核心思路:为了方便存储数据,对数据进行管理,保证程序的通用性,将IC卡的所有信息都存放在IC卡上。包括:激活状态、卡所属人信息,金额等。
所以在程序里定义了一个结构体:pragmapack(1)这个结构体大小为16个字节,刚好存放到IC卡的一个块里面typedefstructCARDINFO{u8stat;卡状态。66表示此卡已经激活其他值表示此卡未激活88表示此卡挂失,无法再进行消费u32money;金额。第一次激活卡,就将金额清0u8phone〔11〕;可以存放电话号码,ID,标识符之类的数据}CARD;externu8ICCarduid〔4〕;
并封装了两个底层函数:接下来的所有对卡的操作只需要调用下面函数即可。读取卡号u8ICCarduid〔4〕;carduid:卡的id号外部5字节数组data:读出来的一个块,16字节数据addr:块号,从4开始数据存放的地址。每个扇区的0、1、2块是存放数据。3是存放密码。一般填:0、1、2、4、5、6、8、9、10数据一般格式:u8SJ〔16〕{255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255};写入的金额;u8ICCardRead(CARDrdata){u8KEY〔6〕{0xff,0xff,0xff,0xff,0xff,0xff};白卡的出厂密码u8status;1。寻卡statussearchcard(ICCarduid);2。验证卡密码if(MIOKstatus){printCardNnmber(ICCarduid);statusRC522PcdAuthState(PICCAUTHENT1A,3,KEY,ICCarduid);验证卡片密码形参参数:验证方式,块地址,密码,卡序列号}3。读出数据if(MIOKstatus){statusRC522PcdRead(1,(u8)rdata);从第addr块读出数据值。}returnstatus;}功能:写数据到指定块参数:u8addr:数据存放的地址。每个扇区的0、1、2块是存放数据。3是存放密码。一般填:0、1、2、4、5、6、8、9、10数据一般格式:u8SJ〔16〕{255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255};写入的金额;u8ICCardWrite(CARDwdata){u8KEY〔6〕{0xff,0xff,0xff,0xff,0xff,0xff};白卡的出厂密码u8status;1。寻卡statussearchcard(ICCarduid);2。验证卡密码if(MIOKstatus){statusRC522PcdAuthState(PICCAUTHENT1A,3,KEY,ICCarduid);验证卡片密码形参参数:验证方式,块地址,密码,卡序列号}3。写数据到卡if(MIOKstatus){statusRC522PcdWrite(1,(u8)wdata);写数据到第addr块,data入的数据值。}returnstatus;}2。2编写案例接口
为了方便理解整体的设计思路,下面针对几个常见的操作编写了函数接口测试Demo。voidActivationCardInformation(void);对卡激活将卡状态设置为66voidUnlockCardInformation(void);对卡解锁去除挂失状态。将卡状态设置为66voidlockingCardInformation(void);对卡挂失。将卡状态设置为88voidConsumptionCardInformation(void);消费。消费就是减少金额。voidRechargeCardInformation(void);对卡进行充值。充值就是累加金额voidQueryCardInformation(void);查询卡的详细信息,通过串口打印
源代码如下:includeapp。h函数功能:查询卡的详细信息,通过串口打印voidQueryCardInformation(){CARDdata;if(ICCardRead(data)MIOK){判断卡是否已经激活if(data。stat66){printf(用户信息:sr,data。phone);printf(余额:dr,data。money);}elseif(data。stat88){printf(此卡已挂失。请先解锁。r);}卡没有激活else{printf(此卡没有激活。r);}复位释放选中的卡片RC522PcdReset();}}函数功能:对卡进行充值。充值就是累加金额voidRechargeCardInformation(){CARDdata;if(ICCardRead(data)MIOK){判断卡是否已经激活if(data。stat66){printf(用户信息:sr,data。phone);printf(充值前的余额:dr,data。money);累加金额data。money100;充值100块重新写入到卡里RC522PcdWrite(1,(u8)data);写数据到第addr块,data入的数据值。;printf(充值后的余额:dr,data。money);}卡已经挂失elseif(data。stat88){printf(此卡已挂失。请先解锁后再充值。r);}卡没有激活else{printf(此卡没有激活。请先激活后再充值。r);}复位释放选中的卡片RC522PcdReset();}}函数功能:消费。消费就是减少金额。voidConsumptionCardInformation(){CARDdata;if(ICCardRead(data)MIOK){判断卡是否已经激活if(data。stat66){printf(用户信息:sr,data。phone);printf(消费前的余额:dr,data。money);消费金额,假如:我要消费10元,先判断卡里有没有10元,没有就不能消费。printf(即将消费10元。。。r);余额足够才能消费if(data。money10){data。money10;减去10块重新写入到卡里RC522PcdWrite(1,(u8)data);写数据到第addr块,data入的数据值。;printf(消费后的余额:dr,data。money);}else{printf(余额不足,消费失败。。。r);}}卡已经挂失elseif(data。stat88){printf(此卡已挂失。请先解锁后再进行消费流程。r);}卡没有激活else{printf(此卡没有激活。请先激活后再进行消费流程。r);}复位释放选中的卡片RC522PcdReset();}}函数功能:对卡挂失。将卡状态设置为88voidlockingCardInformation(){CARDdata;if(ICCardRead(data)MIOK){判断卡是否已经激活if(data。stat66){printf(用户信息:sr,data。phone);设置挂失状态data。stat88;重新写入到卡里RC522PcdWrite(1,(u8)data);写数据到第addr块,data入的数据值。;printf(此卡已成功挂失。r);}卡已经挂失elseif(data。stat88){printf(此卡已挂失。r);}卡没有激活else{printf(此卡没有激活。请先激活。r);}复位释放选中的卡片RC522PcdReset();}}函数功能:对卡解锁去除挂失状态。将卡状态设置为66voidUnlockCardInformation(){CARDdata;if(ICCardRead(data)MIOK){判断卡是否已经激活if(data。stat66){printf(此卡已解锁。r);}卡已经挂失elseif(data。stat88){设置解锁状态data。stat66;重新写入到卡里RC522PcdWrite(1,(u8)data);写数据到第addr块,data入的数据值。;printf(此卡已成功解锁。r);}卡没有激活else{printf(此卡没有激活。请先激活。r);}复位释放选中的卡片RC522PcdReset();}}函数功能:对卡激活将卡状态设置为66激活卡也叫注册卡。可以写入一些用户信息到卡里。voidActivationCardInformation(){CARDdata;if(ICCardRead(data)MIOK){判断卡是否已经激活if(data。stat66){printf(此卡已激活,不需要重复激活。r);}卡已经挂失elseif(data。stat88){printf(此卡已激活,并挂失,锁定,请先解锁。。。r);}卡没有激活else{设置解锁状态data。stat66;strncpy((char)data。phone,473608901,sizeof(data。phone)1);重新写入到卡里ICCardWrite(data);3。写数据到卡RC522PcdWrite(1,(u8)data);写数据到第addr块,data入的数据值。printf(此卡已成功激活。用户信息:sr,data。phone);}复位释放选中的卡片RC522PcdReset();}}2。3编写操作界面
为了方便测试功能,在LCD屏上绘制了几个矩形,触摸屏点击分别执行对应的功能。
includeapp。hRC522射频模块外部的接口:1SDAPB5片选脚2SCKPB4时钟线3MOSIPA12输出4MISOPA11输入5悬空6GNDGND7RSTPA8复位脚8VCCVCCintmain(){USARTxInit(USART1,72,115200);LCDInit();LCDClear(BLACK);XPT2046TouchInit();RC522Init();DisplayString(0,0,16,12345jkdbdfvdfvdfv7364837340hdxsmsks3743934ndvdfv,BLACK,WHITE);POINTCOLOR0x00FF;设置画笔颜色LCDDrawLine(0,0,200,50);画线颜色填充LCDFill(0,0,120,105,RED);颜色填充LCDFill(120,0,239,105,RED);颜色填充LCDFill(0,105,120,210,RED);颜色填充LCDFill(120,105,239,210,RED);颜色填充LCDFill(0,210,120,320,RED);颜色填充LCDFill(120,210,239,320,RED);DisplayString(0,0,16,Activation,BLACK,WHITE);DisplayString(120,0,16,Query,BLACK,WHITE);DisplayString(0,105,16,Recharge,BLACK,WHITE);DisplayString(120,105,16,Consumption,BLACK,WHITE);DisplayString(0,210,16,locking,BLACK,WHITE);DisplayString(120,210,16,Unlock,BLACK,WHITE);while(1){扫描触摸屏坐标if(XPT2046ReadXY()){printf(xd,ydr,xpt2046touch。x,xpt2046touch。y);printf(x0d,y0dr,xpt2046touch。x0,xpt2046touch。y0);对卡激活if(xpt2046touch。x0xpt2046touch。x120xpt2046touch。y0xpt2046touch。y105){printf(对卡激活Demor);充值DemoActivationCardInformation();颜色填充LCDFill(0,0,120,105,WHITE);DisplayString(0,0,16,Activation,BLACK,WHITE);等待触摸屏松开while(XPT2046PEN0){}颜色填充LCDFill(0,0,120,105,RED);DisplayString(0,0,16,Activation,BLACK,WHITE);}查询Demoelseif(xpt2046touch。x120xpt2046touch。x240xpt2046touch。y0xpt2046touch。y105){printf(运行查询Demor);查询DemoQueryCardInformation();颜色填充LCDFill(120,0,239,105,WHITE);DisplayString(120,0,16,Query,BLACK,WHITE);等待触摸屏松开while(XPT2046PEN0){}颜色填充LCDFill(120,0,239,105,RED);DisplayString(120,0,16,Query,BLACK,WHITE);}充值Demoelseif(xpt2046touch。x0xpt2046touch。x120xpt2046touch。y105xpt2046touch。y210){printf(运行充值Demor);充值DemoRechargeCardInformation();颜色填充LCDFill(0,105,120,210,WHITE);DisplayString(0,105,16,Recharge,BLACK,WHITE);等待触摸屏松开while(XPT2046PEN0){}颜色填充LCDFill(0,105,120,210,RED);DisplayString(0,105,16,Recharge,BLACK,WHITE);}消费Demoelseif(xpt2046touch。x120xpt2046touch。x240xpt2046touch。y105xpt2046touch。y210){printf(运行消费Demor);消费DemoConsumptionCardInformation();颜色填充LCDFill(120,105,239,210,WHITE);DisplayString(120,105,16,Consumption,BLACK,WHITE);等待触摸屏松开while(XPT2046PEN0){}颜色填充LCDFill(120,105,239,210,RED);DisplayString(120,105,16,Consumption,BLACK,WHITE);等待触摸屏松开}挂失Demoelseif(xpt2046touch。x0xpt2046touch。x120xpt2046touch。y210xpt2046touch。y320){printf(运行挂失Demor);挂失DemolockingCardInformation();颜色填充LCDFill(0,210,120,320,WHITE);DisplayString(0,210,16,locking,BLACK,WHITE);等待触摸屏松开while(XPT2046PEN0){}颜色填充LCDFill(0,210,120,320,RED);DisplayString(0,210,16,locking,BLACK,WHITE);}解锁Demoelseif(xpt2046touch。x120xpt2046touch。x240xpt2046touch。y210xpt2046touch。y320){printf(运行解锁Demor);解锁DemoUnlockCardInformation();颜色填充LCDFill(120,210,239,320,WHITE);DisplayString(120,210,16,Unlock,BLACK,WHITE);等待触摸屏松开while(XPT2046PEN0){}颜色填充LCDFill(120,210,239,320,RED);DisplayString(120,210,16,Unlock,BLACK,WHITE);}}delayms(10);}}2。4运行效果
点击下方,第一时间了解华为云新鲜技术
华为云博客大数据博客AI博客云计算博客开发者中心华为云
TCLX11智屏获2022年金选奖年度卓越画质领跑奖,实至名近日,在北京举办的第八届中国智慧家庭大会上,2022金选奖榜单揭晓:TCLX11领曜QDMiniLED智屏凭借过硬的画质表现力,斩获金选奖年度卓越画质领跑奖。金选奖作为我……
塔望食研院丨百年益生菌,千亿市场正蓝海2022年12月塔望咨询开设塔望食品大健康消费研究院(简称塔望食研院)栏目,塔望食研院以为食品行业品牌高质量发展赋能为理念,将不定期发布食品大健康行业研究、消费研究报告。塔望食……
2023的第一支包,我选!OK!TOPIC2023年的第一支包你选好了么?不知道小伙伴们有没有关注早前2023春夏系列时装周的发布,反正OK!当时是被很多秀场上的大动作震惊到了S……
宜川桑柏行政村黄土高原小山村苹果酥梨挂枝头广袤无垠的黄土高原,绿色正在层层铺展。这里是位于黄河岸边陕西宜川县,在沟壑起伏的山地上,覆盖着白色防雹网,排列整齐的苹果园映入眼帘。10月11日下午,黄河安澜津润三秦网络主题活……
患上不死癌症的李宇春,你要坚持下去关注我,每天带你了解更多感人的故事!你没有看错,这个坐着轮椅在玻璃前心情低落,看着外面风景的人就是著名歌手李宇春。李宇春有时候需要坐在轮椅上休息,有时候需要借助轮椅……
习惯成自然主人养了一匹马和一头驴。马是曾经得过全国冠军的赛马,驴是拉车推磨的普通驴。不消说,马得到了主人的特别恩宠,而受到冷落和不公正待遇的总管是驴。主人再次得了冠军骑着马神……
重庆三峡银行践行城商行三个定位服务重庆经济社会高质量发展来源:人民网重庆频道人民网重庆12月9日电(胡虹)在主管监管部门指导支持下,重庆三峡银行坚持以党建为引领,聚焦实体经济高质量发展重要领域,持续提升金融服务质效。在为……
苹果移动端新系统要来了,iOS系统末路,苹果狠起来自己都打此前有消息苹果正在加紧研发一款名为realityOS的系统,旨在为实现混合现实头戴设备进行铺路。而在最近两天一家名为DeepDiveLLC的空壳公司在全球多个国家注册了一个操作……
注意!哈市买房有了新方式11月23日,央行发布通知16条文件,从保持房地产融资平稳有序、保交楼、配合好受困房企风险处理、保障住房金融消费者合法权益、阶段性调整部分金融管理政策、加大住房租赁金融支持力度……
手机摄影三星S20Ultra拍照样张今天和大家分享自用的一款手机,三星S20Ultra于2022年2月发布,是三星首款搭载1亿像素100倍变焦的旗舰手机,采用6。9英寸OLED微曲面屏,支持120Hz高刷,屏幕素……
小鹰哈比卜解释了为什么他永远不会违背对母亲的退休承诺哈比卜努尔马戈梅多夫(KhabibNurmagomedov)解释了为什么他永远不会违背对母亲的退休承诺许多人都知道哈比卜努尔马戈梅多夫和他母亲的对话,他告诉他的母亲他再也……
中国最有年味的7个地方,2020年春节挑一个出发吧老话儿说,腊八祭灶,新年来到。眼看春节就要来了,可似乎还没嗅到年味,总觉得和记忆中的春节不太一样,也许是习惯变了,也许是时间变了。其实,在中国的很多地方,仍有着最鲜……