看了原文 解决设备掉线问题:软件方案激动不已。
以前每次都要跑过去插拔手机,现在在键盘上敲一个命令就搞定了。
那篇文章还有一个问题没有解决,就是如何根据设备的 Serial 去重置设备?
因为对 Python 比较熟悉,查找了下 libusb 相关的库,顺利找到一个看样子很鲁棒的库 https://github.com/pyusb/pyusb
Linux 需要运行在 Root 权限下
# 列出所有设备
$ python adbusb.py list
bf755cab Android
3f980000.usb DWC OTG Controller
# 重置设备bf755cab的USB连接
$ python adbusb.py reset bf755cab
# 只填写前缀也可以
$ python adbusb.py reset bf
$ pip install --pre pyusb
$ pip install fire # 命令行解析,用于下面的脚本
Mac 系统还需要安装brew install libusb
, Linux 貌似自己就支持,反正我没装什么别的依赖
代码是针对 python2 写的,如需兼容 py3,需要自行修改
将下面的文件保存成 adbusb.py
#!/usr/bin/env python
# coding: utf-8
#
import usb
import fire
class AdbUSB(object):
def list(self):
for d in usb.core.find(find_all=True):
if d.serial_number:
print('%s\t%s' %(d.serial_number, d.product))
def reset(self, serial):
devices = {}
for d in usb.core.find(find_all=True):
if d.serial_number:
devices[d.serial_number] = d
ok_serials = []
for sn in devices.keys():
if sn.startswith(str(serial)):
ok_serials.append(sn)
if len(ok_serials) == 1:
serial = ok_serials[0]
d = devices.get(serial)
try:
d.reset()
except usb.core.USBError:
pass
elif len(ok_serials) == 0:
print('No device serial number is', serial)
else:
print('Too many device matched', serial)
if __name__ == '__main__':
fire.Fire(AdbUSB)