eNSP AI 平台

eNSP AI 平台

本项目是一个面向 eNSP(华为网络模拟器)实验/教学场景 的前后端分离平台:支持导入 .topo 拓扑、自动连接本地 eNSP 设备 Console 抓取 display current-configuration,并结合拓扑与配置进行故障分析、输出修复建议与命令。同时集成 Ping 工具、子网计算器、网络扫描等常用辅助能力。如需获取项目进一步优化开发,请站内私信。

适用场景:课程实验、网络排障训练、批量配置生成、拓扑可视化与工具化分析。

1. 核心能力概览

1.1 AI 智能修复(重点)

  • 上传 eNSP 导出的 .topo 文件
  • 平台解析拓扑并识别设备(AR/S 系列交换机/USG 防火墙/PC 等)
  • 对每台设备自动连接 127.0.0.1:<com_port>.topo 中自带的 Console 端口)
  • 自动执行 display current-configuration 抓取设备当前配置(支持自动翻页,避免 ---- More ---- 截断)
  • 规则化“预分析”(确定性证据)+ LLM 深度分析(可选)
  • 输出:问题分析、排查步骤、按设备下发的修复命令,并附带“采集到的配置内容”

1.2 网络工具集

  • Ping 工具:支持持续 ping、SSE 流式返回、历史记录
  • 子网计算器:辅助 IPv4 子网划分/地址规划
  • 网络扫描:接口发现、扫描历史记录(以本机网络信息与探测结果为主)

1.3 用户与历史

  • 轻量用户注册/登录(SQLite)
  • Ping/扫描历史记录(SQLite,默认保留最近 50 条)

2. 技术栈与目录结构

