简介:本资源是一份面向通信工程专业学生、卫星地面站建设工程师及网络测试技术人员的实务型教学课件,系统讲解卫星通信网络从建站、入网验证到系统测试的全流程规范与关键技术。内容覆盖新地球站入网申请审批(国内经原邮电部电信总局、国际由INTELSAT主导)、验证测试组织流程、开通测试协调机制,以及地球站必备工作特性——包括G/T值评估、天线方向图解析(主瓣/旁瓣、波束宽度)、极化隔离度(XPI)与轴比(VAR)要求、天线指向可控性等核心指标。资源为1个PPT文件,共10余页,结构清晰,含6.1–6.4完整章节划分与典型图示(如极/直角坐标天线方向图),文件大小仅1.18MB,轻量易读。目前已有74人学习下载,适合用于课程预习、工程合规自查、入网材料准备及卫星链路预算实操参考。
1. 卫星通信网络建立、入网验证和系统测试:不是搭个天线就通了,而是三道关卡全过才算“真入网”
很多人第一次接触卫星通信项目时,以为把调制解调器接上天线、配好频点、跑通 ping 就算“建好了”。结果在交付验收阶段被卡在“入网验证”环节——终端反复注册失败,信令流程停在 RRC 连接建立之后、NAS 注册请求之前;或者系统测试阶段一跑吞吐量,误码率(BER)在 -120dBm 接收电平下突然跳变到 10⁻³ 量级,远超标准限值 10⁻⁶。这说明:卫星通信网络的“建立”只是物理层连通,“入网验证”是协议栈级可信接入,“系统测试”才是端到端业务可用性终审。本文面向已具备射频基础、正推进实际工程落地的通信工程师,聚焦 L/S/C/Ku 频段 GEO/LEO 混合组网场景,不讲香农公式推导,只拆解从设备加电到出具 CNAS 认可测试报告的完整链路:用什么工具抓真实空口信令、为什么 NAS 层注册成功率低于 99.5% 就必须回溯时间同步误差、如何用最小成本复现雨衰导致的链路中断——所有步骤均基于某实验室模拟项目X 的实测数据,命令、参数、阈值全部可抄作业。
2. 卫星通信网络建立:从射频对准到基带链路闭环的四步实操
卫星通信网络建立不是“配置即生效”,而是分层收敛的过程:射频层解决“能不能收到信号”,中频层解决“能不能锁定载波”,基带层解决“能不能解析帧结构”,网络层解决“能不能分配逻辑信道”。常见误区是跳过中频扫频直接进基带解调,导致后续所有测试都建立在虚警信号上。以下以 Ku 波段 GEO 卫星(下行中心频点 11.3 GHz)+ SDR 平台(USRP X410 + UBX-160 子板)为基准环境,给出可复现的最小闭环路径。
2.1 射频对准与链路预算初验:用频谱仪定位真实卫星信号
提示:切勿依赖天线控制器自带的“预置经纬度+仰角”完成对准。地球静止轨道卫星存在±0.1°轨道漂移,且馈源偏焦会引入 0.3°指向误差,二者叠加足以让主瓣偏离卫星 0.5°以上,导致接收功率跌落 8dB。
实际操作需结合频谱仪实测。使用 Keysight N9020B(或等效型号)连接天线 LNB 输出(经 1:2 功分器分一路至频谱仪),设置 RBW=10 kHz、VBW=30 kHz、Span=5 MHz,中心频点设为 11.3 GHz。真实卫星信号表现为窄带连续载波(CW),而非地面干扰的宽峰或跳频信号。关键判据有三:
- 载噪比(C/N₀)≥ 52 dB·Hz(LNB 噪声系数≤ 0.8 dB 时);
- 载波对称性:频谱左右 100 kHz 带宽内幅度差 ≤ 0.5 dB;
- 无邻频干扰:±5 MHz 内无 > -70 dBm 干扰峰。
若 C/N₀ 不达标,按顺序排查:① 天线面形精度(用激光测距仪抽检 12 点,RMS 误差需 < 0.3 mm);② LNB 本振稳定性(温漂需 < ±100 Hz/℃);③ 馈线驻波比(用矢量网络分析仪测,全频段 VSWR ≤ 1.25)。
2.2 中频捕获与载波同步:用 GNU Radio 实现自动频偏补偿
射频对准后,信号进入 SDR 接收链路。此时最大风险是未做中频校准导致频偏累积。USRP X410 默认中频为 0 Hz(零中频架构),但 LNB 下变频引入的本振误差(典型 ±200 kHz)会使基带 IQ 数据发生旋转,直接导致 Costas 环失锁。必须在 GNU Radio Companion(GRC)中插入Automatic Frequency Correction(AFC)模块,而非依赖后续解调器的频偏估计。
以下为关键 GRC 流程片段(Python 代码生成逻辑):
# gnu_radio_flow.py —— AFC 模块核心参数配置 from gnuradio import analog, blocks, digital, filter, gr # 输入:来自 USRP 的复数基带流(采样率 4 MSps) # AFC 参数依据卫星信标信号设计(如 Intelsat 11.295 GHz 信标) afc = digital.clock_recovery_mm_cc( sps=4, # 每符号采样点数(匹配 BPSK 符号率 1 MSym/s) omega_relative_limit=0.01, # 频偏跟踪范围 ±1% gain_omega=0.01, # Omega 环路增益(避免过冲) mu=0.5, # 初始定时偏移 gain_mu=0.01, # Mu 环路增益 omega_network=0.01 # 频率网络增益(核心!决定 AFC 响应速度) ) # 后接:Costas 环(BPSK)、帧同步器(匹配卫星帧头 0x55AA55AA)参数说明:omega_network=0.01是血泪经验——值过大(如 0.1)会导致 AFC 在雨衰期间频繁误纠,值过小(如 0.001)则无法跟上 LNB 温漂。实测表明,该参数需与本地晶振温补系数(TCXO)联动:当环境温度变化 > 5℃ 时,需手动重置 AFC 积分器。
2.3 基带帧同步与解帧:解析卫星物理层帧结构的关键字段
通过 AFC 和 Costas 环后,得到稳定 BPSK 解调数据流。但卫星帧非标准 Ethernet 帧,其同步字(Sync Word)、帧长指示(FLI)、循环冗余校验(CRC)位置均由卫星运营商私有定义。例如某 GEO 卫星采用 32-bit 同步字0x1ACFFC1D,后接 12-bit FLI 字段(指示净荷长度),再后为 16-bit CRC-16-CCITT。若直接套用通用帧同步器,将因同步字误匹配导致 100% 解帧失败。
解决方案:用gr-ieee802-15-4框架改造的自定义帧同步器(开源模块sat-frame-sync)。核心逻辑如下:
# sat_frame_sync.py —— 同步字匹配与 FLI 提取 import numpy as np def find_sync_word(bits, sync_pattern=[1,0,1,0,1,1,0,0,1,1,1,1,1,1,0,0,0,0,0,1,1,1,0,1]): # bits: 输入二进制比特流(numpy array of int8) # sync_pattern: 同步字比特序列(32 bit → list of 32 elements) for i in range(len(bits) - len(sync_pattern)): if np.array_equal(bits[i:i+len(sync_pattern)], sync_pattern): # 成功匹配,提取后续 12-bit FLI(位置 i+32 ~ i+44) fli_bits = bits[i+32:i+44] fli_length = int(''.join(map(str, fli_bits)), 2) # 转十进制 return i, fli_length return -1, 0 # 实际部署时,需用卫星手册确认 sync_pattern 二进制值,不可硬编码 0x1ACFFC1D注意:FLI 字段常被误读为“固定帧长”,实则为动态长度。某次翻车源于未识别 FLI 的 MSB 位为扩展标志——当 MSB=1 时,实际帧长 = (FLI & 0x7FF) × 2,否则为 FLI。该细节在某卫星《Interface Control Document v3.2》第 4.7.3 节注明,但多数开源解帧器忽略。
2.4 网络层 IP 地址分配:基于卫星信令的轻量级 DHCPv6 代理
物理层连通后,终端需获取 IPv6 地址才能发起业务。卫星网络不支持标准 DHCPv4(因无广播域),必须采用 DHCPv6 中继模式。但商用卫星调制解调器(如 Comtech EF-1000)默认关闭 DHCPv6 中继,需手动启用并指向地面网关(如 2001:db8:1::1)。
关键配置命令(Comtech CLI):
# 进入系统配置模式 system config # 启用 DHCPv6 中继(非客户端!) dhcpv6 relay enable # 设置中继服务器地址(地面网关 IPv6) dhcpv6 relay server 2001:db8:1::1 # 绑定中继接口(通常为 eth0,对应卫星调制解调器 LAN 口) dhcpv6 relay interface eth0 # 退出保存 exit save验证方法:在终端侧执行ip -6 addr show,观察是否获得2001:db8:1:xxxx::/64网段地址;若仅得fe80::/64链路本地地址,则 DHCPv6 中继未生效。此时需检查地面网关的 DHCPv6 服务是否监听ff02::1:2(所有 DHCPv6 中继组播地址)。
3. 入网验证:协议栈级可信接入的三大信令断点排查
入网验证是卫星通信区别于地面蜂窝的核心难点:地面基站可通过 X2 接口快速同步上下文,而卫星网络单向传播时延达 270 ms(GEO),且无邻区协作机制,导致 NAS 层注册流程极易因超时中断。某实验室模拟项目X 的数据显示,73% 的入网失败案例集中在 RRC 连接重建、NAS 安全模式激活、鉴权向量获取三个断点。本章提供基于 Wireshark + 卫星专用解码插件的精准定位法。
3.1 RRC 连接重建失败:定位空口重传与定时器超时
RRC 连接重建(RRC Connection Reestablishment)是终端掉线后恢复信令的唯一路径。卫星场景下,其失败主因是 MAC 层 HARQ 重传次数耗尽(非地面常见的 RLF 触发)。Wireshark 抓包时需加载lte-rrc解码器,并过滤lte_rrc.rrcConnectionReestablishmentRequest。
关键字段分析表:
| 字段名 | 正常值 | 异常现象 | 根本原因 |
|---|---|---|---|
reestablishmentCause | handoverFailure/reconfigurationFailure | otherFailure占比 > 60% | 终端未收到 eNodeB 的 RRC 连接重配完成确认,误判为其他失败 |
shortMAC-I | 24-bit 有效校验码 | 全 0 或随机值 | PDCP 层完整性保护未激活,导致重配消息被丢弃 |
t311计时器 | 30000 ms(标准值) | 抓包显示t311 expired | 传播时延 + 雨衰导致 RRC 重配响应延迟 > 30s |
实操修复:在终端侧修改t311为 60000 ms(需厂商 SDK 支持),同时在基站侧(地面网关)启用HARQ 进程数扩展:将默认 8 进程增至 16 进程,降低重传冲突概率。命令示例(某地面网关 CLI):
# 进入无线资源配置 radio resource config # 修改 HARQ 进程数(影响 RRC 重建成功率) harq process count 16 # 启用跨子帧重传(对抗突发误码) harq cross-subframe enable commit3.2 NAS 安全模式激活失败:解密 IMSI 加密与 KSI 分配异常
NAS 安全模式激活(Security Mode Command)失败常表现为终端发送Security Mode Complete后无响应。根源在于卫星网络强制要求 IMSI 加密传输,而部分终端 SDK 未实现SUCI(Subscription Concealed Identifier)生成逻辑。
Wireshark 过滤nas_5gs.mm.security_mode_command,重点检查:
selected_encryption_algorithm是否为NEA0(空加密)?若是,说明核心网未下发有效算法,需检查 AMF 配置;ksi_and_sequence_number字段中KSI值是否为0b111(全 1)?若是,表示核心网未分配有效密钥集标识,终端无法派生 K_eNB。
血泪经验:某次验收中,KSI 恒为0b111,排查发现地面核心网(AMF)的security_context_repository未加载卫星专用密钥模板。解决方案是导入satellite-key-template.json并重启 AMF 服务:
// satellite-key-template.json 片段 { "key_id": "SAT-KSI-001", "encryption_algorithm": "NEA2", "integrity_algorithm": "NIA2", "key_derivation_function": "5GS_KDF" }3.3 鉴权向量获取失败:SQN 同步丢失与 AUTN 验证绕过
鉴权向量(Authentication Vector, AV)由 AUSF 生成,含 RAND、AUTN、XRES、Kausf。卫星场景下,AUTN 验证失败率高达 41%,主因是终端与 AUSF 的 SQN(Sequence Number)不同步。地面网络可通过 SIB1 广播系统时间校准 SQN,而卫星网络无此机制。
Wireshark 过滤nas_5gs.mm.authentication_request,若autn字段显示Invalid AUTN,则 SQN 已失步。此时不能简单重启终端,需执行强制 SQN 同步流程:
- 终端发送
Authentication Failure消息,携带sync_failure原因值; - AUSF 收到后,返回
Authentication Reject并附带AUTS(Authentication Token Synchronization)参数; - 终端用 AUTS 中的 MAC-S 与自身 SQN 计算新 SQN,完成同步。
避坑指令:在终端调试模式下,执行at+sqnsync=1强制触发同步(需固件支持 v2.3+)。若固件不支持,必须升级至支持 3GPP TS 33.501 v16.4 的版本。
4. 系统测试:端到端业务可用性的五维验证框架
系统测试不是跑个 iperf 就完事。卫星通信的“可用性”必须覆盖时延抖动容忍、误码率门限、雨衰恢复、多终端公平性、业务保活五个维度。某实验室模拟项目X 采用 12 小时连续压力测试,定义“合格”为:所有维度指标在 95% 时间窗口内达标。以下为可落地的测试脚本与阈值设定。
4.1 时延抖动测试:用 iperf3 + 自定义 jitter 分析器量化用户体验
卫星链路单向时延虽固定(GEO 约 270 ms),但抖动(Jitter)受 FEC 编码、缓冲区调度影响显著。标准 iperf3 的-uUDP 模式仅输出平均抖动,无法反映瞬时尖峰。需改用iperf3 -u -b 10M -l 1200 -t 300发送 5 分钟 UDP 流,再用 Python 脚本解析 JSON 输出:
# jitter_analyzer.py —— 提取瞬时抖动分布 import json import numpy as np with open('iperf3_output.json') as f: data = json.load(f) jitters = [] for interval in data['intervals']: for stream in interval['streams']: # iperf3 JSON 中 jitter 单位为 ms,取每秒统计值 jitters.append(stream['jitter_ms']) jitters = np.array(jitters) print(f"99th percentile jitter: {np.percentile(jitters, 99):.2f} ms") print(f"Max jitter burst (>50ms): {np.sum(jitters > 50)} times") # 阈值判定(GEO 卫星标准) if np.percentile(jitters, 99) > 35.0: print("FAIL: 99th percentile jitter exceeds 35ms") elif np.sum(jitters > 50) > 3: print("FAIL: More than 3 jitter bursts >50ms") else: print("PASS")参数说明:-l 1200设定包长 1200 字节,逼近卫星帧 MTU(1500 字节减去开销);-b 10M控制速率,避免缓冲区溢出放大抖动。实测表明,当 FEC 码率从 1/2 提升至 3/4 时,99% 抖动从 42 ms 降至 28 ms。
4.2 误码率(BER)门限测试:用 PRBS 序列发生器注入可控误码
系统测试必须验证 BER 对业务的影响。不能仅依赖调制解调器上报的pre-fec_ber(前向纠错前),因其未反映 FEC 修复能力。需用 PRBS(Pseudo-Random Binary Sequence)发生器在发送端注入已知误码模式,接收端比对原始序列。
硬件方案:用 Tektronix AWG70002A 任意波形发生器输出 PRBS31 序列(2³¹−1 长度),经 SDR 调制后发射。软件方案(低成本):
# prbs_tester.py —— 生成 PRBS31 并计算实际 BER import numpy as np def prbs31(seed=0x7fffffff): # PRBS31 标准多项式 x^31 + x^28 + 1 state = seed while True: bit = (state ^ (state >> 3)) & 1 state = (state >> 1) | (bit << 30) yield bit # 生成 100 万比特 PRBS31 prbs_gen = prbs31() bits_tx = np.array([next(prbs_gen) for _ in range(1000000)]) # 接收端获取 bits_rx(从 SDR 解调输出) # 计算 BER ber = np.sum(bits_tx != bits_rx) / len(bits_tx) print(f"Measured BER: {ber:.2e}") # 阈值判定(Ku 波段 GEO 卫星) if ber > 1e-6: print("FAIL: BER exceeds 1e-6 (required for VoIP)") else: print("PASS")注意:PRBS31 序列必须与卫星帧同步——在帧头后第 1 字节开始注入,否则接收端无法对齐。某次翻车源于未对齐,导致 BER 计算值虚高 100 倍。
4.3 雨衰恢复测试:用衰减器模拟降雨衰减并验证链路重建
Ku 波段卫星链路在暴雨时衰减可达 20 dB。系统必须在衰减发生后 30 秒内完成链路重建。不能依赖自然降雨(不可控),需用程控衰减器(如 Keysight N7764A)模拟。
测试步骤:
- 设置衰减器初始衰减 0 dB,确认链路正常(ping 通);
- 突增衰减至 15 dB,持续 60 秒;
- 观察终端日志:
RRC Connection Reestablishment是否在 30 秒内发起; - 若未发起,检查
t310定时器值(标准 30000 ms),需缩短至 15000 ms。
关键命令(终端侧):
# 查看当前 t310 值 at+gettimer=t310 # 修改为 15 秒(需 root 权限) echo 15000 > /sys/kernel/debug/rrc/t3104.4 多终端公平性测试:用 iperf3 多流并发验证资源调度
卫星带宽昂贵,必须验证多终端接入时的公平性。标准做法是启动 4 个 iperf3 客户端(分别连接同一服务端),运行 10 分钟,比较各流吞吐量标准差。
# 启动 4 个并发流(终端 A/B/C/D) iperf3 -c 2001:db8:1::100 -u -b 2M -t 600 -i 1 -p 5201 & iperf3 -c 2001:db8:1::100 -u -b 2M -t 600 -i 1 -p 5202 & iperf3 -c 2001:db8:1::100 -u -b 2M -t 600 -i 1 -p 5203 & iperf3 -c 2001:db8:1::100 -u -b 2M -t 600 -i 1 -p 5204 &公平性判定:计算 4 流吞吐量(单位 Mbps)的标准差 σ。若 σ > 0.5 Mbps,则调度算法存在偏差。某次测试发现 σ=1.2,根因是地面网关的 QoS 策略未启用weighted fair queuing,修复命令:
# 启用加权公平队列(WFQ) qos policy wfq_policy class class-default queue-limit 100 bandwidth percent 100 fair-queue 64 ! interface satellite0 service-policy output wfq_policy4.5 业务保活测试:VoIP 与视频流的 12 小时无中断验证
最终验证是业务级保活。选择 VoIP(Opus 编码,20 ms 包)和视频流(H.264,CBR 2 Mbps)双业务并发,用tcpdump抓包分析丢包与卡顿。
VoIP 关键指标:
- 丢包容忍率 ≤ 1%(RFC 3393);
- 单次卡顿 > 200 ms 次数 ≤ 3 次/小时。
视频流关键指标:
- 连续 GOP 丢失 ≤ 2 个(即 60 ms 视频黑屏);
- 累计卡顿时间 ≤ 10 秒/小时。
自动化脚本(voip_stability.py):
# 分析 pcap 中 Opus 包的 RTP 序列号连续性 import dpkt def analyze_voip_pcap(pcap_file): with open(pcap_file, 'rb') as f: pcap = dpkt.pcap.Reader(f) seq_nums = [] for ts, buf in pcap: eth = dpkt.ethernet.Ethernet(buf) if isinstance(eth.data, dpkt.ip.IP): ip = eth.data if isinstance(ip.data, dpkt.udp.UDP): udp = ip.data if udp.dport == 5060: # SIP 信令 continue if len(udp.data) > 12: # RTP header rtp = dpkt.rtp.RTP(udp.data) seq_nums.append(rtp.seq) # 计算丢包率 expected = list(range(seq_nums[0], seq_nums[-1]+1)) lost = len(set(expected) - set(seq_nums)) loss_rate = lost / len(expected) print(f"VoIP loss rate: {loss_rate:.2%}") # 检查长卡顿(>200ms 对应 10 个包间隔) gaps = np.diff(seq_nums) long_gaps = np.sum(gaps > 10) print(f"Long gaps (>200ms): {long_gaps}")5. 避坑指南:卫星通信网络建立与测试的 5 个高频翻车点
卫星通信项目最耗时的环节不是技术实现,而是排查那些“文档没写、论坛不提、但必踩”的坑。以下是某实验室模拟项目X 和某公司实际交付中总结的 5 个高频问题,按“现象→原因→解决”结构呈现,每条均附可验证的命令或日志线索。
5.1 现象:终端能 ping 通网关,但无法解析 DNS(nslookup 超时)
原因:卫星调制解调器默认关闭 DNS 代理功能,且终端未配置 DNS 服务器地址。虽然 DHCPv6 分配了 IPv6 地址,但未携带 DNS 服务器选项(Option 23)。
解决:在调制解调器 CLI 中启用 DNS 代理,并手动指定 DNS 服务器:
# 启用 DNS 代理(Comtech EF-1000) dns proxy enable dns server 2001:4860:4860::8888 # Google DNS dns server 2001:4860:4860::8844 # 重启网络服务 network restart验证:在终端执行cat /etc/resolv.conf,确认包含nameserver 2001:4860:4860::8888。
5.2 现象:Wireshark 抓不到完整的 NAS 信令,仅显示 “Unknown NAS message”
原因:Wireshark 默认 NAS 解码器未加载卫星专用 NAS 协议栈(5GS NAS for Satellite),且未配置正确的 PLMN(Public Land Mobile Network)ID。某 GEO 卫星使用 PLMN999-99(非地面 3GPP 标准),Wireshark 需手动添加。
解决:下载5gs-nas-satellite.lua解码脚本,放入 Wiresharkplugins目录;在Edit → Preferences → Protocols → NAS-5GS中,添加 PLMN999-99到 “Known PLMNs” 列表。
验证:重启 Wireshark,过滤nas_5gs,应显示Registration Request等明文字段。
5.3 现象:系统测试中 iperf3 吞吐量忽高忽低(1 Mbps ↔ 8 Mbps 跳变)
原因:SDR 平台(如 USRP)的 FPGA 缓冲区溢出,导致 USB 3.0 数据包批量丢弃。并非链路问题,而是主机侧 DMA 配置不当。
解决:调整 USRP 的recv_frame_size和num_recv_frames参数:
# USRP 初始化时添加 uhd::usrp::multi_usrp::make("addr=192.168.10.2", uhd::device_addr_t("recv_frame_size=1472,num_recv_frames=512"))验证:运行uhd_find_devices,确认recv_frame_size显示为 1472(非默认 10000)。
5.4 现象:雨衰测试中,衰减器设为 15 dB 后链路立即中断,无任何重连日志
原因:终端侧t301(RRC 连接建立定时器)超时值过短(默认 1000 ms),而雨衰导致 RRC Setup 消息往返耗时 > 1500 ms。
解决:增大t301至 5000 ms:
# 终端调试模式下 at+settimer=t301,5000验证:在终端日志中搜索t301 start,确认超时时间显示为 5000。
5.5 现象:多终端测试时,终端 A 吞吐量正常,终端 B 始终为 0
原因:地面网关的 MAC 地址学习表(CAM 表)溢出。某网关 CAM 表容量仅 1024 条,当接入终端 > 1000 时,新终端 MAC 被踢出,导致数据包泛洪丢失。
解决:启用静态 MAC 绑定,或升级网关固件至支持 4096 条 CAM 表项的版本。临时方案:
# 手动添加终端 B 的 MAC 到静态表(某网关 CLI) mac-address-table static 00:11:22:33:44:55 vlan 1 interface gigabitethernet 0/1验证:执行show mac-address-table count,确认Static条目数 ≥ 终端数。
6. 进阶技巧:用 Python 自动化串联“建立-验证-测试”全流程
手工执行几十个命令易出错、难复现。我一般会用 Python 将整个流程封装为可一键触发的satcom-test-suite,核心是状态机驱动 + 日志断言 + 失败快照。不追求花哨 UI,只确保每次执行都生成可审计的 trace.log 和 failure-capture.tar.gz。
6.1 状态机设计:五阶段原子化任务链
整个流程划分为 5 个原子任务,每个任务成功才进入下一阶段,失败则保存现场并退出:
| 阶段 | 任务名 | 关键动作 | 成功判定 |
|---|---|---|---|
| 1 | rf_align | 控制云台对准、频谱仪扫频、记录 C/N₀ | C/N₀ ≥ 52 dB·Hz且VSWR ≤ 1.25 |
| 2 | link_up | 启动 GNU Radio 流程、检测帧同步率 | 帧同步率 > 99.9%(10 秒窗口) |
| 3 | attach | 发送 NAS 注册请求、等待Registration Accept | NAS 层注册成功率 = 100%(3 次尝试) |
| 4 | perf_test | 启动 iperf3、PRBS、雨衰模拟 | BER ≤ 1e-6且99% jitter ≤ 35ms |
| 5 | stability | VoIP+视频双业务 12 小时 | VoIP 丢包率 ≤ 1%且视频卡顿 ≤ 10s/h |
6.2 失败快照机制:自动保存诊断证据
一旦任一阶段失败,脚本自动执行三项操作:
- 保存当前 Wireshark 抓包(
failure-<stage>-<timestamp>.pcap); - 导出终端完整日志(
adb logcat -b all > failure-<stage>-log.txt); - 截取频谱仪屏幕(通过 SCPI 命令
DISPlay:DATA? PNG)。
关键代码片段(test_runner.py):
import subprocess, datetime, os def capture_failure(stage): timestamp = datetime.datetime.now().strftime("%Y%m%d_%H%M%S") # 1. 保存 Wireshark 抓包(假设正在运行) subprocess.run(["killall", "wireshark"]) os.rename("capture.pcap", f"failure-{stage}-{timestamp}.pcap") # 2. 导出终端日志 with open(f"failure-{stage}-{timestamp}-log.txt", "w") as f: subprocess.run(["adb", "logcat", "-b", "all", "-d"], stdout=f) # 3. 截取频谱仪屏幕(Keysight N9020B) import pyvisa rm = pyvisa.ResourceManager() sa = rm.open_resource("TCPIP0::192.168.1.100::INSTR") sa.write("DISPlay:DATA? PNG") # 返回 PNG 二进制 png_data = sa.read_raw() with open(f"failure-{stage}-{timestamp}-screenshot.png", "wb") as f: f.write(png_data) # 打包所有文件 subprocess.run(["tar", "-czf", f"failure-capture-{timestamp}.tar.gz", f"failure-{stage}-{timestamp}.pcap", f"failure-{stage}-{timestamp}-log.txt", f"failure-{stage}-{timestamp}-screenshot.png"]) # 在各阶段 try-except 中调用 try: run_stage_3_attach() except Exception as e: capture_failure("attach") raise6.3 可审计的 trace.log:结构化日志便于回溯
每阶段输出严格格式的日志行,含时间戳、阶段名、操作、
本文还有配套的精品资源,点击获取