stm32NFC芯片PN532的使用Word格式文档下载.docx
《stm32NFC芯片PN532的使用Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《stm32NFC芯片PN532的使用Word格式文档下载.docx(7页珍藏版)》请在冰豆网上搜索。
读写器模式,支持FeliCa机制
读写器模式,支持ISO/IEC14443B机制
卡操作模式,支持ISO14443A/MIFARE®
卡操作模式,FeliCa机制
ISO/IEC18092,ECM340点对点
支持主机接口:
-SPI接口
-I2C接口
-串行UART
PN532的操作形式如下图所示:
卡操作模式
读写器模式
三、PN532模块搭配ISO/IEC14443TypeA-4卡片
我使用的是PN532模块搭配ISO/IEC14443TypeA-4卡,使用串口模式。
这个卡是使用APDU(ApplicationProtocolDataUnit--应用协议数据单元)的指令形式操作的。
我拿到的卡片是由发卡商提供的,发卡指的是卡的初始化,即卡号写入和密钥写入的过程,完成后卡片才可发放出去;
发卡:
∙注入卡号,只能注入一次;
∙注入密钥,各个密钥只能注入一次;
接口调用:
S>
C0F5000100001F//卡号
<
R9000
C0F50002D95F77B378C735F17A019EFA6E//外部认证密钥
C0F50003103A748687BFA62A808B4C87AF0EE4B468//充值密钥
C0F500041040CFE895E6076C932422C04F448C0CA1//充值通讯密钥
C0F5000510C501CBE8A849B3E7F638E7E096E560EF//消费密钥
C0F50006104D2A98A9165C79F5A54C862A367E4969//存储密钥
我使用该卡的目的是做一个刷卡饮水的系统,其中涉及卡片的步骤为:
激活----寻卡-----读卡号----写入外部认证----刷卡消费
1、激活
PN532自带一个休眠功能,要使用PN532对NFC卡片进行读写的时候要激活一下(唤醒),一般放在程序的开头,调用一次即可。
激活PN532发送的命令(十六进制)为:
->
55550000000000000000000000000000FF03FDD414011700
线没接错的话就会返回:
D0000FF00FF000000FF02FED5151600
2、寻卡
寻卡是涉及到卡片的第一个步骤,nfc对卡的操作都是先寻找卡的,若寻不到卡,则后续的读写操作将无法进行;
反之,若寻到卡,则后续的读写操作过程中将不再对卡片进行身份确认。
寻卡命令:
0000FF04FCD44A0100E100
上面的数据中:
0000FF----帧头,与卡相关的所有命令都要包含该头;
04----包长度,即“D44A0100”的长度;
FC----包长度校验:
0x100-包长度;
此处0xFC=0x100-0x04;
D4----方向标识码:
数据方向是stm32(主机)至PN532
4A----寻卡命令标识码
01----卡数量,最大是2,PN532一次只能同时处理两张卡
00----PN532工作模式:
106kbpstypeA(ISO/IEC14443TypeA)
E1----发送的数据校验:
等于:
0x100-(0xff&
(0xD4+0x4A+0x01+0x00))
00----暂时没发现有什么卵用;
对于我的卡,若寻到卡,则返回:
D0000FF00FF000000FF20E0D54B01010084200A0123456789ABCDEFAA550E78778403665257453250524F4D2900
返回的命令也是有规则可循的,但你看上面太长了,对返回的命令部分,在下面再讨论吧(下面短)。
3、读卡号
C0F1000108
R620000000000001F9000
所以读卡号的命令是:
0000ff08f8d44001c0f10001083100
看吧:
0000ff----帧头;
08----包长度(d44001c0f1000108);
f8----0x100-0x08;
d4----主控至PN532;
40----数据读写命令;
01----卡1;
c0f1000108----读卡号命令;
31----数据校验:
(0xd4+0x40+0x01+0xc0+0xf1+0x00+0x01+0x08))
我的卡,返回的命令码是:
D0000FF00FF000000FF0DF3D54100620000000000001F9000D900
现在短了,可以分析一下啦:
0000FF00FF00----ACK(应答)指令码:
千万别以为收到应答码就以为卡片正常读写了,因为不正常读写也会收到应答码哟。
原因是你操作PN532芯片,只要芯片工作正常,都会有应答码的啦。
所以还得往下看,看后边的命令码是否符合规则。
0000FF----还记得吗?
帧头----与卡相关的所有命令都要包含该头,所以无论是发送还是接收,都要包含帧头的。
0D----包长度,长度13(从D5到9000正好是13)
F3----包长度校验
D5----方向标识码:
PN532至主控
4100----读正确标志位,若为其它如4117之类的数据,就要注意了哦,说明读出错辣。
620000000000001F----卡号;
卡号为8字节BCD编码,最大卡号支持16位数字。
卡号小于16位数字时填充F。
9000----APDU命令正确时的通用码子(错误时为6900);
D9----返回的数据校验:
0xff-0xff&
(SUM(0000FF0DF3D54100620000000000001F9000))
4、外部认证
为了安全考虑,卡片需要进行外部认证。
其步骤如下:
∙外部设备从卡片获取16字节随机数;
∙外部设备使用“外部认证密钥”对随机数使用SM4_ECB方式加密;
∙外部设备将加密结果送入卡中,卡片对其进行解密,并对比随机数与解密结果是否一致;
∙卡片返回认证结果。
C084000010//读取随机数
R1B93C63291A3658B2ED75D9049B9344F9000
C082000010EC15BF495C66D569C654C02AFBCAA3A2//写入加密结果指令
R9000//验证成功
所以主控首先要获取卡片的随机数:
(命令码解析规则和前述一样,在此不再赘述啦)
0000ff08f8d44001c0840000109700
返回:
D0000FF00FF000000FF15EBD54100155E1EA0047767254B0BE49B7D60210590004A00
分析得到卡片发来的随机数为:
155E1EA0047767254B0BE49B7D602105 (当然,每次获取的数都不会相同)
接着主控获取上面那串16字节随机数,使用已经写好的SM4加密算法对其进行加密。
加密后的数据如下:
A5967E70C3B8559EBBA7E4BA12957D2E
然后外部设备将加密结果送入卡中,写入加密结果的指令为:
0000ff18e8d44001c082000010A5967E70C3B8559EBBA7E4BA12957D2EB000
D0000FF00FF000000FF05FBD5410090005A00
看到9000就可以安心了,外部认证成功!
5、刷卡消费
出于安全考虑,刷卡消费过程还需要使用消费密钥进行数据的加解密,步骤如下:
∙外部设备从卡片获取14字节随机数
∙外部设备使用“消费密钥”加密14字节随机数+2字节消费金额,组成16字节消费报文;
∙外部设备将加密结果发送至卡片;
∙卡片解密消费报文,判断消费报文是否正确,执行消费,并拼接“DONE”+2字节消费金额+“AMOUNT”+4字节余额,用消费密钥加密后返回给外部设备;
∙外部设备调用解密算法解密收到的报文,并判断对比是否为““DONE”+2字节消费金额+“AMOUNT”+4字节余额”的格式,若正确,则开水阀打开。
C08400000e
R37F310E1EDCC07F9344B39501A829000
C08500001036E9DEBBFB21A6CEAEA791ECF
RF1ED7F4CD51EAAD535E662636E89125D9000
余额:
654.60
所以主控首先要获取卡片的14字节随机数,命令如下:
0000ff08f8d44001c08400000e9900
D0000FF00FF000000FF13EDD5410037F310E1EDCC07F9344B39501A829000E200
分析得到卡片发来的14字节随机数为:
37F310E1EDCC07F9344B39501A82
再加上两字节的消费金额,这里我假定消费了1分钱,即两字节为:
0x000x01
所以外部设备使用消费密钥,调用SM4算法对:
37F310E1EDCC07F9344B39501A820001
进行加密,加密后的数据如下:
36E9DEBBFB21A6C6482568EAEA791ECF
然后外部设备将加密结果发送至卡片,命令如下:
0000FF18E8D44001C08500001036E9DEBBFB21A6C6482568EAEA791ECF4700
D0000FF00FF000000FF15EBD54100F1ED7F4CD51EAAD535E662636E89125D9000F900
即卡片拼接“DONE”+2字节消费金额+“AMOUNT”+4字节余额,并用消费密钥加密后的发送给外部设备的数据为:
F1ED7F4CD51EAAD535E662636E89125D
最后外部设备再对该串密文使用消费密钥,调用SM4解密算法进行解密,得到:
444f4e450001414d4f554e540000ffb4
其中:
444f4e45----DONE(ASCII码的十六进制正好为444f4e45);
0001----2字节消费金额,即一分钱
414d4f554e54----AMOUNT(ASCII码的十六进制正好为414d4f554e54)
0000ffb4----4字节余额,即余额为654.60元