0

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

0 回答 0