2017-03-23 21 views
0

最近私のAndroid携帯電話をマシュマロに更新しました。残念なことに私のために、それは私のPythonコードを壊した。PyUSBでset_configurationを使用すると接続がリセットされます

PyUSBを使用すると、デバイスをアクセサリモードにすることができます。残念ながら、set_configuration()を使用すると接続がリセットされ、デバイスがアクセサリモードを終了してMTPモードに再び入るため、デバイスの読み書きはできなくなります。

dev = list(usb.core.find(find_all=True))[0] 
dev.ctrl_transfer(0xc0,51,data_or_wLength=2) 
dev.ctrl_transfer(0x40,52,wIndex=0,data_or_wLength='SAMSUNG') 
dev.ctrl_transfer(0x40,52,wIndex=1,data_or_wLength='SAMSUNG_Android') 
dev.ctrl_transfer(0x40,52,wIndex=2,data_or_wLength='16DIGITSERIALNUM') 
dev.ctrl_transfer(0x40,52,wIndex=3,data_or_wLength='AOA') 
dev.ctrl_transfer(0x40,52,wIndex=4,data_or_wLength='Whatever') 
dev.ctrl_transfer(0x40,52,wIndex=5,data_or_wLength='4') 
dev.ctrl_transfer(0x40,53) 
time.sleep(5) 
dev = list(usb.core.find(find_all=True))[0] 
dev.set_configuration() ## Aaaaaand we're back to MTP... 

これを回避する方法はありません。この問題への言及はありません。私がやっている解決策は、Cを学び、PyUSBモジュールが責任を負うと仮定して、libusbを直接使用することです。

答えて

0

これは良い解決策ではありませんが、

この問題は特定のバックエンド(libusb0)にあります。これは、インターフェイスがすでに要求されている場合など、リセット設定などのメッセージを送信します。いくつかのデバイス(例えば、私の場合)では、プログラムによる接続のリセットが発生します。

私の回避策では、アクセサリモードでデバイスを再取得するときに、libusb1バックエンドを使用します。リセットしないためです。しかし、libusb1は私に制御転送をさせませんので、私はバックエンドを切り替える必要があります。

from usb.backend import libusb0, libusb1、次にbe0,be1 = libusb0.get_backend(),libusb1.get_backend()

次に、バックエンドをパラメータとして指定して、usb.core.find

関連する問題