如何将NTAG213/215 NFC标签设为只读?附代码报错咨询
嘿,我来帮你搞定这个NFC贴纸只读设置的问题!你遇到的TypeError是因为nfcpy里的NTAG对象不能直接用下标访问内存块,得用专门的方法来读写标签的内存区域。下面一步步给你讲清楚:
一、修复NTAG213设置只读的代码错误
首先修正你的代码,用nfcpy提供的read_block和write_block方法来操作标签内存:
import nfc from time import sleep from nfc.clf import RemoteTarget import ndef clf = nfc.ContactlessFrontend('usb') while True: target = clf.sense(RemoteTarget('106A'), RemoteTarget('106B'), RemoteTarget('212F')) if target is None: sleep(1) continue serial = target.sdd_res.hex() tag = nfc.tag.activate(clf, target) if not tag.ndef: print("No NDEF records found!") # 先写入测试NDEF数据(如果需要的话) record = ndef.UriRecord("https://www.example.com") tag.ndef.records = [record] print("Wrote test NDEF record.") # 打印现有NDEF记录 for record in tag.ndef.records: print("Found record: " + str(record)) # 1. 设置访问条件:块10、11设为0xFF,无需认证即可读取 tag.write_block(10, b'\xFF\xFF\xFF\xFF') tag.write_block(11, b'\xFF\xFF\xFF\xFF') # 2. 锁定所有内存块:修改块15(锁控制块)的第一个字节 block15 = bytearray(tag.read_block(15)) block15[0] = block15[0] | 0x0F # 锁定所有块0-15 tag.write_block(15, block15) print("NTAG213已设置为只读状态!") break # 操作完成后退出循环
关键说明:
- NTAG213的访问条件块是块10和11,写入
0xFF表示无需认证就能读取标签内容 - 锁控制块是块15,修改第一个字节为
0x0F会锁定所有内存块(0-15),之后无法修改任何数据
二、NTAG215设置只读的操作
NTAG215的内存结构和213类似,只是块号不同,调整对应的块即可:
# 针对NTAG215的修改部分 # 1. 设置访问条件:块34、35设为0xFF tag.write_block(34, b'\xFF\xFF\xFF\xFF') tag.write_block(35, b'\xFF\xFF\xFF\xFF') # 2. 锁定所有内存块:修改块39(锁控制块)的第一个字节 block39 = bytearray(tag.read_block(39)) block39[0] = block39[0] | 0x0F # 锁定所有块0-39 tag.write_block(39, block39) print("NTAG215已设置为只读状态!")
关键说明:
- NTAG215的访问条件块是块34和35
- 锁控制块是块39,同样通过修改第一个字节锁定所有块
三、NFC贴纸设置只读的通用流程
不管是NTAG系列还是其他类型的NFC贴纸,设置只读的核心逻辑都是一致的,步骤如下:
- 确认标签规格:先查对应标签的官方 datasheet,找到访问条件块和锁控制块的位置、格式
- 写入数据:先把需要存储的NDEF数据写入标签(确保内容正确,锁定后无法修改)
- 配置访问权限:修改访问条件块,设置为「无需认证即可读取」(通常是写入特定值,比如
0xFF,具体看 datasheet) - 锁定内存:修改锁控制块,将数据区和配置区锁定为只读(这一步不可逆,一定要谨慎)
- 验证效果:尝试重新写入数据,确认操作失败;再用设备读取,确认内容正常显示
重要注意事项:
- 锁定操作是不可逆的,一旦设置为只读,就无法再修改标签内容,操作前务必确认数据正确
- 不同品牌、型号的NFC标签锁机制差异很大,必须参考官方文档,不能照搬NTAG的操作
内容的提问来源于stack exchange,提问作者James




