Robomaster电控入门实战:基于大疆C板与CAN总线实现GM6020电机的精准角度控制
1. 从零开始硬件连接与基础认知大家好我是老张在RoboMaster电控这块摸爬滚打也有些年头了。今天想和大家聊聊一个非常具体、也非常核心的实战任务如何用大疆的C型开发板通过CAN总线让GM6020电机精准地转到你指定的角度。这几乎是每个RM电控新手都会遇到的第一个“硬骨头”也是云台控制、底盘跟随等高级功能的基础。别担心我会把整个过程掰开揉碎了讲从硬件怎么连到代码怎么写再到PID怎么调保证你跟着做一遍就能让电机听话。咱们先把手头的东西认清楚。大疆C型开发板也就是大家常说的C板是RoboMaster官方为参赛队设计的核心控制器。它基于STM32F4系列芯片性能强劲外设丰富最关键的是它原生支持CAN总线这是我们和电机对话的“高速公路”。很多新手拿到板子就急着写代码结果发现电机没反应第一步就卡住了。我建议你做的第一件事不是打开电脑而是去RoboMaster官网找到《C型开发板用户手册》把它下载下来。这份手册是你的“地图”上面详细标注了每一个引脚是干什么的比如CAN接口对应哪个引脚、LED灯怎么接、串口在哪里。我见过太多同学因为引脚接错或者配置不对调试了大半天最后发现是手册里早就写明的基础问题。接下来是今天的主角——GM6020电机。这款电机在RM圈子里大名鼎鼎因为它自带高精度编码器输出扭矩大响应快是驱动云台旋转航向轴和上下摆动俯仰轴的理想选择。它和普通直流电机最大的不同在于通信方式它通过CAN总线接收指令和反馈数据。这意味着你不能简单地给个PWM信号就让它转你需要和它“通信”。同样GM6020的说明书也务必从官网下载。里面有两个信息至关重要一是电机的ID设置二是它的通信协议。电机底部有三个小小的拨码开关分别对应bit0, bit2, bit3注意这里跳过了bit1。通过拨动它们你可以设置电机的CAN ID。ID决定了在CAN总线上哪个指令是发给它的它又该用哪个ID回复数据。比如你把开关拨成001二进制对应的ID可能就是0x201十六进制。这个ID会在我们后续的代码里反复出现是主控和电机相互识别的“身份证号”一定不能搞错。硬件连接其实很简单。你需要准备两根线CAN_H和CAN_L。将C板上标有CAN1的接口通常是PD0和PD1具体一定要查你的C板手册与GM6020电机的CAN接口对应连接起来CAN_H接CAN_HCAN_L接CAN_L。最后别忘了给C板和电机都供上合适的电源。连接好后一个最简单的CAN通信硬件系统就搭建好了。你可以先给电机上电听听它有没有发出一声轻微的“嘀”自检声这是电机正常的启动提示音。2. 搭建通信桥梁CubeMX配置与CAN总线初探硬件连好了相当于修好了路。接下来我们要让C板学会在“路”上开车也就是配置CAN通信。这里我们使用STM32CubeMX这个图形化工具它能极大简化初始化工作。但工具好用不代表可以无脑点有几个坑我当年都踩过咱们一一避开。打开CubeMX选择你的C板对应型号。第一步是配置时钟树。在“Pinout Configuration”标签页找到“RCC”选项将高速外部时钟HSE和低速外部时钟LSE都设置为“Crystal/Ceramic Resonator”。然后转到“Clock Configuration”标签页把系统时钟SYSCLK设置到最大168MHz有的板子支持180MHz。CAN总线的时钟来源于APB1总线这里系统会自动分频我们最终需要确保APB1的时钟是42MHz这是后面计算CAN波特率的基础。时钟是单片机的“心跳”配错了后续一切都不准。第二步在“System Core”里找到“Debug”把它设置为“Serial Wire”。这个设置不影响功能但能让你后续用ST-Link等调试器进行在线调试和程序下载非常重要。第三步也是最核心的一步配置CAN外设。在“Connectivity”下拉菜单里找到“CAN1”。点击它将“Mode”设置为“Normal”。这时CubeMX可能会自动分配CAN的收发引脚比如PA11和PA12。但是这里就是第一个大坑。大疆C板的CAN1接口可能并不是用的这组默认引脚。以我手头的C板为例它的CAN1_Tx是PD1CAN1_Rx是PD0。你必须根据自己C板的用户手册在右侧的芯片引脚图上找到PD0和PD1分别点击它们将其功能手动设置为“CAN1_RX”和“CAN1_TX”。如果这一步不做你的代码永远发不出数据。引脚配对了我们再来配置CAN总线的“车速”——波特率。点击“Parameter Settings”标签我们需要关注这几个参数Prescaler (分频系数) 这是设置波特率的关键。计算公式是CAN波特率 APB1时钟 / Prescaler / (Time Segment 1 Time Segment 2 1)。Time Segment 1 (BS1) 同步段之后的时段。Time Segment 2 (BS2) 采样点之前的时段。为了让通信稳定可靠我们通常将波特率设置为1Mbps即1,000,000 bit/s。已知APB1时钟为42MHz我们可以这样计算设置Prescaler为7BS1为2BS2为3。那么波特率 42,000,000 / 7 / (123) 1,000,000 Hz。这个配置在RM赛场上经过大量验证兼容性和稳定性都很好。最后千万别忘了打开CAN的中断。在“NVIC Settings”标签页找到“CAN1 RX0 interrupts”并勾选启用。这样当CAN总线收到数据时单片机才能及时响应处理。至此CubeMX的配置就完成了点击“Generate Code”生成工程代码。生成的代码会帮你完成CAN外设的底层初始化但我们和GM6020对话的具体规则还得自己来写。3. 编写对话协议CAN收发与数据解析CubeMX生成了骨架现在我们要赋予它灵魂——编写CAN的收发函数并理解GM6020的“语言”。CAN通信是一种广播式的总线所有设备都挂在这条线上靠ID来区分消息是发给谁的。所以我们的代码要干两件事一是用特定的ID给电机发送指令比如转快点二是监听特定ID接收电机回传的数据比如我现在转到哪了。首先我们创建一个头文件bsp_can.h定义一个结构体来存放电机信息。这个结构体的成员完全对应GM6020回传的数据帧格式。#ifndef __BSP_CAN_H_ #define __BSP_CAN_H_ #include main.h #include can.h typedef struct { uint16_t can_id; // 电机ID用于识别 int16_t set_voltage; // 设定的电压值发送用 uint16_t rotor_angle; // 转子机械角度0-8191 int16_t rotor_speed; // 转速RPM int16_t torque_current;// 转矩电流 uint8_t temp; // 温度 } moto_info_t; void can_filter_init(void); void set_motor_voltage(CAN_HandleTypeDef* hcan, uint16_t id, int16_t v1); #endif重点是bsp_can.c的实现。我们先看发送函数set_motor_voltage。GM6020的指令帧格式是固定的标准数据帧ID为0x1FF 电机ID。比如电机ID为1那么指令ID就是0x200。数据域有8个字节其中前两个字节DATA[0], DATA[1]组合成一个16位有符号整数代表要施加的电压值范围通常是-30000到30000对应最大反转和正转扭矩。void set_motor_voltage(CAN_HandleTypeDef* hcan, uint16_t id, int16_t v1) { CAN_TxHeaderTypeDef tx_header; uint8_t tx_data[8] {0}; // 构建帧头标准ID数据帧数据长度8字节 tx_header.StdId 0x1ff id; // 计算目标电机的指令ID tx_header.IDE CAN_ID_STD; tx_header.RTR CAN_RTR_DATA; tx_header.DLC 8; // 将电压值填入数据域 tx_data[0] (v1 8) 0xff; // 高字节 tx_data[1] v1 0xff; // 低字节 // 其余6个字节通常填0根据协议也可用于控制其他模式 // 调用HAL库函数发送 HAL_CAN_AddTxMessage(hcan, tx_header, tx_data, (uint32_t*)CAN_TX_MAILBOX0); }然后是接收与解析。我们通过中断来接收数据这样不会阻塞主程序。首先需要一个筛选器初始化函数can_filter_init。很多新手对CAN筛选器感到头疼其实你可以把它理解成邮箱的过滤规则。我们这里设置一个“全通”的筛选器即不过滤任何ID把所有消息都收下来然后在中断回调函数里再根据ID进行判断。虽然看起来“没什么用”但STM32的CAN模块要求必须至少配置一个筛选器才能开始工作所以这一步是必不可少的“规定动作”。真正的数据处理发生在中断回调函数HAL_CAN_RxFifo0MsgPendingCallback里。当CAN总线收到数据并触发中断时程序就会跳到这里。我们首先从硬件FIFO中取出帧头和8字节数据然后检查帧头里的标准IDStdId。GM6020反馈数据的ID格式是0x200 电机ID。例如ID为1的电机其反馈ID是0x201。void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan) { CAN_RxHeaderTypeDef rx_header; uint8_t rx_data[8]; if(hcan-Instance CAN1) { HAL_CAN_GetRxMessage(hcan, CAN_RX_FIFO0, rx_header, rx_data); switch(rx_header.StdId) { case 0x201: // 假设电机ID为1 { // 解析数据注意字节序通常是高字节在前 motor_info.rotor_angle (rx_data[0] 8) | rx_data[1]; motor_info.rotor_speed (rx_data[2] 8) | rx_data[3]; motor_info.torque_current (rx_data[4] 8) | rx_data[5]; motor_info.temp rx_data[6]; break; } // 可以添加更多case来处理总线上其他电机 } } }这里解析出的rotor_angle是电机的原始编码器值范围是0到8191。它代表电机转子相对于一个电气周期的位置并不是我们直观的360度角度。我们需要在后续的PID控制中将它转换为我们需要的角度单位。4. 核心控制逻辑双环PID算法详解通信建立后电机已经能报告自己的位置和转速也能接收我们的电压指令了。但怎么让它精准地停在我们想要的角度呢这就需要引入自动控制领域的经典算法——PID而且是双环PID。为什么需要双环你可以想象一下用手去转动一个沉重的转盘。你的眼睛角度环先判断当前指针位置和目标位置差多远这个差距决定了你心里想让它转多快目标速度。然后你的手臂速度环再根据这个“想转的速度”和“实际转的速度”的差距来决定使出多大的力气输出扭矩/电压。双环结构外环角度内环速度比单环控制更平稳抗干扰能力也更强。我们先在pid.h里定义PID结构体把算法需要的参数和状态变量都打包在一起。typedef struct _pid_struct_t { float kp, ki, kd; // 比例、积分、微分系数 float i_max, out_max; // 积分限幅、输出限幅 float ref; // 目标值Target float fdb; // 反馈值Feedback float err[2]; // 当前误差和上次误差 float p_out, i_out, d_out; // 各环节输出 float output; // PID总输出 } pid_struct_t;关键的运算在pid_calc函数中。这就是PID控制律的离散化实现。比例项P直接放大当前误差反应最快积分项I累积历史误差用来消除静态误差比如电机有摩擦光靠P可能永远差一点微分项D根据误差变化率进行预测抑制超调和振荡。对于GM6020的角度控制初期调试可以先只使用P比例控制把I和D设为0这样系统最简单也最容易理解。float pid_calc(pid_struct_t *pid, float ref, float fdb) { pid-ref ref; pid-fdb fdb; // 计算当前误差并保存上一次误差 pid-err[1] pid-err[0]; pid-err[0] pid-ref - pid-fdb; // P项 Kp * 当前误差 pid-p_out pid-kp * pid-err[0]; // I项 Ki * 累计误差注意累加 pid-i_out pid-ki * pid-err[0]; // 对积分项进行限幅防止积分饱和Windup if(pid-i_out pid-i_max) pid-i_out pid-i_max; if(pid-i_out -pid-i_max) pid-i_out -pid-i_max; // D项 Kd * (当前误差 - 上次误差)即误差的变化率 pid-d_out pid-kd * (pid-err[0] - pid-err[1]); // 总和输出并限幅 pid-output pid-p_out pid-i_out pid-d_out; if(pid-output pid-out_max) pid-output pid-out_max; if(pid-output -pid-out_max) pid-output -pid-out_max; return pid-output; }对于双环PID我们需要初始化两个PID结构体一个角度环一个速度环。角度环的输入是目标角度和当前角度输出是目标速度。速度环的输入是目标速度和当前速度从电机反馈获得输出是最终要发送给电机的电压值。在main函数的循环中这个流程是这样的先读取电机编码器值并转换成角度送给角度环PID计算得到一个目标速度再把这个目标速度和电机反馈的实际速度送给速度环PID计算得到控制电压最后调用CAN发送函数将这个电压值发给电机。如此循环往复就形成了一个完整的闭环控制。5. 实战调试让电机精准转起来理论准备就绪现在进入最激动人心也最考验耐心的环节——调试。我们首先在main.c里把整个逻辑串起来。一个关键步骤是将电机返回的原始编码器值0-8191转换成我们熟悉的角度值比如-π到π弧度。这里需要一个映射函数。double map(double x, double in_min, double in_max, double out_min, double out_max) { return (x - in_min) * (out_max - out_min) / (in_max - in_min) out_min; } int main(void) { // 系统初始化CubeMX生成 HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_CAN1_Init(); // ... 其他外设初始化 can_filter_init(); // 初始化CAN筛选器和中断 gimbal_PID_init(); // 初始化双环PID参数 float target_angle 1.57f; // 目标角度π/2 弧度即90度 float current_angle 0.0f; float target_speed 0.0f; int16_t output_voltage 0; while (1) { // 1. 获取当前角度将编码器值映射为弧度 current_angle map(motor_info.rotor_angle, 0, 8191, -PI, PI); // 2. 角度环PID计算输入目标角度和当前角度输出目标速度 target_speed pid_calc(angle_pid, target_angle, current_angle); // 3. 速度环PID计算输入目标速度和当前速度输出控制电压 output_voltage (int16_t)pid_calc(speed_pid, target_speed, motor_info.rotor_speed); // 4. 将电压指令发送给电机 set_motor_voltage(hcan1, 1, output_voltage); // 假设控制ID为1的电机 // 5. 延时控制循环周期例如1ms或2ms一次 HAL_Delay(2); } }现在烧录程序给电机上电。如果一切连接和配置正确电机可能会“嗡”地一声锁死这是无刷电机的正常现象它正在努力维持当前位置。接下来就是调参了。我的建议是分步调试循序渐进开环测试先把两个PID环的kp, ki, kd全部设为0。然后在主循环里直接给电机发送一个固定的、较小的电压值比如3000。观察电机是否匀速转动。这一步是验证通信链路是否完全畅通。速度环调试设置一个目标速度比如100 RPM将速度环的kp从一个很小的值比如1.0开始尝试。给角度环一个固定的目标角度但暂时只让速度环工作。观察电机转速是否能稳定在目标值附近。逐渐增大kp直到电机能较快响应且不剧烈震荡。如果出现稳态误差始终达不到目标速度可以引入一个很小的ki比如0.1。微分项kd在速度环初期可以不加。角度环调试速度环调稳后再启用角度环。角度环的kp值通常需要比较大因为它是将角度误差弧度转换成速度指令RPM。可以从一个中等值开始比如50。设定一个目标角度观察电机能否转过去并停稳。如果电机在目标点来回振荡“点头”说明kp太大需要减小。如果电机转动缓慢像“爬”过去一样说明kp太小需要增大。如果停下来后始终和目標差一个固定的角度可以考虑加入角度环的积分项ki来消除这个静差。调试过程中善用C板上的LED灯和串口打印。比如可以在主循环里将当前角度、目标速度、输出电压等关键变量通过串口发送到电脑用串口助手或绘图工具查看曲线这比单纯观察电机转动直观得多。记住PID调试没有一步到位的“黄金参数”不同的负载、不同的机械结构最佳参数都不一样。耐心观察现象理解每个参数改变带来的影响这个过程本身就是对自动控制原理最深刻的学习。6. 避坑指南与进阶思考走完整个流程你应该已经能让GM6020相对稳定地指向特定角度了。但要想在机器人上真正可靠地使用还有一些坑需要注意也有一些可以优化的方向。第一个常见的坑是“编码器零点”。GM6020的编码器是增量式的但上电后读到的0位置是一个随机值。我们映射到的“-π到π”弧度是相对于这个随机零点的。如果你需要电机每次上电都回到同一个绝对物理位置比如云台的归中就需要一个校准过程。通常的做法是让电机向一个方向缓慢转动直到碰到一个物理限位开关或通过电流检测判断堵转将这个位置记录为“机械零点”。之后所有的角度指令都基于这个零点进行计算。第二个是“输出限幅”的重要性。在PID初始化时我们给i_max和out_max设置了值。out_max直接限制了发送给电机的最大电压必须设置否则在剧烈误差下可能输出过大电压损坏电机或机械结构。i_max是积分限幅它能有效防止“积分饱和”。想象一下如果电机因为被卡住而产生巨大误差积分项会不断累加到非常大即使误差消除了这个巨大的积分值也需要很长时间才能“消化”掉导致控制反应迟钝这就是积分饱和。限幅可以避免这种情况。第三个是关于控制周期。我在主循环里用了HAL_Delay(2)这大概是一个2ms的控制周期。对于云台这样需要快速响应的机构这个周期可能还是太慢了。更优的做法是使用定时器中断来触发整个控制循环确保周期严格固定。不稳定的周期会严重影响PID效果尤其是微分项。在实现基础功能后你可以考虑进阶优化。比如加入前馈控制。如果云台需要快速跟踪一个移动目标你可以根据目标运动的速度和加速度提前计算出一个额外的电压值加到输出上这能极大提高系统的跟踪性能减少滞后。再比如对PID的输出进行低通滤波可以平滑指令让电机运动更柔和减少机械冲击。最后别忘了安全保护。在代码里加入对电机温度motor_info.temp的监控如果温度过高应逐步降低输出功率甚至停止控制。同时监控转矩电流torque_current如果持续异常偏高可能意味着机械卡死需要触发保护机制。

