C# MQTT客户端工程实践:从协议原理到断线重连
简介这是一份基于C#实现的MQTT协议客户端完整工程面向物联网开发者、上位机工程师以及需要学习MQTT通信机制的编程人员主要解决设备与MQTT服务器之间轻量级发布/订阅消息传输和远程监控需求。工程压缩包共35个文件包含9个C#源码文件、M2Mqtt等动态链接库、可直接运行的exe程序以及配置文件、界面资源和项目解决方案等配套文件整体仅223KB结构紧凑、便于快速部署和二次修改。当前已有4171人学习下载。源码完整覆盖了MQTT连接建立、主题订阅与发布、QoS三种服务质量级别、心跳保活等核心机制同时通过上位机界面展示了连接管理、订阅消息实时显示等功能的具体实现。借助该工程开发者既能快速搭建自己的MQTT客户端也能深入理解C#与MQTT库的集成方式为智能家居、工业数据采集、远程设备监测等场景提供可复用的代码基础。1. MQTT客户端C#版别把消息通信做成玄学做设备数据采集上位机时十有八九会在MQTT上栽跟头连接建好了跑半小时静默断线QoS设成1业务数据却收到两条设备离线了遗嘱消息死活不触发。这些问题不是协议本身复杂而是客户端封装没做到位。这份C#版MQTT客户端资源就是把通信链路的最后一公里做完——连接管理、订阅分发、断线重连、遗嘱参数、心跳保活都封装成工程代码拿到就能跑。适合三类人写物联网上位机的C#工程师做智能硬件配套调试的开发者以及刚接触MQTT、想绕开各种暗坑的新手。新手可以直接抄连接与订阅的写法熟手则能在此基础上改参数、扩展协议层而不必从零拼TCP报文。2. MQTT核心机制与C#选型先搞懂协议再写代码2.1 主题、质量等级、会话状态三个绕不开的协议概念MQTT基于发布订阅模型客户端之间不直接通信而是通过服务端代理中转。理解这一层后面调参才不糊涂。主题是消息的路由标识用斜杠分层形如device/001/telemetry。订阅时可以用通配符匹配单层#匹配多层。比如订阅device//telemetry能收到device/001/telemetry和device/999/telemetry但收不到device/001/status。最容易翻车的写法是把#放在非末尾位置或者错用*——MQTT根本不认识星号。质量等级QoS是MQTT的可靠度档位QoS 0最多一次消息可能丢QoS 1至少一次保证送达但可能重复QoS 2恰好一次最可靠但开销最大。工程上绝大多数场景用QoS 1但接收端必须做去重否则重复消息会在业务层放大成重复订单、重复计数。会话状态由CleanSession标志决定。设为true时连接断开后服务端清空该客户端的订阅与离线消息设为false时建立持久会话客户端重连后能收到离线期间积压的消息。这里的“离线消息”只有QoS 1和2的消息才会被积压QoS 0直接丢弃。2.2 为什么C#里选MQTTnet而不是自造轮子自己用Socket拼MQTT报文不是不能做但Connect报文的可变头、SUBSCRIBE报文的报文标识符、心跳超时判定这些细节足够消耗大量调试时间。成熟方案里C#生态最常用的是MQTTnet一个开源的.NET MQTT客户端库主要优势有三点支持netstandard能跨平台跑在Windows、Linux和嵌入式环境里异步模型贴合C#的async/await写法预留了扩展点从报文拦截到通道适配都可以改。选型代价也要清楚库的版本升级较快API发生过调整比如3.x和4.x的命名空间和委托签名有差异。项目里使用时应锁定一个稳定版本不要随手升到最新。用NuGet安装时固定写法是dotnet add package MQTTnet --version 4.3.6.1151版本号以你的工程目标框架为准。锁定版本后后续构建和部署才不会被API变动打乱。2.3 最小可运行客户端一条连接加一个订阅先不看完整工程把最核心的连通链路跑通。以下代码创建客户端、配置连接参数、连上服务端并订阅主题using MQTTnet; using MQTTnet.Client; using MQTTnet.Protocol; var factory new MqttFactory(); using var client factory.CreateMqttClient(); var options new MqttClientOptionsBuilder() .WithTcpServer(127.0.0.1, 1883) .WithClientId(edge-collector-01) .WithCleanSession(true) .WithKeepAlivePeriod(TimeSpan.FromSeconds(30)) .Build(); client.ConnectedAsync e { Console.WriteLine(已连接开始订阅); return client.SubscribeAsync( new MqttTopicFilterBuilder() .WithTopic(device//telemetry) .WithQualityOfServiceLevel(MqttQualityOfServiceLevel.AtLeastOnce) .Build()); }; client.ApplicationMessageReceivedAsync e { Console.WriteLine($收到 {e.ApplicationMessage.Topic}: {e.ApplicationMessage.PayloadSegment}); return Task.CompletedTask; }; await client.ConnectAsync(options, CancellationToken.None); Console.WriteLine(连接已建立按任意键退出); Console.ReadKey();这段代码里的参数含义要逐个说清。WithTcpServer指定服务端地址和端口局域网调试时填设备实际IP不要一直用127.0.0.1。WithClientId是客户端唯一标识服务端用它区分连接重复会导致旧连接被踢下线。WithCleanSession(true)表示非持久会话适合数据采集这类不需要离线补发的场景。WithKeepAlivePeriod控制心跳包发送间隔这点后面会细讲。ConnectedAsync在连接成功时触发这里把订阅动作挂在连接事件里能保证断线重连后自动恢复订阅。如果不这样做重连成功后订阅会丢失消息就静默漏掉了。ApplicationMessageReceivedAsync是消息到达的统一入口后续工程化改造会从这里扩展。3. 工程化客户端设计订阅分发、去重与断线重连3.1 别把业务塞进回调先用消息分发器接住直接将业务逻辑写在ApplicationMessageReceivedAsync里是维护噩梦的起点。设备类型一多、主题一杂这个回调会膨胀成几百行的if-else。工程上我会先做一层消息分发器按主题路由到不同处理器public sealed class MqttMessageDispatcher { private readonly Dictionarystring, FuncMqttApplicationMessage, Task _handlers new(); public void Register(string topicFilter, FuncMqttApplicationMessage, Task handler) { _handlers[topicFilter] handler; } public async Task DispatchAsync(MqttApplicationMessage message) { foreach (var kvp in _handlers) { if (TopicMatcher.IsMatch(message.Topic, kvp.Key)) { await kvp.Value(message); } } } }这里的关键是TopicMatcher.IsMatch它负责把收到的具体主题和订阅过滤器匹配。匹配规则不复杂把主题按/拆段过滤器里的匹配任意单段#匹配剩余所有段。注意不要用简单的字符串包含判断device/001包含device但语义上完全不是一类消息。分发器注册业务处理时大致是下面这样var dispatcher new MqttMessageDispatcher(); dispatcher.Register(device//telemetry, msg { // 解析温湿度数据写数据库或推给界面 return Task.CompletedTask; }); dispatcher.Register(device//status, msg { // 处理设备上下线状态 return Task.CompletedTask; });3.2 QoS选型与去重QoS 1必须配一个去重机制QoS三种档位的选择思路QoS 0适合高频、允许丢失的传感数据比如温湿度每秒上报一次丢一个点不影响趋势QoS 1适合指令下发和关键数据上报QoS 2在业务系统里很少用因为服务端和客户端的消息流转都要做两次握手吞吐量明显下降只有当重复或丢失会造成严重资损时才考虑。多数项目选QoS 1代价是重复。重复来源有两个一是发送端在超时未收到确认时重发二是重连后服务端把未确认的消息重新推送。业务侧必须去重。去重方案分层设计。最简单的做法是每条消息带一个自增ID或业务唯一键接收端维护一个最近处理过的ID集合private readonly HashSetstring _processedIds new(); private readonly object _lock new(); public bool TryMarkProcessed(string messageId) { lock (_lock) { return _processedIds.Add(messageId); } }收到消息后先调用TryMarkProcessed返回false说明处理过直接跳过。注意集合要控制大小避免内存无限增长常用做法是用定时清理或固定容量的环形缓冲。对于有数据库的场景更稳妥的是在业务表里建唯一索引用数据库去重客户端只做第一道过滤。3.3 断线重连与遗嘱参数怎么配才不会翻车断线重连不是简单套一个while循环。最怕的是连接不稳定时疯狂重连把服务端打成拒绝服务。我建议用指数退避并加上最大重试间隔与抖动int retryCount 0; while (!client.IsConnected) { try { await client.ConnectAsync(options, CancellationToken.None); retryCount 0; } catch (Exception ex) { retryCount; int delaySeconds Math.Min(30, 1 Math.Min(retryCount, 5)); var jitter Random.Shared.Next(0, 1000); await Task.Delay(TimeSpan.FromSeconds(delaySeconds) TimeSpan.FromMilliseconds(jitter)); } }退避逻辑里的关键参数初始间隔1秒每次翻倍封顶30秒。加抖动是为了避免几十个设备同时掉线后同步重连错峰能显著降低服务端瞬时压力。重连成功后由于连接建立事件里已经做了订阅恢复订阅不需要额外处理。遗嘱消息Will Message是MQTT的独特能力。客户端连接时宣告一份遗嘱当服务端检测到异常断开网络中断、设备断电时代替客户端发布这条消息。遗嘱消息适合用来通知其他系统“这个设备掉线了”。配置遗嘱的正确写法var options new MqttClientOptionsBuilder() .WithTcpServer(127.0.0.1, 1883) .WithClientId(edge-collector-01) .WithCleanSession(true) .WithWillTopic(device/001/status) .WithWillPayload(offline) .WithWillQualityOfServiceLevel(MqttQualityOfServiceLevel.AtLeastOnce) .WithWillRetain(true) .Build();这里WithWillRetain(true)很关键。保留消息会让服务端保存这条offline状态新订阅的客户端立刻能收到最后的在线状态而不是要等下一次状态变化才知道设备掉线。如果设了遗嘱但忘了retain新接入的监控端拉不到当前状态经常出现“设备都断了半天界面还显示在线”的怪象。4. 心跳保活与性能调优把KeepAlive、缓冲区调到合理区间4.1 KeepAlive间隔与服务端超时判定的倍数关系心跳是MQTT保活的核心机制。客户端在空闲时发送PINGREQ报文服务端收到后回应PINGRESP。这里有个关键倍数关系客户端设置的KeepAlive间隔决定了服务端认定连接死亡的最长等待时间而这个等待时间通常是间隔的1.5倍。如果客户端30秒发一次心跳服务端45秒没收到任何报文就会断开连接。表格列出实际项目里的推荐区间场景保活间隔说明局域网内设备采集15秒网络稳定间隔可短断线发现更快跨公网设备接入30~45秒兼顾延迟与流量开销窄带无线模块60秒及以上省电省流量但掉线感知慢最怕的是把KeepAlive设成0或一个极大值。0表示关闭心跳机制服务端只能靠TCP层判断死链而TCP超时往往要几分钟甚至更久期间服务端会认为客户端还活着遗嘱也不会触发。有人把KeepAlive设成120秒结果服务端默认超时60秒连接必然被周期性掐断日志里全是“Socket closed”这就是典型的参数不匹配翻车。4.2 消息大小、缓冲区与写入超时的边界设置MQTT协议默认允许的最大报文长度是256MB但实际工程里不会这么配。服务端和客户端之间要约定一个合理的报文上限。常见做法是在连接参数里设置最大报文大小.WithMaximumPacketSize(1024 * 1024) // 1MB 上限设置后超过1MB的消息会被服务端拒绝或丢弃。问题在于很多C#项目用的是默认配置消息一大就出现写入超时或连接重置。这里要区分两个超时连接超时是指建立TCP连接的最大等待时间适合设成10秒左右而写入超时影响的是发布消息时发送缓冲区写满后的等待这个值要结合消息频率来调一般5~15秒。对大消息的另一个处理方式是拆分。比如一个设备一次上传几百KB的日志不要让客户端直接发布整个文件而是拆成多个分片消息每个分片带序列号和总数接收端组装。这样单条消息小、缓冲区压力小即使某一片重传也不会影响整包。4.3 多客户端并发与线程模型评估单机跑多个MQTT客户端实例是常见的比如一个线程管一个设备分组。要注意ClientId必须全局唯一否则后连接的会把先连接的踢掉。实践中碰到的“A连接一建立B就掉线”多半就是ClientId写死了。线程模型上MQTTnet客户端每个连接会有独立的接收循环和消息队列。开几十个客户端实例时每个实例至少占一个线程做IO等待再加上回调处理线程资源开销不能忽视。批量接入场景更合理的做法是单客户端连接、多主题订阅靠分发器路由而不是堆实例。评估资源占用时我习惯按每个连接约占用1.5~2MB内存、1~2个线程来估算。一台8GB内存的工控机跑200个连接压力不大但如果每个连接都开独立Task做业务处理线程上下文切换会成为瓶颈。5. 避坑与排查连接断开、消息重复、主题不匹配的五个真实案例5.1 连接成功但持续断线日志不断出现Socket closed现象客户端能连上服务端但每隔一两分钟就掉线日志里重复出现socket closed重连后又恢复正常然后又断。原因绝大多数情况是KeepAlive间隔大于服务端的断开判定超时。服务端按自己的配置计算保活超时比如某些开源代理默认60秒无报文判定死链而客户端KeepAlive设成了120秒中间没有心跳连接被代理主动掐断。另一种可能是网络中有NAT设备空闲连接被老化回收。解决把客户端保活间隔调到服务端超时时间的一半左右。先查服务端配置确认它的KeepAlive校验窗口再回填客户端参数。比如服务端是60秒客户端设30秒。同时检查是否正确启用了心跳有的库需要显式调用WithKeepAlivePeriod不少人漏掉这行。5.2 QoS 1下收到重复消息业务数据被处理了两次现象发布端设QoS 1接收端偶尔打印出同一条消息两次数据库里出现重复记录。原因QoS 1本身就是“至少一次”重复是协议允许的。典型触发场景是接收端处理消息的过程中网络抖动服务端没收到确认重连后把未确认的消息重新推送。而应用层没有做去重直接把每一条消息都当成新数据落库。解决接收端引入消息去重机制。优先用业务唯一键做数据库唯一索引比如设备编号加序列号同时在内存里维护最近消息ID集合做第一道过滤代码写法见3.2节。注意发布端也要配合确保每条消息里都带唯一的业务标识去重才有依据。5.3 设备断电后遗嘱消息没触发界面一直显示在线现象设备突然断电等了五分钟订阅端没有收到offline遗嘱状态仍显示在线。原因遗嘱触发的前提是服务端感知到连接断开。如果客户端KeepAlive设得很大或者网络中间层对TCP死链有很长的保持时间服务端可能要几分钟才能判定连接失效遗嘱自然延迟。另一种常见疏漏是CleanSessiontrue且遗嘱retain没开启即使遗嘱发布了订阅端因为没有保留消息也拿不到最新状态。解决调小保活间隔让断线感知时间可控。遗嘱使用retain标志新订阅端一上来就能拿到当前状态。如果设备对掉线感知要求很高还可以在业务层加一个“心跳超时未上报则标记离线”的逻辑双保险比单靠遗嘱可靠得多。5.4 订阅#能收到消息换成device//status后就收不到了现象订阅通配符#时一切正常换成device//status后设备上报的消息一条都收不到。原因主题层级不匹配。device/001/status/extra是四层device//status只匹配三层后者收不到前者。更常见的坑是发布端实际发布到device/001/status/尾部多了斜杠在字符串上看着差不多但层级解析完全不同。解决先打开服务端的日志确认消息实际到达的主题是什么再做比对。排查时用小工具订阅#观察真实主题然后对照过滤器修改。写过滤器时记住匹配一层#匹配剩余所有层且#必须放在末尾。不要为了省事全部用#流量大了之后接收端根本忙不过来。5.5 程序退出时消息丢失重启后错过离线数据现象客户端正常关闭程序刚刚发布出去的消息没被服务端收到或者重启后想收离线期间的消息一条也没有。原因程序退出时直接调用Dispose或者进程被强杀发布队列里的消息还没写完就断开了。另外CleanSessiontrue意味着服务端不保存会话数据离线期间积压的消息不会补发。解决退出前先优雅关闭连接。先停止订阅再发布遗嘱如果需要最后调用DisconnectAsync并等待确认。对于需要离线补发的场景连接时设CleanSessionfalse退出时不要发DISCONNECT服务端会保留会话和消息。但要注意持久会话会导致服务端内存增长需要配套消息过期时间否则积压消息越来越多重连时一次性推送的量大到把客户端拖垮。6. 进阶验证搭一个本地代理压测客户端确认消息不丢与重连恢复接手一个MQTT客户端工程后我不会急着写业务代码而是先搭一个本地代理环境把连接、重连、消息可靠性验证一遍。这个过程能提前暴露绝大多数“跑一段时间就出怪问题”的隐患。验证环境用一个开源MQTT代理即可在一台Windows或Linux机器上启动监听1883端口。然后写一个压测脚本用一个发布客户端向perf/topic循环发送带序列号的消息接收客户端订阅该主题并统计收到的序列号int expected 0; var gaps new Listint(); client.ApplicationMessageReceivedAsync e { var seq int.Parse(Encoding.UTF8.GetString(e.ApplicationMessage.Payload)); if (seq ! expected) { gaps.AddRange(Enumerable.Range(expected, seq - expected)); expected seq 1; } else { expected; } return Task.CompletedTask; };压测分三组跑QoS 0、QoS 1、QoS 2各发1000条消息统计序列空洞。QoS 0允许有丢但如果QoS 1也出现空洞就要查服务端和客户端的会话配置。跑压测时我会手动把客户端网络断掉一次再恢复观察重连是否成功、重连后订阅是否恢复、离线期间的消息是否补齐。网络断开模拟可以用防火墙临时阻断端口或者在客户端里加一个调试开关强制断开连接。重连恢复的判定标准是断线期间服务端积压的消息在重连后按顺序到达且不出现重复处理。如果客户端用的是CleanSessiontrue这个断言就不成立所以要明确测试场景对应的配置。从那以后我每接手一个MQTT项目第一天就强制走一遍这套压测流程确认丢包率、重连时间、订阅恢复三项指标满足要求才让业务代码往上叠。这套验证习惯帮我挡掉了好几次“看似连接正常、实则消息黑洞”的隐蔽问题希望帮到你。本文还有配套的精品资源点击获取

