BACnet协议栈移植实战:从嵌入式适配到BTL一致性验证
简介这份资源面向嵌入式开发工程师与楼宇自控方向的学习者提供将BACnet协议移植到STM32F103微控制器的完整工程实践重点解决在Keil环境下基于RS-485MSTP实现BACnet通信的问题。压缩包共440个文件约4.16MB以111个h头文件与74个c源文件为核心配合57个o目标文件、56个crf与__i中间文件以及uvproj、uvopt工程配置、sct分散加载、map映射与hex烧录文件完整保留了从源码到编译产物的工程结构。内容涉及UART转RS-485配置、BACnet协议栈适配、Who-Is/Who-Has与I-Have等对象交互逻辑并包含BACnet_App应用层代码便于读者对照理解协议栈与硬件驱动的衔接方式。目前已有1405人学习下载适合需要快速搭建BACnet从站节点、研究MSTP令牌传递机制或进行协议移植排错的开发者参考。1. BACnet移植从协议栈到嵌入式设备的落地路径BACnet移植这件事很多做楼宇自控的工程师第一次接触时都会低估它的工作量。表面上看不过是把一套协议栈源码放到目标平台上编译通过但真正动手之后才会发现从源码编译到设备能被楼宇管理系统正常识别、读写属性、上报COV通知中间隔着一整套关于对象模型、服务映射、网络层适配和内存约束的工程问题。BACnet本身是ASHRAE制定的楼宇自动化控制网络协议广泛应用于暖通空调、照明、给排水等子系统它的核心价值在于让不同厂商的设备能在同一套语义下互操作。而BACnet移植就是让这套协议在资源受限的嵌入式平台上跑起来并且通过BTL认证或至少通过现场一致性测试。适合读这篇的是正在做楼宇控制器、网关设备、DDC控制器固件开发的嵌入式工程师或者需要把已有BACnet设备接入新平台的技术负责人。接下来的内容会从协议栈选型、平台适配、对象实现、服务裁剪到现场调试把这条链路拆开讲清楚。2. 协议栈选型与目标平台适配先搞清楚你要移植什么2.1 开源BACnet协议栈的三种典型路线BACnet移植的第一步不是写代码而是选栈。目前工程上常见的路线有三类第一类是使用成熟的开源协议栈比如BACnet Stack这类用C语言编写的实现特点是代码结构清晰、对象和服务覆盖较全、有较长的社区积累第二类是从芯片原厂或方案商获取的商用协议栈通常已经针对特定平台做了裁剪和优化但授权费用和移植自由度需要权衡第三类是自己从协议规范出发实现核心子集适合只需要支持极少数对象和服务的定制场景但工作量和一致性风险最高。我一般会建议先明确目标设备的定位。如果设备需要接入第三方楼宇管理系统并且对方要求通过BTL认证那协议栈的完整度和标准符合性就是第一优先级开源栈加自研适配层是性价比最高的选择。如果设备只是在一个封闭系统内做私有扩展那可以大胆裁剪只保留Device对象、Analog Input/Output、Binary Input/Output和必要的服务。选型时重点看几个指标协议版本支持到哪个修订版、是否包含BBMD和Foreign Device注册、是否支持COV订阅、内存占用在编译后能否控制在目标平台RAM的30%以内。2.2 目标平台的资源评估与编译工具链准备选定协议栈之后下一步是评估目标平台的资源。BACnet移植最常见的翻车点就是RAM不够。一个包含完整对象模型和服务的协议栈在32位MCU上静态内存占用通常在20KB到80KB之间动态分配部分取决于对象数量和服务请求并发量。如果目标平台只有64KB RAM那就必须做服务裁剪和对象数量限制。编译工具链的准备要提前确认三件事交叉编译器是否支持C99标准、是否有可用的标准库实现、链接脚本中堆栈大小是否可调。很多嵌入式平台的默认链接脚本给堆分配的空间很小而BACnet栈在初始化时会申请一定量的内存用于网络层缓冲和事务处理。下面是一个典型的平台适配层初始化代码框架/* bacnet_port.c - 目标平台适配层示例 */ #include bacnet/bacdef.h #include bacnet/datalink/datalink.h #include bacnet/npdu.h /* 平台相关的网络接口初始化 */ bool bacnet_port_init(uint16_t local_port) { /* 初始化以太网或串口硬件 */ if (!platform_net_init()) { return false; } /* 设置BACnet设备实例号必须全局唯一 */ Device_Set_Object_Instance_Number(1234); /* 绑定数据链路层以太网用BACnet/IP串口用MS/TP */ if (!datalink_init(local_port)) { return false; } /* 初始化地址缓存和路由表 */ address_init(); return true; } /* 周期性任务中调用处理接收和发送 */ void bacnet_port_task(void) { /* 接收一帧并交给协议栈处理 */ datalink_receive(); /* 处理待发送的确认帧和COV通知 */ npdu_handler(); }这段代码的逻辑是先初始化硬件网络接口然后设置设备实例号再绑定数据链路层。Device_Set_Object_Instance_Number设置的实例号在整个BACnet网络中必须唯一现场调试时如果发现设备冲突第一个要查的就是这个值。datalink_init的参数在BACnet/IP下是UDP端口号默认47808在MS/TP下是串口号和波特率。bacnet_port_task需要放在主循环或定时任务中周期调用调用频率建议不低于10Hz否则COV通知和确认帧的实时性会受影响。2.3 数据链路层的选择BACnet/IP还是MS/TP数据链路层的选择直接决定移植的工作量和硬件成本。BACnet/IP跑在UDP之上需要目标平台有以太网接口或Wi-Fi模块协议栈需要处理UDP套接字、广播、单播和BBMD转发。MS/TP跑在RS-485总线上硬件成本低但需要实现令牌传递机制、波特率自适应和主从状态机。从移植难度看BACnet/IP的软件工作量集中在网络层适配如果目标平台已经有成熟的TCP/IP协议栈移植量相对可控。MS/TP则需要自己实现令牌管理和帧收发时序对串口中断的实时性要求较高。我一般会建议如果设备有以太网口且IP网络可控优先选BACnet/IP如果是低成本DDC或现场总线设备MS/TP更合适但要注意RS-485收发器的方向控制引脚时序这个在高速波特率下容易出问题。3. 对象模型实现与服务映射让设备真正能被读写3.1 必须实现的BACnet对象及其属性表BACnet设备的核心是对象模型。每个对象有一组标准属性楼宇管理系统通过读取这些属性来获取设备状态通过写入属性来下发控制指令。移植时不需要实现规范里的全部对象但Device对象是必须的它承载了设备实例号、对象列表、服务支持列表等关键信息。除此之外根据设备类型通常还需要实现Analog Input、Analog Output、Analog Value、Binary Input、Binary Output、Binary Value、Multi-state Input、Multi-state Output等。每个对象的属性实现要区分三类必需属性、可选属性和私有属性。必需属性是规范强制要求的比如Analog Input的Present_Value、Object_Name、Object_Type、Status_Flags可选属性根据设备能力决定是否实现比如COV_Increment、High_Limit、Low_Limit私有属性是厂商自定义的属性ID从512开始分配。下面是一个Analog Input对象的属性读取处理示例/* 处理ReadProperty请求中Analog Input对象的属性读取 */ int bacnet_ai_read_property(uint32_t object_instance, BACNET_PROPERTY_ID property_id, BACNET_ERROR_CLASS *error_class, BACNET_ERROR_CODE *error_code, BACNET_APPLICATION_DATA_VALUE *value) { switch (property_id) { case PROP_PRESENT_VALUE: /* 从硬件采样通道读取当前值 */ value-tag BACNET_APPLICATION_TAG_REAL; value-type.Real ai_get_channel_value(object_instance); return 0; case PROP_OBJECT_NAME: value-tag BACNET_APPLICATION_TAG_CHARACTER_STRING; characterstring_init_ansi(value-type.Character_String, ai_get_name(object_instance)); return 0; case PROP_UNITS: value-tag BACNET_APPLICATION_TAG_ENUMERATED; value-type.Enumerated UNITS_DEGREES_CELSIUS; return 0; case PROP_STATUS_FLAGS: value-tag BACNET_APPLICATION_TAG_BIT_STRING; bitstring_init(value-type.Bit_String); /* 根据硬件故障状态设置In_Alarm、Fault等位 */ bitstring_set_bit(value-type.Bit_String, STATUS_FLAG_FAULT, ai_is_fault(object_instance)); return 0; default: *error_class ERROR_CLASS_PROPERTY; *error_code ERROR_CODE_UNKNOWN_PROPERTY; return -1; } }这段代码的关键在于属性值的编码格式。BACnet应用层数据类型有Real、Enumerated、Character_String、Bit_String等每种类型的编码方式不同。PROP_PRESENT_VALUE返回Real类型直接放浮点值PROP_UNITS返回Enumerated类型需要查规范里的单位枚举表PROP_STATUS_FLAGS返回Bit_String需要按位设置。如果属性不存在必须返回ERROR_CODE_UNKNOWN_PROPERTY否则楼宇管理系统会认为设备行为异常。3.2 WriteProperty与COV订阅的处理逻辑读写属性是BACnet设备最基础的服务。ReadProperty相对简单按属性ID返回对应值即可。WriteProperty则需要做优先级数组处理BACnet规范定义了16个优先级1最高16最低写入时要把值放到对应优先级的槽位里然后从高到低查找第一个非NULL值作为Present_Value的输出。这个机制是实现楼宇控制逻辑解耦的关键比如楼宇管理系统用优先级8下发设定值本地控制器用优先级16做默认值当管理系统释放优先级8时设备自动回落到本地默认值。COV订阅是另一个必须实现的服务。楼宇管理系统订阅某个对象的Present_Value变化后设备需要在值变化超过COV_Increment时主动发送通知。实现时要注意两点一是COV订阅有生命周期订阅时需要指定生存时间到期后要自动取消二是COV通知的发送频率要控制避免值频繁波动时把网络打满。常见做法是设置一个最小发送间隔比如1秒内最多发一次通知。3.3 服务裁剪哪些服务可以砍哪些不能砍BACnet规范定义了超过30种服务但实际设备不需要全部实现。必选服务包括ReadProperty、WriteProperty、ReadPropertyMultiple、WritePropertyMultiple、I-Am、Who-Is、COV订阅和通知、DeviceCommunicationControl。可选服务包括AtomicReadFile、AtomicWriteFile、ReinitializeDevice、TimeSynchronization等。裁剪的原则是看楼宇管理系统的实际调用。如果对方只用ReadPropertyMultiple做批量读取那单独实现ReadProperty就够了但ReadPropertyMultiple能显著减少网络交互次数建议保留。如果设备不支持时间同步TimeSynchronization可以砍掉但要在Device对象的Protocol_Services_Supported属性里如实声明否则一致性测试会报错。我见过一个翻车案例某设备声明支持WritePropertyMultiple但实现时只处理了第一个对象的写入后续对象直接忽略结果楼宇管理系统批量下发设定值时只有第一个生效排查了很久才发现是服务实现不完整。4. 避坑与排查BACnet移植现场最常见的五个问题4.1 设备实例号冲突导致Who-Is无响应现象是设备上电后楼宇管理系统扫描不到或者扫描到了但属性读取全部超时。原因通常是设备实例号与网络中已有设备重复BACnet路由器在转发时会丢弃冲突设备的响应。解决方法是先用BACnet扫描工具确认网络中已存在的实例号然后在设备配置中分配一个未使用的值。如果设备支持动态绑定可以在启动时发送Who-Is并监听I-Am自动避开已占用的实例号。4.2 MS/TP令牌丢失导致通信间歇性中断现象是MS/TP总线上设备偶尔掉线重新上电后恢复运行一段时间又出现。原因是令牌传递状态机在干扰下进入异常状态没有在超时时间内收到令牌帧。解决方法是检查串口中断的优先级是否足够高确保令牌帧不会被其他中断打断同时在状态机中加入令牌超时重置逻辑超时后主动发送PollForMaster帧重新加入令牌环。RS-485收发器的方向切换延时也要调太快会导致帧头字节丢失。4.3 属性读取返回错误的数据类型现象是楼宇管理系统读取Present_Value时显示乱码或数值异常。原因是属性编码时用了错误的BACnet应用层数据类型标签。比如把Enumerated类型当成Unsigned返回或者Character_String没有正确设置长度。排查时可以用BACnet协议分析工具抓包看返回的APDU里类型标签和实际值是否匹配。解决方法是逐个属性核对规范里的数据类型定义特别是Units、Status_Flags、Relinquish_Default这些容易搞混的属性。4.4 COV通知风暴导致网络拥塞现象是设备接入后网络流量异常增大其他设备通信变慢。原因是COV_Increment设置过小Present_Value的微小波动就触发通知或者多个对象同时订阅且变化频繁。解决方法是在对象初始化时根据物理量的合理波动范围设置COV_Increment比如温度值设为0.5摄氏度湿度设为1%RH同时在COV通知发送逻辑里加最小间隔限制比如同一对象1秒内最多发一次。4.5 内存碎片导致长时间运行后死机现象是设备运行几天后死机或通信异常重启后恢复。原因是协议栈在动态分配事务缓冲时频繁申请释放嵌入式平台的内存堆没有碎片整理机制最终导致分配失败。解决方法是在移植时尽量使用静态内存池替代动态分配事务缓冲、COV订阅表、地址缓存都预分配固定大小。如果协议栈本身依赖malloc可以在适配层实现一个简单的固定块内存分配器避免碎片问题。5. 一致性验证与现场调试怎么确认移植真的成功了5.1 用BACnet协议分析工具做首轮验证移植完成后第一步不是直接接楼宇管理系统而是用协议分析工具做自检。常见做法是在PC上运行一个BACnet客户端工具发送Who-Is、ReadProperty、WriteProperty、ReadPropertyMultiple等请求观察设备响应是否符合规范。重点看三个地方I-Am响应的APDU格式是否正确、ReadProperty返回的属性值编码是否匹配类型、错误响应是否返回了正确的错误类别和错误码。如果手头没有专业工具也可以用Wireshark的BACnet解析功能抓包看报文结构。5.2 对象列表与属性一致性的自动化检查手动逐个属性检查效率太低我一般会写一个脚本通过BACnet客户端库遍历设备的所有对象和属性把读取结果与预期值做比对。下面是一个用Python做的简单检查脚本框架# bacnet_check.py - 遍历设备对象和属性做一致性检查 from bacpypes.core import run from bacpypes.app import BIPSimpleApplication from bacpypes.local.device import LocalDeviceObject from bacpypes.pdu import Address from bacpypes.apdu import ReadPropertyRequest, ReadPropertyACK # 目标设备地址和实例号 target_addr Address(192.168.1.100) target_instance 1234 # 预期对象列表实际项目中从配置文件读取 expected_objects [ (analogInput, 0), (analogInput, 1), (analogOutput, 0), (binaryInput, 0), (device, target_instance), ] def check_object_list(): 读取Device对象的Object_List属性比对预期列表 # 构造ReadProperty请求读取Object_List request ReadPropertyRequest( destinationtarget_addr, objectIdentifier(device, target_instance), propertyIdentifierobjectList, ) # 发送请求并等待响应实际使用时需要处理异步回调 # 这里只展示请求构造逻辑 print(fRequesting object list from {target_addr}) # 比对返回的对象列表与expected_objects # 如果缺少对象或多出未声明的对象记录差异 def check_present_value(obj_type, obj_inst): 读取指定对象的Present_Value检查数据类型和范围 request ReadPropertyRequest( destinationtarget_addr, objectIdentifier(obj_type, obj_inst), propertyIdentifierpresentValue, ) # 发送请求后检查返回值的tag是否为Real或Enumerated # 并检查数值是否在物理量合理范围内 print(fChecking {obj_type}:{obj_inst} present value) if __name__ __main__: check_object_list() for obj_type, obj_inst in expected_objects: if obj_type ! device: check_present_value(obj_type, obj_inst)这个脚本的核心思路是先读取Device对象的Object_List属性确认设备声明的对象列表与实际实现一致然后逐个对象读取Present_Value检查数据类型标签和数值范围。实际使用时需要处理异步响应和超时重试但框架逻辑就是这样。如果Object_List里声明了某个对象但实际读取时返回UNKNOWN_OBJECT说明对象注册逻辑有问题如果Present_Value返回的类型标签不是Real说明属性编码有误。5.3 现场接入楼宇管理系统的调试顺序现场调试要按固定顺序来避免多个问题混在一起。第一步确认物理层连通BACnet/IP下用ping确认网络可达MS/TP下用串口工具确认总线有数据。第二步用扫描工具确认设备能被发现Who-Is有I-Am响应。第三步读取Device对象的几个关键属性确认Object_Identifier、Object_Name、Protocol_Services_Supported、Protocol_Object_Types_Supported都正确。第四步逐个读取实际业务对象的Present_Value确认数值合理。第五步测试WriteProperty从楼宇管理系统下发一个设定值观察设备端是否收到并执行。第六步测试COV订阅改变物理量输入确认楼宇管理系统能收到通知。这个顺序的好处是每一步只验证一个层面出问题时排查范围小。我见过有人跳过前三步直接测COV结果发现是设备实例号冲突白白花了一天时间。5.4 长时间运行稳定性验证的观察指标一致性测试通过后还需要做至少72小时的连续运行验证。重点观察四个指标内存使用是否持续增长、通信响应时间是否逐渐变长、COV通知是否按时到达、设备是否出现无响应后自动恢复的情况。如果内存持续增长大概率是动态分配没有正确释放需要检查事务缓冲和COV订阅表的生命周期管理。如果响应时间变长可能是地址缓存或路由表溢出需要检查缓存淘汰策略。我自己的习惯是在设备固件里加一个简单的统计计数器记录接收帧数、发送帧数、错误帧数、内存分配失败次数通过一个私有对象属性暴露出来。现场调试时用ReadProperty读一下这几个计数器就能快速判断设备运行状态。这个习惯帮我省了很多次现场排查的时间也建议你在移植时顺手加上。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

