我有两个NFC读取设备: ACR12U和ACR1252U。
我在python中有一个简短的脚本,使用pyscard来读取NFC标记的UID:
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手册中,我发现了以下内容:

因此,我尝试了以下几点:
buzzer = [0xE0, 0x00, 0x00, 0x28, 0x01, 0xFF]
response = card.connection.transmit(buzzer)但什么都没发生。对于ACR122U有不同的指令,但也会发生同样的事情。有人能帮我吗?我做错什么了?
编辑:
我能够更接近解决方案,但我仍然不明白发生了什么,100%。
我只有在写这篇文章的时候才有一个ACR122U,所以所有的测试都是用它完成的。从手册中,我能够得到一堆APDU,并且我找到了一个代码,它可以模拟读卡片,而不需要实际的卡被触摸到设备上,所以我可以测试它。
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]时,也会发生同样的事情。它把蜂鸣器关了几秒钟,但后来又打开了。
发布于 2022-02-06 00:11:31
双指针
1)使用命令APDU发送的所有命令都具有Result的标准响应APDU格式(如果可用--大多数确实有结果)、SW1和SW2
所以您应该使用代码response, sw1, sw2 = card.connection.transmit(buzzer)
您应该始终检查SW1 = 90h和SW2 = 00h以确认该命令是否成功(其他值将指示错误,有关代码含义的更多细节,请参见数据表)
2)您说您希望它在成功读取卡片时发出嗡嗡声,但是在读取UID时,您不会检查SW1和SW2值是否成功。
3)命令buzzer = [0xE0, 0x00, 0x00, 0x28, 0x01, 0xFF]是手动打开蜂鸣器,当您希望在签入读取的SW1和SW2值后手动指示成功时,这个命令不会改变读取器的默认嗡嗡声行为。
在ACR1252U上,configBuzzer = [0xE0, 0x00, 0x00, 0x21, 0x01, 0x67]应该是关闭卡插入事件和卡片删除事件上的嗡嗡声的正确比特,这正是您所希望的,这样您就可以在成功时手动触发蜂鸣器(再次检查SW1和SW2是否成功)。
ACR122U更新
configBuzzer = [0xFF, 0x00, 0x52, 0x00, 0x00]
然后
response, sw1, sw2 = card.connection.transmit(configBuzzer)
这不会导致蜂鸣器在标记检测期间不打开( ACR122U比ACR1252U具有更少的配置选项)
https://stackoverflow.com/questions/70973148
复制相似问题