相关新闻

VSC-MMC仿真建模实践:原理、参数计算与调试避坑

VSC-MMC仿真建模实践:原理、参数计算与调试避坑

提到基于VSC的MMC仿真,不少刚接触柔性直流的朋友第一反应是“原理图太密、公式太多”。我最初接手这个方向时也一样,看着桥臂上一串子模块,差点劝退。但实际动手搭过一轮仿真之后,我发现只要把“电压源换流器(VSC&…

2026/10/16 5:05:29 阅读更多 →
别再迷信8小时:用睡眠周期和起床时机找到你的最佳睡眠时长

别再迷信8小时:用睡眠周期和起床时机找到你的最佳睡眠时长

先说个我自己的经历。有一阵我特别迷信“睡足8小时”,每天闹钟固定在早上7点,晚上不管困不困都逼自己11点上床。结果呢?半夜频繁醒,早上起来像被人从被窝里硬拖出来一样,白天还得靠两杯咖啡续命。后来有几天加班&#…

2026/10/16 5:05:29 阅读更多 →
大模型不生成视频:从文本到成片的五步制作流水线详解

大模型不生成视频:从文本到成片的五步制作流水线详解

最近“Claude Opus 5.5 能生成视频”的说法在一些技术社区里传得很猛,我刷到好几个帖子,标题一个比一个唬人,点进去一看,要么是把模型生成的动画代码误当成“视频指令”,要么直接拿某个渲染结果截图说模型出片了。作为…

2026/10/16 5:05:29 阅读更多 →

最新新闻

OpCore-Simplify 一键生成可用的 OpenCore EFI:黑苹果自动化配置五步指南

OpCore-Simplify 一键生成可用的 OpenCore EFI:黑苹果自动化配置五步指南

OpCore-Simplify 一键生成可用的 OpenCore EFI:黑苹果自动化配置五步指南 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify 当你准备在一台旧…

2026/10/16 5:51:44 阅读更多 →
WinPythondot-32bit 3.10.5.0 发行版解析:dot 风味的精简型 Python 3.10 便携发行包

WinPythondot-32bit 3.10.5.0 发行版解析:dot 风味的精简型 Python 3.10 便携发行包

开发工具构建工具CLI包管理器 【免费下载链接】winpython A free Python-distribution for Windows platform, including prebuilt packages for Scientific Python. 项目地址: https://gitcode.com/gh_mirrors/wi/winpython 点击查看 免费下载 本文面向使用与构建…

2026/10/16 5:51:44 阅读更多 →
AI论文写作工具实测:专科毕业论文从开题到降重全攻略

AI论文写作工具实测:专科毕业论文从开题到降重全攻略

写专科毕业论文,最难熬的往往不是写作本身,而是“不知道往哪里写”。开题报告不会搭框架,正文憋不出三千字,参考文献搜半天全是目录页,查重率一出来40%——这种体验我见过太多专科生经历过。所以这次我花了差不多两周时…

2026/10/16 5:51:44 阅读更多 →
asc-devkit 通算融合算子 HCCL 服务端类型配置指南:HcclServerType 接口原理与实战

asc-devkit 通算融合算子 HCCL 服务端类型配置指南:HcclServerType 接口原理与实战

人工智能深度学习算子库CANNAscend 【免费下载链接】asc-devkit 本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言,原生支持C和C标准规范,主要由类库和语言扩展层构成,提供多层级API,满足多维场景算子开发诉求。 项目地址&…

2026/10/16 5:51:44 阅读更多 →
Kimi入局具身智能:技术路径、学习路线与开发者机会

Kimi入局具身智能:技术路径、学习路线与开发者机会

1. 从一条行业传闻说起:Kimi入局具身智能到底意味着什么前几天在几个技术群里同时刷到一条消息,说Kimi可能要入局具身智能领域。说实话,第一反应不是惊讶,而是"终于来了"。过去一年多,大模型赛道从百模大战打…

2026/10/16 5:51:43 阅读更多 →
OpenSceneGraph 缩放平移实战:从原理到顺滑交互实现

OpenSceneGraph 缩放平移实战:从原理到顺滑交互实现

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

2026/10/16 5:50:43 阅读更多 →

日新闻

个人 AI Agent 平台接入 TaoToken:统一 Key 与 API 通道的配置大纲

个人 AI Agent 平台接入 TaoToken:统一 Key 与 API 通道的配置大纲

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

2026/10/16 0:00:05 阅读更多 →
信号与系统频域分析作业解题指南

信号与系统频域分析作业解题指南

1. 作业背景与核心要求解析信号与系统作为电子信息类专业的核心基础课,其作业设计往往直接关联课程的核心知识框架。2026年春季第六次作业的布置,通常对应着课程进展到频域分析的关键阶段。根据常规教学进度推测,本次作业可能涉及以下核心内容…

2026/10/16 0:00:05 阅读更多 →
Django MVT实战:从零构建图书借阅系统,彻底搞懂Model-View-Template分层

Django MVT实战:从零构建图书借阅系统,彻底搞懂Model-View-Template分层

1. 从一个"四不像"的练手项目说起如果你已经看完了Django的官方教程前几章,跟着敲完了投票应用,大概会有一种"我好像会了,又好像什么都不会"的割裂感。教程里每个知识点都是拆开的——这一章讲模型,下一章讲视…

2026/10/16 0:00:05 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/15 16:18:54 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/15 19:41:51 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/15 13:48:15 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

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

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式: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/10/16 3:49:43 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

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

2026/10/15 9:49:14 阅读更多 →