我给自己买了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