ESP32多模块项目整合实战:从零开始融合官方Demo
1. 从“单兵作战”到“集团军”为什么我们需要融合Demo如果你玩过ESP32肯定对乐鑫官方那一大堆例程又爱又恨。爱的是每个例程都像一个封装好的“功能零件”点亮个LED、连个Wi-Fi、用个蓝牙照着跑一遍基本都能成。恨的是当你雄心勃勃地想做个智能家居网关需要同时搞定Wi-Fi连接、MQTT通信、蓝牙配网和文件系统时你会发现每个Demo都是独立的“王国”它们各自为政互相不认识。这时候新手最容易掉进的坑就是新建一个项目然后试图把A例程的main.c整个复制过来再把B例程的main.c也塞进去。结果就是编译报错满天飞各种“重复定义”、“未定义的引用”让你头皮发麻。我刚开始就这么干过折腾了一下午最后气得差点把键盘扔了。其实问题不在于代码本身而在于我们没理解官方Demo的“组织架构”。你可以把每个官方Demo想象成一个精心装修的“样板间”。样板间里家具齐全功能代码水电线路都预埋好了Kconfig配置你直接住进去很舒服。但现在你想自己盖个“大别墅”需要把多个样板间里的精华——比如这个的客厅、那个的厨房、另一个的智能家居系统——都整合到一起。你不能简单地把几个样板间摞起来你得重新画建筑图纸项目结构统一水电标准Kconfig然后把喜欢的家具搬过来重新摆放代码模块。所以融合Demo的核心不是“复制粘贴”而是“模块化移植与重构”。这个过程会逼着你去理解三个关键东西Kconfig配置系统、项目的代码骨架以及如何解决宏定义和函数名的冲突。搞定了这些你就能从“例程学习者”进阶为“项目架构者”真正把ESP32强大的多功能特性玩转起来。接下来我就带你一步步拆解这个融合过程咱们不用那些玄乎的理论就聊实实在在的踩坑经验和操作步骤。2. 理解基石解剖一个官方Demo的“五脏六腑”在动手“拆解”和“组装”之前我们必须先搞清楚一个标准的ESP-IDF项目也就是一个官方Demo到底由哪些关键部分组成。知其然更要知其所以然这样移植时才不会盲目。打开任意一个官方例程比如examples/get-started/blink你会发现除了我们熟悉的main文件夹根目录下还有一堆文件。对新手来说最容易懵的就是这几个CMakeLists.txt这是项目的“总建造师”。它告诉CMake构建系统这个项目由哪些组件components构成源代码文件在哪里依赖关系是什么。当你执行idf.py build时CMake就是照着这个文件的指示去干活儿的。Kconfig.projbuild这是项目的“自定义配置中心”。我们运行idf.py menuconfig后看到的那些图形化配置选项绝大部分就是由这个文件定义的。它决定了哪些功能可以被开启或关闭以及相关的参数设置。这是多项目融合时最需要重点处理的地方sdkconfig这是你的“个性化配置快照”。每次通过menuconfig修改并保存后生成的具体配置值就存储在这个文件里。它是一堆CONFIG_XXXy或CONFIG_XXXn的集合。你可以直接编辑它但不推荐因为下次menuconfig可能会覆盖你的手动修改。main/CMakeLists.txt这是主组件的“建造分册”。它指明main组件包含哪些.c源文件需要链接哪些库。main/main.c这是程序的“心脏”包含app_main()入口函数。那么当我们想把A项目的Wi-Fi功能和B项目的以太网功能合并时本质上是在做什么呢我们是在创建一个新的“总建造师”根目录CMakeLists.txt合并两个“自定义配置中心”Kconfig.projbuild然后把两个“心脏”里的业务逻辑抽出来整合到一个新的“心脏”里同时确保它们需要的“器官”组件库都备齐了。听起来复杂但一步步来其实很有条理。我们先从最基础的“配置融合”开始这是保证后续代码能正确编译的前提。3. 第一步配置系统的融合Kconfig的智慧很多新手包括曾经的我一上来就猛攻代码结果在idf.py menuconfig里找不到需要的配置项或者编译时提示CONFIG_XXX未定义一下子就卡住了。所以融合的第一步必须是搞定配置系统。3.1 Kconfig.projbuild配置的源头记住一个黄金法则所有在menuconfig里出现的、非ESP-IDF内置的、项目特有的配置选项都定义在Kconfig.projbuild里。你想从另一个Demo里移植某个功能首先就要找到它的这个文件。具体怎么做呢假设我们有一个“Wi-Fi Station”例程和一个“Ethernet”例程现在要创建新项目eth_wifi_bridge。创建新项目先用idf.py create-project eth_wifi_bridge创建一个空项目或者直接复制一个简单例程如blink作为起点。打开并对比用文本编辑器分别打开Wi-Fi例程和以太网例程的Kconfig.projbuild。你会发现它们的结构类似都像下面这样menu Example Configuration config EXAMPLE_WIFI_SSID string WiFi SSID default myssid help SSID (network name) for the example to connect to. config EXAMPLE_WIFI_PASSWORD string WiFi Password default mypassword help WiFi password (WPA or WPA2) for the example to use. # ... 其他Wi-Fi相关配置 endmenu以太网的例程里也会有类似EXAMPLE_ETH_PHY_TYPE、EXAMPLE_ETH_MDC_GPIO这样的配置项同样包裹在menu Example Configuration里面。合并操作现在打开你新项目eth_wifi_bridge的Kconfig.projbuild。我们的任务是把两个例程的配置项都搬过来。关键技巧只复制menu和endmenu之间的内容也就是说找到Wi-Fi例程里从config EXAMPLE_WIFI_SSID开始到下一个config之前的所有行复制。然后找到以太网例程的配置部分也复制。粘贴把它们都粘贴到你新项目的menu Example Configuration内部。一个文件里只能有一个menu Example Configuration所以千万别把整个menu...endmenu块都复制过来那样会导致结构错误。处理冲突如果两个例程碰巧定义了同名的CONFIG_变量比如都叫EXAMPLE_CONNECT_IPV6你需要判断保留哪一个或者给其中一个改名以避免冲突。通常直接保留一个即可。完成后的Kconfig.projbuild应该包含了来自两个源项目的所有配置项它们现在都属于你新项目的“Example Configuration”菜单下了。3.2 验证配置让menuconfig“看见”你的选项修改保存Kconfig.projbuild后进入你的新项目目录运行idf.py menuconfig。依次进入Example Configuration菜单你应该能看到刚才合并进来的所有Wi-Fi和以太网的配置项了。如果没看到请检查是否保存了文件。是否把配置项正确粘贴在了menu...endmenu内部。可以尝试先运行idf.py fullclean清除旧配置再运行idf.py menuconfig。在这里你可以为新项目设置新的默认SSID、密码、PHY类型、GPIO引脚等。这些设置最终会生成sdkconfig文件并转化为一系列CONFIG_XXX宏在代码中被引用。4. 第二步代码结构的重组与移植配置通了接下来就是重头戏——搬代码。这里的目标不是制造一个臃肿的main.c而是构建一个清晰、可维护的项目结构。4.1 创建清晰的模块目录我强烈建议你不要把所有代码都堆在main文件夹里。好的习惯是按功能模块创建子目录。在你的新项目根目录下可以这样组织eth_wifi_bridge/ ├── main/ │ ├── CMakeLists.txt │ ├── app_main.c # 主程序入口负责初始化和任务调度 │ └── ... ├── components/ # 可选如果你有高度复用的自定义组件 │ └── my_component/ ├── modules/ # 我推荐的存放功能模块的目录 │ ├── wifi_station/ │ │ ├── wifi_station.c │ │ ├── wifi_station.h │ │ └── CMakeLists.txt │ ├── ethernet/ │ │ ├── ethernet.c │ │ ├── ethernet.h │ │ └── CMakeLists.txt │ └── network_manager/ # 一个管理网络切换的高级模块 │ └── ... └── CMakeLists.txt在项目根目录的CMakeLists.txt中通过add_subdirectory()指令将modules目录下的各个模块加入构建。在每个模块自己的CMakeLists.txt里则用idf_component_register来注册该模块的源文件和头文件路径。4.2 移植核心功能代码现在开始从官方Demo里“搬家具”。以移植Wi-Fi Station功能为例找到源头打开官方wifi/getting_started/station例程的main文件夹。抽取核心文件通常你会找到一个像station_example_main.c这样的文件里面包含了wifi_init_sta()等关键函数。不要复制整个main.c我们只需要功能函数。创建模块文件在你的modules/wifi_station/wifi_station.c中将station_example_main.c里的wifi_init_sta()、event_handler()等函数复制过来。同时把相关的静态全局变量如s_retry_num也搬过来但最好加上模块名前缀比如改成g_wifi_station_retry_num以减少命名冲突风险。创建头文件在wifi_station.h中声明你希望对外暴露的接口例如// wifi_station.h #ifndef __WIFI_STATION_H__ #define __WIFI_STATION_H__ #include esp_wifi.h // 初始化Wi-Fi Station esp_err_t wifi_station_init(void); // 获取当前连接状态 wifi_ap_record_t* wifi_station_get_ap_info(void); // 外部可以注册自定义事件回调 void wifi_station_register_callback(esp_event_handler_t event_handler); #endif注意头文件里要包含必要的ESP-IDF头文件如esp_wifi.h但不要包含esp_log.h然后在头文件里定义TAG。TAG应该在.c文件里定义。修改函数将复制过来的函数进行“封装化”改造。移除原Demo中app_main()里的初始化逻辑将其包装成wifi_station_init()函数。这个函数内部会调用esp_wifi_init(),esp_wifi_set_mode(),esp_wifi_start()等并设置默认配置可以从sdkconfig中读取CONFIG_EXAMPLE_WIFI_SSID等。处理事件循环这是难点之一。多个网络模块Wi-Fi、以太网都会向默认的事件循环ESP_EVENT_ANY_ID发送事件。为了避免事件处理混乱你有两个选择方案A推荐给简单项目在你的app_main.c里创建一个统一的事件处理器根据事件基event_base来分发事件给对应的模块处理函数。方案B更清晰为Wi-Fi模块和以太网模块分别创建独立的事件循环。在各自的初始化函数里调用esp_event_loop_create()创建一个新的事件循环然后将模块的事件处理器注册到这个专属循环上。这样可以实现完全的解耦。对以太网模块重复上述2-6步创建ethernet.c/.h。4.3 解决宏定义与函数冲突在合并过程中编译器报“重复定义”错误是家常便饭。主要来自两方面宏定义冲突两个Demo可能在各自的main.c或头文件里定义了相同的宏比如#define TAG “example”。解决方法很简单检查并重命名。把你新模块文件里的TAG改成WIFI_STATION_TAG、ETH_TAG。对于其他功能宏也加上模块前缀。全局变量/函数冲突如果两个Demo都定义了一个同名的全局函数虽然概率小或者你复制代码时不小心把函数定义粘贴了两次就会导致冲突。解决方法使用static关键字将只在本模块内使用的函数和变量隐藏起来。对于需要跨模块调用的函数确保其声明在头文件中并且在整个项目中只有一处定义。善用编译器的“查找所有引用”功能定位冲突的具体位置。一个实用的技巧是在移植完一个模块后先单独编译一下项目确保这个模块自身没有语法错误并且能通过idf.py menuconfig正确配置。然后再移植下一个模块这样可以隔离问题方便排查。5. 第三步构建系统与依赖管理代码搬好了怎么告诉构建系统“把它们都编译进去”呢这就轮到各个CMakeLists.txt文件上场了。5.1 模块级CMakeLists.txt在每个功能模块目录下如modules/wifi_station/创建一个CMakeLists.txtidf_component_register(SRC_DIRS “.” INCLUDE_DIRS “.” REQUIRES esp_wifi PRIV_REQUIRES )SRC_DIRS “.”表示当前目录下的.c文件是源文件。INCLUDE_DIRS “.”表示当前目录是头文件搜索路径。REQUIRES esp_wifi声明本模块公开依赖esp_wifi组件。这意味着任何依赖本模块的其他模块也会自动获得esp_wifi。PRIV_REQUIRES声明私有依赖。如果本模块内部用了esp_netif但不想暴露给其他模块就放在这里。5.2 主组件CMakeLists.txt在main/CMakeLists.txt中你需要注册主程序的源文件并声明它依赖我们刚才创建的各个功能模块idf_component_register(SRC_DIRS “.” INCLUDE_DIRS “.” REQUIRES wifi_station ethernet)这里REQUIRES wifi_station ethernet就告诉构建系统主组件需要wifi_station和ethernet这两个组件。构建系统会自动去modules目录下查找它们。5.3 项目根目录CMakeLists.txt这是项目的总入口。你需要通过add_subdirectory将模块目录纳入管理范围cmake_minimum_required(VERSION 3.16) include($ENV{IDF_PATH}/tools/cmake/project.cmake) project(eth_wifi_bridge) # 将 modules 目录下的所有子目录作为组件添加 add_subdirectory(modules/wifi_station) add_subdirectory(modules/ethernet) # 如果有更多模块继续添加 # 主组件 main 默认会被包含5.4 处理组件依赖循环有时候wifi_station模块需要调用network_manager模块的某个函数而network_manager又需要知道wifi_station的状态这就形成了依赖循环。CMake会报错。解决方法是进行依赖重构将公共的数据结构、枚举定义抽离到一个独立的“公共头文件”组件如common_defs中让双方都依赖它。或者使用回调函数Callback或事件发布/订阅模式来解耦让模块之间不直接调用函数而是通过中间层通信。6. 实战演练构建一个Wi-Fi与以太网双备份网关光说不练假把式。我们用一个更具体的场景来串联以上所有步骤构建一个网络网关优先使用以太网当以太网断开时自动切换到Wi-Fi网络恢复时又能自动切回。6.1 设计思路与状态机这个功能的核心是一个网络管理状态机。我们可以创建一个新模块modules/network_manager。状态ETH_CONNECTED,ETH_DISCONNECTED,WIFI_CONNECTING,WIFI_CONNECTED,WIFI_FAILED。事件由Wi-Fi和以太网模块的事件处理器产生通过自定义事件或直接函数调用通知给网络管理器。动作根据当前状态和接收到的事件决定是启动Wi-Fi、停止Wi-Fi还是切换默认路由。在network_manager.c里你可能会实现一个这样的函数static void network_event_handler(void* arg, esp_event_base_t event_base, int32_t event_id, void* event_data) { if (event_base IP_EVENT event_id IP_EVENT_ETH_GOT_IP) { // 以太网获取到IP切换到以太网优先 esp_netif_set_default_netif(eth_netif); current_state ETH_CONNECTED; // 如果Wi-Fi连着可以将其断开以省电 wifi_station_disconnect(); } else if (event_base WIFI_EVENT event_id WIFI_EVENT_STA_DISCONNECTED) { // Wi-Fi断开如果当前以太网也没连可能触发重连或告警 if (current_state WIFI_CONNECTED !is_eth_up()) { current_state WIFI_FAILED; // 尝试重启以太网或进行其他恢复操作 } } // ... 处理其他事件 }6.2 模块间的接口设计wifi_station和ethernet模块需要向管理器“汇报”状态。一种干净的做法是在网络管理器初始化时向Wi-Fi和以太网模块注册一个回调函数。当Wi-Fi或以太网连接状态发生关键变化时调用这个回调函数并传递状态码和相关信息。这样网络管理器就与具体的网络实现解耦了它只关心抽象的网络状态变化。未来如果你想换用另一种Wi-Fi驱动或以太网PHY芯片只需要保证新的模块能提供相同的状态回调接口即可网络管理器的代码完全不用动。6.3 调试与日志输出在融合项目中清晰的日志是调试的生命线。一定要为每个模块定义独立的TAG// In wifi_station.c static const char *TAG “wifi_sta”; // In ethernet.c static const char *TAG “eth”; // In network_manager.c static const char *TAG “net_mgr”;这样在串口终端里你可以一眼看出是哪部分代码在打印信息。通过idf.py menuconfig进入Component config - Log output你还可以设置每个模块的日志级别比如在生产环境关闭net_mgr的调试信息 (LOG_LEVEL_DEBUG)只保留错误(LOG_LEVEL_ERROR)。7. 进阶技巧与避坑指南当你成功融合了几个基础Demo后可能会想挑战更复杂的项目。这里分享几个我踩过坑才总结出来的经验。7.1 内存优化与堆空间多个功能叠加最直接的压力就是内存。ESP32的片上内存是有限的。监控堆空间在app_main里定期调用esp_get_free_heap_size()并打印观察内存是否在持续减少内存泄漏。合理分配任务栈每个FreeRTOS任务都需要栈空间。在xTaskCreate时不要盲目使用默认的configMINIMAL_STACK_SIZE * 4。根据任务复杂度通过uxTaskGetStackHighWaterMark()函数检查任务运行后剩余栈空间的最小值然后精确调整栈大小避免浪费。使用外部PSRAM如果项目需要处理大量数据如图像、音频且你的ESP32型号支持务必在menuconfig中开启SPIRAM支持并将大的缓冲区分配到外部RAM中。7.2 电源管理与低功耗如果你的设备是电池供电那么Wi-Fi、蓝牙等射频模块就是“电老虎”。在融合了多个无线功能的项目中需要有全局的电源管理策略。动态关闭射频当蓝牙配网完成后如果没有其他用途调用esp_bluedroid_disable()和esp_bt_controller_disable()彻底关闭蓝牙控制器。Wi-Fi睡眠模式根据实际网络交互频率在menuconfig中配置合理的Wi-Fi睡眠类型如MODEM SLEEP。外设时钟门控对于暂时不用的SPI、I2C等外设可以通过配置对应的GPIO和时钟树来降低功耗。7.3 版本兼容性与IDF版本乐鑫的ESP-IDF版本更新较快API有时会发生变化。你从GitHub上找到的某个炫酷的第三方Demo可能基于老版本的IDF。当你把它融合到自己基于新IDF的项目中时可能会遇到API不兼容的问题。查看迁移指南乐鑫官方文档通常会有Migration Guide列出不同版本间的主要API变化。使用条件编译如果一定要支持多个IDF版本可以使用#if ESP_IDF_VERSION ESP_IDF_VERSION_VAL(5, 0, 0)这样的宏来进行条件编译针对不同版本调用不同的API。7.4 固件升级OTA的考量如果你的融合项目最终需要支持OTA升级那么在项目结构设计之初就要考虑进去。分区表确保你的partitions.csv文件为OTA数据、应用程序等预留了足够空间。融合后的固件体积通常会比单一Demo大。在代码中处理配置迁移OTA升级新固件后原有的网络配置SSID、密码应该被保留。这通常需要将配置存储到NVS非易失性存储中而不是在代码里写死。初始化时优先从NVS读取配置如果没有再使用sdkconfig中的默认值。融合官方Demo的过程本质上是一个从“使用框架”到“理解并驾驭框架”的成长路径。一开始可能会觉得繁琐总是被编译错误打击。但每成功解决一个冲突每清晰地理顺一个模块的接口你对ESP32开发的理解就会加深一层。最终你将不再满足于简单的功能堆砌而是能够设计出架构优雅、运行稳定、易于扩展的嵌入式产品原型。这就是从新手迈向熟练开发者的关键一步。

