上周帮朋友处理一台内网机器上的怪事一个本地起的调试服务启动时死活报端口被占用机器上没装任何端口查看工具远程桌面连上去只有一个黑黢黢的 cmd 窗口。很多人第一反应是去下载个图形化端口查看器但在那种环境下下载本身就是个问题。其实系统自带的netstat配合tasklist两条命令就能把哪个程序占着哪个 IP 的哪个端口这件事说得明明白白。这篇要聊的就是这个仅靠 cmd 里自带的命令抓取本机运行程序所占用的 IP 和端口。我会把netstat -ano输出里每一列的含义拆开讲把 PID 翻译成程序名的两条路径都摆出来再把我这些年踩过的编码坑、误匹配坑、权限坑一个个点掉最后给一套可以直接抄走的批处理和一串 PowerShell 写法。适合谁看服务端运维、做本地开发的、需要排查端口冲突的、以及手头只有一台受限机器但又必须搞清楚谁在监听的人。需要先说明一点这里的抓取指本机端口枚举——看自己这台机器上哪些进程开了哪些监听、有哪些连接。这是完全正当的自查动作不涉及任何越界操作。1. netstat -ano 那一行输出到底该怎么断句很多人敲完netstat -ano就被刷屏了几十上百行密密麻麻看两眼就放弃。其实它每一行都是高度规整的只是你没建立断句的习惯。-a表示列出所有连接和监听端口-n表示用数字形式显示地址和端口不做反向域名解析速度快很多-o表示顺带把拥有该连接的进程 ID 打出来。三个参数少一个都不行少了-a看不到监听态少了-n会去做 DNS 反查导致卡顿几十秒少了-o你就只有地址没有主人。1.1 五个字段的边界从 TCP 到 PID一行典型的输出长这样TCP 0.0.0.0:135 0.0.0.0:0 LISTENING 1044 TCP 192.168.1.27:52341 192.168.1.10:1433 ESTABLISHED 6120 UDP 0.0.0.0:500 *:* 1200从左到右依次是协议、本地地址、外部地址、状态、PID。行首那一个空格是固定存在的这会影响后面用for /f解析时的 token 计数先记着。协议列只有 TCP 和 TCPv6、UDP 和 UDPv6 这几种。TCPv6 就是走 IPv6 栈的连接地址会带上方括号比如[::]:135。本地地址是本机这一端的 IP 加端口格式永远是地址:端口中间那个冒号是唯一的天然分隔符——但也正因为地址里本身可能含冒号IPv6所以不能简单用冒号去 split这是后面写脚本时最容易翻车的地方。外部地址是对端的 IP 加端口。监听态的时候它没有实际意义TCP 会显示0.0.0.0:0UDP 会显示*:*都是占位符。只有连接建立了这一列才会变成真实的远端地址而这一列恰恰是判断某个程序连到哪去了的唯一线索。PID 列是整行的落点。它是个纯数字正常情况下在行尾前面有若干空格。注意 PID 这一列在 UDP 行上也存在但 UDP 行没有状态列整个行的字段数量比 TCP 少一个如果你写脚本按固定位置取 tokenUDP 行一定会取错。1.2 本地地址三态0.0.0.0、127.0.0.1、具体网卡 IP 的含义差本地地址这一列看着简单其实藏着一个非常关键的语义区分搞不清这个端口冲突的排查方向就会完全跑偏。0.0.0.0:8080表示这个程序在所有网卡上都监听 8080。也就是说同一局域网里其他机器能通过你这台机器的 IP 访问到它。这是最开放的一种绑定方式也是绝大多数服务端程序的默认行为。127.0.0.1:8080表示只在本机回环接口上监听。局域网里别人访问不到只有本机上的其他进程能连。很多开发调试用的本地服务会这么绑出于安全考虑是对的但会带来一个副作用——你用另一台机器去测永远连不上然后开始怀疑防火墙其实根本不是防火墙的事。192.168.1.27:8080这种绑定到具体网卡 IP 的就只在那张网卡上响应。机器换网络、IP 变了之后服务起不来十有八九就是这个原因。IPv6 那边还有[::]:8080含义和0.0.0.0类似是全 IPv6 地址监听。有意思的是在新一些的系统上[::]的监听往往同时接管 IPv4 的连接双栈所以你会看到一个程序只写了[::]:8080但 IPv4 也能连上。这一点在判断是不是真的没人监听 8080时很容易误判。1.3 状态列不是装饰LISTENING、ESTABLISHED、TIME_WAIT 各自说明什么LISTENING是等待别人来连这是服务在跑的标志。查端口占用绝大多数时候你筛的就是这一种。ESTABLISHED是连接已经建立、双方正在通信。这个状态下外部地址列才有真东西可看。如果你想搞清楚某个程序往外连了什么筛这个状态。TIME_WAIT是主动关闭连接的一方在等一小段时间确保最后的确认包能被对端收到。这个状态很讨厌因为它会让端口在关闭后还占着几十秒到两分钟。经常出现的情况是你把服务停了立刻重启报端口被占用netstat一查是TIME_WAIT。这时候不用慌也不用杀进程——它的 PID 通常显示为 0根本没有进程可杀等它自己过期就行。CLOSE_WAIT则是被动关闭的一方没把连接关掉通常是程序代码里忘了 close。如果一台机器上堆了几百个CLOSE_WAIT那基本可以断定是那个程序有连接泄漏跟网络无关跟端口冲突也无关。SYN_SENT表示正在尝试连接对端但还没收到回应大量出现说明目标不可达或者被中间设备拦了。这个状态在排查为什么连不上某个服务时很有用。注意UDP 是面向无连接的所以 UDP 那几行压根没有状态列永远是空白。你按状态去 grep 的时候UDP 的行会被整体漏掉这是个静默失败不会有任何报错提示你。2. 拿到 PID 只是起点把它翻译成程序名还有两道坎netstat -ano给你的是 PID一个四位或五位的数字。人对数字是没有记忆的你需要把它换成java.exe、node.exe或者svchost.exe这种名字才知道该动谁。这一步有两条路各有各的坑。2.1 tasklist 过滤器语法为什么你的 /FI 老是没有匹配的任务tasklist是另一个系统自带命令默认输出当前所有进程的映像名、PID、会话名、会话号、内存占用。要按 PID 精确定位用过滤器tasklist /FI PID eq 6120这里有几个必须记住的细节。第一过滤器里的字段名和比较符必须是英文PID、IMAGENAME、eq、ne、gt、lt这些即使在中文系统上也不能写成中文写成中文会直接报语法错误。第二整个过滤表达式必须用双引号包起来因为中间有空格。第三eq后面的值不要加引号加了反而匹配不上。常用参数里/NH是去掉表头只出数据行/FO CSV是把输出改成 CSV 格式方便脚本解析/SVC是额外显示每个进程承载了哪些服务这个参数在查svchost.exe的时候是刚需。最容易踩的一个坑是tasklist /FI PID eq 4有时候会告诉你信息: 没有运行的任务匹配指定标准。PID 4 是 System 进程它确实存在但tasklist在某些会话环境下不显示它。遇到这种情况不要以为进程不存在换成管理员权限的窗口重试或者直接上 PowerShell 的Get-Process -Id 4。2.2 wmic 取可执行路径以及它在较新系统上的退场知道进程名还不够你往往还需要知道它的完整路径——判断这个程序是系统自带的还是用户自己装的路径是最直接的证据。wmic process where processid6120 get name,executablepath,commandline /format:listwmic的好处是输出结构化、能一次拿到命令行参数。几个书写要点processid后面不能有空格where子句里字段名不区分大小写/format:list会把结果竖着输出避免宽表在窄窗口里被截断成一行乱码。但现实是wmic在较新版本的 Windows 上已经被标记为废弃部分新出厂的系统里默认不再预装。如果你在脚本里重度依赖它早晚会翻车。替代方案是 CIMGet-CimInstance Win32_Process -Filter ProcessId6120 | Select-Object Name, ExecutablePath, CommandLine这条在 PowerShell 里跑返回的是对象字段名清晰也不会被窗口宽度截断。功能上和wmic等价但生命周期长得多。我的建议是交互式临时查一下用wmic图个快写进脚本里的一律用Get-CimInstance。2.3 一段能直接用的批处理端口、PID、进程名一次打出来把前面两步拼起来就是一段能直接落地的批处理。下面这个脚本会遍历所有监听态的端口输出本地地址 | PID | 进程名三列echo off setlocal enabledelayedexpansion echo 本地地址^|PID^|进程名 for /f tokens2,5 %%a in (netstat -ano ^| findstr LISTENING) do ( set addr%%a set pid%%b set pnameunknown for /f tokens1 delims, %%n in (tasklist /FI PID eq !pid! /NH /FO CSV 2^nul) do ( set pname%%~n ) echo !addr!^|!pid!^|!pname! ) endlocal几个关键点解释一下。tokens2,5是因为监听行里第 2 个字段是本地地址、第 5 个字段是 PID第 4 个是LISTENING。%%~n那个波浪号是去掉 CSV 输出里自带的双引号不加的话进程名会带着引号显示。2^nul是把tasklist的错误输出吞掉——当 PID 对应的进程刚好在这几十毫秒里退出了tasklist会报找不到不吞掉的话屏幕上会刷一堆红字。setlocal enabledelayedexpansion配上!pid!这种写法是因为在for循环体里动态读取变量必须用延迟展开用%pid%会拿到循环开始前的旧值。delims,配tokens1取的是 CSV 的第一列也就是映像名。如果你的进程名里本身带逗号极少见但存在这个解析会错位那时候只能改成按引号切分属于极端情况一般不折腾。3. findstr 才是把噪音干掉的关键但它对编码很敏感netstat -ano一次输出几百行是常态人眼扫是不现实的。findstr是 cmd 里唯一的原生文本过滤工具用好它效率提升非常明显但它对字符编码的敏感程度也会让人抓狂。3.1 中文系统下 netstat 输出的编码真相这里有个流传很广的误解很多人以为中文系统下netstat的状态列会显示成侦听已建立所以findstr LISTENING会失败。事实恰恰相反——状态值是协议层的英文常量中文系统上依然是LISTENING、ESTABLISHED、TIME_WAIT只有表头活动连接协议本地地址这些被翻译了。所以按状态过滤永远是安全的这是最省事的切入点。真正会出问题的是你试图去过滤表头里的中文。findstr是按字节做子串匹配的它不关心编码。如果你的批处理文件保存成了 UTF-8而 cmd 窗口的当前代码页是 936GBK那么文件里的中文字节和命令输出里的中文字节不是同一串匹配必然失败而且不会有任何提示——你只会看到什么都没查出来。我的做法很干脆过滤条件里只写 ASCII 字符。数字、冒号、点、LISTENING、ESTABLISHED这些在任何代码页下字节都是一致的永远不会出问题。非要在批处理里输出中文提示就把文件另存为 ANSI 编码别用 UTF-8。提示不要在批处理开头随手加chcp 65001。它确实会把控制台切成 UTF-8但netstat这类老程序的输出编码不一定跟着变结果是中文字符串一半正常一半乱码比不加还乱。除非你有明确的编码统一需求否则保持默认就好。3.2 三个常用过滤维度的写法与误匹配边界按端口、按 PID、按状态是三种最高频的过滤方式每一种的误匹配边界都不一样。按端口查netstat -ano | findstr :8080这是最直觉的写法但它有个明显缺陷findstr做的是子串匹配:8080会同时命中:18080、:80800、:80801甚至远端地址里带 8080 的连接也会被捞出来。要收紧一点加个尾随空格netstat -ano | findstr :8080 因为端口后面紧接着要么是空格分隔到下一列要么是行尾。加了空格能排除:80800这种超长端口但仍然排除不掉:18080——它的子串里确实不含:8080等等其实:18080里包含的是:18080不含:8080所以加空格这条已经能挡住了。真正挡不住的是远端端口恰好是 8080 的连接行比如你本机连了对面服务器的 8080那一行的远端地址是x.x.x.x:8080也会被匹配出来。要彻底区分本地和远端findstr无能为力得用第 5 节的 PowerShell 方案按列筛。按 PID 查netstat -ano | findstr 6120前面加空格是为了避免 PID 数字作为子串误中其他列。但即使这样如果某个 IP 地址段里恰好含6120这种片段理论上还是可能误中。实际概率很低可以接受。按状态查netstat -ano | findstr ESTABLISHED这个最干净不会有误匹配因为状态值是固定枚举。想同时看监听和已建立写成findstr LISTENING ESTABLISHED——findstr多个空格分隔的词之间是或的关系命中任意一个就输出。还有一个组合写法值得记住findstr /V是反向过滤netstat -ano | findstr /V TIME_WAIT可以把一堆等待中的连接直接剔掉屏幕立刻清爽。3.3 把高频查询固化成菜单式 .bat每次手敲这一长串敲几次就烦了。我的习惯是在一个固定目录放一个port.bat双击之后给个简单菜单输入端口号就直接出结果echo off setlocal enabledelayedexpansion set /p p请输入端口号: echo. echo 端口 %p% 的占用情况 netstat -ano | findstr :%p% echo. for /f tokens5 %%a in (netstat -ano ^| findstr :%p% ^| findstr LISTENING) do ( echo ---- PID %%a 对应的进程 ---- tasklist /FI PID eq %%a /FO LIST wmic process where processid%%a get executablepath /format:list 2^nul ) echo. pause endlocal这个脚本的价值在于把查端口 → 拿 PID → 查进程 → 拿路径四步串成一次输入。真实排查现场你需要的是连续动作而不是一个个命令去拼。把它放在桌面或者放到 PATH 里长期收益很高。有一个小细节findstr LISTENING那一段是为了避免把TIME_WAIT行里 PID 为 0 的情况也送去tasklist那样会得到一堆没用的提示。但如果这个端口确实处于TIME_WAIT你就什么都查不到会误以为端口没被占。所以实际用的时候我会先把完整结果打出来再单独处理监听态。4. 端口被占用从报错到锁定进程的完整排查链路前面讲的都是零件这一节把它们装成一台机器。端口冲突是最常见的触发场景完整链路走一遍以后遇到任何端口起不来都能照着推。4.1 四步定位法每一步看什么第一步从报错信息里把端口号抠出来。程序报地址已被使用bind failed10048这类括号里或者日志上一行通常会带上具体端口。拿到端口后面才有方向。第二步列出这个端口的全部相关行netstat -ano | findstr :8080 这时候你会看到几种可能。如果只有一行LISTENING说明确实有程序占着直接进第三步。如果只有TIME_WAIT那就是缓释期等一两分钟或者换端口。如果一行都没有说明端口其实没被占报错另有原因——可能是程序压根没启动成功也可能是它绑的是另一个端口而你记错了还可能是绑定到了某个不存在的网卡 IP 上。第三步拿 PID 换进程名tasklist /FI PID eq 6120 /FO LIST/FO LIST是竖排输出一行一个字段比默认的横排表格好读得多尤其在窄窗口里不会折行。第四步拿完整路径确认这个进程到底是谁wmic process where processid6120 get name,executablepath /format:list路径在系统目录下比如C:\Windows\System32之类的基本是系统服务路径在用户目录、临时目录、或者某个奇怪命名的文件夹下的就要多留个心眼。这一步是判断该不该动它的关键依据不要跳过。4.2 监听地址写错导致的假冲突有一种情况特别迷惑人netstat里明明看到 8080 被占了但你访问http://127.0.0.1:8080却连不上。原因通常是占用方绑的是具体网卡 IP比如192.168.1.27:8080而你去连的是回环地址。这两个在协议栈里是不同的绑定互相不通。反过来也一样绑在127.0.0.1上的服务你用本机的局域网 IP 去访问同样连不上。还有一种更隐蔽的绑定的是0.0.0.0:8080理论上回环也能通但如果同时存在另一个程序绑定127.0.0.1:8080在部分系统版本上这两个会互相冲突谁先起谁赢后起的报错。这时候netstat里能看到两行本地地址不同的记录不了解这个机制的人会以为是幽灵进程。排查时的动作是盯着本地地址那一列看而不是只看端口号。同一个端口号出现在不同的绑定地址上是完全不同的两件事。4.3 PID 4、PID 0 与 svchost三个特殊的归属问题有三个 PID 值得单独拎出来说它们经常让人卡住。PID 4是 System 进程。你在 80、443 端口上看到它几乎可以确定是系统里的 HTTP 服务组件在占着可能是某个 Web 服务、也可能是远程管理组件。这种情况你没法用taskkill去杀会提示拒绝访问正确做法是去服务管理器里找到对应的服务停掉或者改用别的端口。硬来的话只能重启机器。PID 0出现在TIME_WAIT行上表示这个连接已经不属于任何活着的进程了纯粹是协议栈在等超时。没有进程可杀也没有进程可查。看到 PID 0 不要浪费时间去tasklist直接等。svchost.exe的问题在于一个映像名对应几十个 PID每个 PID 承载不同的系统服务。光看进程名完全无法判断它到底在干什么。这时候必须加/SVCtasklist /SVC /FI PID eq 1848输出里会列出这个 PID 承载的所有服务名。拿到服务名之后再去服务管理器里查它的显示名称和描述才能知道该不该动。绝对不要直接对 svchost 下手杀掉一个承载关键服务的实例轻则网络断开重则系统需要重启。这是我在早期踩过的坑代价是一次远程会话直接失联。5. PowerShell 原生查询结构化输出的降维打击前面所有内容都建立在文本解析之上而文本解析天生脆弱——列宽一变、语言一换、多个空格少个空格脚本就崩了。如果环境允许开 PowerShell我强烈建议直接上结构化的查询方式。5.1 Get-NetTCPConnection 相比 netstat 多给了什么Get-NetTCPConnection -State Listen | Select-Object -First 10返回的是一个对象集合每一行都是独立的记录字段名明确LocalAddress、LocalPort、RemoteAddress、RemotePort、State、OwningProcess、CreationTime。你不需要再去数第几个 token也不用担心 IPv6 地址里的冒号把解析搞乱。相比netstat它多出的最有价值的一个字段是CreationTime。用它可以判断这个连接是什么时候建立的。排查可疑外连时一个刚建立三秒的连接和一个建立了三天的连接意义完全不同。另一个优势是它天然支持按列筛选而不是全文子串匹配Get-NetTCPConnection -LocalPort 8080 -ErrorAction SilentlyContinue这里-LocalPort是精确匹配本地端口绝不会误中:18080也绝不会把远端端口为 8080 的连接捞进来。这就是结构化查询和文本 grep 的本质区别。5.2 一行命令拼出端口 进程名 远端地址把端口和进程名拼到一起用计算属性就够Get-NetTCPConnection | Select-Object LocalAddress, LocalPort, RemoteAddress, RemotePort, State, OwningProcess, {NameProcess; Expression{ (Get-Process -Id $_.OwningProcess -ErrorAction SilentlyContinue).ProcessName }} | Sort-Object LocalPort | Format-Table -AutoSize{Name...; Expression{...}}这个语法是 PowerShell 的计算属性让你在输出的时候临时算一个新列出来。-ErrorAction SilentlyContinue是必须加的因为 PID 4 和 PID 0 调Get-Process会抛异常不加会刷一屏红字。Sort-Object LocalPort让它按端口排好读起来舒服很多。Format-Table -AutoSize会自动调整列宽避免被窗口截断。如果想更狠一点直接按进程分组看谁开得最多Get-NetTCPConnection -State Listen | Group-Object OwningProcess | Sort-Object Count -Descending | Select-Object -First 10 Count, {nProcess;e{(Get-Process -Id $_.Name -ErrorAction SilentlyContinue).ProcessName}}, {nPid;e{$_.Name}}这个能看到哪个程序监听了一堆端口对于排查异常行为很有参考价值。5.3 老系统上的降级写法不是所有环境都有NetTCPIP模块比较老的系统上Get-NetTCPConnection可能直接报无法识别。这时候有两条降级路。一条是继续用netstat但用 PowerShell 去解析它的输出比在 cmd 里写for /f舒服得多netstat -ano | Select-String LISTENING | ForEach-Object { $f ($_ -split \s) | Where-Object { $_ } [PSCustomObject]{ LocalAddress $f[1] Pid $f[4] } }-split \s按任意空白切分Where-Object { $_ }把切出来的空字符串清掉——因为netstat行首有空格直接切会产生空元素下标会整体偏移一位。这个清空元素的动作是这段代码能正确工作的关键少了它取到的全是错位的值。另一条是用 CIM 查连接表但那个查询比较慢日常用不上除非你要在脚本里做长期采集合规审计。6. 从查得到到查得准几条长期踩出来的经验命令本身不难难的是结果的可信度。同样一条netstat在不同权限、不同会话下跑出来的东西是不一样的这一点官方文档里不会强调。6.1 权限差异造成的看不见普通权限和管理员权限下tasklist能看到的东西不一样。跨会话的进程、某些系统进程的详细信息在非管理员窗口里是查不到的。最典型的症状是netstat明明显示某个 PID 在监听但tasklist过滤这个 PID 却告诉你没有匹配项。netstat -b这个参数更极端它直接在输出里附带可执行文件名看着很美好但有两个致命问题一是必须管理员权限否则全部显示请求的操作需要提升二是极慢因为它要给每个连接枚举模块端口多的机器上跑一次能卡十几秒。所以我的实际选择是始终用管理员身份开一个 cmd 或 PowerShell 窗口然后走netstat -ano加tasklist的组合。-b只在万不得已的时候用一次不写进脚本。注意部分受限环境里即使提升也查不到某些由安全软件托管的进程路径。这时候不要死磕换个方向——看它的网络行为、看它监听的端口范围比看路径更有信息量。6.2 输出留存与时间戳排查是动态过程。你在十点看到某个连接存在十点零五可能就没了。光靠翻屏往回找是不现实的。我习惯把每次抓取都落成文件netstat -ano ports_%date:~0,4%%date:~5,2%%date:~8,2%.txt是覆盖是追加。做对照观察的时候用追加隔一段时间跑一次最后能看出变化趋势。文件名里带日期避免覆盖。要注意%date%这个变量在不同区域设置下的格式不一样上面这种切片写法只在yyyy/MM/dd格式下成立稳妥一点的做法是在脚本里显式拼set ts%date:~0,4%%date:~5,2%%date:~8,2%_%time:~0,2%%time:~3,2% set ts%ts: 0% netstat -ano ports_%ts%.txt那句%ts: 0%是把小时数为个位数时产生的空格替换成 0否则文件名里会带空格后续处理很麻烦。这是个很小的细节但它决定了你的文件能不能被其他脚本批量处理。在for /f循环内部做重定向必须写成^因为在括号块里会被当作语法符号优先解析。这条也是踩过才知道的。6.3 判断一条外连是否正常的几个观察点抓到数据之后怎么判断哪些是正常的、哪些值得关注我一般看四个点。第一看远端地址的网段。内网段之间的连接通常是内部服务调用。出现一个完全陌生的公网地址且对应进程是你没见过的那就值得点开看看。看完进程路径和命令行参数基本就能定性。第二看远端端口。443 和 80 是常规的 Web 通信3389 是远程桌面1433 和 3306 是数据库。如果某个进程在往外连一个高位随机端口比如 54321那可能是自定义协议或者对等通信也可能是别的东西需要结合进程再判断。第三看连接数量。单个进程维持几十个连接是正常的数据库连接池、消息队列客户端都会这样。但如果一个你完全不认识的进程同时开着几百个外部连接那就很不正常了。第四看时间。凌晨三点一台没人用的办公机上某个进程突然发起大量外连这个信号本身就值得看一眼。Get-NetTCPConnection的CreationTime字段在这里就体现出价值了。需要说明的是这些观察点只能帮你缩小范围定性还得靠对业务本身的了解。我在实际操作中的体会是先把正常基线摸清楚异常才看得出来。平时没事的时候跑一遍把结果存下来知道这台机器正常长什么样等到出问题的时候才有对照物。临时抱佛脚去查往往越查越乱。另外还有一个我觉得特别实用的小习惯把Get-NetTCPConnection -State Listen | Select LocalPort, OwningProcess这条命令的输出做成一个每日快照存成带日期的文件。新装了什么软件、哪个服务偷偷开了监听端口对比两天就能看出来。这比事后去翻安装记录快得多而且不需要任何额外工具一条命令的事。真要说这套东西的核心其实就是把netstat -ano这一行输出彻底读懂再老老实实把 PID 翻译成名字 路径 归属服务三层信息。命令是死的判断是活的多查几次这台机器上谁在干什么心里就有数了。
企业数字化 ERP 产品动态
相关推荐
G代码与M代码入门:数控编程的普通话与状态机原理 简介:本资源是一份面向数控编程初学者、机械加工技术人员及高职院校实训教学人员的G/M代码速查手册,系统梳理了FANUC等主流系统中G00–G99、M00–M99标准指令的功能、作用范围与典型应用场景,有效解决编程时查表困难、功能混淆、系统差异不明… · 2026/11/3 20:24:52
谷歌开源ARTEMIS:AI视觉驱动移动端自动化,重定义手机AI Agent操作 做移动端自动化这么久,我越来越觉得,传统那套“写死坐标和控件ID”的做法,正在被一种新思路慢慢替代。那就是让AI直接“看”屏幕,像人一样思考下一步点哪里、划哪里。谷歌开源的ARTEMIS,就是这条路上一个非常有代表性的… · 2026/11/3 20:23:51
Traits技术解析:PHP、Rust与Scala中的代码复用实践 1. 什么是Traits及其核心价值Traits(特性)是一种面向对象编程中的代码复用机制,它允许开发者在不使用多重继承的情况下,将方法集合以模块化的方式注入到类中。我第一次接触这个概念是在2012年重构一个PHP项目时,当时为… · 2026/11/3 20:23:51
车载显示系统与性能优化:从SurfaceFlinger到底层调优实战 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 11:00:38
ESP32-S3桌面终端开发:MicroPython技术栈选型与落地实践 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 11:00:38
PX4仿真环境搭建:PX4、Gazebo、XRCE-DDS与QGC四组件关系详解 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 11:00:38
STM32按键输入全解析:GPIO读到的到底是什么? /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 11:00:38
GC6509两相双极步进驱动芯片:静音斩波与双接口工业级方案解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 11:00:38
物联网安全通信实战:TLCP协议与安全芯片的密钥保护方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 10:59:36
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 3:16:49
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 6:59:29
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 7:02:38
AI辅助技术栈评估:提升研发决策效率60% 1. 项目背景与核心价值技术决策一直是研发团队面临的重大挑战。随着技术生态的快速演进,技术栈的选择、维护和迭代变得愈发复杂。我们团队在过去两年里,先后经历了三次重大技术栈迁移,每次都需要投入大量人力进行技术评估和风险分析。直到去年… · 2026/11/4 0:00:17
从生成Token到直接决策:Jev如何重塑AI Agent工程实践 1. 从"生成文字"到"拍板决策":Jev 到底在解决什么问题大多数人第一次接触大模型,脑子里建立的模型是"输入问题、输出文字"。你问它今天天气怎么样,它给你一段描述;你让它写个周报,它给你… · 2026/11/4 0:00:17
32G统一内存跑大模型:内存账、TPS实测与端云分流 想在一台 32G 统一内存的小主机上把大模型跑成"日常可用",这件事我前后折腾了小半年。标题里说的这台 Mac mini M6,是我们这次讨论的目标平台,具体到手规格以实物为准;但下面这套推算方法和实测思路,对任何统… · 2026/11/4 0:00:17
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 3:16:49
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 6:59:29
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 7:02:38