相关新闻

毕业设计电子信息工程选题指南:从系统架构到嵌入式实现的深度解析

毕业设计电子信息工程选题指南:从系统架构到嵌入式实现的深度解析

在电子信息工程专业的毕业设计过程中,许多同学常常感到迷茫:选题要么过于宏大难以落地,要么过于简单缺乏深度;技术栈东拼西凑,软硬件之间“各自为政”,调试过程更是充满挑战。本文旨在提供一个清晰的工程化…

2026/5/17 12:49:06 阅读更多 →
FRCRN语音处理实战:为语音伪造检测系统提供高质量训练负样本

FRCRN语音处理实战:为语音伪造检测系统提供高质量训练负样本

FRCRN语音处理实战:为语音伪造检测系统提供高质量训练负样本 1. 引言:当语音降噪遇上AI安全 想象一下,你正在开发一个语音伪造检测系统,它的核心任务是像一位经验丰富的侦探,从一段音频中分辨出哪些是真人说话&#…

2026/5/17 2:26:38 阅读更多 →
C 语言文件操作:读写 Lingbot 模型生成的原始深度数据

C 语言文件操作:读写 Lingbot 模型生成的原始深度数据

C 语言文件操作:读写 Lingbot 模型生成的原始深度数据 你是不是刚用 Lingbot-Depth-Pretrain-ViTL-14 这类模型跑出了一堆深度数据,看着那一串串浮点数,有点无从下手?这些数据可能是 .bin 或者 .raw 格式的,里面藏着模…

