用于单台 CPE 深度联调的 TR-069 / CWMP ACS 模拟器。统一 ACS 常驻监听 9090,设备周期 Inform 与参数读取、配置、诊断、重启等主动操作共用同一个会话队列;设备日志文件由独立的 9000 服务接收。
当前项目适合实验室协议联调和单设备 TR-069 功能验证,不是生产级、多租户或完整标准认证 ACS。
环境要求:Python 3.11+。Windows 时区转换依赖 tzdata,请统一安装项目依赖:
python -m pip install -r requirements.txt双击根目录的 start_simulator.bat。它只打开一个 Web 控制台窗口;统一平台会同时启动 9090 ACS 和 9000 日志接收,不再额外打开日志观察 CMD。监听状态在页面顶部查看,收到的文件和完整 HTTP 请求在“上传捕获”页查看。
首次启动会从 acs_local_config.example.json 创建本机专用的 acs_local_config.json。请先把其中的 ACS 对外地址和 CPE Connection Request 地址改为实际局域网地址;本机配置不会提交到 Git。
也可以手工运行:
python web_acs.py服务地址:
| 服务 | 默认地址 |
|---|---|
| Web 控制台 | http://127.0.0.1:5000 |
| CPE ACS 地址 | http://<本机地址>:9090/acs |
| 日志上传 | http://<本机地址>:9000/log-upload |
| Download 文件服务 | http://<本机地址>:8001 |
端口可在 acs_local_config.json 修改,修改后需要重启。
默认页只突出参数树和交互日志:
- 参数树刷新时保留已展开节点和滚动位置。
- 交互日志最新记录在最上方,点击记录查看完整 SOAP;刷新时保留已展开详情和内部滚动位置。
- 顶部保留读取参数、设置单参数、Ping 三个高频快捷入口。
- “清空交互日志”有二次确认,只删除结构化交互记录。
参数工具页包含 3 个相互独立的视图:
- “完整参数树”累计合并历史采集结果。
- “最近一次探测”只保留本次 GPN/GPV 结果,便于定位失败位置。
- “V1.7 能力矩阵”对照 206 个参数、26 个对象和 17 个 RPC。矩阵支持按状态、分组和关键词过滤;“未验证”不会显示为通过,规范权限或类型与设备证据不一致时显示为“冲突”。
能力矩阵只汇总 Profile、GPN/GPV 和 GetRPCMethods 证据,不保存或显示参数值。敏感参数仅展示“敏感参数”约束,不显示实际内容。
左侧选择任务,中间只显示该任务需要的字段,下面显示该任务最近状态、结果、Fault 和关联事件。主要任务包括:
| 分类 | 任务 |
|---|---|
| 参数与采集 | 单参数读取、递归参数树、设备信息、累计流量、上下行速率、LAN 口速率、CPU/内存、RSRP、动态下联终端 |
| 配置 | 单参数设置、NTP、Wi-Fi、MAC 白名单、告警阈值、日志上报 |
| 远程管理 | 管理概览、ACS 接入、周期上报、连接请求认证、升级托管、UDP Connection Request、STUN、动态可管理设备 |
| 诊断 | Ping、TraceRoute |
| 协议与对象 | GetRPCMethods、Get/SetParameterAttributes、Add/DeleteObject、RequestDownload |
| 传输与控制 | Upload、Download、Reboot、FactoryReset |
每个任务都可以先点击“预览 RPC”。预览只生成 XML,不会启动服务、排队或唤醒设备。Reboot 必须输入 REBOOT,Download 必须输入 DOWNLOAD,提交时还会再次确认。
远程管理操作按职责拆分。配置 ACS 接入时不会夹带周期、Connection Request、升级或 STUN 参数;关闭 STUN 时只下发关闭开关。密码会进入实际下发 SOAP,但 RPC 预览、任务 metadata 和结构化交互存储统一显示为 <redacted>。
旧版固定场景保留在“兼容工具”页,只用于历史流程回归和排障。旧 ACS 场景与统一 ACS 都使用 9090,因此统一服务运行时不能启动旧 ACS 场景。
普通读取:
queued -> sent -> GetParameterValuesResponse -> completed
配置任务会自动回读:
SetParameterValues -> SetParameterValuesResponse
-> reading_back -> GetParameterValues -> completed / failed
诊断和控制任务:
Ping/TraceRoute -> waiting_event -> 8 DIAGNOSTICS COMPLETE -> 结果回读
Reboot -> waiting_event -> 1 BOOT -> completed
Download -> waiting_transfer -> TransferComplete -> completed / failed
同一设备可以连续执行多次 Ping 或 TraceRoute。每次 Event 8 只关联当前等待的诊断任务,不再受历史任务记录影响。TraceRoute 会自动读取状态、发现 RouteHops. 动态实例并读取所有跳点。
设备已在 Inform 中提供 ManagementServer.ConnectionRequestURL 时,任务提交后会尝试异步唤醒设备;没有该地址时,任务保留在队列中等待下一次 Inform。
普通读取、参数探测和幂等配置遇到暂态 Fault 时会在后续合法 CWMP 会话中按 5s -> 10s -> 20s 方式有上限退避,默认最多尝试 3 次。永久 Fault 立即失败;Upload、Download、Reboot、FactoryReset、AddObject 和 DeleteObject 等有副作用 RPC 不自动重试,避免设备已执行但响应异常时重复操作。重试等待中的任务不会阻塞同一设备的其他任务。
主动 RPC、诊断完成事件、BOOT 和 TransferComplete 都有独立 UTC deadline,默认分别为 60 秒、300 秒、300 秒和 3600 秒。后台监控会把超时任务明确标记为 rpc_response_timeout、diagnostic_event_timeout、boot_event_timeout 或 transfer_complete_timeout,只清理对应根任务。服务重启时,仍可仅凭持久化状态恢复的等待任务会继续使用原 deadline;无法安全重建 XML 的 queued/sent/in-progress 任务会明确失败,不会留在页面上永久等待。
双击 start_tls_lab.bat 可在不影响默认 HTTP 服务的情况下启动一套独立 HTTPS 环境:ACS 使用 9443,日志上传使用 9444,文件下载使用 9445。首次启动会在 runtime/tls/t12/ 生成本地测试 CA、服务端证书、私钥和隔离配置;这些文件不会进入 Git 或发布包。
服务端证书的 SAN 包含 192.168.8.197、127.0.0.1 和 localhost。设备测试前,需要把 runtime/tls/t12/ca.crt.pem 安装为设备信任 CA,再把 ACS 地址改为 https://192.168.8.197:9443/acs。当前实验环境默认不要求客户端证书,即验证单向 TLS;HTTP Digest 仍可配置在 TLS 通道内使用。
统一平台从 configs/default.json 加载非敏感安全配置。密码不要写入该文件,使用环境变量传给启动进程:
| 用途 | 环境变量 |
|---|---|
| CPE 访问 ACS 认证 | FAKE_ACS_ACS_AUTH_MODE、FAKE_ACS_ACS_USERNAME、FAKE_ACS_ACS_PASSWORD |
| ACS 访问 CPE Connection Request | FAKE_ACS_CONNECTION_REQUEST_AUTH_MODE、FAKE_ACS_CONNECTION_REQUEST_USERNAME、FAKE_ACS_CONNECTION_REQUEST_PASSWORD |
| 上传/下载文件服务认证 | FAKE_ACS_FILE_AUTH_MODE、FAKE_ACS_FILE_USERNAME、FAKE_ACS_FILE_PASSWORD |
| TLS | FAKE_ACS_TLS_ENABLED、FAKE_ACS_TLS_CERTFILE、FAKE_ACS_TLS_KEYFILE、FAKE_ACS_TLS_CAFILE、FAKE_ACS_TLS_MINIMUM_VERSION |
认证模式支持 none、basic、digest。启用 TLS 后,9090 ACS、9000 上传和 8001 下载三个监听都会切换为 HTTPS;证书或私钥无效会阻止平台启动,不会静默退回 HTTP。最低版本支持 TLSv1_2 和 TLSv1_3;需要双向 TLS 时再设置 FAKE_ACS_TLS_REQUIRE_CLIENT_CERTIFICATE=true 并提供 CA 文件。
CPE 偶尔会错误发送已废弃且方向不合法的 HoldRequests。平台会在 events.jsonl 中记录 invalid_cpe_hold_requests,但为兼容 easycwmp 不会据此暂停任务或断开 Inform。
平台可直接驱动或记录:注册 Inform、周期配置/校验、分类参数采集、动态终端实例、Ping、TraceRoute、MAC/NTP/Wi-Fi/告警/日志配置、ALARM、日志文件上传、Reboot 和 Download/TransferComplete。
当前已建立独立的 V1.7、V3 和 compatible 参数 Profile。V1.7 覆盖 206 个叶子和 26 个对象,V3 覆盖 150 个叶子和 20 个对象;路径、类型、读写属性、约束、敏感标记、动态实例规则和兼容别名均由共享 Registry 管理。参数读取和递归树探测不会隐式创建实例;只有 Profile 标记为可创建的平台管理对象才执行标准 AddObject -> SPV -> GPV 流程。
所有普通配置均执行三道检查:Profile 权限校验、设备 GPN Writable=1 校验、SPV 后 GPV 回读比较。非敏感参数缺失或不一致会失败;密码等敏感参数只在进程内比较,落盘结果仅保留 <redacted> 和匹配标志。远程管理和 LAN 合规工具还包含 TR-098/TR-181 管理根探测、LAN/Hosts 动态遍历、ParameterKey 预期 9008 及非法 LAN 实例预期 9005 检查。
当前代码已具备 Get/SetParameterAttributes、通用对象事务、GetRPCMethods、Upload/RequestDownload/FactoryReset、标准 SOAP 1.1 Fault、TLS、HTTP Basic/Digest、暂态 Fault 有上限退避、异常会话超时恢复以及 V1.7/V3/compatible 三种 Profile。干净发布包 smoke,以及单台真实 CPE 的 HTTP 控制/传输和 HTTPS Inform/GPV 验收均已通过;RequestDownload 仍缺少设备主动触发证据。它仍不是完整认证级 ACS。本项目明确只精做单设备,不以同 NAT 多设备隔离作为完成门槛。
本项目采用 MIT License。
以下结果必须配合真实 CPE 和网络人工确认:
- MAC 白名单是否真的阻断或允许下联终端。
- NTP 是否真实同步、Wi-Fi 是否确实不可开启。
- CPU、内存、流量、速率、RSRP 是否与设备管理页面一致。
- 下联终端实际接入情况、日志内容完整性和网络诊断结果合理性。
- Reboot/Download 后设备的真实运行状态。
| 内容 | 路径 |
|---|---|
| 结构化交互 | runtime/state/interactions.jsonl |
| 平台事件 | runtime/state/events.jsonl |
| 任务索引 | runtime/state/indexes/acs_tasks.json |
| 参数树结果 | runtime/state/parameter_result.json |
| GPN/GPV 能力证据 | runtime/state/indexes/runtime_capabilities.json |
| ACS 原始报文 | runtime/captures/acs/ |
| 日志上传原始请求 | runtime/captures/upload/ |
| 日志上传文件内容 | runtime/captures/upload_body/ |
| 旧场景日志 | runtime/logs/ |
设备上传的原始 filename 保留在 .http 请求中,文件内容使用 UUID 文件名保存。工作台的“清空交互日志”只删除结构化交互;“清空全部历史”经过两次确认后,会短暂停止服务并删除参数树、最近探测、交互、任务、会话、告警、Fault、能力证据、上传捕获和旧场景业务日志,然后恢复清理前正在运行的服务。
全部历史重置不会删除 acs_local_config.json、configs/、runtime/downloads/、runtime/screenshots/ 或 runtime/logs/web_console*.log。Web 控制台日志由当前进程占用并作为启动故障证据保留,需要打包或手工清理时先关闭整个模拟器。
双击 package_simulator.bat 即可在 dist/ 生成 ZIP。脚本使用 Python 标准库,不依赖 WinRAR 或 7-Zip,也不会读取正在使用的 runtime/ 文件,因此模拟器运行时也可以打包。
发布包采用明确白名单,只包含运行所需源码、页面、默认配置和启动工具。它不会包含 acs_local_config.json、runtime/、messages/、analysis/、.codex/、测试文件、日志、HTTP 抓包、证书私钥或旧压缩包。
发布前可在命令行执行以下隔离 smoke;它会复制源码到临时目录并自动选择空闲端口,不影响当前运行的服务:
start_simulator.bat --smoke在页面点击“停止平台”会停止 ACS、日志上传和下载服务,但保留 Web 控制台。要停止整个模拟器,在 fake_acs Web Console 窗口按 Ctrl+C,等待进程退出后再关闭窗口。
启动失败时先查看 fake_acs Web Console 窗口中的明确错误;常见原因是 Python/依赖缺失或端口被占用。隔离 smoke 会直接打印失败的服务和端口。平台运行记录保存在 runtime/logs/,完整 HTTP 报文保存在 runtime/captures/。