0

libnfc を使用して Mac OSX Mojave 10.14.6 で ACR122 USB NFC リーダーを使用しようとすると、次のコマンドを使用しようとすると「USB に書き込めません (結果が大きすぎます)」というエラーが表示されますLIBNFC_LOG_LEVEL=3 nfc-list

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 C ケーブルがないため、USB ハブを介してリーダーを接続しますが、問題にはなりません。誰かが同じ問題を抱えているか、私が試すことができる別のアプローチを持っていますか?

4

3 に答える 3

0

元の問題は、デーモンがpcsc-lite に基づくsystem/com.apple.ifdreaderユーザーレベルのドライバー/usr/libexec/SmartCardServices/drivers/ifd-ccid.bundleをロードし、USB デバイスの所有権を要求することです。カードリーダーをlibnfcにアクセスできるようにするには、次のいずれかを実行できます

  • USB デバイスを無視するように ifd-ccid に指示します (これを実現する方法を説明します)。
  • libnfc に pcsc-lite を使用するように指示します
  • ifdreader デーモンを完全に無効にします (特にシステムのアップグレードでは危険だと思います)。

この質問に対して、私は次の 2 つの回答をしました。

  1. これは、ターミナルと回復環境のパスに少し慣れていることを前提としています。「システム整合性保護」を無効にして、他の回答で説明されているように複数回の再起動が必要になる代わりに、1回の再起動でこれを行うこともできます
  2. 他の答えには、より多くの手順(特に再起動)が必要であり、以前に書いています。「システム整合性保護」を一時的に無効にしますが、再度有効にするのを忘れると危険です。

サービスのステータスを表示するために実行できるいくつかのコマンドを次に示します。

launchctl list com.apple.ifdreader
launchctl blame system/com.apple.ifdreader

デーモンを強制終了したり、無効にしたりするだけでは機能しません。ID が Info.plist にリストされている USB デバイスをシステムが検出すると、デーモンは自動的に (再) 起動されるため、USB ID を から削除する必要があります/usr/libexec/SmartCardServices/drivers/ifd-ccid.bundle/Contents/Info.plist

残念ながら、そのファイルは 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を用意したものに差し替えます

リカバリ モードに入る前に、ルート ファイル システムが異なり、通常のルート ファイル システムが /Volumes/< TheNameOfYourSystemDisk > の下にマウントされるため、ファイルが見つかるパスを知る必要があります。回復モードに入ります。

たとえば、私のシステムドライブが呼び出され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 スクリプトを使用することもできます。SmartCardService_disableスクリプトを呼び出すだけで、現在のディレクトリのサブディレクトリに変更された Info.plist ファイルが作成されます。

#!/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.*"できます。他のパターンに変更するだけです。

于 2019-12-08T13:12:21.833 に答える