首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NFC阅读器ACR122U和libnfc.driver.acr122_usb无法写入USB (结果太大)

NFC阅读器ACR122U和libnfc.driver.acr122_usb无法写入USB (结果太大)
EN

Stack Overflow用户
提问于 2019-09-10 18:01:23
回答 3查看 4.4K关注 0票数 1

我尝试在MacOSXMojav10.14.6和libnfc上使用ACR122 USB,当我尝试使用LIBNFC_LOG_LEVEL=3 nfc-list命令时,我遇到了一个“无法写入USB (结果太大)”的错误。

代码语言:javascript
复制
info    libnfc.config   Unable to open file: /usr/local/etc/nfc/libnfc.conf
debug   libnfc.config   key: [device.allow_autoscan], value: [false]
info    libnfc.config   Unknown key in config line: device.allow_autoscan = false
debug   libnfc.config   key: [device.allow_intrusive_scan], value: [false]
info    libnfc.config   Unknown key in config line: device.allow_intrusive_scan = false
debug   libnfc.config   key: [device.log_level], value: [3]
info    libnfc.config   Unknown key in config line: device.log_level = 3
debug   libnfc.general  log_level is set to 3
debug   libnfc.general  allow_autoscan is set to true
debug   libnfc.general  allow_intrusive_scan is set to false
debug   libnfc.general  0 device(s) defined by user
nfc-list uses libnfc 1.7.1
debug   libnfc.driver.acr122_usb    device found: Bus 020 Device 020 Name ACS ACR122
debug   libnfc.general  1 device(s) found using acr122_usb driver
debug   libnfc.driver.acr122_usb    3 element(s) have been decoded from "acr122_usb:020:020"
debug   libnfc.driver.acr122_usb    TX: 62 00 00 00 00 00 00 01 00 00
error   libnfc.driver.acr122_usb    Unable to write to USB (Result too large)
debug   libnfc.general  Unable to open "acr122_usb:020:020".
nfc-list: ERROR: Unable to open NFC device: acr122_usb:020:020

当我开始故障排除时,我出现了一个“无法声明USB接口”的错误,其他人也有。因此,我从堆栈溢出问题和 github问题中找到了以下内容:

  1. brew install libnfc安装libnfc ->获得“无法声明.”错误。
  2. 使用sudo ->无更改
  3. 禁用PC/SC守护进程->没有做任何事情
  4. 编辑/usr/libexec/SmartCardServices/drivers/ifd-ccid.bundle/Contents/Info.plist ->没有帮助
  5. 卸载libnfc,自己编译项目并禁用ifreader。我试图用驱动程序acr122_usb和acr122_pcsc ->构建它,但现在出现了一个“无法写入USB (结果太大)”的错误。
    • 用:autoreconf -iv && ./configure --with-drivers=acr122_usb && make clean && make && make install编译
    • sudo launchctl remove com.apple.ifdreader
    • sudo launchctl stop com.apple.ifdreader

在故障排除之后,我被错误困住了,不知道如何解决这个问题。阅读器灯不再闪烁红色,但由于错误,设备显然连接到计算机和可用的。

作为一个侧节点:我通过USB集线器连接读取器,因为读取器没有USB电缆,但这不应该是个问题。有没有人有同样的问题或者我可以尝试的另一种方法?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-12-07 20:54:39

您的步骤4,编辑/usr/libexec/SmartCardServices/drivers/ifd-ccid.bundle/Contents/Info.plist为我工作,这是我能找到的唯一干净的解决方案。

