51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 3343|回复: 3
打印 上一主题 下一主题

[转贴] 解决自动化测试设备掉线:软件方案

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2017-6-29 09:14:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本着折腾精神,这几天收集了一些软件方案,现总结下,方便碰到同样问题的小伙伴参考。
windows软件解决方案设备实例路径查看办法:win+r打开运行窗口 ——> 输入devmgmt.msc打开设备管理器 ——> 选择你的设备双击 ——> 切换到属性tab页 ——> 在属性下拉框选择设备实例路径

linux/ubuntu软件解决方案
  • python代码实现:
    • 原理:ioctl
    • 代码:
  1. # coding:utf-8
  2. import os
  3. import fcntl
  4. import subprocess
  5. USBDEVFS_RESET = ord('U') << (4 * 2) | 20
  6. def get_adb_usb_devices():
  7.     lines = os.popen('lsusb').readlines()
  8.     target_lines = []
  9.     for line in lines:
  10.         if 'MediaTek' in line or 'Spreadtrum' in line or 'Qualcomm' in line:
  11.             target_lines.append(line)
  12.     adb_usb_devices = []
  13.     for line in target_lines:
  14.         parts = line.split()
  15.         # print parts
  16.         bus = parts[1]
  17.         dev = parts[3][:3]
  18.         adb_usb_devices.append('/dev/bus/usb/%s/%s' % (bus, dev))
  19.     return adb_usb_devices
  20. def send_reset(adb_device_path):
  21.     fd = os.open(adb_device_path, os.O_WRONLY)
  22.     print fd
  23.     try:
  24.         ret = fcntl.ioctl(fd, USBDEVFS_RESET, 0)
  25.     finally:
  26.         os.close(fd)
  27.     if ret < 0:
  28.         return False
  29.     else:
  30.         return True
  31. def main():
  32.     # 请求root权限
  33.     if (os.getuid() != 0):
  34.         exe = subprocess.Popen(['sudo', 'python', __file__])
  35.         exe.wait()
  36.         exit(1)
  37.     # 打印信息
  38.     print '-' * 75
  39.     print 'Usage   : USB device Reset Tool for android QCom|Sprd|MTK device'
  40.     print 'Coder  : Wanyor'
  41.     print '-' * 75
  42.     adb_usb_devices = get_adb_usb_devices()
  43.     print 'usb:', adb_usb_devices
  44.     for adb_device_path in adb_usb_devices:
  45.                 if (send_reset(adb_device_path)):
  46.                     print 'Reset {0} Success!'.format(adb_device_path)
  47.                 else:
  48.                     print 'Reset {0} Fail!'.format(adb_device_path)
  49. if __name__ == '__main__':
  50.     main()
复制代码
  • c语言编写cli程序实现:
    • 原理:ioctl
    • 代码:
  1. usbreset.c

  2. #include <stdio.h>
  3. #include <unistd.h>
  4. #include <fcntl.h>
  5. #include <errno.h>
  6. #include <sys/ioctl.h>
  7. #include <linux/usbdevice_fs.h>
  8. int main(int argc, char **argv)
  9. {
  10.     const char *filename;
  11.     int fd;
  12.     int rc;
  13.     if (argc != 2) {
  14.         fprintf(stderr, "Usage: usbreset device-filename\n");
  15.         return 1;
  16.     }
  17.     filename = argv[1];
  18.     fd = open(filename, O_WRONLY);
  19.     if (fd < 0) {
  20.         perror("Error opening output file");
  21.         return 1;
  22.     }
  23.     printf("Resetting USB device %s\n", filename);
  24.     rc = ioctl(fd, USBDEVFS_RESET, 0);
  25.     if (rc < 0) {
  26.         perror("Error in ioctl");
  27.         return 1;
  28.     }
  29.     printf("Reset successful\n");
  30.     close(fd);
  31.     return 0;
  32. }
复制代码