相关新闻

StructBERT中文相似度模型作品集:中文会议发言要点匹配

StructBERT中文相似度模型作品集:中文会议发言要点匹配

StructBERT中文相似度模型作品集:中文会议发言要点匹配 1. 快速了解StructBERT中文相似度模型 如果你经常需要处理中文文本的相似度匹配,特别是在会议记录、发言要点整理这类场景中,StructBERT中文相似度模型可能会成为你的得力助手。 这个…

2026/5/17 6:32:19 阅读更多 →
实测对比!TinyLlama在Ollama上的量化版本怎么选?Q4_K_M和Q2_K性能差异竟这么大

实测对比!TinyLlama在Ollama上的量化版本怎么选?Q4_K_M和Q2_K性能差异竟这么大

实测对比!TinyLlama在Ollama上的量化版本怎么选?Q4_K_M和Q2_K性能差异竟这么大 最近在折腾本地大模型,想找个轻量又够用的模型塞进我那台老笔记本里。TinyLlama 1.1B 这个“小个子”自然成了首选,毕竟参数少,跑起来压力…

2026/5/17 6:32:15 阅读更多 →
Ollama部署LFM2.5-1.2B-Thinking:面向开发者的企业级轻量推理方案

Ollama部署LFM2.5-1.2B-Thinking:面向开发者的企业级轻量推理方案