2.1 技术栈

  • 前端:Vue 3 + Vite + Element Plus + Pinia + Vue Router
  • 后端:Python Flask + Flask-CORS
  • 拓扑解析:lxml(解析 eNSP .topo XML)
  • AI 能力:LangChain + langchain-openai(可配置任意兼容 OpenAI API 的网关)
  • 数据库:SQLite(users.db

2.2 目录结构(核心)

ensp/ ensp-frontend/         # 前端(Vue3/Vite) ensp-backend/           # 后端(Flask) test.topo               # 示例 topo 文件

后端关键文件:

  • ensp-backend/app.py:Flask API 入口、拓扑解析、AI 修复、Ping/扫描等
  • ensp-backend/telnet_client.py:eNSP Console Telnet 采集实现(含翻页与控制码清理)
  • ensp-backend/llm_service.py:LLM 调用与输出结构(RepairSolution)
  • ensp-backend/database.py:SQLite 用户与历史记录
  • ensp-backend/topo_generator.py:拓扑/配置生成相关能力(与 AI 修复不同链路)

前端关键文件:

  • ensp-frontend/src/views/AIRepairView.vue:AI 修复页面(采集统计、配置输出、预分析证据、修复结果)
  • ensp-frontend/src/router/index.js:路由与登录态守卫

3. AI 修复的工作原理(端到端)

AI 修复链路的目标是:先确保拿到“真实配置”,再做“基于证据的分析”

3.1 拓扑解析

.topo 本质是 XML。平台解析得到:

  • nodes[]:设备 id/name(model)/com_port/坐标
  • edges[]:设备间连接关系(当前未解析端口号,仅保留设备级连接)

其中 com_port 是 eNSP 分配的 Console 端口(例如 2000/2001…),用于后续自动采集配置。

3.2 配置采集(Telnet Console)

平台对每台设备:

  1. 连接 127.0.0.1:<com_port>
  2. 发送命令:screen-length 0 temporary(尽量关闭分页)
  3. 执行:display current-configuration | no-more(优先拿全量)
  4. 若设备不支持 | no-more,自动回退到 display current-configuration
  5. 采集过程中若出现分页提示 ---- More ----,会自动发送回车继续直到结束
  6. 清理终端输出中的 ANSI 光标控制码(例如 \x1b[42D),避免“乱码”

采集结果会以每台设备维度返回:

  • ok / skipped / error:采集是否成功、是否跳过、失败原因
  • config_len:配置长度
  • config_key_lines:提取的关键配置块/关键行
  • config_preview:配置预览(为避免页面过大,默认截断到前 12000 字符)

3.3 规则化预分析(确定性证据)

仅靠大模型容易出现“看到 OSPF 就归因 OSPF”的问题。为避免这种“幻觉式推理”,平台在 LLM 之前增加了 确定性预分析

  • 从配置解析接口块,提取每个 interface 下的 ip address
  • 如果某设备 没有任何接口 IP,直接给出高置信发现(例如“源设备缺少接口 IP”)
  • 根据拓扑链路检查:链路两端 L3 设备是否存在共同网段(否则标记为可疑)
  • 从问题描述中尝试抽取“源设备 + 目标 IP”,并识别目标 IP 的归属设备/接口(如果能从配置里匹配到)

预分析结果会以 precheck 字段返回,并注入大模型上下文,让模型优先解释“证据明确的低级错误”(如接口未配 IP)。

3.4 LLM 深度分析(可选)

如果配置了 OPENAI_API_KEY 等环境变量,平台会调用模型输出结构化 JSON:

  • analysis:基于证据的原因分析
  • solution_steps:排查/修复步骤
  • commands:按设备给出可执行命令列表

若 LLM 不可用,平台会返回可用的降级提示,并保留采集的配置与预分析证据,仍可用于人工排障。


4. 常见误判的根因与本项目的改进点

在 eNSP 实验中,“删接口 IP 导致不通”这类问题非常常见。早期版本的 AI 结果容易出现:

  • 只给“OSPF/路由传递问题”这种泛化结论
  • 未明确指出“接口 IP 缺失/网段不一致”这类硬证据

主要根因:

  1. LLM 在没有强证据时容易做经验推断
  2. 拓扑解析未包含端口级映射,模型难以做精确链路定位
  3. 配置上下文过长/过散,模型抓不到“缺失配置”的关键证据

本项目的改进:

  • Telnet 全量采集 + 自动翻页
  • 清理控制码,保证输出可读
  • 引入规则化预分析(高置信证据)
  • 将“证据”在前端直接展示,避免黑盒

5. API 设计(摘要)

后端默认地址:http://localhost:5000

5.1 AI 修复

  • POST /api/ai-repair
    • FormData:
      • file: .topo
      • issue: 问题描述文本
    • 返回:
      • analysis/solution_steps/commands
      • device_collection:设备采集明细(含配置预览)
      • precheck:预分析证据

5.2 LLM 配置

  • GET/POST /api/system/llm-config
    • 用于读取/写入 .env 中的模型配置(注意不要提交 .env 到 GitHub)

6. 本地运行

6.1 前置条件

  • Windows 环境(eNSP 主要运行于 Windows)
  • eNSP 已启动且拓扑中设备已运行完成
  • Python(建议使用虚拟环境)
  • Node.js / npm

6.2 启动后端

进入 ensp-backend/

pip install -r requirements.txt python app.py

默认监听:http://127.0.0.1:5000

6.3 启动前端

进入 ensp-frontend/

npm install npm run dev -- --host 0.0.0.0 --port 5173

如果 5173 被占用,Vite 会自动换到 5174/5175…,以控制台输出为准。

Read more

2.22 STL 中string的学习

1.什么是STL STL standard template libarary 标准模板库:是C++标准库的重要组成部分 不仅是一个可复用的组件库 而且是一个包罗数据结构和算法的软件框架 2.STL六大组件 容器 算法 迭代器 仿函数 适配器 分配器 3.STL三大境界 学习 熟练 扩展 string的学习 通俗理解 string就是一个会自己长大的字符数组 自带了很多工具函数 为什么使用string 自动内存管理 方便操作 安全(不会越界) 与C兼容 C++ string 类常用接口说明 1. 简介 string 是 C++ 标准库中的字符串类,封装了动态字符数组,自动管理内存,提供丰富的成员函数。使用 string 比 C

By Ne0inhk
2026年3月GESP真题及题解(C++一级):数字替换

2026年3月GESP真题及题解(C++一级):数字替换

2026年3月GESP真题及题解(C++一级):数字替换 题目描述 Alice 不喜欢 4,喜欢 8,她想把 4 全换成 8,若无 4 则不修改。 输入格式 输入一行,一个整数 A,表示替换前的数。 输出格式 输出一行,包含一个整数 B,表示替换后的数。 样例 样例 1: 输入: 8459045 输出: 8859085 样例 2: 输入: 123 输出: 123 数据范围 * 0 ≤ A ≤ 10 9 0 \leq A \leq 1

By Ne0inhk
图形管线与渲染引擎中的C++架构设计:模块化、跨平台与资源驱动实践

图形管线与渲染引擎中的C++架构设计:模块化、跨平台与资源驱动实践

#王者杯·14天创作挑战营·第2期# 图形管线与渲染引擎中的C++架构设计:模块化、跨平台与资源驱动实践 一、引言 在游戏引擎的核心系统中,渲染引擎无疑是最复杂和最性能敏感的模块之一。它负责将游戏世界的所有图形元素最终呈现在屏幕上。 在现代游戏中,渲染系统通常需要具备: * 可扩展性强(支持多种材质与后处理管线) * 跨平台能力(OpenGL、Vulkan、DirectX、Metal) * 高性能(利用 GPU、异步管线、资源复用) * 数据驱动(基于 Render Graph 或 Frame Graph) 本篇博客将以 C++ 为基础,探讨如何构建现代化、模块化的渲染系统架构。 二、图形渲染系统结构概览 Game LogicRender QueueRender GraphDraw Call SubmissionGraphics API WrapperGPU Driver 各部分职责:

By Ne0inhk
C++ 面试题常用总结 详解(满足c++ 岗位必备,不定时更新)

C++ 面试题常用总结 详解(满足c++ 岗位必备,不定时更新)

📚 本文主要总结了一些常见的C++面试题,主要涉及到语法基础、STL标准库、内存相关、类相关和其他辅助技能,掌握这些内容,基本上就满足C++的岗位技能(红色标记为重点内容),欢迎大家前来学习指正,会不定期去更新面试内容。  Hi~!欢迎来到碧波空间,平时喜欢用博客记录学习的点滴,欢迎大家前来指正,欢迎欢迎~~ ✨✨ 主页:碧波 📚 📚 专栏:C++ 系列文章 目录 一、C ++ 语法基础 🔥 谈谈变量的使用和生命周期,声明和初始化 🔥 谈谈C++的命名空间的作用 🔥  include " " 和 <> 的区别 🔥 指针是什么? 🔥 什么是指针数组和数组指针 🔥 引用是什么? 🔥 指针和引用的区别 🔥 什么是函数指针和指针函数以及区别 🔥 什么是常量指针和指针常量以及区别 🔥 智能指针的本质是什么以及实现原理 🔥 weak_ptr 是否有计数方式,在那分配空间? 🔥 类型强制转换有哪几种? 🔥 函数参数传递时,

By Ne0inhk