C++物联网边缘网关开发实践:从原型到量产
1. 为什么物联网开发我选择了C手上的项目是一个典型的物联网边缘网关需要同时管理十几路Modbus传感器、两路串口设备还要把数据通过MQTT上报到云端中间夹杂着本地边缘判断逻辑。当初选型时团队内部争论了好几天有人坚持用C说资源占用最小有人提议直接用Python说开发速度快、生态好我最后拍板用了C并且一路把这个项目从原型推到了量产。先说说我为什么没有选C。C语言当然强大但到了物联网这个场景它的问题也非常现实数据结构靠手写内存靠手动管理代码一多就容易在细节上翻车。我们的网关要跑TCP、串口、MQTT、JSON解析、本地规则引擎如果全用C写光是把这些模块串起来就可能要写几千行胶水代码。调试阶段光是排查缓冲区越界和指针悬空就能让人崩溃更别提后期维护了。Python也有它的问题。我承认Python做原型很快但在资源受限的嵌入式设备上Python运行时本身就吃掉不少内存启动慢、实时性没有保障。我们的网关主控还是一个主频几百兆的ARM处理器内存只有几百兆跑Python再加业务线程内存占用很容易飘起来。更何况Python的GIL在多线程场景下会让并发抖动变得很难控制这对数据采集这种需要稳定节奏的任务来说非常致命。C在这两者之间找到了一个平衡点资源可控、性能逼近C同时又有现代语言特性来提升开发效率。RAII机制让资源管理变成了一件自然的事std::thread和std::async让多线程开发不再依赖手写pthread那一套繁琐逻辑STL容器直接消灭了一大半手工内存操作的bug。更重要的是C的模板和抽象能力让设备驱动层可以做得非常通用换一个传感器型号改几行配置就能适配不用重写整个协议栈。所以这个项目从一开始就走上了“C做核心逻辑C写驱动层”的路线后续所有模块包括串口采集、协议解析、MQTT通信、边缘策略引擎全部在同一个技术栈下完成。语言统一的好处越到后期越明显不用在C和Python之间来回切代码审查、模块复用、交叉编译配置都省了很多力气。2. 开发环境搭建与工具链选型2.1 交叉编译环境的一步步配置物联网项目绕不开交叉编译。我们的设备主控CPU是ARM Cortex-A系列开发机是x86架构直接在开发机上编译出来的二进制没法在目标板上跑所以第一步就要把交叉编译工具链配好。我用的是arm-linux-gnueabihf-g这套工具链安装完之后在CMake里指定编译器即可。这里有一个很关键的细节不只是编译器要换链接器、归档工具、以及sysroot都要一起指定否则编译能过、链接会报找不到libstdc这类错误。set(CMAKE_SYSTEM_NAME Linux) set(CMAKE_SYSTEM_PROCESSOR arm) set(CMAKE_C_COMPILER arm-linux-gnueabihf-gcc) set(CMAKE_CXX_COMPILER arm-linux-gnueabihf-g) set(CMAKE_LINKER arm-linux-gnueabihf-ld) set(CMAKE_AR arm-linux-gnueabihf-ar) set(CMAKE_FIND_ROOT_PATH /opt/arm-sysroot) set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)CMake里这四条FIND_ROOT_PATH_MODE的规则尤其重要。简单说PROGRAM设为NEVER表示找编译工具时用开发机上的程序LIBRARY和INCLUDE设为ONLY表示找依赖库时只从目标板的sysroot里找。我第一次配置时没注意这个规则结果链接器把开发机上的glibc链接进去了烧到板子上直接段错误排查了很久才定位到问题。sysroot我直接用目标厂商提供的根文件系统目录确保库版本和板子一致。编译选项上加了-O2和-ffunction-sections -fdata-sections配合链接选项-Wl,--gc-sections可以去掉用不到的符号二进制体积能缩小不少。对于一块只有几十兆存储空间的设备来说这类优化不是锦上添花而是保命用的。2.2 依赖库选型与裁剪思路嵌入式设备上装库不能像服务器那样随心所欲每一个库都会占用flash空间、内存和CPU周期。我最终选定的库组合是JSON解析json库用于处理云端下发配置和上报数据的序列化。MQTT通信使用一个开源的C MQTT客户端库支持QoS 0和QoS 1。Modbus协议栈用了轻量级的libmodbus跑在串行链路上。日志模块没引入第三方库直接用C流式接口自己封装了一个带时间戳、日志级别和环形缓冲输出。JSON解析库这块我特别想多说两句。物联网设备上报的数据结构看着简单实际用起来非常琐碎设备ID、时间戳、数值、状态码、扩展字段嵌套层级一多解析代码就变得难维护。我选的那个JSON库是header-only的编译简单性能也够用解析一次几KB的JSON消息耗时在毫秒级完全满足我们200毫秒上报周期的要求。还有一个容易被忽略的点目标板的glibc版本。交叉编译时如果开发机的glibc版本比目标板新编译出的程序在板子上会报版本不匹配。这个问题在项目初期狠狠坑过我一次后来我习惯在CMake里加一行检查宏把目标板的glibc版本直接打印出来编译前先确认一遍。3. 整体架构设计与核心模块实现3.1 分层架构驱动层、逻辑层、通信层网关程序如果所有功能堆在一个文件里代码规模上去之后维护就是灾难。我按功能把程序拆成了三层层与层之间通过接口通信互不干扰。驱动层负责和硬件打交道包括串口收发、Modbus轮询、GPIO状态读取。这一层只做数据采集不关心数据含义。逻辑层拿到驱动层的数据后做格式转换、阈值判断、本地缓存这些处理。通信层负责把处理后的数据按照MQTT协议封装发送同时接收云端指令下发到逻辑层。这三层之间我用C的接口类做了抽象class IDeviceDriver { public: virtual ~IDeviceDriver() default; virtual bool init() 0; virtual bool readData(std::vectorSensorData out) 0; virtual bool writeRegister(int addr, uint16_t value) 0; }; class IDataProcessor { public: virtual ~IDataProcessor() default; virtual void process(const std::vectorSensorData input, std::vectorReportData output) 0; }; class ICommunicationChannel { public: virtual ~ICommunicationChannel() default; virtual bool connect() 0; virtual bool publish(const ReportData data) 0; virtual bool receiveCommand(CommandMsg cmd) 0; };这样分层的好处是每个模块可以独立测试。我在开发机上先用模拟串口测驱动层再用本地MQTT broker测通信层最后才拉到板子上做联调。模块边界清晰之后出了问题能很快定位到具体层不用在整个程序里慢慢翻。3.2 Modbus串口采集的线程模型传感器采集是整个系统的数据源头采集不稳后面一切白搭。我们的设备走的是Modbus RTU串口波特率9600每路传感器约40个寄存器两路串口一共有十几个设备轮询一遍需要不少时间。我设计了一个采集线程负责所有Modbus通信轮询周期定为2秒每轮依次给每台设备发请求帧、读响应、解析数据。串口在同一时刻只能有一个请求在飞所以这个线程内部是严格串行的不加锁靠线程单一职责天然避免竞争。这里有一个实战细节Modbus RTU帧之间的间隔要求非常严格请求帧发出后要在规定时间内等到响应否则重试。我把每个设备的响应超时设成500毫秒每轮总耗时大概是设备数量乘以超时上限。遇到某个设备无响应时不能一直卡住不然整个采集链路就堵死了。超时后直接跳过该设备标记一次故障等到下一轮再尝试。void ModbusCollectThread::run() { while (running_) { for (auto device : devices_) { uint8_t req[64]; int reqLen buildReadRequest(device, req); int rlen serialWriteRead(req, reqLen, resp, sizeof(resp), 500); if (rlen 0) { auto data parseModbusResponse(device, resp, rlen); cache_.update(device.addr, data); device.failCount 0; } else { device.failCount; logError(Modbus timeout, addr: %d, device.addr); } } std::this_thread::sleep_for(std::chrono::milliseconds(200)); } }读回来的数据不是直接上报的而是先放到一个共享缓存里。这里涉及线程间通信我用了一个双缓冲结构采集线程往后台缓冲区写上报线程从前台缓冲区读写完交换指针配合一个简单的读写锁。这样的好处是上报线程永远不会读到写了一半的数据也不用为了读几个字节锁住整个采集过程。3.3 MQTT上报通道与心跳保活通信层我用MQTT协议接入云平台上报采用QoS 1级别。QoS 1保证消息至少到达一次如果云平台没有返回ACK客户端会自动重发。刚开始有同事建议直接用QoS 0说减少流量开销但在网络不稳定的工业现场QoS 0丢消息的概率不低数据采集场景下漏报比延迟更不可接受。MQTT客户端在C里维护了独立的网络线程回调函数触发时把收到的消息放入一个线程安全的队列由逻辑层异步处理。断线重连逻辑是必须自己实现的标准库虽然带了自动重连能力但重连时间间隔需要根据现场情况调整。我们的策略分三档第一次断线等5秒重连连续失败3次后等30秒超过10次则等5分钟。等5分钟这个策略是为了避免在云端短暂不可用的时候疯狂发起连接请求把设备自身的网络栈打满。void MqttChannel::onDisconnect() { failCount_; if (failCount_ 3) { reconnectDelay_ 5s; } else if (failCount_ 10) { reconnectDelay_ 30s; } else { reconnectDelay_ 300s; } logWarn(MQTT disconnected, retry in %lld s, reconnectDelay_); timer_.start(reconnectDelay_, [this] { reconnect(); }); }数据上报的payload格式也用JSON统一封装里面包含设备ID、时间戳、数据数组和固件版本号。云端那边解析起来直接、方便调试时用MQTT工具箱看裸报文也能一眼看出问题在哪。4. 设备资源管理与系统稳定性保障4.1 内存管理RAII带来的安全边界嵌入式环境里内存管理是头等大事。C语言风格里用malloc/free手动管理内存稍微一个分支忘记释放就泄漏C的RAII机制把资源生命周期绑定到对象生命周期上对象析构时资源自动释放这个特性在物联网这种长跑场景里价值巨大。我在整个项目里几乎没有写过裸的new和delete所有动态资源全部用智能指针或者容器管理。传感器数据用std::vector队列用std::deque定时器用std::shared_ptr包裹。极少数情况下需要自己管理原始内存我用std::unique_ptruint8_t[] 配合自定义删除器。这样即使代码中途抛出异常也不会把内存泄漏带到系统里去。另外一个细节是禁止在信号处理函数里做任何复杂操作。物联网设备经常要用信号处理来响应外部事件但信号处理器里调malloc或printf是未定义行为可能直接死锁。我的做法是信号处理器里只写一个自增的volatile标志真正的处理逻辑放在主循环中轮询这个标志。4.2 日志系统与看门狗嵌入式调试最大的痛点是没有console可以随时看。设备部署在客户现场程序崩溃了根本不知道原因。我专门写了一套轻量级日志系统支持分级输出、环形缓存、以及异常时自动把最近500条日志写到flash。日志环形缓存是这整套系统里性价比最高的一个模块。运行正常时不打扰人出问题后打开日志文件能看到崩溃前几十秒的完整现场所有操作按时间顺序排列问题定位比大海捞针高效得多。生产环境的稳定性还依赖硬件看门狗。程序里开了一个看门狗线程每隔几秒喂一次狗如果主循环卡死超过设定时间看门狗触发系统重启。但喂狗不能太机械我在采集线程、通信线程和主循环三处都设置了心跳标记喂狗前检查这三个标记是否都在最近一个周期内更新过任何一个标记过期就拒绝喂狗人为触发重启。这个设计救了我们很多次有几个偶发卡死的bug就是这样被捕获并及时恢复的。4.3 掉电保护与配置持久化工业现场经常遭遇突然断电如果参数配置、累积数据只存在内存里一掉电全部归零客户绝对不接受。配置数据我用JSON格式存储在flash分区上写入策略是“先写临时文件再原子重命名”。这样即使写入到一半掉电旧文件依然完好重启后能自动回退到上一次可用的配置。统计数据的持久化稍微复杂一点如果每秒钟都刷一次flashflash寿命很快耗尽。我把统计数据在内存里累积每5分钟批量写入一次同时维护一个标志位表示“内存数据比flash新”。正常重启时主动刷一次flash异常断电时重启后用内存缓存兜底尽量减少数据损失。注意flash写入寿命有限频繁擦写是大忌这个方案在读写频率和可靠性之间取了平衡点。5. 常见问题与排查实录5.1 串口丢帧与波特率漂移我在项目调试中遇到的第一类典型问题是传感器数据偶发错误。现场表现是大部分时间正常但每隔一段时间会出现一个逻辑上完全不可能的数据比如温度突然跳到150度。排查过程非常折磨人。一开始怀疑传感器坏了换新的也一样。后来用逻辑分析仪抓串口波形发现设备在长时间运行后串口时序出现了微小的偏移。原因是主控板晶振精度不够加上温度变化导致波特率漂移。数据帧的起始位还能对齐但是数据位在采样点上已经偏移到了边缘读出来自然错位。解决方法是两件事一方面是让产品换更高精度的晶振硬件层面减少漂移另一方面在软件里加了帧校验和合理性检查凡是校验失败或超出合理量程的数据直接丢弃绝不上报。从那之后云端再也没出现过离谱数据。这个经验给我的教训是嵌入式里“偶发错误”从来都不是随机的背后必然有确定的物理原因。排查范围不要只限在软件里要敢于怀疑硬件。5.2 内存持续增长问题系统联调期间发现一个严重问题运行几天后内存占用逐步攀升快要达到上限时就触发重启。从现象判断是内存泄漏但代码量不小逐行扫很难定位。我采取的排查方法是逐步禁用模块二分区先关掉MQTT上报线程观察内存曲线曲线平了确认问题在通信模块再深入通信模块逐个函数排查最后定位到MQTT消息回调里每收到一条消息就new一个对象但在某些错误分支下没有释放。定位到问题后修复只用了三行代码把裸指针改成std::shared_ptr。从那以后我给自己定了一条规矩多线程环境下共享的数据禁用裸指针要么智能指针、要么共享缓存容器。这条规矩后来帮我避开了好几个类似的坑。5.3 MQTT断线重连的抖动陷阱另一个印象深刻的问题是断线重连引起的设备批量离线。有次云平台做了架构调整短暂不可用了几分钟恢复后出现了大量设备同时重连把接入网关瞬间打满健康检查机制误判系统过载又踢掉了一批连接形成了“连接风暴”。解决方案是给重连加抖动每个设备根据自身ID生成一个随机偏移量重连等待时间等于基准时间加上这个偏移。这样即使几百台设备同时掉线重连也不会挤在同一时刻。这个方案简单但非常有用后来在客户现场遇到电网波动导致批量掉线时这套机制稳住了整个系统。事故复盘后我还在重连逻辑前加了一个“网络预检”步骤先ping一下云端主机的网关地址网络不通就直接跳过本轮重连降低无效连接次数。6. 边缘计算与策略引擎的落地6.1 边缘规则引擎的数据处理项目中期客户提出新需求某些关键设备的告警不能等数据上云再判定要在本地直接出结果甚至要能联动继电器做断电保护。这意味着网关必须拥有边缘计算能力。我基于C写了一个极简的规则引擎规则由云端下发的JSON描述。每条规则包含触发条件、比较操作符、阈值和动作。收到传感器数据后逻辑层逐条匹配本地规则满足条件就立即执行动作同时把动作结果一并上报云端。{ ruleId: TEMP_HIGH_01, deviceAddr: 3, field: temperature, operator: , threshold: 85.0, action: { type: relay, target: 2, value: off } }规则引擎放在本地还有一个额外的好处设备断网时告警联动依然有效。就算云平台完全不可达现场的安全机制也不会失效这对工业场景来说是非常硬性的需求。6.2 模块化设计带来的维护便利规则引擎的实现没有和采集逻辑耦合而是独立编译成一个动态库主程序通过接口加载。每次更新规则不用升级整个固件只替换规则库文件再触发一次热加载就行。设备在客户现场能远程更新一个模块显然比重刷整机固件安全得多。这个设计的缺陷是增加了程序体积和加载复杂度但对交付后的升级便利来说完全值得。选架构的时候多花一点时间后期维护能省十倍功夫。7. 从项目原型到量产的实践心得项目从第一行代码到首批量产设备交付前后花了大概五个月。这个周期在物联网产品里不算快但考虑到设备要24小时不间断运行稳定压倒一切前期多花时间打磨是值得的。我总结经验时想到几条特别值得分享的细节。第一条嵌入式debug手段要提前准备。量产设备不像开发板没有JTAG也没有串口console随时待命日志系统、远程诊断接口、崩溃信息落盘能力必须在开发早期就内置好后面再补的成本非常高。第二条交叉编译环境要固化成脚本团队新成员加入时一键就能搭好环境不要在每个人电脑上手工折腾一遍光是编译器版本不一致就够磨掉好几天时间。第三条代码规范要严格执行。C这门语言能玩的技巧非常多但如果团队里几个人各写各的风格代码审查会变成一场灾难。我们内部规定不使用异常传播业务错误、不用多重继承、所有对外接口都用纯虚类这些约束看起来保守但维护起来心情愉悦很多。第四条压力测试必须做够时间。我们的网关在实验室连续跑了三个月的稳定性测试期间人为模拟了串口拔插、网络断开、云端宕机、电压波动每一个异常场景都反复跑。很多偶发问题就是在长时间压测中暴露出来的而不是到了客户现场才被发现的。后面如果这个项目继续演进我计划做两件事一是把规则引擎升级成支持更多数据源类型让设备联动能力更强二是引入OTA远程升级实现对设备固件和规则库的无感更新。这两块直接影响客户侧的运维成本也是物联网产品从“能用”走向“好用”的关键一步。