然后用gcc usbreset.c -o usbreset编译下,sudo chmod a+x usbreset给cli程序执行权限即可运行,参数为设备的挂载路径(例如:/dev/bus/usb/002/007)
设备挂载路径查看办法:lsusb即可查看
跨平台解决方案
  • libusb库实现:
    • 原理:libusb自带usb_reset函数,写个c代码调用下就可以了
    • 代码:
  1. usbreset.c
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <libusb-1.0/libusb.h>
  5. //compile: gcc usbreset.c -o usbreset -lusb-1.0
  6. //usage: ./usbreset 2
  7. //use lsusb to check out the bus number and device number
  8. struct libusb_device_handle *devh;
  9. struct libusb_device *dev;
  10. struct libusb_device **devs;

  11. void resetUSB() {

  12.     int success;
  13.     int bpoint = 0;

  14.     do {
  15.         success = libusb_reset_device(devh);
  16.         if ((bpoint % 10) == 0) {
  17.             printf(".");
  18.         }

  19.         ++bpoint;

  20.         if (bpoint > 100) {
  21.             success = 1;
  22.         }
  23.     } while (success < 0);

  24.     if (success) {
  25.         printf("nreset usb device failed:%dn", success);
  26.     } else {
  27.         printf("nreset usb device okn");
  28.     }

  29. struct libusb_device* search_device(int _busNum, int _devNum) {

  30.     libusb_device *l_dev;
  31.     int i = 0;
  32.     int l_busNum, l_devNum;

  33.     while ((l_dev = devs[i++]) != NULL) {
  34.         printf("check against %d devicen", i);
  35.         l_busNum =(int) libusb_get_bus_number(l_dev);
  36.         l_devNum =(int) libusb_get_device_address(l_dev);
  37.         printf("bus number: %d; device number: %dn", l_busNum, l_devNum);
  38.         if ((l_busNum == _busNum) && (l_devNum == _devNum)) {
  39.             printf("found devicen");
  40.             return l_dev;
  41.         }
  42.     }
  43.     return NULL;
  44. }
  45. int main(int argc, char **argv) {
  46.     //parse the input parameters to get the bus number and device number
  47.     int l_busNum, l_devNum;
  48.     int l_ret;
  49.     printf("program started!n");
  50.     if (argc < 3) {
  51.         printf("not enough arguments!n");
  52.         printf("usage: ./usbreset <bus number> <dev number>n");
  53.         return 0;
  54.     }
  55.     printf("bus number: %sn", argv[1]);
  56.     printf("dev number: %sn", argv[2]);

  57.     l_busNum = atoi(argv[1]);
  58.     l_devNum = atoi(argv[2]);
  59.     printf("bus number: %d; dev number: %dn", l_busNum, l_devNum);

  60.     l_ret = libusb_init(NULL);
  61.     if (l_ret < 0) {
  62.         return l_ret;
  63.     }
  64.     l_ret = libusb_get_device_list(NULL, &devs);
  65.     if (l_ret < 0) {
  66.         return (int) l_ret;
  67.     }
  68.     dev = search_device(l_busNum, l_devNum);
  69.     if (dev == NULL) {
  70.         printf("device not foundn");
  71.         return 0;
  72.     }
  73.     l_ret = libusb_open(dev, &devh);   
  74.     if (l_ret == 0) {
  75.         printf("got the usb handle successfully.n");
  76.     } else {
  77.         printf("error getting usb handle.n");
  78.     }
  79.     //reset the usb device
  80.     resetUSB();
  81.     //free the device list
  82.     libusb_free_device_list(devs, 1);
  83.     libusb_exit(NULL);
  84.     return 0;
  85. }
复制代码
使用gcc usbreset.c -o usbreset -lusb-1.0编译下,sudo chmod a+x usbreset给cli程序执行权限即可运行,参数为设备的bus id和device id
跨平台方案也可以使用python的libusb的cython封装写,各位小伙伴可自由尝试。
汇报完毕,硬件方案正在买元件,画pcb,找时间再更..

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏
回复

使用道具 举报

  • TA的每日心情
    无聊
    2024-7-12 13:16
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]测试小兵

    2#
    发表于 2017-6-29 09:49:35 | 只看该作者

    我认为adb掉线的原因是电源供电不足,这是其一,后面我在STF官网上面看到他们的分析另一个原因是usb3.0驱动与adb间的问题,只要选择使用usb2.0的usb-hub就可以了。已经通过实践证明,双管齐下后usb都很正常。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    无聊
    2024-9-19 09:07
  • 签到天数: 11 天

    连续签到: 2 天

    [LV.3]测试连长

    3#
    发表于 2017-6-29 09:50:22 | 只看该作者
    乐哈哈yoyo 发表于 2017-6-29 09:49
    我认为adb掉线的原因是电源供电不足,这是其一,后面我在STF官网上面看到他们的分析另一个原因是usb3.0驱 ...

    嗯,见解很到位!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    无聊
    2024-9-19 09:07
  • 签到天数: 11 天

    连续签到: 2 天

    [LV.3]测试连长

    4#
    发表于 2017-6-29 09:50:27 | 只看该作者
    乐哈哈yoyo 发表于 2017-6-29 09:49
    我认为adb掉线的原因是电源供电不足,这是其一,后面我在STF官网上面看到他们的分析另一个原因是usb3.0驱 ...

    嗯,见解很到位!
    回复 支持 反对

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-11-14 14:12 , Processed in 0.066059 second(s), 22 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表