BLE OTA断点续传与恢复设计实战指南
1. 为什么BLE断连不是“失败”而是OTA升级必须预设的常态场景很多人一看到“BLE断连”第一反应是设备出问题了、通信不稳定、协议没写好——然后立刻去查蓝牙信号强度、重试次数、MTU大小甚至怀疑天线设计。但在我过去五年做嵌入式固件升级方案的经历里BLE断连从来就不是异常而是OTA流程中一个被刻意设计、反复验证、必须容纳的确定性事件。它不像Wi-Fi断网那样需要“重连恢复”而更像电梯运行中的一次短暂停顿你不会因为电梯在2楼和3楼之间暂停0.3秒就认定它故障因为你清楚它的机械结构、电机响应、楼层定位逻辑本身就允许并处理这种瞬态。BLE OTA升级的本质是把一块几十KB到几MB的固件镜像通过一条带宽窄典型BLE 5.0 PHY层理论速率2Mbit/s实际应用层吞吐常低于100KB/s、连接脆弱手机端后台策略、系统省电机制、蓝牙协议栈调度优先级低、状态不可控用户随时可能锁屏、切应用、进入地铁隧道的无线链路完整、准确、可验证地传输到资源受限的MCU上。在这个过程中“断连”不是bug而是物理层和协议栈对现实世界妥协后的自然结果。我手上正在维护的三款量产设备平均每次OTA升级过程会经历1.7次主动断连非异常掉线其中83%发生在升级进度60%~90%区间——这恰好对应Flash擦除后写入关键跳转区的阶段此时MCU主频降低、中断屏蔽时间变长蓝牙协议栈响应延迟增大手机端判定超时后主动断开。所以“断连后怎么办”这个问题核心不在于“如何避免断连”而在于如何让整个升级流程具备状态记忆、断点续传、一致性校验和安全回滚能力。这背后是一整套恢复设计哲学它要求固件分区必须预留冗余空间协议交互必须携带版本/偏移/校验三元组主机端工具必须能解析设备当前状态并生成差异包而最关键的是MCU启动流程要能识别“升级进行中”的特殊标记并决定是继续加载、回退旧固件还是进入安全模式等待重连。这不是加个重试循环就能解决的它牵扯到Bootloader架构、Flash映射策略、CRC32与SHA256双级校验机制、以及设备端状态机的重新定义。接下来我会从最底层的硬件约束开始一层层拆解这个“恢复设计”到底该怎么落地。2. 超维方程的恢复设计不是加个标志位而是重构Bootloader状态机“超维方程”这个词在标题里不是修辞它真实指向一种突破传统两段式BootloaderPrimary Application思维的设计范式。常规做法是在Flash里划出两个区域一个放当前运行的App一个放待升级的新App升级时把新镜像写进备用区校验通过后修改跳转地址重启生效。这种设计在BLE OTA场景下有三个致命缺陷第一无法处理断连后部分写入的脏数据——备用区可能一半是旧代码一半是新代码直接跳转必然崩溃第二没有中间状态记录设备重启后Bootloader只能猜“上次是不是在升级”靠一个简单标志位根本无法区分“升级成功但未重启”、“升级中断需续传”、“升级失败需回滚”三种情况第三Flash擦除粒度与OTA分包不匹配比如ESP32的Flash扇区是4KB而BLE一次最大传输是20字节ATT MTU23扣除协议头剩20写入1MB镜像需擦除256次扇区每次擦除都可能因断连卡在半途。超维方程的解法是把Bootloader的状态机从二维运行/升级扩展为四维空间X轴时间维度定义IDLE空闲、UPGRADING升级中、VALIDATING校验中、ROLLING_BACK回滚中四个主态Y轴空间维度划分BOOT_REGION启动区、APP_REGION主应用区、BACKUP_REGION备份区、META_REGION元数据区四块FlashZ轴校验维度每个状态变更都绑定SHA256哈希值与CRC32校验码且元数据区存储三份副本主备份影子写入时采用“先写影子再原子切换指针”的方式W轴安全维度引入Secure Boot签名验证在VALIDATING态强制校验公钥签名未通过则自动进入ROLLING_BACK态。举个具体例子当手机发起OTA请求设备进入UPGRADING态Bootloader首先在META_REGION写入结构体typedef struct { uint32_t magic; // 0x454C4F42 (BOLE) uint32_t version; // 新固件版本号 uint32_t offset; // 当前已接收字节数 uint32_t total_size; // 镜像总大小 uint8_t sha256[32]; // 完整镜像SHA256摘要 uint32_t crc32; // 当前已写入数据CRC32 uint8_t state; // 0IDLE, 1UPGRADING, 2VALIDATING... } upgrade_meta_t;这个结构体不是写一次就完事。每次成功接收一个BLE ATT Write Request20字节Bootloader就更新offset和crc32并用memcpy将新值写入META_REGION的影子副本最后执行flash_write_protect_disable()→flash_erase_sector()→flash_write()→flash_write_protect_enable()这一整套原子操作。如果在此过程中断连设备重启后Bootloader读取META_REGION发现state1且offset total_size立刻知道这是“可续传”的中断而非需要回滚的失败。提示很多工程师误以为“写Flash很快”实测ESP32-WROOM-32在QIO模式下擦除一个4KB扇区平均耗时120ms写入1KB数据约8ms。这意味着一次20字节的BLE写入背后可能触发长达128ms的Flash操作阻塞。你的Bootloader必须在此期间禁用所有高优先级中断否则蓝牙协议栈收发缓冲区溢出导致二次断连。我在某款医疗设备项目中就因此踩坑心电图采集任务中断优先级高于BLE结果OTA时ECG数据丢失最终在Bootloader里加了portDISABLE_INTERRUPTS()保护临界区。3. 断点续传协议设计从“重传整个包”到“精准定位下一个字节”BLE OTA的断点续传绝不是简单地让手机端记住“上次传到第12345字节下次从这里开始”。它需要一套轻量、可靠、抗干扰的协议层设计核心在于把“字节偏移”这个抽象概念转化为设备端可精确寻址的Flash物理地址并确保主机端能无歧义解析该地址。市面上常见的OTA方案如Nordic SDK的DFU、ESP-IDF的OTA默认采用“全量包重传”策略断连后手机端从头开始发包这对小固件64KB尚可接受但对带RTOS和GUI的固件1MB一次重传可能耗时15分钟以上用户早已放弃。超维方程的协议设计关键创新点在于引入“分段摘要索引表Segment Hash Index Table, SHIT”。这个表不是存在手机端而是固化在设备Flash的META_REGION里结构如下Segment IDFlash Start AddrLength (bytes)SHA256 of Segment00x000100004096a1b2c3...10x000110004096d4e5f6...............设备在首次烧录固件时Bootloader就遍历整个APP_REGION按4KB为单位计算每段SHA256生成这张表并存入META_REGION。当OTA开始手机端先发送GET_META指令设备返回当前SHIT表和upgrade_meta_t结构。手机端对比新固件镜像的SHIT表找出第一个不匹配的Segment ID即“差异起始点”然后只发送从该Segment开始的所有后续段。例如旧固件SHIT中Segment 5的哈希是x7y8z9...新固件对应段是m0n1p2...那么手机端就从Segment 5开始传跳过前面0~4段共20KB数据。这个设计带来三个硬性收益传输效率提升实测某款工业网关固件1.2MB升级全量重传平均耗时18.3分钟而SHIT续传仅需2.7分钟节省85%时间断连容忍度增强即使断连发生在Segment 127写入中途设备重启后只需告诉手机端“Segment 127未完成”手机端重新发送该段即可无需重传前面126段Flash磨损均衡传统方案每次升级都擦除整个APP_REGION哪怕只改一行代码SHIT方案只擦除差异段对应的扇区将Flash擦写次数降低至原来的1/300。注意SHIT表本身也需要版本管理。我在某次固件迭代中升级了SHA256算法实现从OpenSSL移植改为mbedTLS导致旧版Bootloader无法解析新版SHIT表。解决方案是在META_REGION增加shithash_version字段Bootloader启动时先读此字段若为0xFF未初始化则用旧算法解析若为0x01则用新算法。这个细节看似微小却避免了整批设备变砖的风险。4. 真实产线踩坑实录从“升级成功”到“设备变砖”的七步死亡链理论再完美不经过产线高压测试都是空中楼阁。去年我们为一家智能锁厂商部署超维方程OTA方案时在量产爬坡阶段连续出现三类“升级成功但设备失联”的诡异问题。排查过程像侦探破案最终还原出一条完整的“死亡链”每一步都直指恢复设计的薄弱环节。我把这个过程完整复盘因为90%的BLE OTA故障根源都在这些看似边缘的细节里。第一步手机端显示“升级完成”设备LED却熄灭现象Android App提示“OTA升级成功”但设备无响应。用JTAG连接发现MCU卡在Bootloader的validate_app()函数里死循环。日志显示sha256_compare()返回失败但app_region里的固件明明是刚写入的。根因Flash写入时电压波动。该锁具使用CR2032纽扣电池供电OTA过程中电机驱动电路偶发启动导致VCC瞬间跌至2.3V低于ESP32最低工作电压2.7V。Flash写入未完成就被中断但META_REGION的state字段已更新为VALIDATING。修复在validate_app()前增加flash_read_vcc_check()读取内部ADC测量VCC低于2.8V则强制进入ROLLING_BACK态并点亮红灯报警。第二步回滚后设备运行旧固件但功能异常现象设备成功回滚但指纹识别模块失效。抓取UART日志发现fingerprint_init()返回-EIO。根因回滚只恢复了APP_REGION但未恢复外设配置寄存器。旧固件中指纹传感器I2C地址是0x48新固件改为0x4A升级中断后I2C控制器仍保持0x4A地址回滚固件尝试用0x48通信失败。修复在META_REGION增加periph_config_backup区每次升级前保存关键外设寄存器快照I2C地址、SPI时钟分频、ADC参考电压等回滚时同步恢复。第三步多设备批量升级时部分设备永久卡在“升级中”现象100台设备同时升级92台成功8台永远显示“升级中”无法响应任何BLE指令。根因BLE连接数限制。手机App使用单线程轮询发送当第8台设备响应慢因天线遮挡信号弱App在超时后关闭连接但设备端UPGRADING态未收到END_UPGRADE指令META_REGION的state一直为1。修复在Bootloader加入“心跳超时”机制每次BLE连接建立后手机端必须每30秒发送HEARTBEAT指令设备端计时器清零若连续2次未收到则自动将state置为IDLE并清除offset和crc32。这七步链电压跌落→Flash写入不全→状态误判→校验失败→死循环→外设配置残留→批量升级雪崩揭示了一个残酷事实OTA恢复设计不是写完代码就结束而是要模拟所有可能的物理世界扰动——电池电压、信号衰减、并发压力、外设耦合。我在产线现场蹲守三天用示波器监测VCC波形用Wireshark抓包分析BLE连接时序最终把这七步链压缩成一份《OTA鲁棒性测试清单》现在已成为我们团队每个新项目必做的准入检查。5. 工程师手把手用ESP32-C3实现超维方程最小可行原型纸上谈兵终觉浅现在我们用最易获取的ESP32-C3开发板搭建一个可实测的超维方程OTA原型。目标很明确不依赖ESP-IDF庞大框架纯裸机实现Bootloader状态机、SHIT表生成、断点续传协议代码总量控制在1200行以内让你看清每一行代码如何支撑“断连后怎么办”这个命题。硬件准备ESP32-C3-DevKitM-1内置USB-JTAG、Micro-USB线、电脑Windows/macOS/Linux均可。软件环境安装ESP-IDF v5.1.2仅用于Toolchain不调用其OTA组件安装Python 3.9pip install pyserial esptool下载裸机SDKhttps://github.com/espressif/esp-idf/tree/master/components/esp_rom关键代码结构bootloader/ ├── main.c // Bootloader主循环状态机调度 ├── flash_ops.c // 封装Flash擦写、读取、保护操作 ├── sha256.c // 轻量SHA256实现2KB ROM占用 ├── shithash_gen.py // Python脚本生成固件SHIT表 └── ota_protocol.h // BLE OTA协议定义ATT UUID、指令码核心步骤详解Flash分区规划在partitions.csv中定义四区# Name, Type, SubType, Offset, Size, Flags bootloader, app, ota_0, 0x0000, 0x10000, app, app, factory, 0x10000, 0x100000, backup, app, ota_1, 0x110000,0x100000, meta, data, ota, 0x210000,0x4000,注意meta区大小设为0x400016KB足够存SHIT表1.2MB固件约300段每段32字节SHA2568字节元数据12KB。SHIT表生成脚本shithash_gen.py接收固件bin文件路径按4KB切片调用hashlib.sha256()计算每段哈希输出C数组#!/usr/bin/env python3 import sys, hashlib with open(sys.argv[1], rb) as f: data f.read() segments [data[i:i4096] for i in range(0, len(data), 4096)] print(const uint8_t shithash_table[][32] {) for seg in segments: h hashlib.sha256(seg).digest() print( {0x ,0x.join(f{b:02x} for b in h) },) print(};)运行python shithash_gen.py firmware.bin shithash_table.h编译时链接进去。Bootloader状态机核心逻辑在main.c中bootloader_main()函数根据meta_region.state分支若state UPGRADING调用flash_read_meta(meta)然后ble_wait_for_data(meta.offset)只接收从meta.offset开始的数据若state VALIDATING逐段比对shithash_table与app_region任一段不匹配则roll_back_to_factory()若state IDLE正常跳转app_start()。BLE协议精简实现不使用BLE Stack全套服务只定义三个UUID0000FF01-0000-1000-8000-00805F9B34FBOTA Control Point写入指令0000FF02-0000-1000-8000-00805F9B34FBOTA Data写入固件数据0000FF03-0000-1000-8000-00805F9B34FBOTA Response设备返回状态每次ota_data写入Bootloader校验meta.offset是否对齐必须是4096的倍数不对齐则拒绝防止部分写入破坏SHIT边界。实测技巧调试时用esptool.py --port COM3 read_flash 0x210000 0x4000 meta_dump.bin导出META_REGION用Hex Editor查看state和offset值这是判断恢复逻辑是否生效的最直接证据。我建议你在第一次烧录时故意拔掉USB线模拟断连然后观察meta_dump.bin里state是否从1变为0offset是否停留在中断位置——这才是真正的“断连后怎么办”验证。6. 跨平台兼容性陷阱Arduino、Zephyr、RT-Thread的OTA适配要点超维方程设计虽源于ESP32但其思想可迁移到任何支持BLE OTA的平台。然而不同RTOS/BSP的Flash操作接口、中断管理机制、BLE协议栈抽象层差异巨大直接移植会踩无数坑。我整理了三大主流生态的适配要点全是血泪教训换来的。Arduino ESP32生态优势是开发快劣势是抽象过度。Arduino Core for ESP32的Update类默认使用esp_https_ota()完全绕过Bootloader。要接入超维方程必须禁用#define ARDUINO_ESP32_RUN_CORE1避免Core1干扰Flash操作替换Update.begin()为自定义函数调用esp_partition_find_first()定位backup分区而非默认的factory关键陷阱Arduino的delay()函数在OTA过程中会阻塞BLE事件循环。必须改用vTaskDelay()或esp_timer_create()否则断连检测失效。我在某款Arduino项目中因此导致设备升级时无法响应手机断连通知最终在loop()里加了BLEDevice::getCentral()-isConnected()轮询。Zephyr RTOS生态Zephyr的mcumgr协议是业界标准但默认不支持断点续传。要启用超维方程需在prj.conf中启用CONFIG_MCUMGR_CMD_OS_MGMTy和CONFIG_MCUMGR_CMD_IMG_MGMTy修改subsys/mgmt/mcumgr/grp/img/src/img_mgmt.c在img_mgmt_state_read()函数中注入SHIT表比对逻辑最大坑点Zephyr的Flash driver默认开启CONFIG_FLASH_PAGE_LAYOUTy但SHIT表要求按4KB对齐而某些SoC如nRF52840Flash页是1KB。必须在dts文件中显式定义flash0 { compatible jedec,spi-nor; reg 0x0 0x100000; pagesize 4096; };。RT-Thread生态RT-Thread的falFlash Abstraction Layer是绝佳适配基础但要注意fal_flash_ops_t结构体中的erase函数必须保证擦除粒度≥SHIT段大小4KB否则shithash_gen.py生成的表无效RT-Thread的dfs文件系统在OTA时会缓存Flash操作需在fal_flash_dev.c中禁用DFS_CACHE关键经验RT-Thread的finsh命令行调试时list_thread会触发大量内存分配干扰OTA内存布局。建议在OTA期间rt_kprintf(OTA mode: disable finsh\r\n);临时禁用shell。个人体会跨平台移植时最耗时的不是代码改写而是验证“Flash操作原子性”。比如Zephyr在flash_write()后会调用k_msleep(1)而RT-Thread的fal_write()是纯同步操作。这个1ms延迟在BLE OTA中可能就是一次重传窗口必须用示波器抓取Flash CS信号波形确认。我建议所有跨平台项目在移植完成后强制在flash_write()前后插入GPIO翻转用逻辑分析仪看实际执行时间这是唯一可靠的验证方式。7. 安全边界与性能权衡为什么不能无脑堆SHA256和加密超维方程强调“恢复”但绝不意味着可以牺牲安全。然而很多工程师走向另一个极端在资源紧张的MCU上强行加入AES-256加密、RSA-2048签名、甚至TEE可信执行环境。结果是OTA耗时翻倍电池续航锐减最终用户投诉“升级一次手机没电了”。真正的工程智慧在于理解安全需求的层次并做精准投入。BLE OTA的安全需求本质是三层漏斗最外层防误操作确保用户不会不小心刷错固件。解决方案是version字段校验magic常量检查成本几乎为零中间层防篡改防止固件在传输中被恶意修改。这是SHA256存在的意义但注意SHA256不是必须对整个镜像计算而是对SHIT表中每段计算——这样1.2MB固件只需300次SHA256每次4KB而非1次1.2MBROM占用从8KB降至3KB最内层防伪造防止攻击者伪造合法签名。这才是RSA/AES的战场但必须清醒如果你的设备没有安全密钥存储如ESP32-H2的EFUSE、nRF52840的CryptoCell加了RSA也形同虚设——私钥明文存在Flash里黑客用JTAG一读就走。我在某款儿童手表项目中做过对比测试方案OTA耗时1.1MBFlash额外占用电池消耗mAh抗攻击能力无校验4.2min0KB18无CRC324.5min4KB19防意外损坏SHA256全镜像12.7min8KB32防篡改SHA256SHIT分段5.1min12KB21防篡改SHA256RSA204828.3min24KB58防伪造结论清晰对于95%的消费电子设备SHIT分段SHA256是性价比最优解。它用12KB Flash换来了“防篡改”能力而耗时仅比CRC32多0.6分钟用户感知不明显。真正需要RSA的场景只有金融POS机、医疗植入设备等强监管领域且必须配合硬件安全模块HSM。最后分享一个小技巧SHA256计算可以和BLE接收流水线并行。在ESP32上用DMA将BLE接收缓冲区ble_rx_buf直接映射到SHA256外设的输入寄存器CPU只需在DMA完成中断里读取哈希结果。这样SHA256计算不占CPU周期OTA耗时几乎不增加。我在某款TWS耳机固件中实测启用此优化后SHA256版本OTA耗时仅比CRC32版本多0.2分钟。

相关新闻

Loop Engineering实战:用Claude Code、Codex、Cursor搭建AI编程自动化闭环

Loop Engineering实战:用Claude Code、Codex、Cursor搭建AI编程自动化闭环

1. 从“会写代码”到“会指挥AI写代码”:Loop Engineering到底在解决什么问题这两年AI编程工具迭代得飞快,Claude Code、Codex、Cursor 一个接一个往外冒,很多人第一反应是“又一个写代码的助手”。但真正上手用了一段时间之后你会发现&#…

2026/10/9 3:44:19 阅读更多 →
Docker 一键部署 DeepTutor:从环境准备到稳定运行的完整指南

Docker 一键部署 DeepTutor:从环境准备到稳定运行的完整指南

1. 为什么我最终选择了 Docker 来跑 DeepTutor第一次接触 DeepTutor 是在一个做企业内训的朋友那里。他当时的需求很具体:公司内部有几十号新员工要培训,但培训资料散落在各种文档、PPT 和视频里,人工整理成本高,答疑又占用大量讲…

2026/10/9 3:43:19 阅读更多 →
多Agent协作如何可靠触达?Agent-Reach连接层设计与落地实践

多Agent协作如何可靠触达?Agent-Reach连接层设计与落地实践

接了个挺奇怪的需求:同事想让他负责资料总结的 AI Agent,自动去调用另一个负责合同审核的 AI Agent 的结果,中间还得经过一个本地部署的模型服务。我听完第一反应不是“这智能程度够不够”,而是“这俩服务到底怎么触达对方”。后来…

2026/10/9 3:43:19 阅读更多 →

最新新闻

LRE框架:重构AI智能体的时间感知与因果记忆机制

LRE框架:重构AI智能体的时间感知与因果记忆机制

1. 这不是“给AI加个备忘录”,而是重构智能体的时间感知能力很多人第一次看到“AI智能体记忆管理”这个词,下意识会想:不就是让大模型多存点上下文、加个向量数据库当外挂硬盘吗?我试过——在某个模拟项目X里,给一个任…

2026/10/9 4:48:03 阅读更多 →
10分钟上手 douyin-downloader:抖音批量下载与无水印提取完整指南

10分钟上手 douyin-downloader:抖音批量下载与无水印提取完整指南

10分钟上手 douyin-downloader:抖音批量下载与无水印提取完整指南 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fal…

2026/10/9 4:48:03 阅读更多 →
answer-me-with-html 完整参考指南:从 Markdown 稿件格式到代码块、自定义主题与 STE 写作检查

answer-me-with-html 完整参考指南:从 Markdown 稿件格式到代码块、自定义主题与 STE 写作检查

【免费下载链接】answer-me-with-html Answer me with HTML — an agent skill that answers hard questions with a one-page HTML you can actually read. 让 AI Agent 用一页 HTML 回答复杂问题。 项目地址: https://gitcode.com/gh_mirrors/an/answer-me-with-h…

2026/10/9 4:48:03 阅读更多 →
ponytail插件使用指南:skill模块配置与效率提升实践

ponytail插件使用指南:skill模块配置与效率提升实践

1. 从“ponytail”这个标题说起:它到底是什么第一次看到“ponytail”这个词,大多数人脑子里蹦出来的画面是扎在脑后的那束马尾辫。但如果它出现在技术社区、插件市场或者效率工具的讨论里,那它大概率不是发型教程,而是一个被开发者…

2026/10/9 4:48:03 阅读更多 →
Java电商系统实战:JSP+JavaBean+SQL Server全链路可运行方案

Java电商系统实战:JSP+JavaBean+SQL Server全链路可运行方案

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

2026/10/9 4:48:03 阅读更多 →
HermesWorkspace Playground 可选 3D NPC 模型替换指南:基于 GLB 的 Voxel 身体升级方案

HermesWorkspace Playground 可选 3D NPC 模型替换指南:基于 GLB 的 Voxel 身体升级方案

【免费下载链接】hermes-workspace Native web workspace for Hermes Agent — chat, terminal, memory, skills, inspector. 项目地址: https://gitcode.com/gh_mirrors/he/hermes-workspace 点击查看 免费下载 本文依据仓库 public/avatars-3d/README.md 编写&am…

2026/10/9 4:47:02 阅读更多 →

日新闻

Java时间API实战:LocalDate、Date与ZonedDateTime的转换与避坑指南

Java时间API实战:LocalDate、Date与ZonedDateTime的转换与避坑指南

Java时间API这个话题,隔三差五就会在群里被翻出来讨论一次。上周还有个同事线上处理一个订单超时问题,排查到最后发现是ZonedDateTime序列化后时区丢了,用户在下单当天晚上看到的时间整整差了8个小时。这类问题几乎每个做Java开发的人都遇到过…

2026/10/9 0:00:49 阅读更多 →
EasyTier实践:从NAT穿透到子网代理的异地组网部署与排错

EasyTier实践:从NAT穿透到子网代理的异地组网部署与排错

前几个月我手头有好几台机器需要互相访问:办公室台式机、家里 NAS、还有一台云主机。如果只是偶尔传个文件倒还好,问题是工作场景经常要在几处环境之间来回切换,每次都先登录跳板机再层层代理,实在折腾。我先后试过端口映射、自建…

2026/10/9 0:00:49 阅读更多 →
AI Agent工程实战:从七要素到七个决策点的系统设计指南

AI Agent工程实战:从七要素到七个决策点的系统设计指南

AI Agent 这个词在过去一年里被反复提及,但真正动手搭过一套能跑起来的 Agent 系统的人都知道,从"知道它是什么"到"让它稳定干活"之间隔着一整套工程决策。我前后参与过几个 Agent 项目的落地,从最初用现成框架拼装&…

2026/10/9 0:01:50 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

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

2026/10/8 15:26:32 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

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

2026/10/8 15:26:40 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

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

2026/10/8 10:10:36 阅读更多 →

月新闻

我发现了一个新思路:用 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/8 21:13:17 阅读更多 →
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/8 15:26:17 阅读更多 →
黑夜航拍船只数据集训练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/7 13:34:55 阅读更多 →