我正在开发一个项目,使用 nfcpy 在 Python 中模拟具有特定服务代码和块数据的 NFC 标签。我的目标是读取卡,捕获其数据(服务代码、块和内容),然后使用精确的数据结构模拟该标签,以便读卡器将其识别为原始卡。 代码运行没有错误,我可以看到诸如“标签已激活”之类的输出消息,但读卡器仍然无法像原始卡那样识别模拟标签。此外,我无法根据从原始卡检索到的块以允许正确读取和写入数据的方式正确设置服务代码。
这是我到目前为止所做的:
我可以使用
nfcpy
成功从卡中读取数据,包括服务代码和块数据。
根据我捕获的数据,我在 USB NFC 读卡器 (Sony RC-S380) 上使用
nfcpy
设置了仿真环境。
我尝试使用
tag.add_service()
添加服务并定义 ndef_read
和 ndef_write
函数来提供块级数据。
我可以使用 nfcpy 成功从卡中读取数据,包括服务代码和块数据。根据我捕获的数据,我在 USB NFC 读卡器 (Sony RC-S380) 上使用 nfcpy 设置了仿真环境。我尝试使用 tag.add_service() 添加服务并定义 ndef_read 和 ndef_write 函数以提供块级数据。
这是迄今为止我的代码示例:
import nfc
import struct
ndef_data_area = bytearray(64 * 16)
ndef_data_area[0] = 0x10 # NDEF mapping version '1.0'
ndef_data_area[1] = 12 # Number of blocks that may be read at once
ndef_data_area[2] = 8 # Number of blocks that may be written at once
ndef_data_area[4] = 63 # Number of blocks available for NDEF data
ndef_data_area[10] = 1 # NDEF read and write operations are allowed
ndef_data_area[14:16] = struct.pack('>H', sum(ndef_data_area[0:14])) # Checksum
def ndef_read(block_number, rb, re):
if block_number < len(ndef_data_area) / 16:
first, last = block_number * 16, (block_number + 1) * 16
return ndef_data_area[first:last]
def ndef_write(block_number, block_data, wb, we):
global ndef_data_area
if block_number < len(ndef_data_area) / 16:
first, last = block_number * 16, (block_number + 1) * 16
ndef_data_area[first:last] = block_data
return True
def on_startup(target):
idm, pmm, sys = '03FEFFE011223344', '01E0000000FFFF00', '12FC'
target.sensf_res = bytearray.fromhex('01' + idm + pmm + sys)
target.brty = "212F"
return target
def on_connect(tag):
print("tag activated")
tag.add_service(0x1A88, ndef_read, ndef_write)
tag.add_service(0x000B, ndef_read, lambda: False)
return True
with nfc.ContactlessFrontend('usb:054c:06c1') as clf:
while clf.connect(card={'on-startup': on_startup, 'on-connect': on_connect}):
print("tag released")
我的问题是:
nfcpy
的某些特定内容?nfcpy
在服务代码处理方面有限制?如有任何意见或建议,我们将不胜感激!谢谢你。
Ndef 是一种基于各种不同类型 NFC 标签的标准化数据格式,如果您尝试模拟捕获的“服务代码、块和内容”,那么尝试使用高级数据格式是行不通的将使用标签功能的特定子集。
该代码仅适用于在 Felica 标签之上模拟 Ndef 数据,您将必须阅读 Felica 和该阅读器的数据表,以便能够足够控制阅读器以进行较低级别的模拟(如果可以的话)(而且通常它无法完全模拟所有内容)