相关新闻

Agent技能层设计实战:从Prompt拼装到可复用模块的工程范式

Agent技能层设计实战:从Prompt拼装到可复用模块的工程范式

去年我重构一个内部知识助手的时候,最头疼的并不是模型选型,而是每个新场景都要重新拼Prompt、接工具、调参数。同事在A场景里调通的一套动作,换到B场景基本作废,代码越堆越乱,负责维护的人也说不清“这个Agent到底会做…

2026/10/13 21:20:14 阅读更多 →
Python控制Arduino与树莓派:从入门到实战的完整指南

Python控制Arduino与树莓派:从入门到实战的完整指南

把Python和Arduino、树莓派放到一块儿,很多人第一反应是“不搭”——搞单片机的人开口闭口C语言,搞嵌入式的人每天都在跟寄存器较劲,Python这种“跑在解释器里的脚本”怎么也来掺和硬件?但如果你像一部分同行一样,本身…

2026/10/13 21:20:14 阅读更多 →
LiteLLM实践:统一大模型API网关,搞定多模型接入与治理

LiteLLM实践:统一大模型API网关,搞定多模型接入与治理

做AI应用最让人头疼的不是模型效果,而是各家接口不统一。今天要聊的LiteLLM(项目名是litellm),就是解决这个问题的开源方案:一套网关,把所有模型服务商的API收拢成同一个格式,后端怎么换&#x…