传统行业AI落地路径:从场景选型到规模化复制

传统行业AI落地路径:从场景选型到规模化复制

在传统行业里谈人工智能,我看到最多的表情不是期待,而是犹豫。犹豫的核心不是大家不懂AI的技术价值,而是不知道这东西放到自己的工厂、仓库、门店里,到底该从哪一步开始。做了十几年数字化咨询,我陪伴过不少企业&#…

2026/10/17 0:36:01 阅读更多 →
GPT-5.4与Claude Opus 4.6编程实测:快与稳的模型选型指南

GPT-5.4与Claude Opus 4.6编程实测:快与稳的模型选型指南

过去三周,我带着一个小团队集中精力做了一件事:把GPT-5.4和Claude Opus 4.6拖进同一个评测环境,用三十多个真实编码任务做了一轮编程能力对比。不是刷榜单、不是拍脑袋打分,而是带完整日志、失败记录和耗时统计的横向实测。结论先…

2026/10/17 0:36:01 阅读更多 →
AI供应商选型实战:技术与服务双维度平衡指南

AI供应商选型实战:技术与服务双维度平衡指南

这段时间一直在折腾AI应用,前后对接了七八家AI供应商,踩了不少坑。说实话,市面上的AI供应商五花八门,真正能用得顺手、关键时刻不掉链子的,比想象中少得多。这篇内容想聊的,就是我在选型和技术接入过程中&a…

