一个 IoT 测试工具:开发记录
· 技术 · Python / PyQt6 / MQTT / REST API / JSON / SSL / MySQL / Docker
我为工作做了一个 IoT 测试工具。公司规定不能公开代码,但其中遇到的工程问题值得留个记录。
用户可以获取网关信息并收发命令,也可以扫描二维码,不必手动输入 Gateway ID。命令和反馈通过 MQTT 传输;网关状态保存在类中,方便管理相关数据。删除网关等危险操作必须输入密码,收到 MQTT 反馈后,界面会自动更新。
不同网关的测试流程拆成独立类。选择网关类型后,程序会按对应标准运行测试。工具用 Python 和 PyQt6 编写,可打包成 Windows EXE 和 macOS App。
二维码识别
我使用 OpenCV 扫描二维码,这一步几乎让整个程序体积翻倍,但识别速度和成功率仍远不如微信。有个二维码即使经过专门的图像预处理,肉眼看起来已经非常清晰,依然很难识别。
PyInstaller 和文件路径
程序在 PyCharm 里运行正常,打包后却一直失败。强制从命令行启动才看到真实错误:文件找不到。最后我把依赖文件放到同一级目录,并在 PyInstaller 命令里逐一指定证书和密钥;OpenCV 还需要声明 hidden import。
conda activate mqtt-testtool
pyinstaller --noconfirm --onefile --windowed ^
--icon=E:\xxx\MQTT-testtool\favicon.ico ^
--add-data="E:\xxx\MQTT-testtool\certificate1.pem.crt;." ^
--add-data="E:\xxx\MQTT-testtool\certificate2.pem.crt;." ^
--add-data="E:\xxx\MQTT-testtool\certificate3.pem.crt;." ^
--add-data="E:\xxx\MQTT-testtool\key1-ca.pem;." ^
--add-data="E:\xxx\MQTT-testtool\key2-ca.pem;." ^
--add-data="E:\xxx\MQTT-testtool\key3-ca.pem;." ^
--add-data="E:\xxx\MQTT-testtool\private1.pem.key;." ^
--add-data="E:\xxx\MQTT-testtool\private2.pem.key;." ^
--add-data="E:\xxx\MQTT-testtool\private3.pem.key;." ^
--hidden-import=cv2 ^
--exclude-module=macholib ^
E:\xxx\MQTT-testtool\UI.py
macOS 上的奇怪问题
完全相同的代码在 macOS 上启动很慢,还会重复开启程序。最初会不断打开新进程,直到我强制关机。加了多层单实例限制后,第一次关闭窗口时仍可能再启动一个副本。这个问题能稳定复现,却很难追踪,所以也记在这里。
