実現したいこと・現状
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
あなたの回答
tips
プレビュー