2026/10/17 0:36:01 阅读更多 →

最新新闻

eWebEditor 11.0 商业版安装部署与 Word 导入功能配置实战

eWebEditor 11.0 商业版安装部署与 Word 导入功能配置实战

简介:eWebEditor11.0中文商业版是一款所见即所得的在线富文本编辑器,面向需要在网页中实现图文混排编辑的开发者与建站人员,可应用于新闻发布、通告记事、论坛发帖等场景,其内置的Word导入功能尤其实用,能大幅降低内容…

2026/10/17 7:09:04 阅读更多 →
跨平台SSL证书导入脚本:从手工操作到一键自动化

跨平台SSL证书导入脚本:从手工操作到一键自动化

简介:这份资源提供了一套跨平台的SSL证书导入脚本,面向需要在Windows与Linux服务器上配置HTTPS通信的运维人员及系统管理员。包内共2个文件,分别为Shell脚本与批处理脚本,压缩包仅578B,体积轻巧便于随项目分发。其中sh…

2026/10/17 7:09:04 阅读更多 →
AI批量清洗图片中文与水印:全托管供货图片质检过关实战方案

AI批量清洗图片中文与水印:全托管供货图片质检过关实战方案

做全托管供货的老哥,最近是不是又被平台的图片质检搞到心态崩了?上一秒还在为出单量兴奋,下一秒就收到驳回通知,理由通常是“图片存在非目标语言信息”“图片包含水印或第三方标识”“图片做过不当遮挡处理”。我在跨境供货圈里泡…

