概述
嘿!因此,这不是完整的教程,它只是快速入门指南,而我们对RFID/NFC进行了更多研究。这里有很多信息,但是没有详细解释所有内容。我们希望填写本教程,但关于NFC的信息并不多,因此需要花费一些时间!
突破接线
本部分专门针对突破板。我们展示了如何在SPI中使用它。该突破还支持TTL串行和I2C,但我们没有使用该方式的教程,因为SPI是最跨平台的通信方法。
如果您使用屏蔽,请检查下一页
为SPI接线接线 PN532芯片和接线设计用于3.3V系统。要将其与Arduino等5V系统一起使用,需要电平转换器将高压转换为3.3V。如果您使用的是3.3V嵌入式系统,则当然不必使用移位器!
首先,我们将插头焊接到分线板上。您将需要两个小的3针接头和一个8针接头。您可以将它们分解成大块。
将两个小块焊接到 SEL0 和 SEL1 垫。这些是芯片的接口选择器。根据跳线的插入方式,芯片将以TTL串行,i2c或SPI方式进行通信。 。/span》
连接如图所示,将4050电平转换器芯片连接到Arduino。 4050的槽口在此图中的“顶部”。
Arduino数字引脚 2 已连接到4050引脚 9 (橙色线)
Arduino数字引脚 3 连接到4050引脚 11 (黄色线)
Arduino数字引脚 4 连接到4050引脚 14 (绿线)
在分支板上
3.3Vin 连接到Arduino 3.3V pn
SCK 已连接到4050引脚 10 (橙色线)
MISO 连接到Arduino引脚 5 (蓝线)
MOSI 连接到4050引脚 12 (黄色电线)
SSEL 连接到4050引脚 15&(绿色电线)
GND 连接到Ardui否接地(黑线)
也将4050引脚#1连接到 3.3V ,将引脚#8连接到地面。
点击查看大图。红色电源线应连接到Arduino上的 3.3v 引脚!
此外,我们需要选择SPI作为接口,以便在 SEL1 上将跳线置于 ON 位置。对于 SEL0 ,将跳线置于 OFF 位置。
就是这样!稍后您可以更改您使用的Arduino引脚,但是对于开始的测试,我们建议匹配我们的接线。
《如果您在I2C模式下使用Breakout,则您还需要在SCL/SDA线上添加两个1.5K上拉电阻,因为Breakout和Arduino不包含上拉电阻。只需在SCL和3.3V之间以及SDA和3.3V之间焊接或添加一个1.5K电阻,然后按照通常的方式连接该分支即可。
屏蔽线
焊接标题第一步是将插头焊接到屏蔽层上。将标题条切成一定长度,然后将各部分(长针向下)插入Arduino。然后将屏蔽层放在顶部并焊接每个引脚。
将Adafruit NFC防护罩与I2C一起使用 Adafruit NFC防护罩设计用于默认情况下为I2C。 I2C仅使用两个引脚(模拟4和5,它们在硬件中固定且不能更改)进行通信,而一个引脚用作“中断”引脚(数字2-可以更改)。 I2C的优点是它是一种“共享”总线-与SPI和TTL串行不同-因此,只要它们的地址不冲突/冲突,就可以在同一两个引脚上放置任意数量的传感器。 Interrupt针很方便,因为它不会不断询问NFC防护罩“是否有卡片视图?现在怎么办?”不断地,当NFC目标进入天线范围时,芯片会提醒我们。
该屏蔽罩与ATmega168或‘328等任何经典Arduino(UNO,Duemilanove,Diecimilla等)兼容)以及任何Mega R3或更高版本。
Mega R2 Arduino也可以正常工作,但是您需要将 SDA 和 SCL 引脚孔中的导线焊接到数字#20和#21上的Mega的I2C引脚上。 》
与Arduino Leonardo和Yun
默认情况下,IRQ引脚连接到数字引脚2。但是,在Arduino Leonardo和Yun上,数字2用于I2C,将无法使用。如果与Leonardo或Yun一起使用,请剪断IRQ引脚和数字2之间的走线,并将IRQ引脚上的导线焊接到数字4或更高版本。然后更改示例代码,以便将IRQ引脚声明为新引脚(例如#6),而不是#2
以下是将IRQ引脚设置为数字引脚的一些照片6.首先,使用一把锋利的业余刀将迹线从IRQ剪切为2
从IRQ到#6
Arduino库
哪个库?
过去,有两个单独的Arduino库用于使用Adafruit NFC板。一个库支持通过SPI连接的中断,而另一个库支持通过I2C连接的中断或屏蔽。但是,这两个库都已合并到一个Arduino库Adafruit-PN532中。/写入EEPROM块。它可以使用SPI或I2C连接与分接器和屏蔽一起使用。
库安装
从github下载Adafruit PN532库。解压缩该文件夹并重命名文件夹 Adafruit_PN532 。在文件夹内,您应该会看到 Adafruit_PN532.cpp 和 Adafruit_PN532.h 文件。通过将 Adafruit_PN532 库文件放置在您的 arduinosketchfolder /libraries 文件夹中,进行安装。如果这是您的第一个库,则可能必须创建库子文件夹。您可以在我们的教程中阅读有关安装库的更多信息。
重新启动Arduino IDE。现在,您应该可以选择文件》示例》 Adafruit_PN532》 readMifare 草图。
如果您通过SPI连接使用NFC分支,使用前一页上显示的布线,您可以立即将草图上载到Arduino,然后跳到“测试MiFare”部分。连接,那么您必须进行一些小的更改才能为I2C配置示例。向下滚动到草图顶部附近的这些行:
下载:文件
复制代码
// Uncomment just _one_ line below depending on how your breakout or shield
// is connected to the Arduino:
// Use this line for a breakout with a SPI connection:
Adafruit_PN532 nfc(PN532_SCK, PN532_MISO, PN532_MOSI, PN532_SS);
// Use this line for a breakout with a hardware SPI connection. Note that
// the PN532 SCK, MOSI, and MISO pins need to be connected to the Arduino’s
// hardware SPI SCK, MOSI, and MISO pins. On an Arduino Uno these are
// SCK = 13, MOSI = 11, MISO = 12. The SS line can be any digital IO pin.
//Adafruit_PN532 nfc(PN532_SS);
// Or use this line for a breakout or shield with an I2C connection:
//Adafruit_PN532 nfc(PN532_IRQ, PN532_RESET); // Uncomment just _one_ line below depending on how your breakout or shield
// is connected to the Arduino:
// Use this line for a breakout with a SPI connection:
Adafruit_PN532 nfc(PN532_SCK, PN532_MISO, PN532_MOSI, PN532_SS);
// Use this line for a breakout with a hardware SPI connection. Note that
// the PN532 SCK, MOSI, and MISO pins need to be connected to the Arduino‘s
// hardware SPI SCK, MOSI, and MISO pins. On an Arduino Uno these are
// SCK = 13, MOSI = 11, MISO = 12. The SS line can be any digital IO pin.
//Adafruit_PN532 nfc(PN532_SS);
// Or use this line for a breakout or shield with an I2C connection:
//Adafruit_PN532 nfc(PN532_IRQ, PN532_RESET);
更改它们,使第二行不加注释,第一行加注释。这将配置草图,以使库使用I2C与NFC屏蔽或分支进行通信。修改后的代码应如下所示:
下载:文件
复制代码
// Uncomment just _one_ line below depending on how your breakout or shield
// is connected to the Arduino:
// Use this line for a breakout with a SPI connection:
//Adafruit_PN532 nfc(PN532_SCK, PN532_MISO, PN532_MOSI, PN532_SS);
// Use this line for a breakout with a hardware SPI connection. Note that
// the PN532 SCK, MOSI, and MISO pins need to be connected to the Arduino’s
// hardware SPI SCK, MOSI, and MISO pins. On an Arduino Uno these are
// SCK = 13, MOSI = 11, MISO = 12. The SS line can be any digital IO pin.
//Adafruit_PN532 nfc(PN532_SS);
// Or use this line for a breakout or shield with an I2C connection:
Adafruit_PN532 nfc(PN532_IRQ, PN532_RESET); // Uncomment just _one_ line below depending on how your breakout or shield
// is connected to the Arduino:
// Use this line for a breakout with a SPI connection:
//Adafruit_PN532 nfc(PN532_SCK, PN532_MISO, PN532_MOSI, PN532_SS);
// Use this line for a breakout with a hardware SPI connection. Note that
// the PN532 SCK, MOSI, and MISO pins need to be connected to the Arduino‘s
// hardware SPI SCK, MOSI, and MISO pins. On an Arduino Uno these are
// SCK = 13, MOSI = 11, MISO = 12. The SS line can be any digital IO pin.
//Adafruit_PN532 nfc(PN532_SS);
// Or use this line for a breakout or shield with an I2C connection:
Adafruit_PN532 nfc(PN532_IRQ, PN532_RESET);
然后将示例上传到Arduino并继续。 请注意,您需要进行类似的更改以从库中选择其他NFC示例的界面。
测试MiFare 在串行监视器中,您应该看到它找到了 PN532 芯片。然后,您可以将标签放在附近,它将显示4个字节的ID码(这个是0xAE 0x4C 0xF0 0x6C),然后是所有四个字节的整数版本。您可以使用该号码来识别每张卡。最近,恩智浦制造了如此多的卡,以至于实际上它们可以遍历所有4个字节(2 ^ 32),因此不能保证数字绝对唯一。但是,您将拥有两张具有相同ID的卡的机会非常渺茫,只要您不将这些卡用于非常重要的事情(例如转账),就可以将其用作唯一标识符
Python和CircuitPython
很容易将PN532分支和屏蔽与Python和CircuitPython以及Adafruit CircuitPython PN532模块一起使用。此模块可让您轻松编写可在RFID/NFC标签之间进行数据读写的Python代码。
您可以将Breakout与任何CircuitPython微控制器板或具有GPIO和Python的计算机配合使用,这是由于Adafruit_Blinka,我们的CircuitPython-for-Python兼容性库。
CircuitPython微控制器接线
首先完全按照前一页所示组装PN532分支或屏蔽。
下面是使用I2C将Feather M0接线到分支的示例:
板3V 至突破3.3V
板GND 至突破GND
主板SCL 到突破SCL
主板SDA 到突破SDA
D6板到突破RSTOUT_N
I2C要求SCL和SDA上的外部上拉电阻!
您必须设置跳线以在PN532上启用I2C!对于I2C:
SEL0 = ON
SEL1 = OFF
div》
下面是使用SPI将Feather M0连接到突破的示例:
3V板以突破3.3V
板GND 至断开GND
板MISO 至突破MISO
Board MOSI 至突破MOSI
Board SCK 到突破SCK
D5板到突破SSEL
您必须设置跳线以在PN532上启用SPI!对于SPI:
SEL0 = OFF
SEL1 = ON
下面是使用UART将Feather M0连接到突破口的示例:
3V板以突破3.3V
电路板GND 至断开GND
电路板RX 至突破TX
板TX 到突破RX
您必须设置跳线以在PN532上启用UART!对于UART:
SEL0 = OFF
SEL1 = OFF
下面是使用I2C将Metro M0连接到屏蔽的示例:
按照前几页所示组装防护罩,然后将其插入Metro M0。
您必须设置跳线以在PN532上启用I2C!对于I2C:
SEL0 = ON
SEL1 = OFF
div》
Python计算机接线
由于可以使用数十台 Linux计算机/主板,我们将显示Raspberry Pi的接线。对于其他平台,请访问Linux上的CircuitPython指南,以了解您的平台是否受支持。
此突破口旨在与I2C,SPI和UART配合使用,但是I2C和UART在RASPBERRY PI上不能可靠地工作。如果您将PN532与Raspberry Pi一起使用,请使用SPI!
以下是与SPI相连的Raspberry Pi:
Pi 3V 》至突破3.3V
Pi GND 至突破GND
Pi MOSI 到突破MOSI
Pi MISO 到突破MISO
Pi SCLK 到突破SCK
Pi D5 到突破SSEL
您必须设置跳线以在PN532上启用SPI!对于SPI:
SEL0 = OFF
SEL1 = ON
我们不建议使用I2C ,但这是与I2C相连的Raspberry Pi:
Pi 3V 至突破3.3V
Pi GND 至突破GND
Pi SCL 到突破SCL
Pi SDA 到突破SDA
Pi D6 以突破RSTPD_N
Pi D12 以突破P32
您必须设置跳线以在PN532上启用I2C!对于I2C:
SEL0 = ON
SEL1 = OFF
div》
我们不建议使用UART ,但这是与UART相连的Raspberry Pi:
您必须设置跳线以在PN532上启用UART!对于UART:
Pi 3V 至突破3.3V
Pi GND 至突破GND
Pi RXD 到突破TX
Pi TXD 到突破RX
SEL0 = OFF
SEL1 = OFF
CircuitPython安装
下一步,您需要在CircuitPython板上安装Adafruit CircuitPython PN532库。
首先请确保您正在为板运行最新版本的Adafruit CircuitPython。
下一步,您需要安装必要的库才能使用硬件-仔细按照以下步骤从Adafruit的CircuitPython库包中查找并安装这些库。我们的简介指南上有一个很棒的页面,介绍如何为快速和非表达板安装库包。
请记住非表达板,例如,您需要从束中手动安装必要的库:
adafruit_pn532.mpy
adafruit_bus_device
在继续制作之前确保您开发板上的lib文件夹或根文件系统已复制 adafruit_pn532.mpy 和 adafruit_bus_device 文件和文件夹。
下一步连接到开发板的串行REPL,这样您就可以在CircuitPython上运行》》》 提示。
PN532库的Python安装
您将需要安装Adafruit_Blinka库,该库在Python中提供了CircuitPython支持。这可能还需要在您的平台上启用I2C并验证您正在运行Python3。由于每个平台都略有不同,并且Linux经常更改,请访问Linux上的CircuitPython指南以准备好您的计算机!
完成后,从命令行运行以下命令:
sudo pip3 install adafruit-circuitpython-pn532
如果您的默认Python是版本3,则可能需要改为运行“ pip”。只要确保您不尝试在Python 2.x上使用CircuitPython,就不支持它!
CircuitPython和Python使用情况
为演示该突破的用法,我们将对其进行初始化,并使用开发板的Python REPL从标签读取ID
运行以下代码以导入必要的模块,并将复位引脚分配到板上的数字引脚。我们使用了D6:
下载:文件
复制代码
import board
import busio
from digitalio import DigitalInOut
from adafruit_pn532.i2c import PN532_I2C
reset_pin = DigitalInOut(board.D6) import board
import busio
from digitalio import DigitalInOut
from adafruit_pn532.i2c import PN532_I2C
reset_pin = DigitalInOut(board.D6)
在Raspberry Pi上,还必须将引脚连接到P32“ H_Request”以进行硬件唤醒。这样可以避免I2C时钟延长。
下载:文件
复制代码
req_pin = DigitalInOut(board.D12) req_pin = DigitalInOut(board.D12)
初始化I2C对象:
下载:文件
复制代码
i2c = busio.I2C(board.SCL, board.SDA)
pn532 = PN532_I2C(i2c, debug=False, reset=reset_pin, req=req_pin) i2c = busio.I2C(board.SCL, board.SDA)
pn532 = PN532_I2C(i2c, debug=False, reset=reset_pin, req=req_pin)
现在我们可以开始进行交互了具有以下功能的NFC/RFID标签:
get_firmware_version -获取最新的固件版本。
SAM_configuration-将PN532配置为读取MiFare卡。
read_passive_target-等待MiFare卡可用并返回
call_function-将指定的命令发送到PN532,并期望返回最多response_length个字节。
》
mifare_classic_authenticate_block-验证MiFare经典卡的指定块号。
mifare_classic_read_block-从卡中读取数据块。
mifare_classic_write_block-将数据块写入卡中。
ntag2xx_read_block-从卡中读取数据块。
ntag2xx_write_block-写入
首先,我们将验证PN532是否已连接并检查固件。
下载:文件
复制代码
ic, ver, rev, support = pn532.get_firmware_version()
print(’Found PN532 with firmware version: {0}。{1}‘.format(ver, rev)) ic, ver, rev, support = pn532.get_firmware_version()
print(’Found PN532 with firmware version: {0}。{1}‘.format(ver, rev))
《现在,我们将配置PN532以读取MiFare卡。然后,我们将等待卡可用并打印UID。
首先,我们检查卡是否可用。在等待时,我们将。打印到串行输出,因此我们知道它仍在查找。如果找不到卡,我们将继续寻找。找到卡后,我们将打印UID。
下载:文件
复制代码
pn532.SAM_configuration()
while True:
uid = pn532.read_passive_target(timeout=0.5)
print(’。‘, end=“”, flush=True)
if uid is None:
continue
print(’Found card with UID:‘, [hex(i) for i in uid]) pn532.SAM_configuration()
while True:
uid = pn532.read_passive_target(timeout=0.5)
print(’。‘, end=“”, flush=True)
if uid is None:
continue
print(’Found card with UID:‘, [hex(i) for i in uid])
触摸MiFare卡即可突破!
使用CircuitPython从卡中读取UID就是全部还有PN532!有关更多信息,请查看文档。
完整示例代码
下载:Project Zip 或 pn532_simpletest.py | 在Github上查看
复制代码
“”“
This example shows connecting to the PN532 with I2C (requires clock
stretching support), SPI, or UART. SPI is best, it uses the most pins but
is the most reliable and universally supported.
After initialization, try waving various 13.56MHz RFID cards over it!
”“”
import board
import busio
from digitalio import DigitalInOut
#
# NOTE: pick the import that matches the interface being used
#
from adafruit_pn532.i2c import PN532_I2C
#from adafruit_pn532.spi import PN532_SPI
#from adafruit_pn532.uart import PN532_UART
# I2C connection:
i2c = busio.I2C(board.SCL, board.SDA)
# Non-hardware
#pn532 = PN532_I2C(i2c, debug=False)
# With I2C, we recommend connecting RSTPD_N (reset) to a digital pin for manual
# harware reset
reset_pin = DigitalInOut(board.D6)
# On Raspberry Pi, you must also connect a pin to P32 “H_Request” for hardware
# wakeup! this means we don’t need to do the I2C clock-stretch thing
req_pin = DigitalInOut(board.D12)
pn532 = PN532_I2C(i2c, debug=False, reset=reset_pin, req=req_pin)
# SPI connection:
#spi = busio.SPI(board.SCK, board.MOSI, board.MISO)
#cs_pin = DigitalInOut(board.D5)
#pn532 = PN532_SPI(spi, cs_pin, debug=False)
# UART connection
#uart = busio.UART(board.TX, board.RX, baudrate=115200, timeout=100)
#pn532 = PN532_UART(uart, debug=False)
ic, ver, rev, support = pn532.get_firmware_version()
print(‘Found PN532 with firmware version: {0}。{1}’.format(ver, rev))
# Configure PN532 to communicate with MiFare cards
pn532.SAM_configuration()
print(‘Waiting for RFID/NFC card.。.’)
while True:
# Check if a card is available to read
uid = pn532.read_passive_target(timeout=0.5)
print(‘。’, end=“”)
# Try again if no card is available.
if uid is None:
continue
print(‘Found card with UID:’, [hex(i) for i in uid])
“”“
This example shows connecting to the PN532 with I2C (requires clock
stretching support), SPI, or UART. SPI is best, it uses the most pins but
is the most reliable and universally supported.
After initialization, try waving various 13.56MHz RFID cards over it!
”“”
import board
import busio
from digitalio import DigitalInOut
#
# NOTE: pick the import that matches the interface being used
#
from adafruit_pn532.i2c import PN532_I2C
#from adafruit_pn532.spi import PN532_SPI
#from adafruit_pn532.uart import PN532_UART
# I2C connection:
i2c = busio.I2C(board.SCL, board.SDA)
# Non-hardware
#pn532 = PN532_I2C(i2c, debug=False)
# With I2C, we recommend connecting RSTPD_N (reset) to a digital pin for manual
# harware reset
reset_pin = DigitalInOut(board.D6)
# On Raspberry Pi, you must also connect a pin to P32 “H_Request” for hardware
# wakeup! this means we don‘t need to do the I2C clock-stretch thing
req_pin = DigitalInOut(board.D12)
pn532 = PN532_I2C(i2c, debug=False, reset=reset_pin, req=req_pin)
# SPI connection:
#spi = busio.SPI(board.SCK, board.MOSI, board.MISO)
#cs_pin = DigitalInOut(board.D5)
#pn532 = PN532_SPI(spi, cs_pin, debug=False)
# UART connection
#uart = busio.UART(board.TX, board.RX, baudrate=115200, timeout=100)
#pn532 = PN532_UART(uart, debug=False)
ic, ver, rev, support = pn532.get_firmware_version()
print(’Found PN532 with firmware version: {0}。{1}‘.format(ver, rev))
# Configure PN532 to communicate with MiFare cards
pn532.SAM_configuration()
print(’Waiting for RFID/NFC card.。.‘)
while True:
# Check if a card is available to read
uid = pn532.read_passive_target(timeout=0.5)
print(’。‘, end=“”)
# Try again if no card is available.
if uid is None:
continue
print(’Found card with UID:‘, [hex(i) for i in uid])
关于NFC
NFC(近场)通信) NFC(近场通信)是一组短距离(通常长达10厘米)的无线通信技术,旨在在两个设备之间提供轻巧安全的通信。 NFC是由NXP(当时为Phillips),诺基亚和Sony发明的,如今NFC“标准”背后的主体是NFC论坛,负责发布和维护与NFC技术有关的各种标准。 》 NFC以13.56MHz的频率运行,并基于“启动器”和“目标”模型,其中启动器会产生一个小的磁场来为目标供电,这意味着目标不需要电源。这种通信方式称为 Passive Communication (被动通信),用于根据ISO14443A等标准读写小型,廉价的13.56MHz RFID标签。当两个设备都通电时,主动通信(对等)也是可能的,其中每个设备交替创建自己的磁场,以辅助设备为目标,反之亦然。/div》
被动通信:ISO14443A卡(Mifare等)虽然NXP的PN53x收发器系列与许多13.56MHz RFID卡标准兼容,但到目前为止,最受欢迎的标准是ISO14443A。许多制造商都生产与ISO14443A兼容的卡或芯片,但最常见的是基于NXP的 Mifare 系列。尽管也存在许多具有改进的安全性和加密功能的标签(Mifare DESFire等),但Mifare Classic和Mifare Ultralight可能是最常遇到且对基础项目有用的标签。 adafruit.com上出售的所有标签均为Mifare Classic 1K,这意味着它们包含1K(1024字节)的可编程EEPROM存储器,可以由启动器设备(PN532)以被动模式读取和修改。
所有ISO14443A卡在最高级别上具有某些共同的特征(由四部分标准定义),每组Mifare芯片(经典,超轻,Plus,DESFire等)都有其自身的功能和特点。以下是两种最常见的格式:
Mifare Classic:这些卡极为常见,包含1K或4K EEPROM,每64字节(1K/4K卡)具有基本安全性。 )或256字节(4K卡)扇区。
Mifare Ultralight:包含512字节的EEPROM,包括32位的OTP内存。这些标签价格便宜,通常采用不干胶标签格式,并经常用于交通票务,音乐会票等。
主动通信(点对点) 主动或“点对点”通信仍然基于先前描述的启动器/目标模型,但是两个设备都处于主动供电状态,并且在通信期间将角色从启动器或目标切换为目标。当一个设备发起与另一设备的对话时,它会启用它的磁场,而接收设备会监听(禁用自己的磁场)。此后,目标/接收设备可能需要响应并依次激活其自身的磁场,而原始设备将被配置为目标。尽管存在两个设备,但一次仅激活一个磁场,每个设备都会不断启用或禁用自己的磁场。
ToDo:添加对激活模式的更好描述,但是我需要先自己测试一下!
NFC数据交换格式(NDEF) NFC数据交换格式(NDEF)是一种标准化的数据格式,可用于在任何兼容的NFC设备与另一个NFC设备或标签之间交换信息。数据格式由 NDEF邮件和 NDEF记录组成。该标准由NFC论坛维护,可以免费进行协商,但需要接受许可协议才能下载。
NDEF格式用于存储和交换URI,纯文本等信息,使用的是一种常见的格式。 。可以将Mifare Classic卡之类的NFC标签配置为NDEF标签,并且任何其他NDEF兼容设备都可以理解和访问由一个NFC设备写入它们的数据(NDEF记录)。 NDEF消息还可以用于在“对等”模式下的两个活动NFC设备之间交换数据。通过在通信过程中遵守NDEF数据交换格式,原本互不了解或没有通用语言的设备便能够以一种有组织的,可相互理解的方式共享数据。
NDEF标准包括许多 Record类型定义(RTD),用于定义应如何存储诸如URI之类的信息,并且每个NDEF设备,标签或消息可以包含多个RTD。 NFC论坛维护的“ NFC记录类型定义(RTD)规范”中描述了标准RTD定义。
* NDEF概述:此页面提供了NDEF的更详细说明,包括如何使用Mifare Classic卡存储NDEF。消息。
注意:NDEF专用页面仍在开发中,某些信息当前不完整。
阅读有关NFC/RFID和该芯片的更多详细信息,我们建议使用以下精彩资源:
RFID选择指南-大量有关RFID的详细信息
诺基亚NFC简介-大量有关NFC的详细信息
NXP S50芯片数据表,芯片内部 MiFare经典标签
NXP PN532简短数据表
NXP PN532长格式数据表
NXP PN532用户手册
NXP PN532应用笔记
在libnfc中使用PN532
NFC词汇表
MiFare卡和标签
MiFare是四个13.56MHz卡“协议”之一(FeliCa是另一个著名的协议)。所有在Adafruit出售的卡和标签商店使用廉价且流行的MiFare Classic卡组
MiFare Classic卡 MIFARE Classic卡有1K和4K两种。尽管存在几种芯片,但以下公开可获得的文档中描述了使用的两个主要芯片组:
MF1S503x Mifare Classic 1K数据表
MF1S70yyX MIFARE Classic 4K数据表
Mifare Classic卡通常具有 4字节NUID ,可唯一地(在值的数字范围内)识别卡。可能也可以有7个字节的ID,但4字节模型在Mifare Classic中更为常见。
EEPROM存储器 Mifare Classic卡具有1K或4K的EEPROM存储器。每个内存块可以配置有不同的访问条件,每个内存块中都有两个单独的身份验证密钥。
Mifare Classic卡分为扇区和 blocks 部分。每个“扇区”都有各自的访问权限,并包含由这些访问权限控制的固定数量的“块”。每个块包含16个字节,扇区包含4个块(1K/4K卡),每个扇区总共64个字节,或者16个块(仅4K卡),每个扇区总共256个字节。卡的类型如下:
1K卡-16个扇区,每个扇区4个块(扇区0..15)
4K卡-32个扇区,每个4块(扇区0..31)和8个扇区,每个16块(扇区32..39)
4个块扇区 1K和4K卡都使用16个扇区,每个扇区4个块,并且出于兼容性方面的考虑,4K卡上的底部1K内存与1K型号组织相同。这些单独的4个块扇区(每个块包含64个字节)具有基本的安全功能,每个扇区都可以配置有单独的读/写访问权限和两个不同的6字节身份验证密钥(每个扇区的密钥可以不同)。由于这些安全功能(存储在最后一个块中,称为 Sector Trailer ),每个扇区的最后3个块实际上才可用于数据存储,这意味着每64字节有48字节供您自己使用的扇区。
每个4块扇区的组织方式如下,每行四个16字节的行,每个扇区总共64字节。显示任何卡的前两个扇区:
下载:文件
复制代码
Sector Block Bytes Description
------ ----- ----- -----------
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 Sector Block Bytes Description
------ ----- ----- -----------
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
下载:文件
复制代码
1 3 [-------KEY A-------] [Access Bits] [-------KEY B-------] Sector Trailer
2 [ Data ] Data
1 [ Data ] Data
0 [ Data ] Data 1 3 [-------KEY A-------] [Access Bits] [-------KEY B-------] Sector Trailer
2 [ Data ] Data
1 [ Data ] Data
0 [ Data ] Data
下载:文件
复制代码
0 3 [-------KEY A-------] [Access Bits] [-------KEY B-------] Sector Trailer
2 [ Data ] Data
1 [ Data ] Data
0 [ Manufacturer Data ] Manufacturer Block 0 3 [-------KEY A-------] [Access Bits] [-------KEY B-------] Sector Trailer
2 [ Data ] Data
1 [ Data ] Data
0 [ Manufacturer Data ] Manufacturer Block
部门预告片(第3块)
扇区尾部块包含两个密钥(密钥A和密钥B),以及这四个块的访问条件。它具有以下结构:
下载:文件
复制代码
Sector Trailer Bytes
--------------------------------------------------------------
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
[ Key A ] [Access Bits] [ Key B ] Sector Trailer Bytes
--------------------------------------------------------------
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
[ Key A ] [Access Bits] [ Key B ]
有关使用键访问时钟内容的更多信息,请参见下面的访问数据块。
数据块(0..2块)
数据块为16字节宽,根据访问位中设置的权限,可以读取和写入数据块。您可以随意使用16个数据字节。您可以轻松地存储文本输入,存储四个32位整数值,一个16个字符的uri等。
数据块作为“值块”
将随机数据存储在16个字节宽的块将它们配置为“值块”。价值块允许执行电子钱包功能(有效命令为:读取,写入,递增,递减,还原,传输)。每个价值块均包含一个带符号的32位值,该值存储3次以确保数据完整性和安全性原因。它被存储两次不取反,一次取反。后4个字节用于1个字节的地址,该地址存储4次(两次非反相,两次反相)。
配置为“值块”的数据块具有以下结构:
下载:文件
复制代码
Value Block Bytes
--------------------------------------------------------------
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
[ Value ] [ ~Value ] [ Value ] [A ~A A ~A] Value Block Bytes
--------------------------------------------------------------
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
[ Value ] [ ~Value ] [ Value ] [A ~A A ~A]
制造商块(扇区0,块0)
扇区0是特殊的,因为它包含制造商块。该块包含制造商数据,并且是只读的。除非您知道自己在做什么,否则应该避免。
16个块扇区 16个块扇区与4个块扇区相同,但具有更多的数据块。上面4个块扇区中描述的结构相同。
下载:文件
复制代码
Sector Block Bytes Description
------ ----- ----- ----------
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 Sector Block Bytes Description
------ ----- ----- ----------
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
下载:file
复制代码
32 15 [-------KEY A-------] [Access Bits] [-------KEY B-------] Sector Trailer 32
14 [ Data ] Data
13 [ Data ] Data
。..
2 [ Data ] Data
1 [ Data ] Data
0 [ Data ] Data 32 15 [-------KEY A-------] [Access Bits] [-------KEY B-------] Sector Trailer 32
14 [ Data ] Data
13 [ Data ] Data
。..
2 [ Data ] Data
1 [ Data ] Data
0 [ Data ] Data
访问EEPROM内存要访问卡上的EEPROM,您需要执行以下步骤:
您必须检索4字节的NUID卡(有时也可以是7字节长,尽管Mifare Classic卡很少)。这对于后续的身份验证过程是必需的。
您必须通过传递适当的6字节身份验证密钥,根据该扇区的“扇区尾部”块中定义的访问规则,对希望访问的扇区进行身份验证。例如:新卡0xFF 0xFF 0xFF 0xFF 0xFF 0xFF。
一旦身份验证成功,然后根据扇区权限,您就可以读取/写入/递增/递减特定块的内容。请注意,您需要为访问的每个扇区重新进行身份验证,因为每个扇区可以具有自己的不同访问密钥和权限!
身份验证注意事项 在可以访问扇区的内存之前,您首先需要“验证”根据存储在Sector Trailer中的安全设置。默认情况下,通常将任何新卡配置为允许使用密钥A和值0xFF 0xFF 0xFF 0xFF 0xFF 0xFF完全访问扇区中的每个块。如果这不起作用,您可能希望尝试使用其他一些常见的密钥:
下载:文件
复制代码
0XFF 0XFF 0XFF 0XFF 0XFF 0XFF
0XD3 0XF7 0XD3 0XF7 0XD3 0XF7
0XA0 0XA1 0XA2 0XA3 0XA4 0XA5
0XB0 0XB1 0XB2 0XB3 0XB4 0XB5
0X4D 0X3A 0X99 0XC3 0X51 0XDD
0X1A 0X98 0X2C 0X7E 0X45 0X9A
0XAA 0XBB 0XCC 0XDD 0XEE 0XFF
0X00 0X00 0X00 0X00 0X00 0X00
0XAB 0XCD 0XEF 0X12 0X34 0X56 0XFF 0XFF 0XFF 0XFF 0XFF 0XFF
0XD3 0XF7 0XD3 0XF7 0XD3 0XF7
0XA0 0XA1 0XA2 0XA3 0XA4 0XA5
0XB0 0XB1 0XB2 0XB3 0XB4 0XB5
0X4D 0X3A 0X99 0XC3 0X51 0XDD
0X1A 0X98 0X2C 0X7E 0X45 0X9A
0XAA 0XBB 0XCC 0XDD 0XEE 0XFF
0X00 0X00 0X00 0X00 0X00 0X00
0XAB 0XCD 0XEF 0X12 0X34 0X56
新Mifare Classic 1K卡的示例 以下内存转储说明了1K Mifare Classic卡的结构,其中数据和扇区可以清楚看到预告片:
下载:文件
复制代码
[--------------------------Start of Memory Dump--------------------------]
------------------------Sector 0-------------------------
Block 0 8E 02 6F 66 85 08 04 00 62 63 64 65 66 67 68 69 ?.of?。..bcdefghi
Block 1 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 2 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 3 00 00 00 00 00 00 FF 07 80 69 FF FF FF FF FF FF 。..。..ÿ。?iÿÿÿÿÿÿ
------------------------Sector 1-------------------------
Block 4 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 5 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 6 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 7 00 00 00 00 00 00 FF 07 80 69 FF FF FF FF FF FF 。..。..ÿ。?iÿÿÿÿÿÿ
------------------------Sector 2-------------------------
Block 8 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 9 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 11 00 00 00 00 00 00 FF 07 80 69 FF FF FF FF FF FF 。..。..ÿ。?iÿÿÿÿÿÿ
------------------------Sector 3-------------------------
Block 12 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 13 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 14 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 15 00 00 00 00 00 00 FF 07 80 69 FF FF FF FF FF FF 。..。..ÿ。?iÿÿÿÿÿÿ
------------------------Sector 4-------------------------
Block 16 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 17 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 18 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 19 00 00 00 00 00 00 FF 07 80 69 FF FF FF FF FF FF 。..。..ÿ。?iÿÿÿÿÿÿ
------------------------Sector 5-------------------------
Block 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 21 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 22 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 23 00 00 00 00 00 00 FF 07 80 69 FF FF FF FF FF FF 。..。..ÿ。?iÿÿÿÿÿÿ
------------------------Sector 6-------------------------
Block 24 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 25 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 26 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 27 00 00 00 00 00 00 FF 07 80 69 FF FF FF FF FF FF 。..。..ÿ。?iÿÿÿÿÿÿ
------------------------Sector 7-------------------------
Block 28 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 29 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 31 00 00 00 00 00 00 FF 07 80 69 FF FF FF FF FF FF 。..。..ÿ。?iÿÿÿÿÿÿ
------------------------Sector 8-------------------------
Block 32 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 33 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 34 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 35 00 00 00 00 00 00 FF 07 80 69 FF FF FF FF FF FF 。..。..ÿ。?iÿÿÿÿÿÿ
------------------------Sector 9-------------------------
Block 36 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 37 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 38 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 39 00 00 00 00 00 00 FF 07 80 69 FF FF FF FF FF FF 。..。..ÿ。?iÿÿÿÿÿÿ
------------------------Sector 10-------------------------
Block 40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 41 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 42 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 43 00 00 00 00 00 00 FF 07 80 69 FF FF FF FF FF FF 。..。..ÿ。?iÿÿÿÿÿÿ
------------------------Sector 11-------------------------
Block 44 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 45 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 46 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 47 00 00 00 00 00 00 FF 07 80 69 FF FF FF FF FF FF 。..。..ÿ。?iÿÿÿÿÿÿ
------------------------Sector 12-------------------------
Block 48 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 49 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 50 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 51 00 00 00 00 00 00 FF 07 80 69 FF FF FF FF FF FF 。..。..ÿ。?iÿÿÿÿÿÿ
------------------------Sector 13-------------------------
Block 52 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 53 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 54 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 55 00 00 00 00 00 00 FF 07 80 69 FF FF FF FF FF FF 。..。..ÿ。?iÿÿÿÿÿÿ
------------------------Sector 14-------------------------
Block 56 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 57 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 58 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 59 00 00 00 00 00 00 FF 07 80 69 FF FF FF FF FF FF 。..。..ÿ。?iÿÿÿÿÿÿ
------------------------Sector 15-------------------------
Block 60 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 61 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 62 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 63 00 00 00 00 00 00 FF 07 80 69 FF FF FF FF FF FF 。..。..ÿ。?iÿÿÿÿÿÿ
[---------------------------End of Memory Dump---------------------------] [--------------------------Start of Memory Dump--------------------------]
------------------------Sector 0-------------------------
Block 0 8E 02 6F 66 85 08 04 00 62 63 64 65 66 67 68 69 ?.of?。..bcdefghi
Block 1 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 2 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 3 00 00 00 00 00 00 FF 07 80 69 FF FF FF FF FF FF 。..。..ÿ。?iÿÿÿÿÿÿ
------------------------Sector 1-------------------------
Block 4 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 5 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 6 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 7 00 00 00 00 00 00 FF 07 80 69 FF FF FF FF FF FF 。..。..ÿ。?iÿÿÿÿÿÿ
------------------------Sector 2-------------------------
Block 8 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 9 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 11 00 00 00 00 00 00 FF 07 80 69 FF FF FF FF FF FF 。..。..ÿ。?iÿÿÿÿÿÿ
------------------------Sector 3-------------------------
Block 12 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 13 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 14 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 15 00 00 00 00 00 00 FF 07 80 69 FF FF FF FF FF FF 。..。..ÿ。?iÿÿÿÿÿÿ
------------------------Sector 4-------------------------
Block 16 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 17 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 18 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 19 00 00 00 00 00 00 FF 07 80 69 FF FF FF FF FF FF 。..。..ÿ。?iÿÿÿÿÿÿ
------------------------Sector 5-------------------------
Block 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 21 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 22 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 23 00 00 00 00 00 00 FF 07 80 69 FF FF FF FF FF FF 。..。..ÿ。?iÿÿÿÿÿÿ
------------------------Sector 6-------------------------
Block 24 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 25 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 26 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 27 00 00 00 00 00 00 FF 07 80 69 FF FF FF FF FF FF 。..。..ÿ。?iÿÿÿÿÿÿ
------------------------Sector 7-------------------------
Block 28 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 29 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 31 00 00 00 00 00 00 FF 07 80 69 FF FF FF FF FF FF 。..。..ÿ。?iÿÿÿÿÿÿ
------------------------Sector 8-------------------------
Block 32 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 33 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 34 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 35 00 00 00 00 00 00 FF 07 80 69 FF FF FF FF FF FF 。..。..ÿ。?iÿÿÿÿÿÿ
------------------------Sector 9-------------------------
Block 36 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 37 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 38 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 39 00 00 00 00 00 00 FF 07 80 69 FF FF FF FF FF FF 。..。..ÿ。?iÿÿÿÿÿÿ
------------------------Sector 10-------------------------
Block 40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 41 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 42 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 43 00 00 00 00 00 00 FF 07 80 69 FF FF FF FF FF FF 。..。..ÿ。?iÿÿÿÿÿÿ
------------------------Sector 11-------------------------
Block 44 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 45 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 46 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 47 00 00 00 00 00 00 FF 07 80 69 FF FF FF FF FF FF 。..。..ÿ。?iÿÿÿÿÿÿ
------------------------Sector 12-------------------------
Block 48 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 49 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 50 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 51 00 00 00 00 00 00 FF 07 80 69 FF FF FF FF FF FF 。..。..ÿ。?iÿÿÿÿÿÿ
------------------------Sector 13-------------------------
Block 52 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 53 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 54 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 55 00 00 00 00 00 00 FF 07 80 69 FF FF FF FF FF FF 。..。..ÿ。?iÿÿÿÿÿÿ
------------------------Sector 14-------------------------
Block 56 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 57 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 58 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 59 00 00 00 00 00 00 FF 07 80 69 FF FF FF FF FF FF 。..。..ÿ。?iÿÿÿÿÿÿ
------------------------Sector 15-------------------------
Block 60 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 61 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 62 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 63 00 00 00 00 00 00 FF 07 80 69 FF FF FF FF FF FF 。..。..ÿ。?iÿÿÿÿÿÿ
[---------------------------End of Memory Dump---------------------------]
MiFare Ultralight卡 MiFare Ultralight卡通常包含512位(64字节)的内存,其中包括4字节(32位)的OTP(一次性可编程)内存,可以在其中写入各个位,但
MF0ICU1 MiFare Ultralight功能规范
MiFare Ultralight卡具有 7字节UID 唯一地标识卡。
EEPROM存储器 MiFare Ultralight卡具有512位(64字节)的EEPROM存储器,其中包括4字节(32位)的OTP存储器。与Mifare Classic卡不同,尽管可以使用锁定字节(如下所述)将块设置为“只读”模式,但每个块都没有身份验证。EEPROM存储器分为16页,每页四个字节,顺序如下:
下载:文件
复制代码
Page Description
---- ------------
0 Serial Number (4 bytes)
1 Serial Number (4 bytes)
2 Byte 0: Serial Number
Byte 1: Internal Memory
Byte 2..3: lock bytes
3 One-time programmable memory (4 bytes)
4..15 User memory (4 bytes) Page Description
---- ------------
0 Serial Number (4 bytes)
1 Serial Number (4 bytes)
2 Byte 0: Serial Number
Byte 1: Internal Memory
Byte 2..3: lock bytes
3 One-time programmable memory (4 bytes)
4..15 User memory (4 bytes)
以下是按表格格式排列的页面和块:
下载:文件
复制代码
Page Block 0 Block 1 Block 2 Block 3
----- ---------------------------------------
0 [ Serial Number ]
1 [ Serial Number ]
2 [Serial] - [Intern] - [ Lock Bytes ]
3 [ One Time Programmable Memory ]
4 [ User Data ]
5 [ User Data ]
6 [ User Data ]
7 [ User Data ]
8 [ User Data ]
9 [ User Data ]
10 [ User Data ]
11 [ User Data ]
12 [ User Data ]
13 [ User Data ]
14 [ User Data ]
15 [ User Data ] Page Block 0 Block 1 Block 2 Block 3
----- ---------------------------------------
0 [ Serial Number ]
1 [ Serial Number ]
2 [Serial] - [Intern] - [ Lock Bytes ]
3 [ One Time Programmable Memory ]
4 [ User Data ]
5 [ User Data ]
6 [ User Data ]
7 [ User Data ]
8 [ User Data ]
9 [ User Data ]
10 [ User Data ]
11 [ User Data ]
12 [ User Data ]
13 [ User Data ]
14 [ User Data ]
15 [ User Data ]
锁定字节(第2页)第2页的字节2和3称为“锁定字节” 。可以通过将相应的锁定位设置为“ 1”来分别锁定从0x03开始的页面,以防止进一步的写访问,从而有效地使存储器变为只读。
有关锁定字节机制的更多信息,请参见8.5.2节。数据表的内容(上面已引用)。
OTP字节(页3) 第3页是OTP存储器,默认情况下,此页上的所有位都设置为0。可以使用MiFare WRITE命令按位修改这些位,并且可以将各个位设置为1。但不能更改回0。
数据页(第4-15页)只要与上述“锁定字节”没有冲突,就可以自由地读取和写入第4至15页。
生产后,字节具有以下默认值:
下载:文件
复制代码
Page Byte Values
---- ----------------------
0 1 2 3
4 0xFF 0xFF 0xFF 0xFF
5..15 0x00 0x00 0x00 0x00
访问数据块要访问卡,您必须执行以下两个步骤:
“连接”到Mifare Ultralight卡并检索卡的7字节UID。
内存可以一旦建立了被动模式连接,就可以直接读写。 Mifare Ultralight卡不需要身份验证。
读取/写入长度 出于兼容性原因,对Mifare Ultralight卡的“读取”请求将一次检索16个字节(4页)(与Mifare Classic的块大小相对应)卡)。例如,如果您指定要读取第3页,则实际上将读取并返回第3、4、5和6页,并且如果不需要它们,可以简单地丢弃最后12个字节。如果选择更高的页面,则读取的16个字节将换回到第0页。例如,读取第14页实际上将返回第14、15、0和1页。
“写”请求出现在页面(4个字节)中,因此覆盖后续页面上的数据没有问题。
关于NDEF格式
NDEF( NFC数据交换格式)。NFC数据交换格式(NDEF)是一种标准化的数据格式,可用于在任何兼容的NFC设备与另一个NFC设备或标签之间交换信息。数据格式由 NDEF邮件和 NDEF记录组成。该标准由NFC论坛维护,可以免费查阅,但需要接受许可协议才能下载。
NDEF格式用于存储和交换URI,纯文本等信息,其中包括常用格式。可以将Mifare Classic卡之类的NFC标签配置为NDEF标签,并且任何其他NDEF兼容设备都可以理解和访问由一个NFC设备写入它们的数据(NDEF记录)。 NDEF消息还可以用于在“对等”模式下的两个活动NFC设备之间交换数据。通过在通信过程中遵循NDEF数据交换格式,原本互不了解彼此或通用语言的设备能够以一种有组织的,可相互理解的方式共享数据。
有些帮助与NDEF相关的应用笔记和白皮书如下:
NFC数据交换格式(NDEF)技术规范(需要接受许可条款)
NFC记录类型定义(RTD)规范(需要接受许可条款)
NXP白皮书-NFC论坛类型标签
NDEF消息 NDEF消息是NDEF记录的基本“传输”机制,每个邮件包含一个或多个NDEF记录。
NDEF记录 NDEF记录包含特定的有效负载,并具有以下结构来标识记录的内容和大小:
下载:文件
复制代码
Bit 7 6 5 4 3 2 1 0
------ ------ ------ ------ ------ ------ ------ ------
[ MB ] [ ME ] [ CF ] [ SR ] [ IL ] [ TNF ]
[ TYPE LENGTH ]
[ PAYLOAD LENGTH ]
[ ID LENGTH ]
[ RECORD TYPE ]
[ ID ]
[ PAYLOAD ] Bit 7 6 5 4 3 2 1 0
------ ------ ------ ------ ------ ------ ------ ------
[ MB ] [ ME ] [ CF ] [ SR ] [ IL ] [ TNF ]
[ TYPE LENGTH ]
[ PAYLOAD LENGTH ]
[ ID LENGTH ]
[ RECORD TYPE ]
[ ID ]
[ PAYLOAD ]
记录头(字节0)记录头包含许多重要字段,其中包括一个3位字段,用于标识随后的记录类型(类型名称格式或TNF ):
TNF:类型名称格式字段
NDEF记录的类型名称格式或 TNF字段是一个描述记录类型的3位值,并设置对其余记录的结构和内容的期望。可能的记录类型名称包括:
下载:文件
复制代码
TNF Value Record Type
--------- -----------------------------------------
0x00 Empty Record
Indicates no type, id, or payload is associated with this NDEF Record.
This record type is useful on newly formatted cards since every NDEF tag
must have at least one NDEF Record.
0x01 Well-Known Record
Indicates the type field uses the RTD type name format. This type name is used
to stored any record defined by a Record Type Definition (RTD), such as storing
RTD Text, RTD URIs, etc., and is one of the mostly frequently used and useful
record types.
0x02 MIME Media Record
Indicates the payload is an intermediate or final chunk of a chunked NDEF Record
0x03 Absolute URI Record
Indicates the type field contains a value that follows the absolute-URI BNF
construct defined by RFC 3986
0x04 External Record
Indicates the type field contains a value that follows the RTD external
name specification
0x05 Unknown Record
Indicates the payload type is unknown
0x06 Unchanged Record
Indicates the payload is an intermediate or final chunk of a chunked NDEF Record TNF Value Record Type
--------- -----------------------------------------
0x00 Empty Record
Indicates no type, id, or payload is associated with this NDEF Record.
This record type is useful on newly formatted cards since every NDEF tag
must have at least one NDEF Record.
0x01 Well-Known Record
Indicates the type field uses the RTD type name format. This type name is used
to stored any record defined by a Record Type Definition (RTD), such as storing
RTD Text, RTD URIs, etc., and is one of the mostly frequently used and useful
record types.
0x02 MIME Media Record
Indicates the payload is an intermediate or final chunk of a chunked NDEF Record
0x03 Absolute URI Record
Indicates the type field contains a value that follows the absolute-URI BNF
construct defined by RFC 3986
0x04 External Record
Indicates the type field contains a value that follows the RTD external
name specification
0x05 Unknown Record
Indicates the payload type is unknown
0x06 Unchanged Record
Indicates the payload is an intermediate or final chunk of a chunked NDEF Record
IL:ID长度字段
IL标志指示ID长度字段是否存在。如果将其设置为0,则记录中将省略“ ID长度”字段。
SR:短记录位
如果PAYLOAD LENGTH字段为1,则SR标志设置为1。字节(8位/0-255)或更小。
CF:块标志
CF标志指示这是第一个记录块还是中间记录块。
ME:消息结束
ME标志指示这是否是消息中的最后一条记录。MB:消息开始MB标志指示这是否是NDEF消息的开始。
类型长度 指示“记录类型”字段的长度(以字节为单位)。对于使用上述TNF字段定义的某些类型的记录,该值始终为零。
有效载荷长度 指示记录有效载荷的长度(以字节为单位)。如果在记录头中将SR字段(如上所述)设置为1,则此值将为1个字节长(有效负载长度为0-255个字节)。如果SR字段设置为0,则此值为32位值,占4个字节。
ID长度 表示ID字段的长度(以字节为单位)。仅当在记录标题中将IL标志(如上所述)设置为1时,此字段才存在。
记录类型 此值描述了随后的记录的“类型”。类型字段的值必须与在记录头的TNF位中输入的值相对应。
记录ID 如果包含ID(记录标题中的IL位设置为1),则ID字段的值。如果IL位设置为0,则忽略此字段。
有效载荷 记录有效载荷,这将恰好是前面“有效载荷长度”字段中描述的字节数。
知名记录(TNF记录类型0x01)可能是最有用的记录类型为“ NFC论坛知名类型” (TNF类型0x01)。遵循“严格定义”类型的记录类型均由称为RTD或记录类型定义的内容进行描述。当前定义良好的一些RTD是:
URI记录(0x55/’U‘) URI URI 记录的“知名类型”为0x55(’U‘),并且该记录类型可用于存储各种有用的信息,例如电话号码(tel :),网站地址, FTP 文件位置的链接等。
URI 记录已定义在NFC论坛的“ URI 记录类型定义”文档中,它具有以下结构:
下载:文件
复制代码
Name Offset Size Description
---- ------ ---- -----------
Identifier Code 0 1 byte See table below
URI Field 1 N bytes The rest of the URI (depending on byte 0 above) Name Offset Size Description
---- ------ ---- -----------
Identifier Code 0 1 byte See table below
URI Field 1 N bytes The rest of the URI (depending on byte 0 above)
URI标识符代码用于缩短URI长度,并且可以具有以下任意值:
下载:文件
复制代码
Value Protocol
----- --------
0x00 No prepending is done 。.. the entire URI is contained in the URI Field
0x01 http://www.
0x02 https://www.
0x03 http://
0x04 https://
0x05 tel:
0x06 mailto:
0x07 ftp://anonymous:[email protected]
0x08 ftp://ftp.
0x09 ftps://
0x0A sftp://
0x0B smb://
0x0C nfs://
0x0D ftp://
0x0E dav://
0x0F news:
0x10 telnet://
0x11 imap:
0x12 rtsp://
0x13 urn:
0x14 pop:
0x15 sip:
0x16 sips:
0x17 tftp:
0x18 btspp://
0x19 btl2cap://
0x1A btgoep://
0x1B tcpobex://
0x1C irdaobex://
0x1D file://
0x1E urn:epc:id:
0x1F urn:epc:tag:
0x20 urn:epc:pat:
0x21 urn:epc:raw:
0x22 urn:epc:
0x23 urn:nfc: Value Protocol
----- --------
0x00 No prepending is done 。.. the entire URI is contained in the URI Field
0x01 http://www.
0x02 https://www.
0x03 http://
0x04 https://
0x05 tel:
0x06 mailto:
0x07 ftp://anonymous:[email protected]
0x08 ftp://ftp.
0x09 ftps://
0x0A sftp://
0x0B smb://
0x0C nfs://
0x0D ftp://
0x0E dav://
0x0F news:
0x10 telnet://
0x11 imap:
0x12 rtsp://
0x13 urn:
0x14 pop:
0x15 sip:
0x16 sips:
0x17 tftp:
0x18 btspp://
0x19 btl2cap://
0x1A btgoep://
0x1B tcpobex://
0x1C irdaobex://
0x1D file://
0x1E urn:epc:id:
0x1F urn:epc:tag:
0x20 urn:epc:pat:
0x21 urn:epc:raw:
0x22 urn:epc:
0x23 urn:nfc:
URI标识符代码后是 URI字段。此字段提供根据RFC 3987的URI,并包含在前缀URI标识符对应的值之后的其余URI(除非URI ID为0x00,在这种情况下,完整的URI将包含在URI字段中)。/div》
测试记录要做的事情
智能海报记录要做的事情
NDEF记录示例
众所周知的记录
URI记录
“带有NDEF的Mifare Classic 1K卡的内存转储”中显示了URI记录的示例。记录”。
文本记录
要执行
Smartposter Record
要做的事情
绝对URI记录
待办事项
使用Mifare Classic卡作为NDEF标签 可以配置Mifare Classic 1K和4K卡作为NFC论坛兼容的NDEF标签,但必须以某种特定方式进行组织。以下NXP的应用笔记中说明了制作Mifare Classic卡“符合NFC论坛”的要求:
AN1304-NFC类型的MIFARE Classic标签操作
同时,以上应用笔记为作为此问题的权威消息来源,以下说明还可以简要概述使用Mifare Classic卡作为NFC论坛兼容的“ NDEF”标签所涉及的关键概念:
Mifare应用程序目录(MAD),以形成基于扇区的内存之间的关系Mifare Classic卡和单个NDEF记录均使用 Mifare应用程序目录(MAD)结构。 MAD指示哪个扇区包含哪个NDEF记录。关于Mifare应用程序目录的权威信息是以下应用笔记:
AN10787-MIFARE应用程序目录(MAD)
为便于参考,两种类型的MAD(取决于卡的大小)问题)定义如下:
Mifare应用程序目录1(MAD1) MAD1可以在任何Mifare Classic卡中使用,而不管EEPROM的大小如何,尽管如果它用于大于1KB的卡,则只有第一个NDEF记录可访问1KB内存。
MAD1存储在Mifare Classic卡的制造商扇区(扇区0x00)中。
》
Mifare应用程序目录2(MAD2) MAD2仅可用于具有以下功能的Mifare Classic卡超过1KB的存储空间(Mifare Classic 4K卡等)。它不与仅包含1KB内存的卡兼容!
MAD2存储在扇区0x00(制造商扇区)和0x10中。
MAD扇区访问 包含MAD1的扇区(0x00)和MAD2(0x00和0x10)受KEY A和KEY B保护(如果您不熟悉此概念,请查阅PN532/NFC Wiki中其他地方的Mifare Classic摘要)。为了确保任何应用程序都可以读取这些扇区,应始终使用以下公共密钥A:
下载:文件
复制代码
Public KEY A of MAD Sectors
---------------------------------------------------
BYTE 0 BYTE 1 BYTE 2 BYTE 3 BYTE 4 BYTE 5
0xA0 0xA1 0xA2 0xA3 0xA4 0xA5 Public KEY A of MAD Sectors
---------------------------------------------------
BYTE 0 BYTE 1 BYTE 2 BYTE 3 BYTE 4 BYTE 5
0xA0 0xA1 0xA2 0xA3 0xA4 0xA5
可以选择将MAD扇区写为-如果您希望限制客户修改卡内容的能力,请使用密钥B保护。公共密钥A将确保它们始终可以读取数据。
在Mifare扇区中存储NDEF消息 NDEF消息/记录可以存储在Mifare卡的任何扇区中,但MAD所使用的扇区或1K范围以外的扇区除外。使用MAD1表。
使用扇区存储NDEF记录时,将其称为NFC扇区。与上述MAD扇区一样,必须始终至少以只读模式访问这些扇区,因此NFC扇区也存在一个公用的公共密钥A,尽管该密钥与该密钥中使用的密钥A不同。 MAD扇区:
下载:文件
复制代码
Public KEY A of NFC Sectors
---------------------------------------------------
BYTE 0 BYTE 1 BYTE 2 BYTE 3 BYTE 4 BYTE 5
0xD3 0xF7 0xD3 0xF7 0xD3 0xF7 Public KEY A of NFC Sectors
---------------------------------------------------
BYTE 0 BYTE 1 BYTE 2 BYTE 3 BYTE 4 BYTE 5
0xD3 0xF7 0xD3 0xF7 0xD3 0xF7
为了将NDEF消息存储在Mifare Classic卡上,需要将消息包装在称为 TLV Block 的东西中。 TLV块的基本结构如下所述。
TLV块 TLV是三个不同字段的缩写:T表示标签字段,L表示长度字段,V表示值字段。一个TLV块由一个或多个字节组成,具体取决于这三个字段中的哪一个。请注意,TLV块将始终至少为一个字节,因为在每种情况下T字段都是必填字段。
标签字段
标签字段(或T字段)是唯一的必填字段,并根据预定值表使用单字节来标识TLV块的类型:
下载:文件
复制代码
TLV Block Types
Block Type Value Description
------------- ----- --------------------------------------
NULL 0x00 These blocks should be ignored
NDEF Message 0x03 Block contains an NDEF message
Proprietary 0xFD Block contains proprietary information
Terminator 0xFE Last TLV block in the data area TLV Block Types
Block Type Value Description
------------- ----- --------------------------------------
NULL 0x00 These blocks should be ignored
NDEF Message 0x03 Block contains an NDEF message
Proprietary 0xFD Block contains proprietary information
Terminator 0xFE Last TLV block in the data area
长度字段
长度字段(或L字段)包含值字段的大小(以字节为单位)。长度字段可以用两种不同的方式组织,使用一个或三个字节。
一个字节格式简单包含一个从0x00..0xFF。开始的字节值。
三字节格式由以下格式组成:
下载:文件
复制代码
Byte 0: Always 0xFF to indicate that we are using the three byte format
Byte 1..2: Can be a value between 0x00FF and 0xFFFE Byte 0: Always 0xFF to indicate that we are using the three byte format
Byte 1..2: Can be a value between 0x00FF and 0xFFFE
一字节和三字节格式都必须为支持NFC论坛和NDEF兼容性。
值字段
仅当“长度”字段(存在上述内容),但不等于0x00。如果“长度”字段不等于0,则“值”字段将包含N个字节的数据,格式为上面的T字段指示。
“值”字段是有效负载(an NDEF消息 ,例如)。
终结者TLV
终结者TLV是数据中的最后一个TLV块区域,并且由一个字节组成:0x0FE(请参见上面的TLV块类型表)。此TLV块是强制性的。
带有Mifare Classic 1K卡的内存转储NDEF记录
下载:文件
复制代码
[ Start of Memory Dump ]
------------------------Sector 0-------------------------
Block 0 3E 39 AB 7F D3 88 04 00 47 41 16 57 4D 10 34 08 》9«Ó?。.GA.WM.4.
Block 1 14 01 03 E1 03 E1 03 E1 03 E1 03 E1 03 E1 03 E1 。..á。á.á。á.á。á.á
Block 2 03 E1 03 E1 03 E1 03 E1 03 E1 03 E1 03 E1 03 E1 。á.á。á.á。á.á。á.á
Block 3 00 00 00 00 00 00 78 77 88 C1 00 00 00 00 00 00 。..。..xw?Á。..。..
------------------------Sector 1-------------------------
Block 4 00 00 03 11 D1 01 0D 55 01 61 64 61 66 72 75 69 。..。Ñ..U.adafrui
Block 5 74 2E 63 6F 6D FE 00 00 00 00 00 00 00 00 00 00 t.comþ。..。..。..。
Block 6 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 7 00 00 00 00 00 00 7F 07 88 40 00 00 00 00 00 00 。..。..[email protected]
------------------------Sector 2-------------------------
Block 8 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 9 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 11 00 00 00 00 00 00 7F 07 88 40 00 00 00 00 00 00 。..。..[email protected]
------------------------Sector 3-------------------------
Block 12 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 13 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 14 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 15 00 00 00 00 00 00 7F 07 88 40 00 00 00 00 00 00 。..。..[email protected]
------------------------Sector 4-------------------------
Block 16 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 17 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 18 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 19 00 00 00 00 00 00 7F 07 88 40 00 00 00 00 00 00 。..。..[email protected]
------------------------Sector 5-------------------------
Block 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 21 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 22 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 23 00 00 00 00 00 00 7F 07 88 40 00 00 00 00 00 00 。..。..[email protected]
------------------------Sector 6-------------------------
Block 24 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 25 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 26 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 27 00 00 00 00 00 00 7F 07 88 40 00 00 00 00 00 00 。..。..[email protected]
------------------------Sector 7-------------------------
Block 28 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 29 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 31 00 00 00 00 00 00 7F 07 88 40 00 00 00 00 00 00 。..。..[email protected]
------------------------Sector 8-------------------------
Block 32 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 33 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 34 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 35 00 00 00 00 00 00 7F 07 88 40 00 00 00 00 00 00 。..。..[email protected]
------------------------Sector 9-------------------------
Block 36 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 37 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 38 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 39 00 00 00 00 00 00 7F 07 88 40 00 00 00 00 00 00 。..。..[email protected]
------------------------Sector 10-------------------------
Block 40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 41 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 42 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 43 00 00 00 00 00 00 7F 07 88 40 00 00 00 00 00 00 。..。..[email protected]
------------------------Sector 11-------------------------
Block 44 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 45 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 46 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 47 00 00 00 00 00 00 7F 07 88 40 00 00 00 00 00 00 。..。..[email protected]
------------------------Sector 12-------------------------
Block 48 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 49 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 50 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 51 00 00 00 00 00 00 7F 07 88 40 00 00 00 00 00 00 。..。..[email protected]
------------------------Sector 13-------------------------
Block 52 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 53 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 54 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 55 00 00 00 00 00 00 7F 07 88 40 00 00 00 00 00 00 。..。..[email protected]
------------------------Sector 14-------------------------
Block 56 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 57 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 58 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 59 00 00 00 00 00 00 7F 07 88 40 00 00 00 00 00 00 。..。..[email protected]
------------------------Sector 15-------------------------
Block 60 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 61 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 62 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 63 00 00 00 00 00 00 7F 07 88 40 00 00 00 00 00 00 。..。..[email protected]
[ End of Memory Dump ] [ Start of Memory Dump ]
------------------------Sector 0-------------------------
Block 0 3E 39 AB 7F D3 88 04 00 47 41 16 57 4D 10 34 08 》9«Ó?。.GA.WM.4.
Block 1 14 01 03 E1 03 E1 03 E1 03 E1 03 E1 03 E1 03 E1 。..á。á.á。á.á。á.á
Block 2 03 E1 03 E1 03 E1 03 E1 03 E1 03 E1 03 E1 03 E1 。á.á。á.á。á.á。á.á
Block 3 00 00 00 00 00 00 78 77 88 C1 00 00 00 00 00 00 。..。..xw?Á。..。..
------------------------Sector 1-------------------------
Block 4 00 00 03 11 D1 01 0D 55 01 61 64 61 66 72 75 69 。..。Ñ..U.adafrui
Block 5 74 2E 63 6F 6D FE 00 00 00 00 00 00 00 00 00 00 t.comþ。..。..。..。
Block 6 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 7 00 00 00 00 00 00 7F 07 88 40 00 00 00 00 00 00 。..。..[email protected]
------------------------Sector 2-------------------------
Block 8 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 9 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 11 00 00 00 00 00 00 7F 07 88 40 00 00 00 00 00 00 。..。..[email protected]
------------------------Sector 3-------------------------
Block 12 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 13 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 14 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 15 00 00 00 00 00 00 7F 07 88 40 00 00 00 00 00 00 。..。..[email protected]
------------------------Sector 4-------------------------
Block 16 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 17 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 18 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 19 00 00 00 00 00 00 7F 07 88 40 00 00 00 00 00 00 。..。..[email protected]
------------------------Sector 5-------------------------
Block 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 21 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 22 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 23 00 00 00 00 00 00 7F 07 88 40 00 00 00 00 00 00 。..。..[email protected]
------------------------Sector 6-------------------------
Block 24 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 25 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 26 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 27 00 00 00 00 00 00 7F 07 88 40 00 00 00 00 00 00 。..。..[email protected]
------------------------Sector 7-------------------------
Block 28 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 29 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 31 00 00 00 00 00 00 7F 07 88 40 00 00 00 00 00 00 。..。..[email protected]
------------------------Sector 8-------------------------
Block 32 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 33 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 34 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 35 00 00 00 00 00 00 7F 07 88 40 00 00 00 00 00 00 。..。..[email protected]
------------------------Sector 9-------------------------
Block 36 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 37 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 38 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 39 00 00 00 00 00 00 7F 07 88 40 00 00 00 00 00 00 。..。..[email protected]
------------------------Sector 10-------------------------
Block 40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 41 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 42 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 43 00 00 00 00 00 00 7F 07 88 40 00 00 00 00 00 00 。..。..[email protected]
------------------------Sector 11-------------------------
Block 44 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 45 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 46 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 47 00 00 00 00 00 00 7F 07 88 40 00 00 00 00 00 00 。..。..[email protected]
------------------------Sector 12-------------------------
Block 48 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 49 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 50 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 51 00 00 00 00 00 00 7F 07 88 40 00 00 00 00 00 00 。..。..[email protected]
------------------------Sector 13-------------------------
Block 52 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 53 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 54 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 55 00 00 00 00 00 00 7F 07 88 40 00 00 00 00 00 00 。..。..[email protected]
------------------------Sector 14-------------------------
Block 56 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 57 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 58 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 59 00 00 00 00 00 00 7F 07 88 40 00 00 00 00 00 00 。..。..[email protected]
------------------------Sector 15-------------------------
Block 60 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 61 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 62 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 。..。..。..。..。..。
Block 63 00 00 00 00 00 00 7F 07 88 40 00 00 00 00 00 00 。..。..[email protected]
[ End of Memory Dump ]
NDEF记录 上面的示例包含两个记录,均位于扇区1中(扇区0包含MAD)。
记录1
可以通过查看扇区1中第4块的第一个字节来识别卡上的第一条记录。
下载:文件
复制代码
Block 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 Char Value
----- ----------------------------------------------- ------------
04 00 00 。. Block 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 Char Value
----- ----------------------------------------------- ------------
04 00 00 。.
Mifare卡上的每个记录均以 TLV块(如上所述),TLV块的第一个字节(标记字段)表示这是 NULL块类型(值0x00)。第二个字节是“长度”字段,为0。由于此记录没有有效负载(长度= 0),因此不存在TLV块的第三个字节(“值”字段)。
此记录第一次格式化存储卡以确保至少有一条记录时可能已插入该记录。
记录2
第二条记录卡上的记录从块4的字节0x02开始,一直到块5。
下载:文件
复制代码
Block 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 Char Value
----- ----------------------------------------------- ------------
04 03 11 D1 01 0D 55 01 61 64 61 66 72 75 69 Ñ。.U.adafrui
05 74 2E 63 6F 6D t.com Block 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 Char Value
----- ----------------------------------------------- ------------
04 03 11 D1 01 0D 55 01 61 64 61 66 72 75 69 Ñ。.U.adafrui
05 74 2E 63 6F 6D t.com
从第一个 TLV块数据开始两个字节,我们可以确定以下内容:
下载:文件
复制代码
Byte(s) Value Description
------- ----- -----------
04:02 0x03 Field Type (0x03 = NDEF Message)
04:03 0x11 Length Field (17 bytes) Byte(s) Value Description
------- ----- -----------
04:02 0x03 Field Type (0x03 = NDEF Message)
04:03 0x11 Length Field (17 bytes)
这向我们表明该记录包含 NDEF消息(值0x03),并且该消息的长度为17个字节(十六进制的0x11 =十进制的17)。这意味着我们的NDEF消息包含在接下来的17个字节中(04:04..05:04)。然后可以按如下方式分析NDEF记录:
下载:文件
复制代码
Byte(s) Value Description
------- ----- -----------
04:04 0xD1 This byte is the **NDEF Record Header**, and indicates that this is
an NFC Forum Well Known Record (0x01 in the first 3 bits),
and that this is the first and last record (MB=1, ME=1),
and that this is a short record (SR = 1) meaning the payload
length is less than or equal to 255 chars (len=one byte)。
TNF = 0x01 (NFC Forum Well Known Type)
IL = 0 (No ID present, meaning there is no ID Length or ID Field either)
SR = 1 (Short Record)
CF = 0 (Record is not ’chunked‘)
ME = 1 (End of message)
MB = 1 (Beginning of message)
04:05 0x01 This byte is the **Type Length** for the Record Type Indicator
(see above for more information), which is 1 byte (0x55/’U‘ below)
04:06 0x0D This is the payload length (13 bytes)
04:07 0x55 Record Type Indicator (0x55 or ’U‘ = URI Record)
04:08 0x01 This is the **start of the record payload**, which contains the
URI Identifier (“http://www.”) since this is a URI Well-Defined
Record Type (see Well-Defined Records above)。 This will be
prepended to the rest of the URI that follows in the rest of the
message payload
04:09..05:04 。.. The remainder of the URI (“adafruit.com”), which combined with the
pre-pended value from byte 04:08 yields: http://www.adafruit.com Byte(s) Value Description
------- ----- -----------
04:04 0xD1 This byte is the **NDEF Record Header**, and indicates that this is
an NFC Forum Well Known Record (0x01 in the first 3 bits),
and that this is the first and last record (MB=1, ME=1),
and that this is a short record (SR = 1) meaning the payload
length is less than or equal to 255 chars (len=one byte)。
TNF = 0x01 (NFC Forum Well Known Type)
IL = 0 (No ID present, meaning there is no ID Length or ID Field either)
SR = 1 (Short Record)
CF = 0 (Record is not ’chunked‘)
ME = 1 (End of message)
MB = 1 (Beginning of message)
04:05 0x01 This byte is the **Type Length** for the Record Type Indicator
(see above for more information), which is 1 byte (0x55/’U‘ below)
04:06 0x0D This is the payload length (13 bytes)
04:07 0x55 Record Type Indicator (0x55 or ’U‘ = URI Record)
04:08 0x01 This is the **start of the record payload**, which contains the
URI Identifier (“http://www.”) since this is a URI Well-Defined
Record Type (see Well-Defined Records above)。 This will be
prepended to the rest of the URI that follows in the rest of the
message payload
04:09..05:04 。.. The remainder of the URI (“adafruit.com”), which combined with the
pre-pended value from byte 04:08 yields: http://www.adafruit.com
TLV终结符
下载:文件
复制代码
Block 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 Char Value
----- ----------------------------------------------- ------------
05 FE þ Block 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 Char Value
----- ----------------------------------------------- ------------
05 FE þ
最后一个字节(块5,字节5),值为0xFE的 TLV终结符,表示这是TLV块的结尾。
使用LibNFC
libnfc是一个不断发展的目标,并且由于从一个版本到另一个版本的频繁更改,我们无法为PN532提供libnfc支持。我们只能保证我们自己维护的Arduino代码库的支持和工作代码。以下信息是我们最大的尝试,可以帮助您开始使用libnfc和PN532突破,但是根据所使用的库版本和平台,可能需要自己进行一些拨弄和操作。不幸的是,libnfc的使用由您自行决定。
与libnfc一起使用PN532扩展板 libnfc 是一种成熟的跨平台开源NFC库,可以轻松配置为与PN532扩展板配合使用。尽管Linux可能是最容易使用libnfc的平台,但它也可以在Mac和Windows上进行配置,尽管您可能需要在libnfc社区论坛上深入了解有关为Windows等编译.dll的一些具体细节。 br》
如果您想使用libnfc测试PN532分支电路板,此简单教程将带您逐步了解编译和配置libnfc的绝对基础,并使用部分随附的示例SW
这仅用于将PN532突破用于FTDI电缆或FTDI Friend连接到正确的计算机。您不能在Arduino或其他微控制器上运行LIbNFC
libnfc在Linux中(本示例中使用的是Ubuntu 10.10)
第一步:下载libnfc ,从Google Code中下载最新版本的libnfc(例如“ libnfc-1.4.1.tar.gz”),并按如下所示提取文件内容:
下载:文件
复制代码
$ wget http://libnfc.googlecode.com/files/libnfc-x.x.x.tar.gz
$ tar -xvzf libnfc-x.x.x.tar.gz
$ cd libnfc-x.x.x $ wget http://libnfc.googlecode.com/files/libnfc-x.x.x.tar.gz
$ tar -xvzf libnfc-x.x.x.tar.gz
$ cd libnfc-x.x.x
第二步:为PN532和UART配置libnfc libnfc当前仅支持使用任何廉价的USB转UART适配器(例如FTDI Friend或TTL FTDI电缆)通过UART进行通信。但是,在编译之前,您将需要配置libnfc以包括对UART和PN532芯片组的支持,这可以通过以下命令来完成(在上述压缩文件所在的文件夹中执行):
下载:文件
复制代码
$ 。/configure --with-drivers=pn532_uart --enable-serial-autoprobe $ 。/configure --with-drivers=pn532_uart --enable-serial-autoprobe
注意:如果还希望包括调试输出,则可以在配置选项中添加“ –enable-serial-autoprobe”标志(减去单引号)
第三步:构建和安装libnfc 您可以使用以下三个命令构建和安装libnfc ,也可以从原始存档解压缩的文件夹中运行:
下载:文件
复制代码
$ make clean
$ make
$ make install $ make clean
$ make
$ make install
第四步:检查已安装的设备 现在(希望)已构建并安装了libnfc,您可以运行“ nfc-list”示例尝试检测连接的NFC板。确保开发板已连接至FTDI或USB/UART适配器,并且已连接至PC,并运行以下命令:
下载:文件
复制代码
$ cd examples
$ 。/nfc-list $ cd examples
$ 。/nfc-list
这应该列出检测到的设备
第五步:轮询ISO14443A卡(Mifare等) 接下来,您可以使用“ nfc-poll”示例等待30秒以获取ISO14443A卡或标签,并显示有关此信息的一些基本信息卡。在我们更改为上面的示例文件夹中,运行以下命令:
下载:file
复制代码
$ 。/nfc-poll $ 。/nfc-poll
这应该为您提供任何进入磁场的卡的基本信息
带有Mac OSX Lion的
libnfc scott-42是足以发布一些使FTDI适配器在Mac上使用libnfc的提示。需要对代码进行几个简单的更改(从v1.6.0-rc1开始),并在此处提供详细信息。
请牢记上面提到的代码更改,以下步骤应由libnfc编译并通过Lion上的FTDI类型适配器和UART工作(使用libnfc 1.6.0_rc1):
下载并构建libnfc并配置是否用于PN532 UART(在运行make之前更改代码):
下载:文件
复制代码
wget http://libnfc.googlecode.com/files/libnfc-1.6.0-rc1.tar.gz
tar -xvzf libnfc-1.6.0-rc1.tar.gz
cd libnfc-1.6.0-rc1
。/configure --with-drivers=pn532_uart --enable-serial-autoprobe
sudo make
sudo make install wget http://libnfc.googlecode.com/files/libnfc-1.6.0-rc1.tar.gz
tar -xvzf libnfc-1.6.0-rc1.tar.gz
cd libnfc-1.6.0-rc1
。/configure --with-drivers=pn532_uart --enable-serial-autoprobe
sudo make
sudo make install
》
如果一切顺利,请切换到示例文件夹,看看是否可以找到PN532并等待适当的标签:
下载:文件
复制代码
cd examples
Kevins-Mac-mini:examples kevin$ 。/nfc-poll
/Users/kevin/libnfc-1.6.0-rc1/examples/.libs/nfc-poll uses libnfc 1.6.0-rc1 (r1326)
NFC reader: pn532_uart:/dev/tty.usbserial-FTE5WWPB - PN532 v1.6 (0x07) opened
NFC device will poll during 30000 ms (20 pollings of 300 ms for 5 modulations)
ISO/IEC 14443A (106 kbps) target:
ATQA (SENS_RES): 00 04
UID (NFCID1): 3e b9 6e 66
SAK (SEL_RES): 08 cd examples
Kevins-Mac-mini:examples kevin$ 。/nfc-poll
/Users/kevin/libnfc-1.6.0-rc1/examples/.libs/nfc-poll uses libnfc 1.6.0-rc1 (r1326)
NFC reader: pn532_uart:/dev/tty.usbserial-FTE5WWPB - PN532 v1.6 (0x07) opened
NFC device will poll during 30000 ms (20 pollings of 300 ms for 5 modulations)
ISO/IEC 14443A (106 kbps) target:
ATQA (SENS_RES): 00 04
UID (NFCID1): 3e b9 6e 66
SAK (SEL_RES): 08
运行libnfc有一些依赖项,但是由于它不是Adafruit项目,因此nd我们真的不能直接自己直接支持它,如果您有机会获得Mac支持的libnfc论坛,可能会比较幸运。在Mac上有一些活跃的用户。
常见问题解答
论坛上与PN532 NFC/RFID Breakout 和 NFC Shield相关的一些更常见的问题。
我可以在一个Arduino上使用多个屏蔽吗?
不是,I2C每个总线库只能有一个地址,并且该地址不可调节!所以请每个Arduino一个盾牌!
我可以使用PN532和Adafruit库读取或写入Mifare标签吗?
绝对! Adafruit库包含对Mifare Classic卡进行身份验证,读取和写入单个块的功能。在读取或写入块之前,您需要使用适当的密钥对它进行身份验证,并且在对该块进行身份验证之后,您可以对您的Heart内容进行读写操作!
例如,I2C库中的密钥功能(因为它默认为I2C,所以它是与NFC屏蔽一起编写的)是:
i》下载:文件
复制代码
uint8_t mifareclassic_AuthenticateBlock (uint8_t * uid, uint8_t uidLen,
uint32_t blockNumber, uint8_t keyNumber,
uint8_t * keyData);
uint8_t mifareclassic_ReadDataBlock (uint8_t blockNumber, uint8_t * data);
uint8_t mifareclassic_WriteDataBlock (uint8_t blockNumber, uint8_t * data); uint8_t mifareclassic_AuthenticateBlock (uint8_t * uid, uint8_t uidLen,
uint32_t blockNumber, uint8_t keyNumber,
uint8_t * keyData);
uint8_t mifareclassic_ReadDataBlock (uint8_t blockNumber, uint8_t * data);
uint8_t mifareclassic_WriteDataBlock (uint8_t blockNumber, uint8_t * data);
这就是开始读写数据所需的全部,您可以使用支持Mifare卡的许多Android应用程序之一来验证数据(搜索NFC会发现很多)。
库中包括什么级别的NDEF支持?
目前,所有NDEF功能均为实验性且不完整。仅编写了非常基本的测试代码来格式化NDEF消息的卡,以使任何支持NFC的Android手机都能够理解该代码,并且它是经过编写的,并且是非常简单的概念证明。
我们希望在不久的将来改进对Mifare标签的NDEF支持,并且已经对此进行了一些初步计划,但是目前,我们的建议是坚持纯文本和“香草”的Mifare Classic读写。您可以从Android读写Mifare Classic和Mifare Ultralight块,而无需使用更复杂的NDEF标准来简单地通过Mifare Classic或Ultralight卡来回传递数据。
注意:请小心使用受限制的NDEF代码。格式化支持NDEF的卡目前是一种单向操作,并且仅应在可以专用于NDEF的卡上执行。
PN532是否支持对等通信
是的,PN532支持对等通信,但SW支持为此,Adafruit库中未实现。
例如,与Android进行点对点通信是可能的,但是PN532端的实际实现非常复杂。您需要经过许多SW层才能以Android理解的方式与之通信-这将需要为消息,SNEP和LLCP堆栈等开发完整的NDEF堆栈-不幸的是,这远远超出了范围
Adafruit屏蔽板和分线板满足了所有硬件要求,但是堆栈实现并非易事,将需要我们收取高额费用。对于这些委员会,如果我们实现了这一点。
我们将精力集中在提供可靠的,经过验证的,正确调整的硬件参考以及足够的软件构建模块上,以使每个人都能上手,但是要填补NFC可以完成的所有工作,还有很多空缺需要填补
以NFC与手机通信的示例为例,请看一下使用Adafruit NFC Shield的“通过Blackberry上的NFC与Arduino对话”。与Blackberry设备进行基于NFC的P2P通信所需的SW层显然比Android低得多。
PN532是否支持标签仿真?
是的,但实际上是不可能实现的,因为它需要一个很难获取的外部“安全元素”(受出口管制,并由少数几家制造商提供一般NDA)。不过,如果您能得到一个,我们很乐意看到它!
PN532可以从TI读取Tag-It标签吗?
否。 PN532设计为与ISO14443标签一起使用,而Mifare Classic可能是最常用的通用标签类型。有关受支持标签的更多信息,请参见http://www.libnfc.org/documentation/hardware/tags/iso14443或搜索有关基于ISO1443A的常见Mifare标签系列的信息。
我可以设置调用readPassiveTargetID()的延迟吗?
注意:此问题仅适用于I2C库。 SPI库无法以相同的方式处理时序。
readPassiveTargetID()故意在阻塞延迟中等待,直到卡进入磁场为止。此阻塞延迟的原因是为了确保良好理解的命令/响应流。一旦激活了磁场并通过readPassiveTargetID发送了读取请求,您就可以继续向PN532发送新命令,但是一旦卡或标签进入该字段,PN532将发送对初始读取请求的响应,即使它处于其他一些响应或活动的中间。为了避免在SW中进行调试,实施了阻塞延迟,以使命令/响应模式尽可能清晰。
作为此阻塞延迟限制的解决方法, setPassiveActivationRetries (maxRetries)已添加到最新的NFC库中,以允许您在读取请求后设置特定的超时。
默认情况下,PN532将永远等待卡进入该字段。通过 MxRtyPassiveActivation 指定固定的重试次数(请参阅UM节7.3.1中描述 RFConfiguration 寄存器,特别是CfgItem 5),PN532将在指定次数的重试后中止读取请求。尝试,您可以安全地发送新命令,而不必担心混淆响应帧。要永远等待,请将MxRtyPassiveActivation设置为0xFF。要在固定的重试次数后超时,请将MxRtyPassiveActivation设置为小于0xFF的任何值。
示例草图:
下载:文件
复制代码
#include
#include
#define IRQ (2)
#define RESET (3) // Not connected by default on the NFC Shield
Adafruit_NFCShield_I2C nfc(IRQ, RESET);
void setup(void) {
Serial.begin(115200);
Serial.println(“Hello!”);
nfc.begin();
uint32_t versiondata = nfc.getFirmwareVersion();
if (! versiondata) {
Serial.print(“Didn’t find PN53x board”);
while (1); // halt
}
// Got ok data, print it out!
Serial.print(“Found chip PN5”); Serial.println((versiondata》》24) & 0xFF, HEX);
Serial.print(“Firmware ver. ”); Serial.print((versiondata》》16) & 0xFF, DEC);
Serial.print(‘。’); Serial.println((versiondata》》8) & 0xFF, DEC);
// Set the max number of retry attempts to read from a card
// This prevents us from waiting forever for a card, which is
// the default behaviour of the PN532.
nfc.setPassiveActivationRetries(0xFF);
// configure board to read RFID tags
nfc.SAMConfig();
Serial.println(“Waiting for an ISO14443A card”);
}
void loop(void) {
boolean success;
uint8_t uid[] = { 0, 0, 0, 0, 0, 0, 0 }; // Buffer to store the returned UID
uint8_t uidLength; // Length of the UID (4 or 7 bytes depending on ISO14443A card type)
// Wait for an ISO14443A type cards (Mifare, etc.)。 When one is found
// ‘uid’ will be populated with the UID, and uidLength will indicate
// if the uid is 4 bytes (Mifare Classic) or 7 bytes (Mifare Ultralight)
success = nfc.readPassiveTargetID(PN532_MIFARE_ISO14443A, &uid[0], &uidLength);
if (success) {
Serial.println(“Found a card!”);
Serial.print(“UID Length: ”);Serial.print(uidLength, DEC);Serial.println(“ bytes”);
Serial.print(“UID Value: ”);
for (uint8_t i=0; i 《 uidLength; i++)
{
Serial.print(“ 0x”);Serial.print(uid[i], HEX);
}
Serial.println(“”);
// Wait 1 second before continuing
delay(1000);
}
else
{
// PN532 probably timed out waiting for a card
Serial.println(“Timed out waiting for a card”);
}
} #include
#include
#define IRQ (2)
#define RESET (3) // Not connected by default on the NFC Shield
Adafruit_NFCShield_I2C nfc(IRQ, RESET);
void setup(void) {
Serial.begin(115200);
Serial.println(“Hello!”);
nfc.begin();
uint32_t versiondata = nfc.getFirmwareVersion();
if (! versiondata) {
Serial.print(“Didn‘t find PN53x board”);
while (1); // halt
}
// Got ok data, print it out!
Serial.print(“Found chip PN5”); Serial.println((versiondata》》24) & 0xFF, HEX);
Serial.print(“Firmware ver. ”); Serial.print((versiondata》》16) & 0xFF, DEC);
Serial.print(’。‘); Serial.println((versiondata》》8) & 0xFF, DEC);
// Set the max number of retry attempts to read from a card
// This prevents us from waiting forever for a card, which is
// the default behaviour of the PN532.
nfc.setPassiveActivationRetries(0xFF);
// configure board to read RFID tags
nfc.SAMConfig();
Serial.println(“Waiting for an ISO14443A card”);
}
void loop(void) {
boolean success;
uint8_t uid[] = { 0, 0, 0, 0, 0, 0, 0 }; // Buffer to store the returned UID
uint8_t uidLength; // Length of the UID (4 or 7 bytes depending on ISO14443A card type)
// Wait for an ISO14443A type cards (Mifare, etc.)。 When one is found
// ’uid‘ will be populated with the UID, and uidLength will indicate
// if the uid is 4 bytes (Mifare Classic) or 7 bytes (Mifare Ultralight)
success = nfc.readPassiveTargetID(PN532_MIFARE_ISO14443A, &uid[0], &uidLength);
if (success) {
Serial.println(“Found a card!”);
Serial.print(“UID Length: ”);Serial.print(uidLength, DEC);Serial.println(“ bytes”);
Serial.print(“UID Value: ”);
for (uint8_t i=0; i 《 uidLength; i++)
{
Serial.print(“ 0x”);Serial.print(uid[i], HEX);
}
Serial.println(“”);
// Wait 1 second before continuing
delay(1000);
}
else
{
// PN532 probably timed out waiting for a card
Serial.println(“Timed out waiting for a card”);
}
}
嘿,等等。.. SVDD引脚上没有有趣的东西吗?
确实,好眼睛!不幸的是,v1.0和v1.3的分支板在原理图上都有问题。 SVDD直接连接到VDD,但由于用于给安全模块供电,因此应保持悬空状态。这对电路板的功能没有影响,但是会导致消耗一些额外的电流。它将固定在电路板的下一个修订版上,但是如果您需要使用安全模块(稀有),则可以简单地在C22的左侧切割走线,即连接到SVDD的电容(只需跟随走线)从第37针一直向上)。
对于将PN532 Breakout与Due一起使用是否有特殊要求?
尽管这些库尚未正式支持Due,但一些客户已经能够使他们对库进行一些小的更改。
由于I2C库代表Adafruit的最新代码,因此我们建议同时将I2C库与屏蔽板和分线板一起使用,并且屏蔽版本应该可以毫不费力地工作。 I2C和Due,但是: Duue包括I2C0的上拉电阻(SCL0和SDA1),但SCL1和SDA1上没有上拉电阻。。 SCL1/SDA1是用作Uno I2C引脚(标准屏蔽上使用的引脚)的替代引脚,因此您需要在SCL1和SDA1上添加两个1.5K上拉电阻,才能将分线板与I2C1和Due一起使用。只需焊接两个1.5K电阻器,一个从SCL1到3V3,另一个从SDA1到3.3V,然后以与Uno相同的方式连接电路板。
此问题仅适用于PN532 Breakout电路板,因为PN532屏蔽在板上包含I2C上拉电阻。
下载
文件可以从github获得
SPI和I2C库
可以从github获得不推荐使用的仅I2C库(不推荐)
Adafruit Fritzing中可用的Fritzing对象
用于Shield的EagleCAD PCB文件,网址为https://github.com/adafruit/Adafruit-PN532-RFID-NFC-Shield
EagleCAD PCB有关突破的文件,请访问https://github.com/adafruit/Adafruit-PN532-RFID-NFC-Breakout
数据表
有关NFC/RFID和此芯片的更多详细信息,我们建议使用以下出色的资源:
RFID选择指南-大量关于RFID的详细信息
诺基亚的NFC简介-大量关于NFC的详细信息
将PN532与libnfc结合使用
天线设计文档卡格式
Breakout v1.6原理图并打印
(单击放大)
原理图
(单击放大)
PN532 Breakout v1示意图
责任编辑:wv
-
RFID
+关注
关注
388文章
6142浏览量
237752 -
nfc
+关注
关注
59文章
1621浏览量
180515
发布评论请先 登录
相关推荐
评论