Ollama部署LFM2.5-1.2B-Thinking:面向开发者的企业级轻量推理方案 1. 模型简介与核心优势 LFM2.5-1.2B-Thinking是一个专为设备端部署设计的新型混合模型,它在LFM2架构基础上进行了深度优化。这个模型最大的特点是在保持轻量级的同时,提供了…

2026/5/17 6:32:15 阅读更多 →

最新新闻

AI Agent自动化工作流实战:从Loop Engineering到落地部署

AI Agent自动化工作流实战:从Loop Engineering到落地部署

🚀 30款热门AI模型一站整合,DeepSeek/GLM/Qwen 随心用,限时 5 折。 👉 点击领海量免费额度 这次我们来看一个正在改变 AI 开发工作方式的新范式:AI Agent 构建 AI Agent 的自动化工作流。这听起来有点“套娃”&…

2026/7/5 1:08:09 阅读更多 →
主库“写入过 binlog,但后来主库 binlog 文件里看不到了”

主库“写入过 binlog,但后来主库 binlog 文件里看不到了”

典型场景是: 主库事务提交时 binlog 已经写到 OS page cache 或 MySQL binlog 文件缓冲;binlog dump 线程已经把这些 event 发给从库;从库 IO/SQL 线程收到并执行;从库开启了 log_slave_updates,所以这些 event 又写进…

