#ifndef BNTVS_SW_APP_HPP #define BNTVS_SW_APP_HPP #include #include #include #include #include /** * @brief BNTVS_SW 命名空间,包含总线网络测试验证软件所有核心类型与函数。 * * 该命名空间涵盖基础通信、协议兼容、数据存储、路由转发、总线分析、 * 故障注入、信号转换和总线测试等全部软件单元的功能声明与实现。 * 每个业务函数均通过 @requirement 标签关联对应的 CSCI 需求标识。 */ namespace bntvs { // ============================================================================ // 枚举类型定义 // ============================================================================ /// @brief 总线类型。 enum class BusType : uint8_t { ETHERNET = 0, ///< 以太网总线 RS422 = 1, ///< RS422 串行总线 CAN = 2, ///< CAN 总线 ANALOG = 3, ///< 模拟量 DIGITAL = 4 ///< 离散量 }; /// @brief CAN 协议类型。 enum class CANProtocolType : uint8_t { CAN2_0 = 0, ///< CAN 2.0 协议 CANFD = 1 ///< CAN FD 协议 }; /// @brief 帧格式类型。 enum class FrameFormat : uint8_t { STANDARD = 0, ///< 标准帧 (11-bit ID) EXTENDED = 1 ///< 扩展帧 (29-bit ID) }; /// @brief 路由类型。 enum class RouteType : uint8_t { STATIC = 0, ///< 静态路由 DYNAMIC = 1 ///< 动态路由 }; /// @brief 故障类型。 enum class FaultType : uint8_t { SHORT_CIRCUIT = 0, ///< 短路 OPEN_CIRCUIT = 1, ///< 断路 EMI = 2, ///< 电磁干扰 ERROR_FRAME = 3, ///< 错误帧 NODE_OFFLINE = 4, ///< 节点离线 NODE_ABNORMAL = 5, ///< 节点异常接入 BAUD_RATE_ANOM = 6 ///< 波特率异常波动 }; // ============================================================================ // 数据结构定义 // ============================================================================ /** * @brief 总线数据记录,对应数据库总线数据记录表结构。 * * 用于存储从总线采集的原始通信数据,包含时间戳、帧ID、 * 数据载荷及协议类型等信息。 */ struct BusDataRecord { int64_t record_id = 0; ///< 记录ID (数据库主键) std::string bus_type; ///< 总线类型 std::chrono::system_clock::time_point timestamp; ///< 时间戳 (微秒精度) uint32_t frame_id = 0; ///< 帧ID uint32_t data_length = 0; ///< 数据长度 std::vector data_content; ///< 数据内容 std::string protocol_type; ///< 协议类型 std::string node_id; ///< 采集节点标识 }; /** * @brief 路由表条目,对应数据库路由表结构。 */ struct RouteEntry { int route_id = 0; ///< 路由ID std::string dest_network; ///< 目标网络 std::string netmask; ///< 子网掩码 std::string next_hop; ///< 下一跳地址 std::string out_interface; ///< 出接口 int priority = 0; ///< 路由优先级 std::string route_type; ///< 路由类型 (Static/Dynamic) }; /** * @brief 网络状态信息,用于总线状态监视。 */ struct NetworkStatus { double bus_load = 0.0; ///< 总线负载率 (%) uint64_t total_frames = 0; ///< 总帧数 uint64_t error_frames = 0; ///< 错误帧数 double capture_rate = 0.0; ///< 报文捕获速率 (帧/秒) std::string last_update_time; ///< 最后更新时间 }; /** * @brief 性能测试指标。 */ struct PerformanceMetrics { double avg_latency_us = 0.0; ///< 平均延迟 (微秒) double max_latency_us = 0.0; ///< 最大延迟 (微秒) double min_latency_us = 0.0; ///< 最小延迟 (微秒) double throughput_mbps = 0.0; ///< 吞吐量 (Mbps) double packet_loss_rate = 0.0; ///< 丢包率 (%) uint64_t total_packets = 0; ///< 总报文数 uint64_t lost_packets = 0; ///< 丢失报文数 }; /** * @brief 波形与时序分析结果。 */ struct WaveformAnalysisResult { double signal_frequency_hz = 0.0; ///< 信号频率 (Hz) double signal_amplitude = 0.0; ///< 信号幅度 double rise_time_us = 0.0; ///< 上升时间 (微秒) double fall_time_us = 0.0; ///< 下降时间 (微秒) double duty_cycle = 0.0; ///< 占空比 (%) uint64_t glitch_count = 0; ///< 毛刺计数 std::string analysis_summary; ///< 分析摘要 }; // ============================================================================ // 基础通用通信单元 (SU-COM) — 函数声明 // ============================================================================ /** * @brief 初始化以太网通信接口。 * * @requirement(name="基础通用通讯功能", id="SRS-F-01-001") * 实现以太网通信接口的初始化,支持 TCP/IP 和 UDP 协议,全双工千兆速率。 * * @param ip_address 本机 IP 地址 * @param port 通信端口 * @return true 初始化成功 * @return false 初始化失败 */ bool initEthernetComm(const std::string& ip_address, uint16_t port); /** * @brief 初始化 RS422 通信接口。 * * @requirement(name="基础通用通讯功能", id="SRS-F-01-001") * 实现 RS422 异步串行通信接口的初始化,支持全双工和波特率自适应。 * * @param port_name 串口名称 (如 COM1, /dev/ttyS0) * @param baud_rate 波特率 * @return true 初始化成功 * @return false 初始化失败 */ bool initRS422Comm(const std::string& port_name, uint32_t baud_rate); /** * @brief 初始化 CAN 通信接口。 * * @requirement(name="基础通用通讯功能", id="SRS-F-01-001") * 实现 CAN 总线通信接口的初始化,支持 CAN2.0B/CANFD 协议, * 波特率 5K~1Mbps 可调。 * * @param interface_name 接口名称 (如 can0) * @param baud_rate 波特率 (5K~1Mbps) * @return true 初始化成功 * @return false 初始化失败 */ bool initCANComm(const std::string& interface_name, uint32_t baud_rate); /** * @brief 初始化模拟量采集接口。 * * @requirement(name="基础通用通讯功能", id="SRS-F-01-001") * 实现模拟量信号采集接口的初始化,支持 0~10V 输入范围,12位精度。 * * @param channel 采集通道编号 * @return true 初始化成功 * @return false 初始化失败 */ bool initAnalogComm(uint8_t channel); /** * @brief 初始化离散量 I/O 接口。 * * @requirement(name="基础通用通讯功能", id="SRS-F-01-001") * 实现离散量 TTL 电平信号采集接口的初始化,支持 48 路 I/O。 * * @param io_pin I/O 引脚编号 * @return true 初始化成功 * @return false 初始化失败 */ bool initDigitalComm(uint8_t io_pin); // ============================================================================ // 协议兼容单元 (SU-PROT) — 函数声明 // ============================================================================ /** * @brief 自动识别 CAN 帧采用的协议类型(CAN2.0 或 CAN FD)。 * * @requirement(name="协议兼容功能", id="SRS-F-01-002") * 实现 CAN2.0 与 CANFD 协议的自动识别。 * * @requirement(name="支持协议要求", id="SRS-F-09-007") * 支持 CANFD 和 CAN2.0 协议识别。 * * @param frame_data 原始 CAN 帧数据 * @return CANProtocolType 识别的协议类型 */ CANProtocolType detectCANProtocol(const std::vector& frame_data); /** * @brief 在 CAN2.0 和 CAN FD 帧格式之间进行兼容转换。 * * @requirement(name="协议兼容功能", id="SRS-F-01-002") * 实现 CAN2.0 与 CANFD 协议的切换适配和格式兼容转换, * 确保数据转发一致性。 * * @param source_type 源协议类型 * @param target_type 目标协议类型 * @param frame_data 待转换的帧数据 * @return std::vector 转换后的帧数据 */ std::vector convertCANFrame(CANProtocolType source_type, CANProtocolType target_type, const std::vector& frame_data); // ============================================================================ // 数据存储单元 (SU-STOR) — 函数声明 // ============================================================================ /** * @brief 存储一条总线数据记录到持久化存储。 * * @requirement(name="数据存储功能", id="SRS-F-02-001") * 实现通信数据的持久化存储,按时间顺序组织数据, * 支持自动分段存储和磁盘容量监控。 * * @param record 总线数据记录 * @return true 存储成功 * @return false 存储失败 */ bool storeBusData(const BusDataRecord& record); /** * @brief 启动存储服务,包括磁盘容量监控。 * * @requirement(name="数据存储功能", id="SRS-F-02-001") * 监控磁盘容量,满时触发告警及覆盖最旧数据。 * * @return true 启动成功 * @return false 启动失败 */ bool startStorageService(); /** * @brief 停止存储服务。 * @return true 停止成功 * @return false 停止失败 */ bool stopStorageService(); // ============================================================================ // 数据管理与回放单元 (SU-REPLAY) — 函数声明 // ============================================================================ /** * @brief 根据查询条件检索历史总线数据。 * * @requirement(name="数据管理与数据回放功能", id="SRS-F-02-002") * 提供历史数据的检索功能,支持按总线类型、时间范围等条件查询。 * * @param bus_type 总线类型筛选(空字符串表示全部) * @param start_time 起始时间 * @param end_time 结束时间 * @return std::vector 匹配的记录列表 */ std::vector queryBusData(const std::string& bus_type, const std::string& start_time, const std::string& end_time); /** * @brief 按原始时序和可调速度回放指定总线数据。 * * @requirement(name="数据管理与数据回放功能", id="SRS-F-02-002") * 实现按原始时序、可调速度将存储数据回放。 * * @requirement(name="数据统计回放功能", id="SRS-F-09-005") * 实现数据统计回放,在回放过程中统计各项指标。 * * @param records 待回放的数据记录列表 * @param speed_factor 回放速度倍数 (1.0 表示原始速度) * @param callback 每帧回放时的回调函数 * @return uint64_t 实际回放的帧数 */ uint64_t replayBusData(const std::vector& records, double speed_factor, std::function callback); /** * @brief 删除指定 ID 的历史数据记录。 * * @requirement(name="数据管理与数据回放功能", id="SRS-F-02-002") * 支持历史数据的删除功能。 * * @param record_id 要删除的记录 ID * @return true 删除成功 * @return false 删除失败 */ bool deleteBusData(int64_t record_id); // ============================================================================ // 信号转换单元 (SU-CONV) — 函数声明 // ============================================================================ /** * @brief 将模拟量电压值转换为 CAN 总线帧。 * * @requirement(name="信号转换功能", id="SRS-F-06-001") * 将模拟量信号进行数字化处理,转换为总线信号。 * * @requirement(name="模拟量离散量转总线信号功能", id="SRS-F-06-005") * 实现模拟量向总线信号的转换。 * * @param voltage 模拟量电压值 (0~10V) * @param can_id CAN 目标帧 ID * @return BusDataRecord 转换后的总线数据记录 */ BusDataRecord convertAnalogToBus(double voltage, uint32_t can_id); /** * @brief 将离散量电平值转换为 CAN 总线帧。 * * @requirement(name="信号转换功能", id="SRS-F-06-001") * 将离散量信号进行数字化处理,转换为总线信号。 * * @requirement(name="模拟量离散量转总线信号功能", id="SRS-F-06-005") * 实现离散量向总线信号的转换。 * * @param level 离散量电平 (0 或 5V) * @param can_id CAN 目标帧 ID * @return BusDataRecord 转换后的总线数据记录 */ BusDataRecord convertDigitalToBus(uint8_t level, uint32_t can_id); // ============================================================================ // 总线路由单元 (SU-ROUTE) — 函数声明 // ============================================================================ /** * @brief 执行数据帧的路由转发。 * * @requirement(name="数据转发交换功能", id="SRS-F-07-001") * 实现数据转发交换功能。 * * @requirement(name="路由寻址功能", id="SRS-F-07-002") * 实现路由寻址,根据路由表决定转发路径。 * * @param frame 待转发的数据帧 * @return true 转发成功 * @return false 转发失败 */ bool routeDataFrame(const BusDataRecord& frame); /** * @brief 将以太网数据帧转换为 CAN 总线帧。 * * @requirement(name="以太网-CAN协议转换适配功能", id="SRS-F-07-003") * 实现以太网与 CAN 协议间的转换适配。 * * @param eth_frame 以太网帧数据 * @return BusDataRecord 转换后的 CAN 总线帧 */ BusDataRecord convertEthernetToCAN(const BusDataRecord& eth_frame); /** * @brief 将 CAN 总线帧转换为以太网数据帧。 * * @requirement(name="以太网-CAN协议转换适配功能", id="SRS-F-07-003") * 实现 CAN 到以太网的协议转换。 * * @param can_frame CAN 总线帧 * @return BusDataRecord 转换后的以太网帧 */ BusDataRecord convertCANToEthernet(const BusDataRecord& can_frame); /** * @brief 添加一条静态路由。 * * @requirement(name="路由功能要求", id="SRS-F-07-007") * 支持静态路由配置。 * * @param entry 路由条目 * @return true 添加成功 * @return false 添加失败 */ bool addStaticRoute(const RouteEntry& entry); /** * @brief 添加一条动态路由(模拟 OSPF/RIP 协议行为)。 * * @requirement(name="路由功能要求", id="SRS-F-07-007") * 支持动态路由协议。 * * @param entry 路由条目 * @return true 添加成功 * @return false 添加失败 */ bool addDynamicRoute(const RouteEntry& entry); // ============================================================================ // 总线分析单元 (SU-ANALY) — 函数声明 // ============================================================================ /** * @brief 启动总线实时监听。 * * @requirement(name="总线实时监听功能", id="SRS-F-09-001") * 启动对指定类型总线的实时监听,通过回调传递接收的数据。 * * @param bus_type 要监听的总线类型 * @param callback 接收数据时的回调 * @return true 启动成功 * @return false 启动失败 */ bool startBusMonitoring(BusType bus_type, std::function callback); /** * @brief 停止总线监听。 * @return true 停止成功 * @return false 停止失败 */ bool stopBusMonitoring(); /** * @brief 解析 CAN 帧数据,提取协议字段。 * * @requirement(name="协议解析解码功能", id="SRS-F-09-002") * 实现协议解析解码,支持 CAN2.0 和 CAN FD 协议格式。 * * @param raw_data 原始 CAN 帧数据 * @return BusDataRecord 解析后的数据记录 */ BusDataRecord parseCANFrame(const std::vector& raw_data); /** * @brief 对数据帧进行故障诊断分析。 * * @requirement(name="故障诊断分析功能", id="SRS-F-09-003") * 实现故障诊断分析,检测各类总线错误。 * * @requirement(name="错误帧识别要求", id="SRS-F-09-011") * 识别位错误、CRC 错误等错误帧类型。 * * @param frame 待检查的数据帧 * @return std::string 错误描述,空字符串表示无错误 */ std::string diagnoseBusFault(const BusDataRecord& frame); /** * @brief 检查帧数据是否存在位错误或 CRC 错误。 * * @requirement(name="错误帧识别要求", id="SRS-F-09-011") * 要求识别位错误、CRC 错误等。 * * @param frame_data 帧数据 * @return true 检测到错误 * @return false 无错误 */ bool checkErrorFrame(const std::vector& frame_data); /** * @brief 执行波形与时序分析。 * * @requirement(name="波形与时序分析功能", id="SRS-F-09-004") * 实现波形与时序分析,计算信号频率、幅度、占空比等参数。 * * @param samples 采样数据序列 * @param sample_rate_hz 采样率 (Hz) * @return WaveformAnalysisResult 分析结果 */ WaveformAnalysisResult analyzeWaveform(const std::vector& samples, double sample_rate_hz); /** * @brief 获取当前网络状态信息。 * * @requirement(name="网络状态监视功能", id="SRS-F-09-006") * 实现网络状态监视,刷新率不低于 1Hz。 * * @param bus_type 总线类型 * @return NetworkStatus 当前网络状态 */ NetworkStatus getNetworkStatus(BusType bus_type); // ============================================================================ // 故障注入单元 (SU-FAULT) — 函数声明 // ============================================================================ /** * @brief 向目标总线注入短路故障。 * * @requirement(name="总线短路/断路注入", id="SRS-F-12-001") * 实现总线短路故障注入。 * * @param bus_type 目标总线类型 * @param duration_ms 持续时间 (毫秒) * @return true 注入成功 * @return false 注入失败 */ bool injectShortCircuit(BusType bus_type, uint32_t duration_ms); /** * @brief 向目标总线注入断路故障。 * * @requirement(name="总线短路/断路注入", id="SRS-F-12-001") * 实现总线断路故障注入。 * * @param bus_type 目标总线类型 * @param duration_ms 持续时间 (毫秒) * @return true 注入成功 * @return false 注入失败 */ bool injectOpenCircuit(BusType bus_type, uint32_t duration_ms); /** * @brief 向目标总线注入电磁干扰故障。 * * @requirement(name="电磁干扰注入", id="SRS-F-12-002") * 实现电磁干扰故障注入。 * * @param bus_type 目标总线类型 * @param intensity 干扰强度 (0.0~1.0) * @param duration_ms 持续时间 (毫秒) * @return true 注入成功 * @return false 注入失败 */ bool injectEMI(BusType bus_type, double intensity, uint32_t duration_ms); /** * @brief 向目标总线注入错误帧。 * * @requirement(name="错误帧注入", id="SRS-F-12-003") * 实现错误帧故障注入。 * * @param bus_type 目标总线类型 * @param error_type 错误类型描述 * @return true 注入成功 * @return false 注入失败 */ bool injectErrorFrame(BusType bus_type, const std::string& error_type); /** * @brief 模拟节点离线故障。 * * @requirement(name="节点离线/异常接入", id="SRS-F-12-004") * 实现节点离线故障注入。 * * @param node_id 目标节点标识 * @param duration_ms 持续时间 (毫秒) * @return true 注入成功 * @return false 注入失败 */ bool injectNodeOffline(const std::string& node_id, uint32_t duration_ms); /** * @brief 模拟节点异常接入故障。 * * @requirement(name="节点离线/异常接入", id="SRS-F-12-004") * 实现节点异常接入故障注入。 * * @param node_id 异常节点标识 * @return true 注入成功 * @return false 注入失败 */ bool injectNodeAbnormal(const std::string& node_id); /** * @brief 向目标总线注入波特率异常波动故障。 * * @requirement(name="波特率异常波动注入", id="SRS-F-12-005") * 实现波特率异常波动故障注入。 * * @param bus_type 目标总线类型 * @param abnormal_baud 异常波特率 * @param duration_ms 持续时间 (毫秒) * @return true 注入成功 * @return false 注入失败 */ bool injectBaudRateAnomaly(BusType bus_type, uint32_t abnormal_baud, uint32_t duration_ms); // ============================================================================ // 总线测试分析单元 (SU-TEST) — 函数声明 // ============================================================================ /** * @brief 执行 40m 以内短距离总线的传输性能测试。 * * @requirement(name="40m内总线测试分析功能", id="SRS-F-10-001") * 实现 40m 内总线传输延迟、吞吐量、丢包率等性能测试。 * * @param bus_type 总线类型 * @param test_duration_sec 测试持续时间 (秒) * @return PerformanceMetrics 测试结果指标 */ PerformanceMetrics testShortBusPerformance(BusType bus_type, uint32_t test_duration_sec); /** * @brief 执行 40m 以上(含中继)总线的传输性能测试。 * * @requirement(name="40m以上总线测试分析功能", id="SRS-F-10-002") * 实现 40m 以上含中继总线的测试分析。 * * @param bus_type 总线类型 * @param test_duration_sec 测试持续时间 (秒) * @return PerformanceMetrics 测试结果指标 */ PerformanceMetrics testLongBusPerformance(BusType bus_type, uint32_t test_duration_sec); /** * @brief 执行长时间满负荷稳定性测试(≥24小时)。 * * @requirement(name="长时间满负荷测试分析功能", id="SRS-F-10-003") * 实现长时间满负荷运行、重复启停等测试分析。 * * @param bus_type 总线类型 * @param duration_hours 测试持续时间 (小时) * @return PerformanceMetrics 测试结果指标 */ PerformanceMetrics testLongDurationStability(BusType bus_type, uint32_t duration_hours); // ============================================================================ // 辅助函数 // ============================================================================ /** * @brief 获取软件版本号。 * @return std::string 版本号字符串 */ std::string getVersion(); /** * @brief 打印命令行帮助信息。 */ void printHelp(); } // namespace bntvs #endif // BNTVS_SW_APP_HPP