使用 Raspberry Pi 将 NDEF 写入 Mifare S50
Writing NDEF to Mifare S50 with Raspberry Pi
我正在尝试将 NDEF 数据写入 NFC 标签(Mifare S50 芯片),以便它可以与我的 iPhone 一起使用,我正在使用连接了 RC522 NFC 模块的 Raspberry Pi 4通过 GPIO 并使用 SPI。
我尝试了几种方法,最后得到上面的代码,它似乎没有向标签写入任何内容,而且我的 phone 确实无法读取它,我想我可能在某个地方搞砸了。
代码如下:
#!/usr/bin/env python
import RPi.GPIO as GPIO
import ndef
from mfrc522 import SimpleMFRC522
reader = SimpleMFRC522()
try:
message = [ndef.TextRecord("Hello"), ndef.TextRecord("World")]
print("Approach a tag to the reader")
reader.write(b''.join(ndef.message_encoder(message)))
print("Written")
finally:
GPIO.cleanup()
这是控制台输出:
Traceback (most recent call last):
File "Write.py", line 12, in <module>
reader.write(b''.join(ndef.message_encoder(message)))
File "/usr/local/lib/python3.7/dist-packages/mfrc522/SimpleMFRC522.py", line 62, in write
id, text_in = self.write_no_block(text)
File "/usr/local/lib/python3.7/dist-packages/mfrc522/SimpleMFRC522.py", line 78, in write_no_block
data.extend(bytearray(text.ljust(len(self.BLOCK_ADDRS) * 16).encode('ascii')))
AttributeError: 'bytes' object has no attribute 'encode'
这段代码有两个问题。
1)您已经创建了 ndef 消息的“字节流”,但 SimpleMFRC522 包需要一个 Unicode 字符串并将其编码以将其转换为“字节流”,所以基本上它已经是一个“字节流”,它不能被双重编码。
2)Mifare S50 芯片是 Mifare Classic 系列芯片,它们是专有格式,不符合 NFC 论坛标准,因此没有标准定义的方式在其上存储 Ndef 数据(您需要做的不仅仅是将一组原始字节写入内存到芯片,以便将其识别为 Ndef 数据格式的数据。
对于 NFC 标准 compliant/compatible 芯片,有许多类型定义了 Ndef 数据在每种类型上的存储方式。
虽然 NXP 已经定义了一种专有的方式来在 Mifare Classic 芯片上存储 Ndef 数据,但是“SimpleMFRC522”确实非常简单,并且没有编写标准 Ndef 消息的代码更不用说非标准的专有方法.
我还注意到,虽然 iPhone 硬件可以在低级别读取 Mifare Classic 卡,但我不确定它是否也在顶部实现了 Ndef 数据格式。我知道有些 Android 手机根本不支持专有的 Mifare Classic 硬件。
我建议您阅读 https://www.nxp.com/docs/en/application-note/AN1305.pdf 因为这是关于如何在这些卡上存储 NDEF 数据的专有格式定义
不幸的是,RC522 非常旧且功能有限,因此功能更强大的 Python NFC 模块不能很好地支持它。
使用 https://github.com/ondryaso/pi-rc522 可能会更好,因为它至少允许您写入原始字节。
我正在尝试将 NDEF 数据写入 NFC 标签(Mifare S50 芯片),以便它可以与我的 iPhone 一起使用,我正在使用连接了 RC522 NFC 模块的 Raspberry Pi 4通过 GPIO 并使用 SPI。
我尝试了几种方法,最后得到上面的代码,它似乎没有向标签写入任何内容,而且我的 phone 确实无法读取它,我想我可能在某个地方搞砸了。
代码如下:
#!/usr/bin/env python
import RPi.GPIO as GPIO
import ndef
from mfrc522 import SimpleMFRC522
reader = SimpleMFRC522()
try:
message = [ndef.TextRecord("Hello"), ndef.TextRecord("World")]
print("Approach a tag to the reader")
reader.write(b''.join(ndef.message_encoder(message)))
print("Written")
finally:
GPIO.cleanup()
这是控制台输出:
Traceback (most recent call last):
File "Write.py", line 12, in <module>
reader.write(b''.join(ndef.message_encoder(message)))
File "/usr/local/lib/python3.7/dist-packages/mfrc522/SimpleMFRC522.py", line 62, in write
id, text_in = self.write_no_block(text)
File "/usr/local/lib/python3.7/dist-packages/mfrc522/SimpleMFRC522.py", line 78, in write_no_block
data.extend(bytearray(text.ljust(len(self.BLOCK_ADDRS) * 16).encode('ascii')))
AttributeError: 'bytes' object has no attribute 'encode'
这段代码有两个问题。
1)您已经创建了 ndef 消息的“字节流”,但 SimpleMFRC522 包需要一个 Unicode 字符串并将其编码以将其转换为“字节流”,所以基本上它已经是一个“字节流”,它不能被双重编码。
2)Mifare S50 芯片是 Mifare Classic 系列芯片,它们是专有格式,不符合 NFC 论坛标准,因此没有标准定义的方式在其上存储 Ndef 数据(您需要做的不仅仅是将一组原始字节写入内存到芯片,以便将其识别为 Ndef 数据格式的数据。
对于 NFC 标准 compliant/compatible 芯片,有许多类型定义了 Ndef 数据在每种类型上的存储方式。
虽然 NXP 已经定义了一种专有的方式来在 Mifare Classic 芯片上存储 Ndef 数据,但是“SimpleMFRC522”确实非常简单,并且没有编写标准 Ndef 消息的代码更不用说非标准的专有方法.
我还注意到,虽然 iPhone 硬件可以在低级别读取 Mifare Classic 卡,但我不确定它是否也在顶部实现了 Ndef 数据格式。我知道有些 Android 手机根本不支持专有的 Mifare Classic 硬件。
我建议您阅读 https://www.nxp.com/docs/en/application-note/AN1305.pdf 因为这是关于如何在这些卡上存储 NDEF 数据的专有格式定义
不幸的是,RC522 非常旧且功能有限,因此功能更强大的 Python NFC 模块不能很好地支持它。
使用 https://github.com/ondryaso/pi-rc522 可能会更好,因为它至少允许您写入原始字节。