2026/7/5 1:08:09 阅读更多 →
文生3D模型工具推荐哪个:按创作链路来选,为什么更该先看V2Fun

文生3D模型工具推荐哪个:按创作链路来选,为什么更该先看V2Fun

文生3D模型工具没有统一“最好”的答案,但如果目标不是只生成一个可看的模型,而是想继续做绑定、动作、导出和下游应用,那么更值得优先试的是V2Fun。原因很直接:它把AI生图、AI建模、Auto-Rigging、动作应用和导出放在同一条工作流…

2026/7/5 1:08:09 阅读更多 →
ChanlunX缠论插件:5分钟快速上手的通达信自动化缠论分析工具

ChanlunX缠论插件:5分钟快速上手的通达信自动化缠论分析工具

ChanlunX缠论插件:5分钟快速上手的通达信自动化缠论分析工具 【免费下载链接】ChanlunX 缠中说禅炒股缠论可视化插件 项目地址: https://gitcode.com/gh_mirrors/ch/ChanlunX 还在为复杂的缠论笔段划分而烦恼吗?面对海量的K线数据,传统…

2026/7/5 1:06:07 阅读更多 →
创客指南:oDrive X2212电机从零到闭环的完整配置流程

创客指南:oDrive X2212电机从零到闭环的完整配置流程

1. 硬件准备与连接第一次拿到oDrive和X2212电机时,我盯着桌上这堆零件有点懵——主板、电机、编码器线、电源线,还有各种杜邦线。后来发现只要理清思路,连接其实比想象中简单。最关键的三个部件:oDrive主板(带散热片那…

2026/7/5 1:06:07 阅读更多 →
戴尔 PowerEdge R930

戴尔 PowerEdge R930

戴尔 PowerEdge R930 是定位非常高端的服务器。它在发布时被称为当时“戴尔最强大的服务器”,是专为企业最严苛、最关键的业务应用而设计的旗舰级产品。它的“高端”主要体现在这几个方面:🚀 为关键任务而生的性能猛兽R930的硬件配置和设计目…

2026/7/5 1:04:06 阅读更多 →

日新闻

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 阅读更多 →

月新闻