首页/新闻资讯/正文详情

用ESP32绕过射频直连DMR网络:纯网络终端设计与实现

发布时间:2026/9/25 12:17:58 来源:云帆数科 栏目:资讯中心
用ESP32绕过射频直连DMR网络:纯网络终端设计与实现
前两天我把手头的ESP32 DevKitC接上家里的路由器没装天线、没有PA、没有射频调制器却在串口日志里看到DMR主站发来了语音帧耳机里传出清晰的通话声。这个标题里说的“纯网络DMR终端”不是玄学而是一种非常实际的玩法用一块几十块钱的开源硬件跨过完整的射频链路直接从互联网这一侧接入DMR数字对讲网络。DMR这个词在业余无线电台圈子里一般是和手台、中继、热点板绑定的一说到“终端”大家默认就是一台VHF/UHF对讲机。但我这次做的项目把射频部分直接砍掉了核心思路就是让ESP32通过Wi-Fi或以太网以标准DMR协议连接远程主站完成呼号注册、通话组加入、语音帧收发这些动作。听起来很简单真上手之后才发现里面涉及DMR的TDMA帧结构、AMBE语音编解码、MMDVM网络协议、ESP32的I2S音频链路还有一堆网络保活和延迟控制的坑。这篇文章就围绕这个项目把设计思路、核心技术点、实操流程和踩坑记录完整写一遍。适合想了解DMR协议的人、ESP32玩家以及那些暂时不想买射频设备但想体验数字语音网络的业余无线电爱好者。1. 先理清路线纯网络DMR终端到底做了什么1.1 传统DMR链路里射频在中间扮演什么角色传统DMR通话的完整路径大致是这样的手台把麦克风采集的语音用AMBE编码器压缩成DMR语音帧再经过4FSK调制、上变频到VHF/UHF频段发射出去中继台或热点板接收射频信号解调后把语音帧通过IP网络送给DMR主站主站再把帧路由给其他通话组成员。这里有个关键点DMR系统真正用于组呼和语音交换的核心其实是那套IP网络协议和DMR数据帧射频只是把语音帧从手台运送到中继这一段“最后一公里”的载具。既然DMR协议本身就是网络协议那我完全可以绕开射频从网络侧直接接入主站用网络数据包来代替射频信号这就是“纯网络DMR终端”的底层逻辑。这样做的好处是你不用关心天线高度、馈线损耗、驻波比、发射功率、频率偏移这些东西。那些让射频工程师头大的问题——天线匹配、带外抑制、互调干扰、PA线性度——全部从你的系统里消失了。对一个做开发实验的人来说这等于把一个需要专业仪器才能调试的系统简化成了可以用串口日志和抓包工具排查的问题。1.2 为什么偏偏是ESP32选ESP32而不是树莓派、STM32或者其他板子有一个非常现实的原因ESP32在一颗芯片上集成了Wi-Fi、蓝牙、I2S数字音频接口、ADC/DAC和足够用的算力价格却只有十几到三十几块钱。做网络DMR终端需要同时干三件事保持网络连接、处理DMR协议帧、跑音频数据的采集和播放。ESP32的240MHz双核、320KB SRAM很多模组还带PSRAM和4MB Flash刚好能把这个任务吃下来。树莓派当然也能做而且性能更强但一块树莓派的价格和功耗是ESP32的好几倍开机时间也长不适合做成一个“实时在线的小终端”。STM32算力够但网络协议栈要额外搞还得外挂Wi-Fi芯片折腾成本明显更高。ESP32上有成熟的Arduino库和ESP-IDF框架Wi-Fi、I2S、UART的驱动都是现成的我能把主要精力放在DMR协议本身而不是被底层外设驱动拖死。另外ESP32的蓝牙功能也是个加分项。虽然我最后用的是I2S外接功放但在调试阶段我试过直接用ESP32做蓝牙音频源把DMR解码后的语音推给蓝牙耳机少了两根音频线体验相当不错。如果一个终端想做成便携设备ESP32在这种场景下的集成度优势就体现出来了。1.3 收益与代价告别射频之前先看清边界说实话这种纯网络终端和传统的补丁机/热点板在使用场景上是有明显分歧的。热点板的做法是保留射频链路但把功率降到极低让手台通过射频连接到热点热点再通过网络连接主站。而我这个项目是完全的“网络原生”设备没有射频出口。收益很明显硬件成本低、不需要天线和射频前端、不占频谱资源、调试全靠网络日志、不需要考虑干扰和越距问题。对一个只想研究DMR协议、练习数字语音通联或走读代码的人来说这几乎是成本最低的入坑方式。代价也要说清楚。第一它不是一台“电台”不能做本地射频直通和中继通信离开了互联网就完全瘫痪。第二DMR语音帧的编解码仍然绕不开AMBE算法这个问题在后面会专门讲它才是整个项目最大的技术瓶颈。第三如果接入的是真实的业余无线电DMR网络你仍然需要呼号和相关权限纯网络终端并没有豁免这一点只是把“发射”变成了“接入网络”而已。做联网实验时我建议使用测试通话组和自反射模式不要干扰正常的中继通信。2. 技术核心拆解协议、语音编解码和音频链路2.1 DMR语音帧与AMBE编解码是最大的坎先来认识DMR语音帧的基本结构。DMR采用TDMA双时隙方式每帧时长60ms分成两个30ms的时隙每个时隙承载一帧语音或数据。语音帧里最有价值的部分是AMBE编码后的语音比特流DMR标准下语音码率大约是2.45kbps配合前向纠错比特最终每时隙传输的净比特率约为4.6kbps。这个压缩率能把一段语音压得极干但也正因为如此语音编码器是整个系统里最难绕开的部分。AMBE算法是DVSI公司的专有技术传统DMR手台里都有一颗AMBE芯片或授权IP核。开源硬件做DMR终端要么使用DVSI的DV3K模块就是集成AMBE3000芯片的小板子通过UART接口就能收发压缩语音流要么尝试移植开源软件编码库。我在项目里先走了软件解码的路线把这个项目作为初版目标即先完成“接入主站、接收语音、解码播放”的半双向终端。现实情况是ESP32的算力跑AMBE解码器不是完全没戏但会吃掉大量CPU周期再叠加Wi-Fi和音频驱动之后整机响应会变得很勉强。所以目前最稳妥的完整双向方案是给ESP32挂一个DV3K模块由它负责AMBE编解码ESP32只负责网络协议和音频数据搬运。想用软件方案的小伙伴建议把升级目标放在带PSRAM的ESP32-S3上并做好牺牲部分功能的心理准备。这个取舍不是性能焦虑而是DMR语音编解码本身就是一块硬骨头。2.2 网络侧接入怎么和DMR主站“搭上线”DMR主站通常使用一种叫MMDVM协议的UDP报文进行管理。MMDVM协议里设备要向主站注册注册成功后持续发送心跳主站会把属于某个通话组的语音帧通过UDP数据包转发给设备。这个协议从“网络对讲机”的角度看其实和DNS、DHCP这种常见UDP协议一样没什么神秘的就是一组固定格式的二进制包。整个接入流程可以粗略分成三步。第一步用UDP Socket向主站指定端口发送注册包注册包里包含你的设备呼号、软件描述和协议标识第二步主站收到后返回注册确认设备进入“在线”状态第三步设备周期性地发送心跳包同时监听主站转发过来的语音帧。如果你启用了自反射模式主站还会把你自己发出的语音帧原样转发回来方便你确认本地链路是否正常。这里我补充一个很重要的经验很多新手把注意力全放在“语音怎么压缩”上却忽略了网络接入本身。其实只要你用Wireshark抓一次MMDVM协议的交互整个系统的脉络就会变得非常清晰——注册包、心跳包、语音数据包一目了然。反而是那些包的具体字节含义要对着主站的源码或协议文档去核不然很容易在细节上卡壳。2.3 音频链路从ESP32到喇叭/麦克风ESP32的音频输出有几个选择内置DAC仅ESP32经典版带、I2S外接Codec芯片、或者蓝牙音频。我第一版先用的是内置DAC直接驱动一个简单的功放接小喇叭测试好处是电路极简缺点是音质一般底噪明显。第二版换成了I2S外接ES8388或MAX98357方案信噪比提升非常明显尤其是语音播放人声清晰度完全是两个档次。麦克风输入这边如果用内置ADC采样噪声会让你怀疑人生。我推荐用INMP441这种I2S数字麦克风或者直接使用带I2S输入输出的音频Codec模块把模拟麦克风信号在模块内完成数字化。整个音频链路要维持在8kHz采样率、16bit、单声道这是DMR语音的标准参数不能为了音质随意改成44.1kHz立体声否则帧率和编码器会完全对不上。音频链路的实时性是另一个被忽视的问题。DMR每帧语音30ms理想情况下从网络收到语音包到喇叭播放延迟应该小于150ms。我实测下来使用I2S外设加DMA缓冲后ESP32完全能跑到这个要求。但如果用的音频库实现不当比如在解码循环里加了很多阻塞延时延迟会迅速飙升到几百毫秒通话体验会变得像卫星电话一样难受。3. 实操搭建从焊接到出声的完整流程3.1 硬件清单与接线含LAN8720网口方案因为这个项目对Wi-Fi稳定性有一定要求我在硬件选型上做了两手准备默认用板载Wi-Fi如果网络环境差或需要长时间稳定挂机就切换到LAN8720以太网模块。整套硬件清单可以压得很小ESP32 DevKitC开发板经典版带DAC或带PSRAM版本MAX98357 I2S功放模块 3W小喇叭INMP441 I2S麦克风或ES8388音频Codec模块DV3K模块AMBE3000用于完整双向语音LAN8720以太网模块可选若干飞线和一个5V电源用I2S外设接线比较标准MAX98357的BCLK接ESP32的GPIO26LRC接GPIO25DIN接GPIO22VIN接3.3V或5VINMP441的输出也是BCLK、LRCLK、DOUT三根线接对应的I2S引脚。注意I2S模块的供电电压有的功放模块需要5V才能发挥功率有的可以直接3.3V看模块上的标识。如果要用LAN8720走有线网络接线就要更仔细一些。LAN8720和ESP32之间推荐使用RMII接口需要连接TXD0、TXD1、RXD0、RXD1、CRS_DV、REF_CLK、MDC、MDIO等信号线。我用的接线分配是TXD0到GPIO19TXD1到GPIO21RXD0到GPIO25RXD1到GPIO26CRS_DV到GPIO27REF_CLK到GPIO0MDC到GPIO23MDIO到GPIO18。这里有个常见的坑REFR_CLK如果不用外部时钟源就需要ESP32在GPIO0上输出50MHz时钟而这个引脚通常兼作下载模式选择引脚所以烧录时要把网口模块断开或者处理好启动时序否则会一直进不了下载模式。3.2 烧录环境Arduino IDE离线包与三种烧录方式开发环境我用了Arduino IDE加上ESP32离线安装包。很多网络环境不稳定的朋友会被在线下载Arduino核心库折磨最省事的方法是直接下载完整离线包比如Arduino ESP32 3.x版本的完整工具链压缩包解压后放到Arduino的hardware目录下就不需要再从GitHub拉资源了。如果你用的是ESP32经典版也可以按需选装旧版2.x内核新旧版本的API在I2S和蓝牙部分有差异建议以你参考的开源库为准。程序写好之后烧录方式按场景选。最简单的是用Arduino IDE自带的下载按钮通过USB转串口直接烧录如果嫌每次IDE重新编译太慢可以用arduino-cli在命令行下编译烧录还有一种是我调试网络问题时比较喜欢的方式——用乐鑫官方的FlashDownloadTools工具把编译好的bin文件分包烧录到指定地址适合批量生产或反复刷同一份固件。我建议所有新手先跑一个最简的I2S播放测试固件确认音频链路OK之后再跑这个DMR终端项目。不然网络和音频同时调出了问题往往分不清是协议解析错误还是硬件接线问题排查起来非常折磨。3.3 核心代码框架注册、心跳、语音帧收发这个项目的代码核心不在UI而在状态机和协议解析。我以Arduino框架为例把思维框架画出来。首先初始化Wi-Fi、NTP和I2S然后创建一个UDP客户端向主站IP的62031端口发送注册包。注册包格式按MMDVM协议填写包含握手魔数、协议版本、设备类型、呼号和软件标识主站返回确认后进入REGISTERED状态。之后主循环主要做四件事每5秒发送一次心跳包表示设备还活着接收UDP数据包解析包头判断是语音帧还是控制帧如果是DMR语音帧就提取出该通话组的语音数据交给解码器如果有PTT按键或语音检测触发发射就反向把编码后的语音帧发给主站。核心伪代码大概是这样的void setup() { WiFi.begin(ssid, password); NTP.begin(); I2S.begin(I2S_PHILIPS_MODE, 8000, 16, 1); udp.begin(LOCAL_PORT); mmdvmRegister(); // 发送注册包 } void loop() { static unsigned long lastBeat 0; if (millis() - lastBeat 5000) { udp.write(heartbeatPacket, HEARTBEAT_LEN); lastBeat millis(); } int len udp.parsePacket(); if (len 0) { uint8_t buf[256]; udp.read(buf, len); if (isDmrVoiceFrame(buf)) { int16_t pcm[160]; decodeVoiceFrame(buf, pcm); // 交给AMBE解码器 i2s_write(I2S_NUM_0, pcm, sizeof(pcm), written, portMAX_DELAY); } } }真正工程化的时候注册状态机、重连机制和语音缓冲队列都要单独拆出来。注册包发送后不能闷头等要加超时重发UDP丢包时会听到语音断续所以解码前先做帧序号的连续性检查乱序的帧宁可丢掉也不要播放出来否则听感会严重撕裂。整个架构并不复杂但这种状态机的设计才是稳定性差异的根源。3.4 参数配置与实测指标我在BrandMeister主站的测试通话组下面跑了一下午最终稳定运行的参数是这样的UDP本地端口随便选了一个高位端口对端主站端口默认62031心跳间隔5秒音频采样率8000Hz单声道16bit接收缓冲设为256个PCM采样约32ms刚好放得下一帧语音。实测下来从主站语音包到达ESP32到喇叭出声的延迟约60到90毫秒加上网络本身的延迟通联时感觉大概比传统中继路径快一些但比手持对讲机的直通延迟要大。音质方面AMBE压缩后的语音本身就带一种“数字通信特有”的压缩感类似以前用语音压缩软件通话的效果但可懂度很好背景噪音控制也优于模拟对讲机。使用内置DAC时底噪非常明显换成MAX98357之后基本听不到了建议一步到位直接上I2S方案。4. 避坑实录调试中踩过的几个真坑4.1 Wi-Fi、蓝牙和外设同时跑内存经常爆ESP32看起来有320KB RAM但实际Wi-Fi和蓝牙协议栈会吃掉一大半剩下能自由分配的往往不到80KB。一开始我在开蓝牙音频的同时又开着Wi-Fi接收DMR语音包结果设备每几分钟就重启一次。排查后才发现是内存分配失败触发了panic。解决路径有几个优先关闭不必要的蓝牙功能如果必须用蓝牙音频就给系统增加PSRAM并让关键缓冲优先放PSRAM再就是降低Wi-Fi接收缓冲的数量。要注意的是ESP32经典版的PSRAM和Wi-Fi同时使用的兼容性不太好需要打开特定的编译选项和分区配置不然PSRAM就是摆设。这个坑很隐蔽建议直接参考官方文档里的PSRAM使用说明。4.2 UDP网络的不确定性与主站连接保活UDP连接在NAT环境下有个大坑主站向设备发送语音包是通过四元组源IP、源端口、目标IP、目标端口来寻址的。如果家里的路由器NAT映射过期主站转发过来的UDP包就进不了ESP32。表现就是注册成功、心跳正常但就是听不到任何语音。解决方式是我在注册后故意定时发送一个小数据包给主站同时本机UDP端口保持打开让路由器的NAT映射不老化。另外如果你把设备放在公网VPS上测试这个问题就不存在。还遇到过一个情况主站对同一个呼号做了“重复登录”判断前一个会话没正常退出时新注册会一直被拒绝。解决办法是等一段时间让旧会话超时或者在代码里对主站发送注销报文。4.3 时钟不同步导致语音乱序DMR语音帧本身带有帧序号和时隙信息解码时如果不检查这些字段把乱序的帧一股脑丢给AMBE解码器会发现语音出现明显的抽风感好像机器人说话时每个音节都跳变一下。这个问题一度让我以为是AMBE解码状态机没初始化好花了很多时间对比寄存器配置。后来才发现是Wi-Fi下UDP包偶尔乱序或者主站把两个时隙的帧混在一起发过来了。解决方式很简单解析帧头时提取时隙号和帧计数用一个4帧的小队列做重排。网络顺畅时这个队列基本不起作用但一到网络抖动时音质的稳定性就全靠它兜底。4.4 音频链路的各种“塑料味”DMR语音本身是窄带语音但如果你听到的声音特别“塑料”而且伴有沙沙声那通常是音频链路的问题不是AMBE解码问题。我遇到过几个具体场景使用内置DAC时供电纹波导致低频嗡嗡声MAX98357的GAIN引脚悬空导致增益过高产生削波失真I2S时钟线飞线太长导致信号质量恶化。排查这类问题最有效的方法是绕过网络让ESP32循环播放一段已知的PCM正弦波或录音先确认音频硬件本身的音质。如果播放测试音干净问题就在协议解析或缓冲处理上如果播放测试音都发闷那就直接查I2S接线和增益不浪费时间在网络这边。4.5 手里只有万用表和串口怎么快速定位问题作为一个开发调试项目不一定每个人都有频谱仪和示波器。我的经验是先通过串口日志把系统状态打印出来Wi-Fi连接状态、NTP同步状态、MMDVM注册状态、心跳发送时间、每秒钟收到的语音帧数这些指标全部打印出来系统状态就基本透明了。然后配合Wireshark抓包在PC上抓UDP流量看主站是否在往你的IP和端口发数据。只要抓包里有DMR语音包而ESP32没出声问题就锁定在本机协议解析或音频输出上根本不用猜网络。这套组合拳帮我解决至少百分之八十的疑难杂症强烈建议在路由器或电脑上开一个端口镜像把ESP32发的UDP包全都记录下来。5. 后续能玩的方向与我的一点体会5.1 从网络终端到网关还能怎么扩展纯网络DMR终端做完之后自然会产生一个想法能不能把它变成一个“网关节点”帮其他设备接入DMR网络因为ESP32已经完成了MMDVM协议的注册和语音帧的收发理论上只要再把本地音频通过UART转给其他设备或者把DMR语音帧转成其他音频协议就能成为一个小巧的DMR音频网桥。我实际试过两个方向的扩展。第一个是接一个GPS模块在串口里同时输出DMR语音调试信息和GPS定位这样设备就变成一个带位置上报的网络终端第二个是把它接到HomeAssistant上通过语音帧触发本地自动化比如某个通话组喊一个关键词就开灯。这些扩展听起来很“偏门”但恰好证明了ESP32这种平台在网络终端项目上的可塑性。当然如果想把项目推向更完整的双向DMR终端就必须把DV3K模块的驱动、PTT控制、语音活动检测VOX和完整的双时隙支持都加进去。我在规划中加入了这些但这个版本的稳定运行给了我足够信心只要网络链路做扎实音频链路不出杂音剩下的就是顺着DMR协议一层层往下啃的事情。5.2 给想入坑的朋友几条建议说了这么多最后给想复刻这个项目的朋友几个建议。第一别一开始就追求完整双向。先把接收链路打通ESP32连上主站、能听到测试通话组的声音这就是一个里程碑。这时你对DMR协议栈的理解已经超过大半只会用热点的玩家了。第二硬件选择上音频部分一步到位用I2S Codec别在内置DAC上浪费调试时间。第三网络保活代码一定要认真写NAT超时导致“掉线但心跳正常”的状态非常迷惑人。第四做任何联网测试前先确认自己是否有权限接入用测试通话组和自反射模式就够了别拿正常中继频道当试验场。我做完这台纯网络终端以后最深的体会是当把射频从系统里拿掉DMR的学习门槛其实被大大降低了。所有交互都变成了可以在串口和抓包里观察的数据包你能非常直观地看到自己发送的注册请求、收到的心跳确认、转发的语音帧。这种“把看不见的电磁波变成看得见的协议”的过程才是这个项目最吸引我的地方。如果你手头正好有一块吃灰的ESP32不妨按这个思路接上网络试试把它变成一个数字语音终端你会看到一片不一样的开源硬件玩法。

相关推荐

MFC坐标转换实战:GetClientRect/GetWindowRect/ClientToScreen/GetCursorPos/ScreenToClient 配 TaoToken 统一 Key 通
MFC坐标转换实战:GetClientRect/GetWindowRect/ClientToScreen/GetCursorPos/ScreenToClient 配 TaoToken 统一 Key 通

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 12:17:21

ESPnet2 语音情感分析实战:基于 Switchboard 情感标注数据的 Conformer ASR 多任务方案
ESPnet2 语音情感分析实战:基于 Switchboard 情感标注数据的 Conformer ASR 多任务方案

人工智能语音音频深度学习NLP 【免费下载链接】espnet End-to-End Speech Processing Toolkit 项目地址: https://gitcode.com/gh_mirrors/es/espnet 点击查看 免费下载 导读 本文围绕 ESPnet2 仓库中的 egs2/swbd_sentiment/asr1 语音情感分析(Speech… · 2026/9/25 12:17:21

STM32红外PM2.5通信原理与NEC协议解析实战
STM32红外PM2.5通信原理与NEC协议解析实战

1. 为什么STM32接红外PM2.5传感器不是“插上线就能用”的事在嵌入式课程设计、毕业项目甚至小型环境监测设备开发中,“STM32连接红外PM2.5传感器”这个标题听起来简单直接——不就是把传感器模块的VCC、GND、TX/RX接到单片机上,串口读数据吗?… · 2026/9/25 12:17:09

Protractor 版本发布全流程指南:从 Milestone 规划、CI 验证到 NPM 发布与官网更新的完整 Release 清单
Protractor 版本发布全流程指南:从 Milestone 规划、CI 验证到 NPM 发布与官网更新的完整 Release 清单

测试 【免费下载链接】protractor E2E test framework for Angular apps 项目地址: https://gitcode.com/gh_mirrors/pr/protractor 点击查看 免费下载 本文以 Protractor 仓库根目录下的 release.md 发布清单为骨架,逐条拆解一次完整版本发布所需的前置… · 2026/9/25 12:48:17

人机交互实验报告与GOMS、Fitts、可用性量表完整复现指南
人机交互实验报告与GOMS、Fitts、可用性量表完整复现指南

简介:面向高校计算机相关专业学生的“人机交互”课程配套资料,内容涵盖从基础实验到综合大作业的完整过程。资源包含实验报告、讲义演示文档、源码工程以及三维虚拟现实场景等,覆盖二维交互画板、语音交互程序、订单管理系统界面设计、虚拟现… · 2026/9/25 12:47:58

基于Atlas 300V部署YOLOv5全流程:从ATC转换到ACL推理实战
基于Atlas 300V部署YOLOv5全流程:从ATC转换到ACL推理实战

1. 项目概述与核心需求解析1.1 “atlas”到底是什么,为什么你需要关注它聊到“atlas”这个词,如果你关注过AI推理加速、边缘计算或者嵌入式视觉方向,大概率会第一时间想到昇腾的Atlas系列。这么多年我在实际项目里摸爬滚打,Atlas这… · 2026/9/25 12:47:52

cube-ui 移动端 Vue 组件库完全上手指南:安装、按需引入与本地开发
cube-ui 移动端 Vue 组件库完全上手指南:安装、按需引入与本地开发

前端UI组件移动开发 【免费下载链接】cube-ui :large_orange_diamond: A fantastic mobile ui lib implement by Vue 项目地址: https://gitcode.com/gh_mirrors/cu/cube-ui 点击查看 免费下载 cube-ui 是由滴滴出行开源的移动端 UI 组件库,基于 Vue 2.… · 2026/9/25 12:47:40

2026年OpenClaw部署实战:京东云5分钟环境搭建与百炼Coding Plan配置指南
2026年OpenClaw部署实战:京东云5分钟环境搭建与百炼Coding Plan配置指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 12:47:40

WPScan 插件版本检测实战:以 bonaire 的 CHANGELOG.md 为例解读 ChangeLog 动态查找器
WPScan 插件版本检测实战:以 bonaire 的 CHANGELOG.md 为例解读 ChangeLog 动态查找器

网络安全漏洞扫描渗透测试应用安全CLI 【免费下载链接】wpscan WPScan WordPress security scanner. Written for security professionals and blog maintainers to test the security of their WordPress websites. Contact us via contactwpscan.com 项目地址: ht… · 2026/9/25 12:47:40

数值优化(Numerical Optimization)学习系列-03-共轭梯度方法(Conjugate Gradient)
数值优化(Numerical Optimization)学习系列-03-共轭梯度方法(Conjugate Gradient)

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:31

创维E900V22D刷机全攻略:S905L3SB芯片兼容性解析与救砖实战
创维E900V22D刷机全攻略:S905L3SB芯片兼容性解析与救砖实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:31

MQTT协议原理与Broker服务器搭建实战:从Mosquitto到EMQX
MQTT协议原理与Broker服务器搭建实战:从Mosquitto到EMQX

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:37

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码