澳大利亚 D-Link 公司使用 Python 控制固件更新
引言
D-Link 澳大利亚的 RMA 部门为澳大利亚和亚洲地区提供保修服务。保修服务包括诊断、修复、测试、翻新和包装安防摄像头、调制解调器、VoIP 硬件、交换机和路由器产品。
问题描述
在开发下面描述的软件之前,保修服务期间升级固件的标准方法是在固件完全启动后,通过网页浏览器将设置和固件加载到调制解调器上。使用这种技术,每台机器一次只能升级一个调制解调器。为了确认固件升级成功,调制解调器必须重新启动,并通过网页浏览器再次检查版本。
固件损坏的调制解调器、需要转换为不同区域本地化的调制解调器以及需要升级引导加载程序的调制解调器无法通过这种方式处理。相反,需要使用一个单独的可执行文件在引导 ROM 级别进行恢复或转换。在日常工作中,每天有数百个这样的设备需要服务,并且涉及许多不同的型号。
解决方案
为了解决其中一些问题,我开始使用终端脚本来驱动调制解调器的串行通信,以绕过在引导 ROM 级别升级固件过程中手动使用网页浏览器,并将调制解调器所需的启动次数减少到一次。尽管这种方法消除了许多问题,但仍然存在手动选择适合调制解调器型号的固件以及为不同引导加载程序使用不同命令的手动步骤。此外,一次只能执行一次升级。这不是一个特别用户友好的解决方案。
为了改善这种情况,我决定开发自定义软件来处理升级。我首先考虑使用 Java 来实现性能,但当我看到复杂的 Java 串行通信代码和语言本身时,我转而选择了 Python。我不是一名程序员,我觉得我无法使用和理解 Java 代码。我相信 Python 能让我更专注于问题本身,而不是语言。
DSL 固件恢复系统
这项工作的开发环境是 Linux 上的 Eclipse,使用了 pySerial 模块、tftp 和 PyQt3。硬件包含四端口串行和网卡,以及一个支持载波检测的 RS-232 到 TTL 串行接口。
软件系统的组件包括网络模块、串行 I/O 模块、线程管理器和 GUI。端口管理器检测在线和离线调制解调器,并管理端口的连接和释放。每个线程处理一个调制解调器,连接网络和串行接口。一旦调制解调器启动,串行缓冲区会持续监控,并检测任何常见错误。软件系统会自动选择每个型号升级所需的正确固件和设置文件。FTP 命令用于控制闪存区域的写入,串行命令用于控制启动过程。正在运行的进程通过易于阅读的图形和日志用户界面显示其状态。用户界面还提供了简单的控件来启动、停止和选择调制解调器的型号。
线程模型是软件开发中最困难的部分。我使用了 Qt 提供的线程支持,发现它比 Python 的 threading 模块更容易使用。当主 Qt 程序退出时,它也会自动退出任何仍在运行的 qthread。
结果
该项目取得了成功。我是唯一的创建者和开发者,对仅用 1200 多行代码就取得的成果感到惊讶。该系统耗时 2-3 个月开发,包括测试。
完成后,DSL 固件恢复系统在单台机器上快了 8 倍,并且更容易添加额外的机器和串行卡。有一天,除了日常工作量外,还完成了 1600 次调制解调器固件转换。
该软件还有助于防止错误,从而提高了服务质量,减少了有缺陷的调制解调器出货量。
结论
尽管我没有编程经验,但 Python 让我在学习编程语言的同时,完成了一项复杂的工作。Python 是一种独特强大且实用的“边学边用、功能丰富的语言”。
关于作者
黄浩之前大学编程不及格,现在是一名 Linux 技术专家。他热衷于使用 Linux 和开源软件来解决现实世界中的问题。黄先生在多样化的 IT 职业生涯中,以及业余时间从事 Python 和网络编程、多媒体和 Linux 操作系统方面的工作,积累了技能。