这里是一个简短的描述,您需要做什么:

  • 禁用“系统完整性保护”
  • 从plist 的3个数组( ifdFriendlyName、ifdVendorID和ifdProductID )中移除3条匹配行(具有相同数组索引的ifdFriendlyName、ifdVendorID和ifdProductID!
  • 启用“系统完整性保护”

在我的例子中的三行是条目编号370:

  • ifdFriendlyName="ACS ACR122U PICC接口“
  • ifdVendorID=0x072F
  • ifdProductID=0x2200

详细描述一步一步:

  1. 拔掉NFC读卡器的插头
  2. 关闭OSX
  3. 在启动Mac时,按住键盘上的<cmd>+<R>键,进入恢复模式
  4. 在恢复模式中,使用“实用程序”菜单打开终端窗口
  5. 执行命令csrutil disable
  6. 正常重新启动Mac
  7. 打开终端窗口并执行以下命令: sudo /usr/libexec/SmartCardServices/drivers/ifd-ccid.bundle/Contents -i cp Info.plist修补程序-l -p0 <
  8. 正常重新启动Mac
  9. 插入NFC读卡器
  10. 测试nfc实用程序现在是否工作,例如通过调用nfc-scan-device
  11. 关闭OSX
  12. 按住键盘上的<cmd>+<R>键,然后启动Mac进入恢复模式。
  13. 使用“实用程序”菜单打开终端窗口
  14. 执行命令csrutil enable
  15. 正常重新启动Mac

@anderssonjohan给出了正确的答案在他的岗位,但他发布的plist文件不一致,因为他只删除了一行而不是三行。

票数 4
EN

Stack Overflow用户

发布于 2021-10-13 15:30:53

第一种解决方案是我所需要的,但是启用SIP、更改驱动程序和恢复SIP对于我来说是太多了,这对我们的读者来说只是禁用PC/SC而已。

如果您在某些符合PC/SC标准的macos应用程序中使用读取器,此解决方案将不适用于您。

我找到了没有启用/禁用SIP的解决方案。

  1. 安装非系统驱动程序,在我的例子中,是https://www.acs.com.hk/download-driver-unified/12835/ACS-Unified-INST-MacOSX-1182-P.zip驱动程序。
  2. 在本地系统中找到这样的文件夹/usr/local/libexec/SmartCardServices/drivers/ifd-acsccid.bundle/Contents,它不受SIP保护,因为它的/usr/local和它的用户驱动程序
  3. 修改文件Info.plist如何在第一个答案中描述
  4. 拔掉和插上由读取器主导的插头不起作用(这是意料之中的!)
  5. 确保把你的读者显示在列表中。
  6. 使用acr122_usb驱动程序的libnfc

在这种情况下,macos系统会忽略系统驱动程序,因为它已经安装了用户驱动程序并应用于它们的所有配置,即使设备在其中被忽略了。

测试并与最新版本的libnfc从主机和macos BigSur 11.6

注意:为了能够正确地使用gen3 fob,我建议从主程序编译和安装libnfc,已经做了一些新的更改,但还没有发布(

票数 2
EN

Stack Overflow用户

发布于 2019-12-08 13:12:21

最初的问题是,守护进程system/com.apple.ifdreader加载用户级驱动程序/usr/libexec/SmartCardServices/drivers/ifd-ccid.bundle,即基于pcsc-lite,并声称拥有USB设备。要使libnfc可以访问读卡器,您可以

  • 告诉ifd-ccid忽略USB设备(我会告诉你如何实现这一点)
  • 告诉libnfc使用pcsc lite。
  • 完全禁用ifdreader守护进程(我认为这很危险,特别是在系统升级时)

我对这个问题作了两个回答:

  1. 这个假设假设您更熟悉终端和恢复环境中的路径。与其禁用“系统完整性保护”(),而且需要像我在另一个答案中描述的那样多次重新启动,您还可以只使用一次重新启动就可以做到这一点。
  2. 另一个答案需要更多的步骤(特别是重新启动),我已经写过了。它暂时禁用‘系统完整性保护’,这是危险的,当你忘记再次启用它。

在这里,可以执行一些命令来显示服务的状态:

代码语言:javascript
复制
launchctl list com.apple.ifdreader
launchctl blame system/com.apple.ifdreader

仅仅关闭守护进程或禁用它将无法工作,当系统检测到其Info.plist中列出其ID的USB设备时,它将自动(重新)启动,因此您需要从/usr/libexec/SmartCardServices/drivers/ifd-ccid.bundle/Contents/Info.plist中删除USB ID。

不幸的是,该文件受到MacOS Mojave 10.14.6中的“系统完整性保护”的保护,因此您只能在启动到恢复模式并在那里修改它时才能修改它,或者在那里使用csrutil disable禁用“系统完整性保护”,以便能够在正常的用户环境中修改它。

以下是您需要执行的步骤:

  1. 准备新的Info.plist并保存原始的备份(见下文)
  2. 关闭OSX
  3. 按住键盘上的<cmd>+<R>键,然后启动Mac进入恢复模式。
  4. 使用“实用程序”菜单打开“终端”窗口
  5. 将原来的/usr/libexec/SmartCardServices/drivers/ifd-ccid.bundle/Contents/Info.plist替换为您准备的

在进入恢复模式之前,您需要知道在哪些路径下可以找到文件,因为根文件系统是不同的,并且您的普通根文件系统将被挂载在/卷/下,所以在恢复模式之前在Finder中查找这个名称。

例如,我的系统驱动器名为Macintosh HD,路径如下:

  • 我的家:/Volumes/Macintosh HD/Users/michael
  • pinfo文件:/Volumes/Macintosh HD/usr/libexec/SmartCardServices/drivers/ifd-ccid.bundle/Contents/Info.plist

在我的示例中,最好的方法是使chroot '/Volumes/Macintosh HD'能够使用大多数普通的CLI命令。

要创建新的Info.plist文件,您可以使用我的另一个答案中的小补丁。或者您可以使用附加的python脚本,这更灵活。只需调用脚本,它将在当前目录的sub SmartCardService_disable中创建已更改的SmartCardService_disable文件:

代码语言:javascript
复制
#!/usr/bin/env python3
import os, re, plistlib
from shutil import copyfile
plistFile = "/usr/libexec/SmartCardServices/drivers/ifd-ccid.bundle/Contents/Info.plist"
plistFileBak = "Info.plist.orig"
plistFileOut = "Info.plist"
workDir = "SmartCardService_disable"
usbFriendlyNamePattern = ".*ACS.*ACR122.*"

def findDevicesByFriendlyName(pl, usbFriendlyNamePattern) :
        reUsbFriendlyName = re.compile(usbFriendlyNamePattern, re.IGNORECASE)
        indexes = []
        for index, item in enumerate(pl["ifdFriendlyName"]):
                if reUsbFriendlyName.fullmatch(item) :
                        indexes.append(index)
        return indexes

def makePlistCopy() :
        try:
                os.mkdir(workDir)
        except FileExistsError:
                pass
        except:
                raise Exception("Unable to create work directory")
        os.chdir(workDir)
        try:
                os.stat(plistFileBak)
        except FileNotFoundError:
                copyfile(plistFile, plistFileBak)
        except:
                raise Exception("Unable to copy plist file")

makePlistCopy()
pl = plistlib.readPlist(plistFileBak)
indexes = findDevicesByFriendlyName(pl, usbFriendlyNamePattern)
indexes.sort(reverse = True)
for index in indexes:
        del pl["ifdFriendlyName"][index]
        del pl["ifdVendorID"][index]
        del pl["ifdProductID"][index]

plistlib.writePlist(pl, plistFileOut)

该脚本可以很容易地修改以删除其他读卡器,只需将usbFriendlyNamePattern = ".*ACS.*ACR122.*"更改为任何其他模式即可。

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

https://stackoverflow.com/questions/57876097

复制
相关文章

相似问题

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