如何在Python中使用特定的服务代码和块数据模拟NFC FeliCa标签?

问题描述 投票:0回答:1

我正在开发一个项目,使用 nfcpy 在 Python 中模拟具有特定服务代码和块数据的 NFC 标签。我的目标是读取卡,捕获其数据(服务代码、块和内容),然后使用精确的数据结构模拟该标签,以便读卡器将其识别为原始卡。 代码运行没有错误,我可以看到诸如“标签已激活”之类的输出消息,但读卡器仍然无法像原始卡那样识别模拟标签。此外,我无法根据从原始卡检索到的块以允许正确读取和写入数据的方式正确设置服务代码。

这是我到目前为止所做的:

  1. 我可以使用

    nfcpy
    成功从卡中读取数据,包括服务代码和块数据。

  2. 根据我捕获的数据,我在 USB NFC 读卡器 (Sony RC-S380) 上使用

    nfcpy
    设置了仿真环境。

  3. 我尝试使用

    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")

我的问题是:

如何正确模拟具有特定服务代码和块数据的 NFC 标签,以便读卡器将其完全解释为原始卡?在设置可能影响仿真的服务代码或块数据时,是否缺少特定于 nfcpy 的内容?是否有更好的库或方法来实现 FeliCa 标签模拟,特别是当 nfcpy 在服务代码处理方面有限制时?

如有任何意见或建议,我们将不胜感激!谢谢你。

python nfc emulation
1个回答
0
投票

Ndef 是一种基于各种不同类型 NFC 标签的标准化数据格式,如果您尝试模拟捕获的“服务代码、块和内容”,那么尝试使用高级数据格式是行不通的将使用标签功能的特定子集。

该代码仅适用于在 Felica 标签之上模拟 Ndef 数据,您将必须阅读 Felica 和该阅读器的数据表,以便能够足够控制阅读器以进行较低级别的模拟(如果可以的话)(而且通常它无法完全模拟所有内容)

© www.soinside.com 2019 - 2024. All rights reserved.