我给自己买了Waveshare PN532 NFC HAT并将它安装到我的 Raspberry Pi 4 Model B 上。
我遵循了有关如何安装硬件和软件的官方指南。
现在我尝试运行给出的一些示例脚本,但出现错误。
运行 example_get_uid.py 脚本工作得非常好。
运行 example_rw_mifare.py 脚本引发了这个错误:
pi@raspberrypi:~/raspberrypi/python $ python3 example_rw_mifare.py
找到固件版本为 1.6 的 PN532
等待 RFID/NFC 卡写入!
...找到带有 UID 的卡:['0x1', '0x23', '0x45', '0x67']
回溯(最近一次通话最后):
文件“example_rw_mifare.py”,第 57 行,在
uid,block_number=block_number,key_number=nfc.MIFARE_CMD_AUTH_A,key=key_a)
mifare_classic_authenticate_block 中的文件“/home/pi/raspberrypi/python/pn532/pn532.py”,第 395 行
如果响应 [0]:
TypeError:“NoneType”对象不可下标
所以看起来给定的 pn532 库中存在错误。
有没有人以前遇到过这个错误并且知道如何解决它?
已经感谢您的回答。
编辑:
example_rw_mifare.py
"""
此示例显示连接到 PN532 并写入 M1
类型 RFID 标签
警告:不要写 4N+3 (3, 7, 11, ..., 63) 的块
否则您将更改块 4N ~ 4N+2 的密码。
笔记:
1. 4N+3块的前6个字节(KEY A)总是显示为0x00,
因为'KEY A'是不可读的。相比之下,最后 6 个字节(KEY B)的
4N+3 个块是可读的。
2. Block 0 不可写。
"""
导入 RPi.GPIO 作为 GPIO
将 pn532.pn532 导入为 nfc
从 pn532 导入 *
pn532 = PN532_SPI(调试=假,重置=20,cs=4)
#pn532 = PN532_I2C(调试=假,重置=20,请求=16)
#pn532 = PN532_UART(调试=假,重置=20)
ic,版本,版本,支持 = pn532.get_firmware_version()
print('找到固件版本为 {0} 的 PN532。{1}'.format(ver, rev))
# 配置PN532与MiFare卡通信
pn532.SAM_configuration()
print('等待 RFID/NFC 卡写入!')
而真:
# 检查卡片是否可以读取
uid = pn532.read_passive_target(超时=0.5)
print('.', end="")
# 如果没有可用的卡,请重试。
如果 uid 不是无:
休息
print('找到 UID:', [hex(i) for i in uid])
"""
警告:不要写 4N+3 (3, 7, 11, ..., 63) 的块
否则您将更改块 4N ~ 4N+2 的密码。
笔记:
1. 4N+3块的前6个字节(KEY A)总是显示为0x00,
因为'KEY A'是不可读的。相比之下,最后 6 个字节(KEY B)的
4N+3 个块是可读的。
2. Block 0 不可写。
"""
#写块#6
块数 = 6
key_a = b'\xFF\xFF\xFF\xFF\xFF\xFF'
数据 = 字节([0x00、0x01、0x02、0x03、0x04、0x05、0x06、0x07、0x08、0x09、0x0A、0x0B、0x0C、0x0D、0x0E、0x0F])
尝试:
pn532.mifare_classic_authenticate_block(uid, block_number=block_number, key_number=nfc.MIFARE_CMD_AUTH_A, key=key_a)
pn532.mifare_classic_write_block(block_number,数据)
如果 pn532.mifare_classic_read_block(block_number) == 数据:
print('写入块 %d 成功' % block_number)
除了 nfc.PN532Error 为 e:
打印(e.errmsg)
GPIO.cleanup()
这是 pn532.py 中的代码部分
def mifare_classic_authenticate_block(self, uid, block_number, ey_number, key): # pylint: disable=invalid-name
"""验证MiFare经典卡的指定块号。uid
应该是带有卡的 UID 的字节数组,块号应该是
要进行身份验证的块,密钥编号应该是密钥类型(例如
MIFARE_CMD_AUTH_A 或 MIFARE_CMD_AUTH_B),key 应该是一个字节数组
与关键数据。如果块已通过身份验证,则返回 True,否则返回 False
如果未通过身份验证。
"""
# 为 InDataExchange 命令构建参数以验证 MiFare 卡。
uidlen = len(uid)
keylen = len(键)
参数 = 字节数组(3+uidlen+keylen)
params[0] = 0x01 # 最大卡数
参数 [1] = key_number & 0xFF
参数 [2] = block_number & 0xFF
参数[3:3+keylen] = 键
参数[3+keylen:] = uid
# 发送 InDataExchange 请求并验证响应为 0x00。
响应 = self.call_function(_COMMAND_INDATAEXCHANGE,
参数=参数,
响应长度=1)
如果响应 [0]:
引发 PN532Error(响应 [0])
返回响应[0] == 0x00