2026/10/17 7:09:04 阅读更多 →
Git代码审计实战:从提交规范到问题定位的完整工具箱

Git代码审计实战:从提交规范到问题定位的完整工具箱

1. 版本控制的底层逻辑:为什么审计能力决定了协作质量做开发这些年,我越来越觉得 Git 不仅仅是一个“存档工具”。很多人把 Git 当网盘用,一天下来就是add、commit、push三连,等到真出了问题——谁改的这行代码、为什么改、这个提…

2026/10/17 7:09:04 阅读更多 →
从零到生产:Agent开发原理与实战指南

从零到生产:Agent开发原理与实战指南

1. 为什么说现在入局Agent开发不算晚:先搞懂Agent到底是什么这两年“Agent”这个词几乎要被说烂了,打开技术社区满屏都是“智能体”“多Agent协作”“自主决策”,搞得好像不搞个Agent就不配叫AI从业者一样。但我在实际跟很多开发者聊下来的感…

2026/10/17 7:09:04 阅读更多 →
Windows虚拟化排查指南:从BIOS到Hyper-V的彻底解决

Windows虚拟化排查指南:从BIOS到Hyper-V的彻底解决

这个标题一看就是被模拟器、虚拟机折腾过的人写出来的。说实话,Windows上这颗“虚拟化”的雷,我踩过不下几十次,帮身边朋友排查也排了无数轮。明明主板的开关开了,BIOS里也看到了,系统里却还是提示“CPU 虚拟化已禁用”…

