在 PyUSB 中使用 set_configuration 时连接重置
connection resets when using set_configuration in PyUSB
我最近将 android phone 更新为 Marshmallow。不幸的是,这破坏了我的 python 代码。
使用 PyUSB,我可以让设备进入附件模式。不幸的是,我无法再 read/write 到设备,因为现在使用 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 并直接使用 libusb
,假设 PyUSB
模块是罪魁祸首...
嗯,这不是一个好的解决方案,但以防万一其他人碰巧遇到这个问题并发现这个问题:
问题出在特定的后端 (libusb0
),如果接口已被声明,它会发送一条消息来重置配置或类似的东西。在某些设备(例如我的设备)中,这会导致连接的编程重置。
我的解决方法是在配件模式下重新获取设备时使用libusb1
后端,因为它不会导致重置。但是由于 libusb1
不允许我进行控制转移,我需要在后端之间切换。
from usb.backend import libusb0, libusb1
,然后 be0,be1 = libusb0.get_backend(),libusb1.get_backend()
。
然后只需将后端指定为参数即可 usb.core.find
我最近将 android phone 更新为 Marshmallow。不幸的是,这破坏了我的 python 代码。
使用 PyUSB,我可以让设备进入附件模式。不幸的是,我无法再 read/write 到设备,因为现在使用 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 并直接使用 libusb
,假设 PyUSB
模块是罪魁祸首...
嗯,这不是一个好的解决方案,但以防万一其他人碰巧遇到这个问题并发现这个问题:
问题出在特定的后端 (libusb0
),如果接口已被声明,它会发送一条消息来重置配置或类似的东西。在某些设备(例如我的设备)中,这会导致连接的编程重置。
我的解决方法是在配件模式下重新获取设备时使用libusb1
后端,因为它不会导致重置。但是由于 libusb1
不允许我进行控制转移,我需要在后端之间切换。
from usb.backend import libusb0, libusb1
,然后 be0,be1 = libusb0.get_backend(),libusb1.get_backend()
。
然后只需将后端指定为参数即可 usb.core.find