2026/7/5 19:11:46 阅读更多 →

最新新闻

开源小模型如何重构AI商业逻辑:7B参数的确定性价值

开源小模型如何重构AI商业逻辑:7B参数的确定性价值

1. 一家没做消费级产品的AI公司,凭什么拿到6.4亿美元? 你可能刚刷到这条新闻:“估值64亿美元!Mistral AI官宣6.4亿美元B轮融资”——第一反应是:又一家大模型创业公司爆了?但稍一查就会发现,它既…

2026/7/5 23:17:02 阅读更多 →
CATANet:基于内容感知Token聚合的图像超分辨率技术解析

CATANet:基于内容感知Token聚合的图像超分辨率技术解析

1. 从传统超分辨率到CATANet的技术演进图像超分辨率(Super-Resolution, SR)技术在过去十年经历了三次重大技术迭代。最早期的SRCNN开创了深度学习在超分辨率领域的应用,采用简单的三层卷积网络结构。2017年EDSR和RCAN引入残差学习和通道注意力…

2026/7/5 23:17:02 阅读更多 →
Linux命令-reject(拒绝打印任务)

Linux命令-reject(拒绝打印任务)

Linux命令-reject(拒绝打印任务)命令语法常用选项场景化实例1. 拒绝指定打印机2. 带原因说明拒绝3. 批量拒绝多个打印机4. 打印机故障自动处理5. 恢复打印机接受任务6. 通过 CUPS Web 接口管理7. 配合系统监控脚本查询打印队列状态最佳实践快速参考&…