2026/10/13 21:20:14 阅读更多 →

最新新闻

DNA到蛋白质的完整路径:转录、翻译与中心法则的分子实战

DNA到蛋白质的完整路径:转录、翻译与中心法则的分子实战

DNA怎么变成蛋白质?这个问题的完整答案,比课本上那张中心法则的箭头要丰富得多。我当年第一次给学生讲清楚转录和翻译的全程时,最深的感受是:知识链条其实不长,但每一环都有大量“看似理所当然、实则经不起追问”的细节…

2026/10/14 3:40:38 阅读更多 →
基于CNN的水下声源定位实战:从数据到部署全流程

基于CNN的水下声源定位实战:从数据到部署全流程

简介:一套基于PyTorch的海洋水下声源定位实战项目,使用卷积神经网络(CNN)对水下声学信号进行建模,预测声源方位角与距离,完整覆盖从声学数据到位置估计的流程。资源面向水声工程、人工智能、电子信息、自动…

2026/10/14 3:40:38 阅读更多 →
Falcom经典游戏源码构建与调试实战指南

Falcom经典游戏源码构建与调试实战指南

简介:本资源为Falcom十大经典游戏系列的项目源码整理包,面向游戏开发初学者、JRPG爱好者及逆向分析兴趣者,提供一份轻量级参考素材,辅助理解经典日式RPG的设计脉络与基础架构逻辑。压缩包共3个文件,含1个HTML页面&…

