首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python pyscard控制NFC读取器的蜂鸣器。

Python pyscard控制NFC读取器的蜂鸣器。
EN

Stack Overflow用户
提问于 2022-02-03 14:35:32
回答 1查看 458关注 0票数 1

我有两个NFC读取设备: ACR12U和ACR1252U。

我在python中有一个简短的脚本,使用pyscard来读取NFC标记的UID:

代码语言:javascript
复制
from smartcard.CardMonitoring import CardMonitor, CardObserver
from smartcard.util import toHexString
from smartcard.Exceptions import CardConnectionException

getuid = [0xFF, 0xCA, 0x00, 0x00, 0x00]

class transmitobserver(CardObserver):
    def update(self, observable, actions):
        (addedcards, removedcards) = actions
        for card in addedcards:
            card.connection = card.createConnection()
            try:
                card.connection.connect()
            except CardConnectionException:
                # print("Card was removed too fast!")
                return
            response, sw1, sw2 = card.connection.transmit(
                getuid)
            nfc_id = "{}".format(toHexString(response)).replace(" ", "").lower()
            return nfc_id

if __name__ == '__main__':
    cardmonitor = CardMonitor()
    cardobserver = transmitobserver()
    cardmonitor.addObserver(cardobserver)
    try:
        while True:
            pass
    except KeyboardInterrupt:
        pass

当我的NFC卡接近时,ACR122U就会发出嗡嗡声.当NFC接近时,ACR1252U会发出嗡嗡声,当我移除它时,会再次发出嗡嗡声。

我想改变这种行为,所以只有当我删除卡片和卡片已被阅读时,他们才会发出嗡嗡声。我对它进行了测试,如果我移除一张卡太快,程序就会失败,但读者仍然认为它是成功的。

这是我第一次使用这样的方法,所以我尝试了一些尝试和错误的方法。

因此,我认为getuid = [0xFF, 0xCA, 0x00, 0x00, 0x00]正在向读者发送一个读取UID的命令,我在他们的手册中都找到了这个命令:

现在我想我可以用这个来控制蜂鸣器。在ACR1252U手册中,我发现了以下内容:

因此,我尝试了以下几点:

代码语言:javascript
复制
buzzer = [0xE0, 0x00, 0x00, 0x28, 0x01, 0xFF]
response = card.connection.transmit(buzzer)

但什么都没发生。对于ACR122U有不同的指令,但也会发生同样的事情。有人能帮我吗?我做错什么了?

编辑:

我能够更接近解决方案,但我仍然不明白发生了什么,100%。

我只有在写这篇文章的时候才有一个ACR122U,所以所有的测试都是用它完成的。从手册中,我能够得到一堆APDU,并且我找到了一个代码,它可以模拟读卡片,而不需要实际的卡被触摸到设备上,所以我可以测试它。

代码语言:javascript
复制
from smartcard.System import readers
from smartcard.CardConnection import CardConnection
from smartcard.scard import SCARD_SHARE_DIRECT

reader = readers()[0]
connection = reader.createConnection()
connection.connect(protocol=CardConnection.RAW_protocol, mode=SCARD_SHARE_DIRECT)
turn_off_red = [0xFF, 0x00, 0x40, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00]
r, sw1, sw2 = connection.transmit(turn_off_red)

现在我有了APDU:turn_off_red = [0xFF, 0x00, 0x40, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00]

按照手册的规定,红色的变化也是一样的,但只是几秒钟而已。即使我在代码的末尾放了一个sleep(50),红色的LED也只闪烁了一秒,而不是回头。

我认为,当我尝试使用configBuzzer = [0xFF, 0x00, 0x52, 0x00, 0x00]时,也会发生同样的事情。它把蜂鸣器关了几秒钟,但后来又打开了。

EN

回答 1

Stack Overflow用户

发布于 2022-02-06 00:11:31

双指针

1)使用命令APDU发送的所有命令都具有Result的标准响应APDU格式(如果可用--大多数确实有结果)、SW1SW2

所以您应该使用代码response, sw1, sw2 = card.connection.transmit(buzzer)

您应该始终检查SW1 = 90hSW2 = 00h以确认该命令是否成功(其他值将指示错误,有关代码含义的更多细节,请参见数据表)

2)您说您希望它在成功读取卡片时发出嗡嗡声,但是在读取UID时,您不会检查SW1SW2值是否成功。

3)命令buzzer = [0xE0, 0x00, 0x00, 0x28, 0x01, 0xFF]是手动打开蜂鸣器,当您希望在签入读取的SW1SW2值后手动指示成功时,这个命令不会改变读取器的默认嗡嗡声行为。

在ACR1252U上,configBuzzer = [0xE0, 0x00, 0x00, 0x21, 0x01, 0x67]应该是关闭卡插入事件和卡片删除事件上的嗡嗡声的正确比特,这正是您所希望的,这样您就可以在成功时手动触发蜂鸣器(再次检查SW1SW2是否成功)。

ACR122U更新

configBuzzer = [0xFF, 0x00, 0x52, 0x00, 0x00]

然后

response, sw1, sw2 = card.connection.transmit(configBuzzer)

这不会导致蜂鸣器在标记检测期间不打开( ACR122U比ACR1252U具有更少的配置选项)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70973148

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档