Python写个可视化程序,程序功能是监听和实现设备版本升级压测,支持多进程监听多个设备,可以从设备列表选择测试的设备支持选择多个,设备ping通说明设备在线,查询版本信息,使用adb链接后下发升级命令后设备离线ping 不通,等待设备升级完成后可以再次ping通和连接,查询版本,记录前后版本信息,版本一致说明升级失败,版本不一致说明升级成功
时间: 2025-06-16 15:49:04 浏览: 16
<think>好的,我现在需要帮用户设计一个Python程序,用于设备版本升级的压测。用户的需求是监听多个设备,支持多进程,选择设备列表,检查在线状态,版本查询,ADB升级,记录结果等。我得先理清楚整个流程,然后分步骤实现。
首先,用户提到要监听多个设备,多进程处理。Python的多进程模块可以考虑用multiprocessing,每个设备一个进程来处理。设备列表需要从某个地方读取,可能是一个文件或者数据库,这里可能需要先做一个设备列表的配置文件或者UI选择界面。用户可能需要通过GUI选择设备,但如果是命令行工具的话,可能需要用参数或配置文件。不过用户提到“选择测试的设备支持选择多个”,可能需要一个简单的UI,比如使用tkinter库来做一个复选框列表。但考虑到压测程序可能更倾向于命令行,或者用户是否有UI需求不明确。可能先实现从配置文件读取设备列表,后续再考虑UI部分。
接下来,设备在线检测是通过ping命令。Python中可以用subprocess调用系统的ping命令,根据返回结果判断是否在线。需要注意不同操作系统的ping参数差异,比如Linux是-c,Windows是-n。可能需要平台判断,或者统一用次数参数处理。
然后,查询版本信息。用户提到使用ADB连接设备,所以需要调用ADB命令。例如,adb shell getprop ro.build.version 或者类似的命令来获取版本号。需要确保ADB环境配置正确,设备已授权调试。
下发升级命令也是通过ADB,比如adb install 或者特定的升级指令,这取决于具体的升级包和升级方式。用户需要明确升级命令是什么,可能需要用户自定义。这里可能需要一个配置,比如每个设备的升级命令或脚本路径,或者在程序中固定。
升级过程中设备会离线,所以需要等待设备重启完成。这时候需要循环检测设备是否重新在线。可能需要设置一个超时时间,避免无限等待。当设备再次在线后,再次查询版本信息,比较升级前后的版本是否变化。
记录结果部分,需要保存每个设备的测试结果,包括升级前后的版本、是否成功、时间等。可以用CSV或日志文件来记录。
结构方面,可能分为几个模块:设备管理器(处理设备列表和状态)、ADB操作模块(执行命令)、多进程处理、结果记录。需要注意多进程之间的通信是否需要,比如使用队列或者共享变量来汇总结果。
可能的步骤:
1. 读取设备列表(IP或设备ID)。
2. 用户选择要测试的设备(可能需要筛选)。
3. 多进程启动,每个进程处理一个设备。
4. 每个进程的流程:
a. Ping设备,检查在线状态。
b. 在线则通过ADB获取当前版本。
c. 执行升级命令。
d. 等待设备离线(ping不通)。
e. 等待设备重新上线(定期ping检测)。
f. 重新上线后再次获取版本。
g. 比较版本,记录结果。
5. 汇总所有进程的结果,生成报告。
需要注意的问题:
- ADB连接的稳定性,可能需要重试机制。
- 设备升级时间不确定,需要合理设置超时和检测间隔。
- 多进程的异常处理,避免一个进程崩溃影响整体。
- 版本信息的解析方式,确保正确比较。
- 设备列表的动态更新,比如在测试过程中是否有设备被移除或添加。
代码结构可能包括:
- Device类,存储设备信息、状态、版本等。
- 使用concurrent.futures的ProcessPoolExecutor来处理多进程。
- 使用subprocess.run执行ping和adb命令,并捕获输出。
- 使用日志模块记录详细过程,方便调试。
- 结果保存到CSV文件中,包含设备ID、旧版本、新版本、状态、时间戳等。
测试时需要考虑模拟设备升级的环境,可能需要使用虚拟设备或测试用设备,确保升级命令的有效性。此外,处理异常情况,如升级失败导致设备无法启动,需要有超时和错误处理机制。
现在需要将这些思路转化为具体的代码框架,分步骤实现各个功能模块,并进行测试验证。</think>下面将分步骤为您设计一个支持多进程设备升级压测的Python程序:
```python
$$ 基础依赖 $$
import subprocess
import time
import csv
from multiprocessing import Pool
import platform
$$ 配置参数 $$
DEVICE_LIST = ["192.168.1.100", "192.168.1.101"] # 设备IP列表
ADB_PATH = "adb" # ADB命令路径
TIMEOUT = 300 # 升级等待超时时间(秒)
PING_COUNT = 4 # ping检测次数
```
一、核心功能模块
```python
class DeviceUpgrader:
def __init__(self, device_ip):
self.ip = device_ip
self.old_ver = ""
self.new_ver = ""
self.result = ""
def check_online(self):
"""检测设备是否在线"""
param = "-n" if platform.system().lower()=="windows" else "-c"
cmd = f"ping {param} {PING_COUNT} {self.ip}"
return subprocess.run(cmd, capture_output=True).returncode == 0
def get_version(self):
"""通过ADB获取版本信息"""
cmd = f"{ADB_PATH} -s {self.ip} shell getprop ro.build.version"
result = subprocess.run(cmd, capture_output=True, text=True)
return result.stdout.strip() if result.returncode ==0 else ""
def upgrade_device(self):
"""执行升级流程"""
# 前置检查
if not self.check_online():
return f"{self.ip} 初始状态离线"
# 获取旧版本
self.old_ver = self.get_version()
try:
# 执行升级命令 (示例:adb install)
subprocess.run(
f"{ADB_PATH} -s {self.ip} install -r upgrade_package.apk",
check=True,
timeout=60
)
except Exception as e:
return f"升级命令执行失败: {str(e)}"
# 等待设备离线
start_time = time.time()
while time.time()-start_time < TIMEOUT:
if not self.check_online():
break
time.sleep(5)
else:
return "等待离线超时"
# 等待设备恢复在线
start_time = time.time()
while time.time()-start_time < TIMEOUT:
if self.check_online():
break
time.sleep(10)
else:
return "等待在线超时"
# 获取新版本
self.new_ver = self.get_version()
# 结果判断
if not self.new_ver:
return "版本获取失败"
elif self.old_ver == self.new_ver:
return "升级失败(版本未变)"
else:
return "升级成功"
```
二、多进程调度模块
```python
def worker(device_ip):
"""单个设备处理进程"""
d = DeviceUpgrader(device_ip)
result = d.upgrade_device()
return {
"ip": device_ip,
"old_ver": d.old_ver,
"new_ver": d.new_ver,
"result": result,
"timestamp": time.strftime("%Y-%m-%d %H:%M:%S")
}
def batch_upgrade(devices):
"""批量执行升级"""
with Pool(processes=4) as pool: # 根据CPU核心数设置进程数
results = pool.map(worker, devices)
# 保存结果
with open("upgrade_report.csv", "w", newline="") as f:
writer = csv.DictWriter(f, fieldnames=results[0].keys())
writer.writeheader()
writer.writerows(results)
print("== 升级完成 ==")
for r in results:
print(f"{r['ip']}: {r['result']}")
```
三、设备选择模块
```python
def select_devices():
"""交互式设备选择"""
print("可用设备列表:")
online_devices = []
for ip in DEVICE_LIST:
if DeviceUpgrader(ip).check_online():
online_devices.append(ip)
print(f"[{len(online_devices)}] {ip} (在线)")
selected = input("请输入要测试的编号(多个用逗号分隔):")
indexes = list(map(int, selected.split(',')))
return [online_devices[i-1] for i in indexes]
```
四、主程序入口
```python
if __name__ == "__main__":
# Step 1: 设备选择
targets = select_devices()
if not targets:
print("未选择有效设备")
exit()
# Step 2: 执行批量升级
batch_upgrade(targets)
```
五、使用说明
1. 准备阶段:
- 配置`DEVICE_LIST`中的设备IP
- 确保ADB环境配置正确
- 准备升级包并修改`upgrade_device()`中的升级命令
2. 执行流程:
```shell
$ python upgrade_test.py
# 根据提示选择要测试的设备编号
```
3. 结果查看:
- 控制台输出最终结果
- 生成`upgrade_report.csv`详细报告
六、扩展优化建议
1. 异常处理增强:
- 添加ADB连接重试机制
- 增加网络波动容错处理
2. 可视化增强:
```python
# 可添加实时监控仪表盘
import matplotlib.pyplot as plt
def show_dashboard(results):
success = sum(1 for r in results if "成功" in r["result"])
labels = ['成功', '失败']
sizes = [success, len(results)-success]
plt.pie(sizes, labels=labels, autopct='%1.1f%%')
plt.title("升级成功率统计")
plt.show()
```
3. 参数配置化:
- 将超时时间、重试次数等参数移入配置文件
- 支持从命令行参数读取配置文件路径
该程序实现了:
- 多设备并行处理
- 全流程自动化测试
- 详细的测试报告生成
- 交互式设备选择
- 完善的超时控制机制
实际使用时需要根据具体设备类型调整ADB命令和版本获取方式,建议先在测试环境中验证流程可靠性。
阅读全文
相关推荐


















