1

私はLED付きのUSBマスストレージを持っています

私はLEDをつけたり消したりしようとしています

USB パケット スニッフィング ツール USBlyzer を使用して、

生データを取得できます

55 53 42 43 58 66 93 88 00 00 00 00 00 00 06 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

要求情報がバルクまたは割り込み転送で、I/O がアウトになっている

および USB プロパティ セクションで

などの情報を得ることができます。

エンドポイント記述子 81 1 入力、バルク、512 バイト

bDescriptorType 05h Endpoint

bEndpointAddress 81h 1 In

エンドポイント記述子 02 2 入力、一括、512 バイト

bDescriptorType 05h Endpoint

bEndpointAddress 02h 2 Out

python 2.7、libusb-win32-bin-1.2.4.0、pyusb-1.0.0-a1でpythonコードを作ってみました

完全なソースはここにあります

import usb.core
import usb.util

# find our device
dev = usb.core.find(idVendor=0x1516, idProduct=0x8628)

# was it found?
if dev is None:
    raise ValueError('Device not found')

dev.set_configuration()
# get an endpoint instance
cfg = dev.get_active_configuration()
interface_number = cfg[0].bInterfaceNumber
alternate_setting = usb.control.get_interface(interface_number)
intf = usb.util.find_descriptor(cfg, bInterfaceNumber = \
                                ineterface_number, bAlternateSetting = alternate_setting)
ep = usb.util.find_descriptor(intf,custom_match = \
                                  lambda e: \
                                      usb.util.endpoint_direction(e.bEndpointAddress) == \
                                      usb.util.ENDPOINT_OUT)
# set the active configuration. With no arguments, the first
# configuration will be the active one


assert ep is not None

ep.write(0x2,0x55)
ep.write(0x2,0x53)
ep.write(0x2,0x42)
ep.write(0x2,0x43)
ep.write(0x2,0x58)
ep.write(0x2,0x66)
ep.write(0x2,0x93)
ep.write(0x2,0x88)
ep.write(0x2,0x00)
ep.write(0x2,0x00)
ep.write(0x2,0x00)
ep.write(0x2,0x00)
ep.write(0x2,0x00)
ep.write(0x2,0x00)
ep.write(0x2,0x00)
ep.write(0x2,0x06)
ep.write(0x2,0x00)
ep.write(0x2,0x00)
ep.write(0x2,0x00)
ep.write(0x2,0x00)
ep.write(0x2,0x00)
ep.write(0x2,0x00)
ep.write(0x2,0x00)
ep.write(0x2,0x00)
ep.write(0x2,0x00)
ep.write(0x2,0x00)
ep.write(0x2,0x00)
ep.write(0x2,0x00)
ep.write(0x2,0x00)
ep.write(0x2,0x00)
ep.write(0x2,0x00)
ep.write(0x2,0x00)

しかし、私がそれを実行しようとすると、

Traceback (most recent call last):
  File "C:\Documents and Settings\kty1104\Desktop\usb2.py", line 14, in <module>
    interface_number = cfg[0].bInterfaceNumber
  File "C:\Python27\lib\site-packages\usb\core.py", line 447, in __getitem__
    return Interface(self.device, index[0], index[1], self.index)
TypeError: 'int' object is not subscriptable

生じる

私のコードの何が問題になっていますか?

何か間違った概念があれば、私に知らせてください

ありがとう!

4

1 に答える 1

2

私はpyusbについて何も知りませんが、エラーメッセージの私の解釈は、他の人の意見に反して、cfg整数ではなく、非整数のインデックスが必要だということです。私がこれを言うのは、例外が__getitem__関数でスローされるためです。これは 's のみである可能性がありcfgます。__getitem____getitem__

interface_number = cfg[0].bInterfaceNumber

が int の場合、.cfgはありません__getitem__。問題は、中央cfgの2 つの引数 で示されているように、 が受信した__getitem__に添字を付けられることを期待しているように見えることです。整数を渡したので、それは不可能です。indexindex[0], index[1]cfg


チュートリアルから:

次のように、添え字演算子を使用して記述子にランダムにアクセスすることもできます。

>>> # access the second configuration
>>> cfg = dev[1]
>>> # access the first interface
>>> intf = cfg[(0,0)]
>>> # third endpoint
>>> ep = intf[2] 

ご覧のとおり、インデックスはゼロ ベースです。ちょっと待って!インターフェイスにアクセスする方法に何か奇妙なことがあります... はい、そのとおりです。構成の添字演算子は、最初の項目がインターフェイスのインデックスで、2 番目の項目が代替の 2 つの項目のシーケンスを受け入れます。設定。したがって、最初のインターフェイスにアクセスするために、ただしその 2 番目の代替設定にアクセスするには、cfg[(0,1)] と記述します。

于 2011-06-02T15:42:01.097 に答える