起源

看了原文 解决设备掉线问题:软件方案激动不已。
以前每次都要跑过去插拔手机,现在在键盘上敲一个命令就搞定了。

那篇文章还有一个问题没有解决,就是如何根据设备的 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)


↙↙↙阅读原文可查看相关链接,并与作者交流