机顶盒看起来是个非常成熟的产品,很多人觉得产线工作无非就是“组装、测试、包装”三板斧。但真正在工厂待过就会知道,产线日常每天面对的不是寂寞,而是无穷无尽的变量:今天换了一版固件,明天 Wi-Fi 模组换了供应商,后天有一批 eMMC 的批次不良率突然升高,再往后可能只是操作员换了一个人,测试良率就掉了两个点。
这篇文章不聊怎么开发机顶盒,而是站在产线测试与工程的角度,讲清楚一台机顶盒从贴片完成到包装出货,中间要经历哪些测试环节,每个环节容易出什么问题,以及产线工程人员怎么把这些问题管起来。核心判断是:机顶盒产线真正比拼的不是测试项目多不多,而是异常响应速度和数据追溯能力。测试项写得再全,如果出了问题无法快速定位到批次、固件版本、工位和操作员,产线就永远在救火。
因此接下来会从产线流程、测试原理、环境搭建、自动化脚本、数据采集、异常排查和工程管理几个角度展开,并给出可复用的脚本与配置示例。
1. 机顶盒产线日常到底在解决什么问题
一台机顶盒从硬件上看并不复杂:主控芯片、DDR、eMMC、Wi-Fi/BT 模组、Tuner、HDMI、电源、遥控接收头,再加一个外壳。但从贴片完成到用户可以正常使用,中间的测试环节一点都不少。产线日常的本质,是在有限的节拍时间内,用最可靠的方式验证三件事:
- 硬件有没有问题。贴片有没有虚焊、短路,DDR 能不能稳定读写,射频信号强度是否达标,电源纹波是否在允许范围内。
- 软件有没有烧对。固件版本是否正确,SN、MAC、HDCP Key 等唯一信息有没有写入,写进去之后能不能被正确读取和校验。
- 整机能不能稳定工作。Aging 老化测试中是否出现死机、重启、花屏,高温环境下 Wi-Fi 是否掉线,遥控器响应是否灵敏。
产线日常之所以难,不在于某个单项技术有多深,而在于它是一个典型的“多变量耦合系统”。固件版本、硬件批次、操作员手法、测试治具状态、环境温湿度,任何一个变量变化都可能影响测试结果。更麻烦的是,有些问题只在产线上出现,离开产线环境就复现不了,这时候如果没有完整的日志和数据记录,排查会非常被动。
这篇文章适合三类读者:一是刚接手产线测试工作的嵌入式工程师,二是做测试开发、需要编写产线自动化脚本的同学,三是负责工厂信息化、需要对接 MES 系统的软件开发人员。读完这篇文章,你会对整个机顶盒产线测试链条有一个完整认识,并且可以直接参考其中的脚本思路搭建最小可用的产线测试工具。
2. 机顶盒产线整体流程拆解
机顶盒的生产测试流程,一般从 SMT 贴片开始,到包装出货结束。不同工厂的组织方式会有差异,但核心环节大致可以分为七个阶段。
2.1 SMT 贴片与 PCBA 外观检查
SMT 贴片完成之后,PCBA 先过 AOI 光学检测,检查贴片位置、极性、桥连等缺陷。这个环节的效率很高,一台 AOI 每小时可以检测几百片板子,但它只能发现“看得见”的问题。AOI 之后通常还会安排一次人工目检,重点检查连接器、插座、屏蔽罩等 AOI 不容易覆盖的位点。
这里容易出现的问题有两个:一是 AOI 误判率过高导致频繁停机确认,二是漏判率过高导致有缺陷的板子流入后段测试。因此,AOI 程序的维护和误判复判流程非常重要。每天开班前用标准板校准一次,是最基本的动作。
2.2 PCBA 单板测试
PCBA 在组装成整机之前,通常会先做一次单板测试,也叫 FCT(Functional Circuit Test)。这个工站主要验证主板供电路径、晶振起振、主控芯片能否正常启动、能否进入升级模式。单板测试的好处是,在组装之前就把坏板拦截掉,避免把一块坏板装进外壳之后再拆机返修,浪费大量工时。
FCT 工站一般使用测试治具压合 PCBA 上的测试点,通过串口或者 USB 与主板通信。测试内容比较简单,重点是“能不能开机”和“能不能烧录”。这个环节如果发现某一块板卡无法进入烧录模式,大概率是主控芯片周边电路有问题,比如晶振、电源、复位电路。
2.3 整机装配
单板测试通过之后,PCBA 进入整机装配环节:装外壳、贴标签、连接天线、装配电源板、安装散热片等。装配环节看似没有技术含量,但恰恰是很多“灵异问题”的源头。比如 Wi-Fi 天线端子在装配过程中松脱、散热片压到了某个元器件、外壳卡扣压住了排线,这些硬件问题往往要到功能测试甚至老化测试才会暴露出来。
因此,装配工位通常会有一个简单的外观确认动作,并且关键连接器会拍照留档或者由巡检人员定时抽检。如果产线后面批量出现“信号弱”的问题,第一步不是怀疑硬件设计方案,而是先检查装配工位的操作是否规范。
2.4 整机功能测试
整机装配完成之后,进入产线最核心的工站:整机功能测试,一般叫做 MMI(Man-Machine Interface)测试。所有功能都会在这个工站验证一遍,包括:
- 开机启动是否正常,进系统时间是否在允许范围内
- SN、MAC、HDCP Key 等唯一信息是否正确写入
- Wi-Fi 信号强度和蓝牙功能是否正常
- HDMI 输出是否有画面,分辨率是否设置正确
- USB 接口读写是否正常
- 以太网连接是否正常
- 遥控器按键和红外接收是否正常
- 音视频输出是否正常
这个工站的节拍时间直接决定了产线的产能。节拍压得越短,测试覆盖越容易缩水;测试覆盖越全,节拍就越难压缩。优秀的产线工程团队会把“必须全检的功能”和“可以抽检的功能”区分开,把有限的产线时间花在最关键的验证项上。
2.5 烧录与写号
烧录和写号在很多工厂是放在功能测试之前的,也有放在中间的,取决于软件架构和测试流程设计。烧录包括烧写 Bootloader、系统固件、基带固件等,写号则包括写入 SN、MAC、HDCP Key、区域配置等信息。
这个环节最容易出的问题就是“烧错版本”和“写错号”。烧错版本一般是升级包管理混乱导致的,写错号则往往是因为操作员扫码时扫描枪多扫了一位、或者扫码内容与订单不一致而系统没有校验。这两个问题都属于“批量事故”,一旦发生,轻则返工重烧,重则整批流向市场后被发现序列号冲突,引发客诉和召回。
2.6 老化测试
老化测试(Aging Test)是机顶盒产线里耗时最长的一个环节,一般持续 4 到 8 个小时,甚至更久。目的是通过长时间通电运行,让早期失效的元器件提前暴露。常见的做法是让机顶盒在高温环境下持续播放视频或者循环跑压力测试,同时监测是否出现死机、重启、花屏、Wi-Fi 掉线等问题。
老化测试的瓶颈在于占地面积大、耗时长、需要占用大量治具和电源。因此产线一般只会对批量订单的代表性样本做全量老化,或者对首件、工程变更后的批次做全量老化,其余批次按比例抽检。如果老化测试中发现某批次不良率异常偏高,就会触发批次隔离和原材料追溯流程。
2.7 包装与出货
老化测试通过之后,机顶盒经过最终外观检查、附件清点、彩盒包装,就可以入库出货了。最后一个环节通常还会做一次“出货前快速开机确认”,防止在老化之后、包装之前的存放期间出现运输损伤或静电损伤。
从这段流程可以看出,机顶盒产线其实是一条“层层拦截、逐级确认”的质量链条。每一道工序都在为后一道工序提供输入,任何一个环节的错误都可能被放大。因此,产线日常的核心工作,除了完成当前的测试任务之外,更关键的是把每一个环节的数据和异常记录管理起来。
3. 机顶盒产线测试的核心原理
明白了整体流程之后,再深入看每个测试环节背后的原理。这里不会讲到芯片寄存器级别,而是从产线工程的角度讲清楚每个测试为什么存在、它检测的是什么类型的缺陷。
3.1 单板测试的核心原理
单板测试(FCT)本质上是一个“最小系统验证”。它把 PCBA 当作一个独立的电子系统,测试电源、时钟、复位、主控启动链路是否正常。单板测试的关键在于测试治具的设计:通过探针压合 PCBA 上的测试点,把电源、地、串口、USB 等信号引出来,连接到一个测试控制板或者直接连接到工控机。
FCT 常见的检测项包括:
- 各电压轨是否正常,比如 3.3V、1.8V、1.0V
- 晶振是否起振
- 主控能否通过串口输出启动日志
- 能否进入烧录模式
单板测试的逻辑很简单:如果最小系统都不能正常启动,后续所有测试都无从谈起。因此这个工站的通过率一般要求在 99% 以上,如果低于这个水平,往往意味着 SMT 焊接工艺出现了系统性问题,优先查炉温曲线、锡膏质量、贴片压力设置。
3.2 功能测试的核心原理
功能测试的核心是一个“软硬协同验证”的过程。机顶盒运行测试 APK 或通过 ADB 指令执行测试用例,同时测试工装模拟用户操作,验证各功能模块是否正常。
以 Wi-Fi 测试为例,产线通常不测真实吞吐量,而是通过读取系统内的 RSSI 值来判断信号强度是否达标。机顶盒连接一个指定的 AP,然后读取cmd wifi status或者通过系统 API 获取当前的信号强度。如果 RSSI 低于某个阈值,比如 -60dBm,就判为失败。这个测试速度快、覆盖率高,但它有一个盲区:它只能证明 Wi-Fi 模块能够连上 AP,不能证明实际吞吐量是否达标。因此有些对无线性能要求高的订单,会额外增加一个吞吐量抽检环节,使用 iperf 进行实际打流测试。
HDMI 测试的原理类似。机顶盒通过 HDMI 连接到一个带 HDMI 输入的监视器或者视频采集卡,测试系统播放一段测试画面,由采集卡抓取图像并做比对。常见的判断方式有两种:一种是做像素比对,通过计算图像相似度判断画面是否正常;另一种是检测是否有 HDMI 信号输出,比如读取显示器或采集卡是否有有效分辨率信息。像素比对更严格,但速度更慢;信号检测速度快,但无法发现花屏、偏色等问题。产线需要根据订单质量要求做取舍。
3.3 写号与校验原理
SN、MAC 这些唯一信息,在产品出厂后承担着追溯、激活、网络鉴权等职责。写号环节最核心的要求就是两点:唯一性和一致性。唯一性是指同一个 SN 不能出现两次,一致性是指写入的内容必须和订单、标签、包装箱上的内容一致。
为了实现这两点,产线通常会采用“扫码→比对→写入→回读→校验→上传”的流程。操作员先扫描机顶盒标签上的条码,系统根据条码生成或者获取对应的 SN、MAC 信息,通过 ADB 或串口写入设备,然后回读写入结果并与原始数据比对。比对通过之后,这些信息会同步上传到 MES 系统,作为后续追溯的依据。
这里的关键是“写入后的回读校验”,很多早期产线只写不读,导致 SN 写入失败但测试仍然判 PASS 的情况,直到产品流向市场才被发现。回读校验会额外增加几百毫秒的时间,但相比整批返工的代价,这点时间非常值得。
3.4 老化测试的原理
老化测试的本质是“加速失效验证”。电子元器件的失效曲线呈现典型的浴盆形状:早期失效率较高,随后进入低而平稳的随机失效期,最后进入磨损失效期。老化测试的目的就是通过高温、长时间通电、高负载运行,把早期失效提前暴露在工厂内,而不是等到用户手里再爆发。
常见的做法是将机顶盒放置在 45℃ 左右的高温老化房里,持续播放本地或者在线视频,循环执行重启、待机唤醒、Wi-Fi 重连等操作,同时通过串口或网络上报设备状态。老化测试中发现的问题,一般集中在散热不良、DDR 兼容性、电源模块在高温下的稳定性、Wi-Fi 在高温下的连接稳定性等。
老化测试的价值不能用“检出多少不良”来衡量,更准确地说,它的价值在于建立信心。一批产品在老化工序中连续运行 8 小时无故障,这本身就说明这批产品的早期失效风险比较低。
4. 产线测试环境搭建与工具链
产线测试环境是一个容易被低估的部分。表面上看,测试环境无非就是工控机、测试治具、网络、电源,但实际上,一个设计良好的产线测试环境可以大幅降低误判率、提升换线效率。
4.1 产线网络的规划
机顶盒产线测试有一个特点:设备数量多、IP 地址变化频繁、安全隔离要求高。每台机顶盒在测试时都需要一个独立的 IP 地址,测试完成之后,这个 IP 要么释放,要么被回收。如果机顶盒的 IP 和产线办公网络的 IP 段冲突,或者和 MES 服务器的 IP 冲突,排查起来会非常痛苦。
一个比较常见的做法,是把产线网络划分为三个隔离的网段:
- 管理网段:用于工控机、测试服务器、MES 客户端之间的通信
- 测试网段:用于机顶盒设备接入,一般由 DHCP 动态分配地址,每台测试治具对应一个独立的网口或 VLAN
- 工厂局域网段:用于连接 ERP、MES 数据库、文件服务器等
这样做的好处是,测试网段的广播风暴不会影响管理网络,而且便于做 IP 资源的统筹管理。机顶盒在测试完成后,DHCP 租约可以设置得较短,比如 5 到 10 分钟,这样 IP 资源能够快速回收复用。
如果想避免 DHCP 带来的地址管理问题,也可以使用 USB 网络共享或者通过 ADB over WiFi 的方式连接设备,但这通常只适用于某些特定的测试场景,不是主流方式。
4.2 测试工控机的软件环境
产线测试工控机建议使用 Ubuntu 系统,主要原因是 Android 调试工具链(ADB、Fastboot)在 Linux 环境下运行更稳定,而且 Python 脚本生态更丰富。工控机作为产线测试的核心节点,软件环境需要尽量精简、稳定。一个典型的工控机环境包括:
- Ubuntu 20.04 或 22.04 LTS 系统
- Python 3.8+,使用虚拟环境管理依赖
- Android Platform Tools,包含 adb、fastboot
- 串口调试工具,如 minicom、pyserial
- MES 客户端或者 MES API 调用脚本
安装好系统之后,建议将测试脚本统一放在/opt/line_test/目录下,按照工站进行子目录划分,避免不同脚本之间互相依赖。测试记录和日志统一输出到/var/log/line_test/,方便集中收集和排查。
# 安装 Python 虚拟环境和依赖 sudo apt update sudo apt install -y python3 python3-venv python3-pip # 创建测试项目目录 mkdir -p /opt/line_test/{fct,mmi,aging,report} cd /opt/line_test python3 -m venv venv source venv/bin/activate # 安装 pyserial 和 requests pip install pyserial requests # 确认 adb 版本 adb version这里有一点需要注意:产线工控机不建议频繁升级系统和工具链,因为每次升级都可能引入兼容性问题。正确的做法是先在实验室环境验证好版本组合,再批量同步到产线工控机。版本升级要像固件发布一样,走测试、灰度、全量的流程。
4.3 测试治具的准备
测试治具是连接工控机和被测设备的桥梁。机顶盒整机测试一般通过 USB 线连接工控机和机顶盒的 USB 口,使用 ADB 通信;PCBA 单板测试则通过治具上的探针和排线连接串口。
治具的维护和保养是一个容易被忽视但影响很大的细节。USB 线在反复插拔之后接触不良,探针在长期压合之后弹性下降,这些都会导致测试结果不稳定。因此,产线需要为每个测试工位制定一个“治具点检表”,每天开班前检查线材、探针、电源、网络连接,每周进行一次深度清洁和阻抗检查。
治具的防呆设计也很重要。比如 USB 方向插反会导致通信失败,治具上要设计防反插结构;批头、探针要设计成快拆结构,方便操作员在出现问题时快速更换,而不是拿着烙铁在现场焊接。
4.4 测试固件与升级包的版本管理
产线最容易出的问题之一,就是测试固件版本和订单不一致。很多工厂还在用共享文件夹的方式管理固件,文件名上加上日期和版本号,操作员手动拷贝到工控机。这种方式在订单少的时候勉强可用,一旦多个订单并行,就很容易出现操作员拿错固件包、烧错版本的情况。
更稳妥的方式是搭建一个简单的固件管理服务,可以是 MES 系统的一个模块,也可以是一个独立的版本管理工具。固件包统一存放在服务器上,工位机通过订单号或者产品型号自动拉取对应的固件包,拉取之后计算 MD5 校验值,确保固件包完整。产线工控机上不保留历史版本固件,只保留当前订单对应的固件。
如果你所在工厂还没有上 MES,也可以先用 Git LFS 配合一个简单的 Python 脚本来管理固件版本。核心思路是:固件文件走版本管理,工位机通过脚本拉取,记录拉取日志。
5. 关键测试项与判定标准
不同客户的机顶盒测试要求会有差异,但核心测试项基本一致。下面以比较典型的整机功能测试为例,整理一个测试项与判定标准参考。实际执行时,标准需要根据产品规格书和客户要求进行细化。
| 测试工站 | 测试项目 | 判定标准参考 | 失败处理 |
|---|---|---|---|
| FCT | 电源电压 | 3.3V/1.8V/1.0V ± 5% | 检查电源电路与焊接 |
| FCT | 晶振起振 | 频率偏差在规格允许范围内 | 更换晶振或检查负载电容 |
| FCT | 串口输出 | 能正常输出启动日志 | 检查主控最小系统 |
| 烧录 | 固件版本 | 与订单要求完全一致 | 重新烧录并核对升级包 |
| 写号 | SN 写入与回读 | 回读值和目标值一致 | 检查写入工具与标签 |
| 写号 | MAC 写入与回读 | 回读值和目标值一致 | 检查写入工具与标签 |
| MMI | 开机时间 | 从上电到进桌面不超过设定值 | 检查系统启动项与 eMMC 速率 |
| MMI | Wi-Fi 信号强度 | RSSI 大于等于 -60dBm | 检查天线连接与射频匹配 |
| MMI | 蓝牙扫描 | 能扫描到指定蓝牙设备 | 检查蓝牙天线与屏蔽 |
| MMI | HDMI 输出 | 能检测到有效分辨率信号 | 检查 HDMI 座子与外围电路 |
| MMI | USB 读写 | U 盘读写正常 | 检查 USB 数据线对与供电 |
| MMI | 以太网连接 | DHCP 获取 IP 且 ping 通网关 | 检查网口变压器与连接器 |
| MMI | 遥控接收 | 按键响应正常 | 检查红外接收头与遥控器 |
| Aging | 长时间运行 | 无死机、重启、花屏 | 定位失效元件,批次隔离 |
| Aging | 高温 Wi-Fi | 持续连接不断线 | 检查散热与射频高温特性 |
这些测试项中,有些适合全检,有些适合抽检。比如 USB 读写,在硬件设计稳定的情况下,产线做全检的边际收益很低,反而拖慢节拍。一般建议新导入的机型做全量全检,量产稳定后对非关键项改为抽检,把时间留给真正容易出问题的环节。
6. 自动化脚本与代码实现
产线测试自动化是一个很大的话题,这里从实际情况出发,给出几个可以直接参考的脚本示例。这些脚本解决的场景包括:SN 读取校验、MMI 测试主流程、MES 数据上报。实际产线脚本会比这复杂得多,但这些示例可以帮助你快速理解产线自动化的基本模式。
6.1 通过串口读取并校验 SN
PCBA 单板测试阶段,设备还没有完全启动 Android 系统,无法使用 ADB 通信,只能通过串口访问。此时可以用 pyserial 读取设备输出的信息,并对 SN 等关键信息做校验。
# 文件路径:/opt/line_test/fct/read_sn.py import re import serial import serial.tools.list_ports def find_device_port(): """自动查找测试治具对应的串口号""" ports = serial.tools.list_ports.comports() for port in ports: # 这里以 USB 转串口的 VID/PID 作为识别依据 # 实际产线中建议使用 port.serial_number 做更严格的判断 if "USB" in port.description or "UART" in port.description: return port.device raise RuntimeError("未找到串口设备") def read_sn_from_device(port: str, timeout: int = 10) -> str: """从设备串口读取 SN 信息""" pattern = re.compile(r"SN[:=]\s*([A-Za-z0-9\-_]+)") with serial.Serial(port, 115200, timeout=1) as ser: buf = b"" end_time = time.time() + timeout while time.time() < end_time: data = ser.read(64) if not data: continue buf += data text = buf.decode("utf-8", errors="ignore") match = pattern.search(text) if match: return match.group(1) raise RuntimeError("读取 SN 超时") def check_sn_format(sn: str) -> bool: """校验 SN 格式,具体规则由产品定义""" if re.fullmatch(r"[A-Z0-9]{8,16}", sn): return True return False if __name__ == "__main__": port_name = find_device_port() sn_value = read_sn_from_device(port_name) if check_sn_format(sn_value): print(f"SN 读取成功: {sn_value}") else: print(f"SN 格式异常: {sn_value}") raise SystemExit(1)这段代码的思路是:先自动识别串口设备,然后持续读取串口数据,通过正则表达式匹配 SN 字段,读取后做格式校验。实际产线中,SN 格式规则一般由产品定义,比如前几位是产品代码、中间是生产日期、后面是流水号。还可以在读取 SN 之后调用 MES 接口,比对 SN 是否在订单范围内,防止混料。
6.2 MMI 测试主流程脚本
整机功能测试阶段,设备已经启动了 Android 系统,可以通过 ADB 执行测试操作。下面的脚本演示了 MMI 测试的主流程框架:开机确认、检查固件版本、读取 SN、执行指定测试动作、把结果写入本地报告。
#!/bin/bash # 文件路径:/opt/line_test/mmi/mmi_test.sh # 用法:bash mmi_test.sh <设备序列号> set -e DEVICE_SN="$1" if [ -z "$DEVICE_SN" ]; then echo "请传入设备序列号" exit 1 fi # 第一步:确认 ADB 设备已连接 adb devices | grep -w "$DEVICE_SN" >/dev/null || { echo "设备不在线: $DEVICE_SN" exit 1 } # 第二步:获取设备型号和固件版本 MODEL=$(adb -s "$DEVICE_SN" shell getprop ro.product.model | tr -d '\r') FW_VERSION=$(adb -s "$DEVICE_SN" shell getprop ro.build.version.release | tr -d '\r') echo "设备型号: $MODEL, 系统版本: $FW_VERSION" # 第三步:检查设备是否有开机动画/桌面异常 BOOT_COMPLETED=$(adb -s "$DEVICE_SN" shell getprop sys.boot_completed | tr -d '\r') if [ "$BOOT_COMPLETED" != "1" ]; then echo "设备未完成开机" exit 1 fi # 第四步:读取 SN 并与传入参数比对 DEVICE_SN_VALUE=$(adb -s "$DEVICE_SN" shell getprop ro.serialno | tr -d '\r') if [ "$DEVICE_SN_VALUE" != "$DEVICE_SN" ]; then echo "SN 不匹配: 期望=$DEVICE_SN, 实际=$DEVICE_SN_VALUE" exit 1 fi # 第五步:占位,这里可以扩展为执行具体测试 # 例如:adb shell am instrument -w com.test.mmi/androidx.test.runner.AndroidJUnitRunner echo "MMI 基础检查 PASS"这段 Shell 脚本虽然简单,但体现了产线测试脚本的通用结构:设备在线检查、静态信息读取、关键字段比对、测试执行、结果输出。脚本中的sys.boot_completed是判断 Android 是否完成开机的一个常用属性,在产线测试中很有用。
实际产线的 MMI 测试不会只在命令行里检查属性,而是会启动一个专门的测试 APK,由 APK 内部调用系统接口执行 Wi-Fi、蓝牙、HDMI、USB 等测试,并通过广播或者文件方式把结果返回给测试脚本。APK 测试的好处是可读性强、扩展性好,而且可以对每一个测试项输出详细的日志。
6.3 测试结果上报 MES
产线测试的最终目的是把数据汇集到 MES 系统,形成单台设备的完整测试档案。下面给出一个简单的 Python 上报脚本,把测试结果以 JSON 格式提交到 MES API。
# 文件路径:/opt/line_test/report/upload_result.py import json import time import requests MES_API_URL = "http://mes-server.example.com:8080/api/v1/line-test/report" TOKEN = "generate-yours-by-mes-login" def build_report(device_sn: str, station: str, result: str, items: list, logs: str) -> dict: """构造测试报告数据""" return { "deviceSn": device_sn, "station": station, "result": result, "testTime": time.strftime("%Y-%m-%d %H:%M:%S"), "items": items, "logs": logs[:2000], # 日志过长时截断 } def upload_report(report: dict) -> bool: """上报 MES 系统""" headers = { "Content-Type": "application/json", "Authorization": f"Bearer {TOKEN}", } try: resp = requests.post(MES_API_URL, json=report, headers=headers, timeout=5) if resp.status_code == 200: return True # 这里可以增加重试机制 print(f"上报失败: {resp.status_code}, body={resp.text}") return False except requests.exceptions.RequestException as exc: print(f"上报异常: {exc}") return False if __name__ == "__main__": sample_items = [ {"name": "power_on", "result": "PASS", "detail": "boot time: 23s"}, {"name": "wifi_rssi", "result": "PASS", "detail": "-45dBm"}, {"name": "sn_check", "result": "PASS", "detail": "sn match"}, ] sample_report = build_report( device_sn="SN20250101001", station="MMI-01", result="PASS", items=sample_items, logs="sample test log", ) ok = upload_report(sample_report) print("上报成功" if ok else "上报失败")上报逻辑的要点在于:数据要结构化、结果要可追溯、失败要有重试机制。上面这个示例中的TOKEN需要在真实环境中通过登录接口获取,生产环境建议使用服务账号而不是个人账号,同时控制权限范围。另外,上报失败一定不能静默忽略,要把失败记录写入本地待补传队列,等网络恢复后重新上报。
7. 产线数据采集与追溯体系
测试做完只是第一步,把测试过程中产生的数据管理起来才是产线工程的核心工作。每一台机顶盒都应该有完整的“出生档案”,包括测试结果、关键参数、操作员、工位、时间、所用固件版本等信息。这样当市场端出现批量质量问题时,仓库可以根据 SN 反查这批货是哪一天、哪条线、哪一批物料生产的。
7.1 单台设备档案
单台设备档案最简单的实现方式,就是 MES 系统里的一张宽表,每条记录对应一台设备。记录的核心字段包括:
- 设备 SN、MAC、Wi-Fi MAC、蓝牙 MAC
- 产品型号、硬件版本、软件版本
- 各工站的测试结果、测试时间、操作员工号、工位编号
- 关键测试参数,比如 RSSI 值、吞吐量、供电电压
- 原料批次信息,包括主控批次、DDR 批次、eMMC 批次、Wi-Fi 模组批次
这些字段不需要全部手工录入,而应该通过测试脚本自动采集。人一多、环节一长,手工录入的错误率会非常高。
7.2 批量数据分析
建立档案之后,还需要建立批量分析的习惯。很多质量问题不是靠单台测试发现的,而是靠统计发现的。比如某一天的 Wi-Fi 测试通过率从 99% 下降到 95%,单独看每一台都定位不到什么问题,但是按批次、按时间段、按工位、按操作员维度聚合之后,问题往往就浮出水面了。
一个务实的做法是,每周拉取一次 MES 测试数据,按测试项统计通过率,按工位统计一次通过率,按操作员统计操作耗时和误判率。如果某个工位的通过率明显低于其他工位,优先排查治具问题而不是设备问题,这是产线排障中非常有效的一个经验法则。
8. 常见问题与排查方法
产线运行过程中会遇到各种问题,下面整理几个最常见的问题现象、可能原因和排查思路。
| 问题现象 | 可能原因 | 排查方式 | 解决方案 |
|---|---|---|---|
| 设备无法进入烧录模式 | 主控最小系统异常 | 查看串口日志,确认供电、时钟、复位 | 检查 PCBA 焊接,特别是电源和晶振 |
| ADB 设备列表看不到设备 | USB 线接触不良或驱动异常 | 更换 USB 线,检查设备管理器 | 更换线材,重新安装驱动 |
| SN 写入后回读不一致 | 写入工具读取分区错误 | 查看写入日志,确认分区挂载 | 更新写入工具,检查镜像分区表 |
| Wi-Fi 测试 RSSI 偏低 | 天线未装配到位或模组批次异常 | 拆机检查天线连接,抓取射频日志 | 重新装配,反馈模组供应商 |
| 老化测试死机 | 高温下供电不稳或 DDR 兼容问题 | 查看内核日志与温度日志 | 改善散热,调整 DDR 参数 |
| 测试脚本偶发超时 | 网络抖动或 USB 通信不稳定 | 查看 ping 丢包率,更换 USB 口 | 优化网络,使用独立 USB 控制器 |
| 某工位通过率明显偏低 | 治具老化或操作手法差异 | 与相邻工位对比,检查治具 | 清洁或更换治具,加强培训 |
| MES 上报失败 | 接口异常或网络隔离 | 检查 MES 服务状态和网络策略 | 增加重试队列,联系 MES 管理员 |
从这些常见问题可以看出,产线问题的排查思路往往是“先环境后设备、先批次后单台、先治具后主板”。如果一上来就怀疑主控芯片,方向很容易跑偏。
9. 产线工程最佳实践与后续方向
最后把这些年产线工程中比较有价值的经验整理成几条通用的实践建议。这些建议不仅适用于机顶盒,也适用于其他智能硬件产品的产线测试。
9.1 自动化防呆优先于事后检查
产线测试的核心原则是“不要让流程依赖人的自觉”。操作员每天重复成百上千次动作,总会有疲劳的时候。所以凡是能够用系统校验的,就不要让人工判断。比如固件版本选择,不应该让操作员手动选文件,而应该扫码之后自动匹配;SN 校验也不应该依赖人眼比对,而应该由系统自动读取、自动比对。
9.2 脚本幂等与异常恢复
产线脚本必须做成幂等的,也就是同一台设备重复执行测试脚本,结果应该一致且不会产生副作用。原因是产线测试经常遇到中途异常、重启测试、返工重测的情况。如果脚本逻辑假设“设备处于全新状态”,第二次运行就可能失败。正确的做法是,在每个测试环节开始前先恢复到一个确定的初始状态,比如清理测试数据、关闭干扰应用、重置 Wi-Fi 列表。
9.3 日志要留存,但要有结构
很多产线测试程序只输出一个PASS或FAIL,出了问题之后什么线索都没有。更好的做法是,把关键操作和关键参数记录下来,并输出为结构化字段。比如 Wi-Fi 测试失败时,除了保存“Wi-Fi FAIL”之外,还要保存当时的 SSID、BSSID、RSSI、信道、连接耗时。这些信息在排障时可以大大缩小问题范围。
9.4 最小权限与安全边界
产线工控机的权限管理也需要注意。测试脚本应该使用专用的服务账号运行,不要使用 root 账号跑日常测试;MES API 的密钥要保存在独立的配置文件中,不能硬编码在脚本里;固件包从服务器拉取时要校验哈希值,防止文件在传输过程中损坏或被替换。工厂环境虽然不像互联网环境那样面临强烈攻击,但内部数据的安全边界依然需要守好。
9.5 后续方向:从“测出来”到“管起来”
机顶盒产线测试的未来方向,不是加更多的测试项,而是把测试数据和制造数据打通。当测试系统、MES、仓储系统之间形成完整的数据链路之后,产线就可以实现更精细的管理,比如基于历史通过率动态调整抽检比例、基于原料批次预测潜在风险批次、基于老化数据优化测试策略。
对于正在搭建产线测试体系的团队,建议分三步走。
- 第一步,先把单工站的自动化跑通,保证每个测试工站能自动测试、自动记录、自动判定。
- 第二步,把测试数据统一收集到 MES 或者一个简单数据库,实现单台设备的完整档案。
- 第三步,再做批量分析和异常预测,这一阶段才有足够的数据支撑。
产线工作最大的价值,不是简单地“把测试做完”,而是让任何一台机器出现问题时,都能够在十分钟内定位到它是什么时候生产的、用了哪一批物料、经过了哪些工站、在哪一个环节开始出现异常。把这条链路打通之后,机顶盒产线才真正从“经验驱动”走向“数据驱动”。
对于个人开发者或者小团队来说,这套体系听起来很重,但其实可以从最小闭环开始推进。先用一台工控机跑通 ADB 测试,把结果写进 SQLite,然后逐步增加工站、增加字段、增加分析报表。产线自动化建设的路是一步一步走出来的,关键不是一步到位,而是每走出来一步,都能让下一次遇到问题时轻松一点。