2026/10/14 3:40:38 阅读更多 →
秋叶SD整合包V5.0代码版:从改代码到批量出图API实战

秋叶SD整合包V5.0代码版:从改代码到批量出图API实战

简介:秋叶SD整合包V5.0面向希望快速上手Stable Diffusion的Windows新手用户,解决环境配置繁琐、参数调节门槛高的问题。资源包共3个文件,以inscode工程配置、html页面与gitignore忽略规则为主,压缩包仅6KB,属于轻量级代…

2026/10/14 3:40:38 阅读更多 →
三站时差定位球面模型实战:从时差解算到经纬度

三站时差定位球面模型实战:从时差解算到经纬度

简介:这份资源围绕三站时差定位(TDOA)展开,面向无线通信、雷达定位与物联网设备追踪方向的学习者和开发者,重点解决无GPS覆盖环境下利用信号到达时间差解算信号源位置的问题。内容涉及Chan提出的球面TDOA实现思路&…

2026/10/14 3:40:38 阅读更多 →
一张图微调YOLOv11:自然栖息地鸟类检测的流程与扩充

一张图微调YOLOv11:自然栖息地鸟类检测的流程与扩充

简介:面向 YOLOv11 模型验证需求,这份精简版鸟类目标检测数据集包含一张真实野外鸟类图像及配套标准标注,可用于快速原型验证、轻量级部署测试与小样本检测基线建立。压缩包共五个文件,包含三张 JPG 图像、一个数据配置文件与一个…

2026/10/14 3:39:38 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 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/13 22:01:27 阅读更多 →
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/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练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/12 18:11:17 阅读更多 →