質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

Q&A

0回答

2569閲覧

libusbのUSBデバイスへのアクセスが拒否される (Mac OS X)

muta_

総合スコア0

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

1グッド

1クリップ

投稿2021/07/05 23:19

編集2021/07/05 23:22

実現したいこと・現状

USB接続されたQRコードリーダーのインタラプト転送を読み込むPythonシステムを実現したいです。

現状、ベンダーID・プロダクトIDからデバイスオブジェクトを取得することはできました。
しかし、デバイスのインタラプト転送を読み込むに際に以下のエラーメッセージが発生し、解決方法を見出せずにいます。

解決方法やアイデアなど、ご教示いただけますと幸いです。
どうぞ、よろしくお願い致します。

発生している問題・エラーメッセージ

raise USBError(_strerror(ret), ret, _libusb_errno[ret]) usb.core.USBError: [Errno 13] Access denied (insufficient permissions)

アクセス権がないため、アクセスが拒否されたと返ってきます。

該当のソースコード

Python

1import usb.core 2import usb.util 3 4vid = 0xac90 5pid = 0x3002 6 7# デバイスの取得 8dev = usb.core.find(idVendor=vid, idProduct=pid) 9 10# デバイスが取得できなかったらエラーを出す 11if not dev: 12 raise ValueError('Device not found!') 13 14# デバイスのアクティブなコンフィギュレーションを取得 15cfg = dev.get_active_configuration() 16 17# アクティブなコンフィギュレーションをセット 18dev.set_configuration(cfg) 19 20# デバイスのエンドポイントにアクセスして読み込み (ここでエラーが出る) 21result = dev.read(0x81, 1024, timeout=1000)

試したこと

libusb1.pyがclaim_interfaceメソッドでデバイスの使用権を要求した際に、エラーが起こっているのではないかと仮説を立てています。
claim_interfaceメソッドは以下のように記述されており、こちらから_checkメソッドを呼んだ際に引数retの値が-3となっていました。

def claim_interface(self, dev_handle, intf): _check(self.lib.libusb_claim_interface(dev_handle.handle, intf))
def _check(ret): if hasattr(ret, 'value'): ret = ret.value if ret < 0: if ret == LIBUSB_ERROR_NOT_SUPPORTED: raise NotImplementedError(_strerror(ret)) elif ret == LIBUSB_ERROR_TIMEOUT: raise USBTimeoutError(_strerror(ret), ret, _libusb_errno[ret]) else: raise USBError(_strerror(ret), ret, _libusb_errno[ret]) # retが−3の為ここでエラーを吐いた return ret
# return codes LIBUSB_SUCCESS = 0 LIBUSB_ERROR_IO = -1 LIBUSB_ERROR_INVALID_PARAM = -2 LIBUSB_ERROR_ACCESS = -3 # 現状のエラー LIBUSB_ERROR_NO_DEVICE = -4 # map return codes to strings _str_error_map = { LIBUSB_SUCCESS:'Success (no error)', LIBUSB_ERROR_IO:'Input/output error', LIBUSB_ERROR_INVALID_PARAM:'Invalid parameter', LIBUSB_ERROR_ACCESS:'Access denied (insufficient permissions)', # 現状のエラー LIBUSB_ERROR_NO_DEVICE:'No such device (it may have been disconnected)', }

なぜ、retの値が-3となったのか?このあたりが理解できずにいます。
また、どのように修正を加えることでこの問題を解決できるのか、どんな些細なことでもアイデアをいただけますと幸いです。

補足情報(FW/ツールのバージョンなど)

■実行環境
OS : macOS Big Sur 11.4
Python : 3.9.5
pyusb : 1.1.1
libusb : 1.0.23b7

■使用しているハードウェア
今回使用しているQRコードリーダーはこちらのようなもので、Macから見たときにはUSBキーボードとして認識されています。

QRコードリーダーの情報は以下のようになりました。
デバイス→マシンのインタラプト転送用エンドポイント(0x81)があることが確認できています。

terminal

1DEVICE ID ac90:3002 on Bus 020 Address 054 ================= 2 bLength : 0x12 (18 bytes) 3 bDescriptorType : 0x1 Device 4 bcdUSB : 0x110 USB 1.1 5 bDeviceClass : 0x0 Specified at interface 6 bDeviceSubClass : 0x0 7 bDeviceProtocol : 0x0 8 bMaxPacketSize0 : 0x40 (64 bytes) 9 idVendor : 0xac90 10 idProduct : 0x3002 11 bcdDevice : 0x100 Device 1.0 12 iManufacturer : 0x1 SM 13 iProduct : 0x2 SM-2D PRODUCT HID KBW 14 iSerialNumber : 0x3 APP-000000000 15 bNumConfigurations : 0x1 16 CONFIGURATION 1: 200 mA ================================== 17 bLength : 0x9 (9 bytes) 18 bDescriptorType : 0x2 Configuration 19 wTotalLength : 0x22 (34 bytes) 20 bNumInterfaces : 0x1 21 bConfigurationValue : 0x1 22 iConfiguration : 0x0 23 bmAttributes : 0x80 Bus Powered 24 bMaxPower : 0x64 (200 mA) 25 INTERFACE 0: Human Interface Device ==================== 26 bLength : 0x9 (9 bytes) 27 bDescriptorType : 0x4 Interface 28 bInterfaceNumber : 0x0 29 bAlternateSetting : 0x0 30 bNumEndpoints : 0x1 31 bInterfaceClass : 0x3 Human Interface Device 32 bInterfaceSubClass : 0x1 33 bInterfaceProtocol : 0x1 34 iInterface : 0x0 35 ENDPOINT 0x81: Interrupt IN ========================== 36 bLength : 0x7 (7 bytes) 37 bDescriptorType : 0x5 Endpoint 38 bEndpointAddress : 0x81 IN 39 bmAttributes : 0x3 Interrupt 40 wMaxPacketSize : 0x8 (8 bytes) 41 bInterval : 0x1
YouheiSakurai👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問