2026/10/17 7:08:04 阅读更多 →

日新闻

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

简介:《DeepSeek使用方法.pdf》是一份面向DeepSeek入门及进阶用户的完整使用指南,重点围绕V3与R1两款模型的能力差异与适用场景展开,帮助读者根据任务类型与成本选择合适的模型。资源共1个PDF文件,压缩包大小约311KB,篇…

2026/10/17 0:00:25 阅读更多 →
200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

简介:这是一份聚焦DeepSeek提示词优化的《200Deepseek润色指令》PDF文档,共收录两百余条可直接套用的润色指令,涵盖语法修正、风格统一、逻辑梳理、表达精炼等维度,并针对商务写作、学术论文、广告文案等场景给出差异化建议。文档…

2026/10/17 0:00:25 阅读更多 →
OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

简介:本资源是一份基于OpenCV的本科课程设计完整报告,面向计算机视觉初学者、图像处理学习者及高校通信/信息类专业学生,解决物体智能计数与检测结果结构化记录的实际问题。项目覆盖图像预处理、轮廓检测、边界框绘制、轨迹栏交互式参数调节、…

2026/10/17 0:00:25 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/16 15:04:24 阅读更多 →

月新闻

我发现了一个新思路:用 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/16 21:54:38 阅读更多 →
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/16 14:23:36 阅读更多 →