2026/7/5 23:15:02 阅读更多 →
羽毛球姿态评估系统设计:基于OpenPose与局部余弦相似度的6方案对比

羽毛球姿态评估系统设计:基于OpenPose与局部余弦相似度的6方案对比

羽毛球姿态评估系统设计:基于OpenPose与局部余弦相似度的6方案对比 羽毛球运动作为一项对动作规范性要求极高的竞技项目,其姿态评估技术正成为计算机视觉领域的热点研究方向。本文将深入剖析基于OpenPose框架的六种姿态评估方案,重点解析局部…

2026/7/5 23:13:01 阅读更多 →
OneNote到Markdown迁移:3步实现95%格式保留的专业方案

OneNote到Markdown迁移:3步实现95%格式保留的专业方案

OneNote到Markdown迁移:3步实现95%格式保留的专业方案 【免费下载链接】onenote-md-exporter ConsoleApp to export OneNote notebooks to Markdown formats 项目地址: https://gitcode.com/gh_mirrors/on/onenote-md-exporter 你是否正在寻找一种可靠的方法…

2026/7/5 23:13:01 阅读更多 →
Claude-Opus-4.7生产级API实测:性能、精度与成本的硬核验证

Claude-Opus-4.7生产级API实测:性能、精度与成本的硬核验证

1. 这不是一次“升级通知”,而是一次真实世界的压力测试我花了106美元,不是买会员、不是充订阅,而是真金白银在Anthropic官方API控制台里,用生产级调用量反复调用Claude-Opus-4.7的API接口,连续跑了72小时,…

2026/7/5 23:11:01 阅读更多 →

日新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

月新闻