概述
嘿!因此,這不是完整的教程,它只是快速入門指南,而我們對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.comt。..。..。..。
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.comt。..。..。..。
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 t Block 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 Char Value
----- ----------------------------------------------- ------------
05 FE t
最后一個字節(塊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文章
6213瀏覽量
238804 -
nfc
+關注
關注
59文章
1637瀏覽量
181101
發布評論請先 登錄
相關推薦
分享一款兼容SWP接口并可支持全協議的NFC芯片
TRF7960ATB,TRF7970ATB NFC/HF RFID讀取器模塊用戶指南

評論