开源计费系统NetBilling落地实践:核心链路、费率配置与避坑指南
简介NetBilling是一个面向网络服务提供商、电信运营商及需要精确计量收费场景的开源流量计费系统围绕区域流量核算提供灵活计费策略支持按地区、数据量、时间、用户类型等维度定制资费。资源包共包含三十三个文件整体大小仅50KB以Perl脚本、Shell脚本和HTML页面为主并辅以SQL数据库脚本、多语言文件、配置文件及安装说明便于快速部署与二次开发。压缩包内覆盖流量统计、账单生成、用户管理、支付集成等模块的参考实现并附有FreeBSD平台说明和示例页面结构清晰适合网络运维与开源开发者研究借鉴。目前已有九十七人学习下载通过阅读源码可以理解区域计费系统的核心架构与工作流程也可结合自身业务需求扩展功能构建定制化计费平台。1. 开源计费系统是不是个坑先想清楚NetBilling要解决什么问题很多团队直到产品要开放付费了才发现“计费”这件事比预想中麻烦得多。你以为计费就是“用了多少乘以单价再存个流水”等真正上线面对的是套餐扣费、赠费抵扣、阶梯计价、月底对账盘不平、用户投诉扣了两次钱这时候再回头补计费模块基本等于重构一遍核心链路。开源计费系统 NetBilling 这类项目就是把这套电信级计费领域沉淀下来的模型拿出来复用数据采集、批价、出账、结算是一条完整流水线不是几个表几个接口的事。这篇文章按我自己落地计费系统的顺序来讲先拆解一条用量数据是怎么变成账单金额的再做最小部署把第一个计费任务跑通然后深入费率配置和批价参数最后把实际项目里最容易翻车的五个问题摊开说。适合谁看有计费需求但没做过计费系统的后端工程师、从“送算力/送流量”这种运营模式往正式计费转的技术负责人、还有评估“开源计费系统能不能省掉自研成本”的架构师。2. 一条话单怎么变成一笔钱NetBilling 的核心链路与数据模型2.1 计费系统的四个核心环节计费系统最常见的误解是“批价就是查个价”。实际上从原始用量到最终账单中间要经过计量、标准化、批价、出账四个环节。开源计费系统 NetBilling 的架构也基本围绕这条链路展开你可以先把它理解成一条流水线每个环节的输入输出都是标准化的数据对象这样后续扩展计费模式才不会被卡死。第一个环节是计量。计量解决的是“用了多少”的问题。它有三种典型来源一是业务服务主动上报比如你在自己的应用里调用计费系统的 API 推送用量事件二是外部网元采集比如 CDN 节点的日志、短信网关的状态回执、云主机的监控采样三是定时拉取比如从数据库里批量扫描某段时间产生的记录。NetBilling 这类开源系统通常提供一个消息管道来承接这些来源避免上游突发流量直接把计费服务打垮。第二个环节是标准化。不同来源的原始数据格式千奇百怪有的是 JSON有的是 CSV有的时间字段用的是字符串有的用时间戳。标准化的作用就是把它们统一成内部的“事件模型”比如统一把时间转成 UTC 毫秒时间戳、把用户名映射成账户 ID、把业务量统一成秒/条/MB 这样的标准计量单位。这一步做不好的话后面费率的条件匹配会全是坑。第三个环节是批价也就是核心的计价过程。它拿标准化后的用量事件结合账户当前的产品包、剩余额度、费率和时间条件算出一笔金额。这里要处理的是“该用哪个费率”“是否被套餐抵扣”“抵扣之后剩多少进入阶梯计费”这一连串判断。批价是计费系统里分支逻辑最多、也最容易出对账差异的地方后面第四章会专门展开。第四个环节是出账与结算。批价产生了大量明细流水出账按账期比如自然月把明细聚合成一张账单并把折扣、减免、税费逐项计算进去。结算则处理资金层面的事情余额扣减、发票生成、对账文件输出。开源计费系统在这里通常提供可导出的账单格式方便你接自己的财务系统。很多团队做到第二、三环节就开始上线结果月底手工对账对到怀疑人生所以出账环节一定不要砍。2.2 典型数据模型账户、费率与用量记录我梳理数据模型时发现计费系统其实就围绕五个核心对象转账户、产品包、费率、用量事件、账单。把这五个表的关系理清楚后面所有配置和开发都有抓手。账户是计费的主体可以是用户、企业或某个设备它有一个总余额和一组产品包订阅关系。产品包描述“用户在某个时间段买了什么”比如“100GB 流量包有效期 30 天超出后按 0.15 元/GB 计费”。费率是计费系统的“价格表”它指示批价引擎在什么条件下按多少钱计算条件可以叠加时间段、用量区间、渠道来源等维度。用量事件是批价的输入账单是账期的输出两者通过流水明细关联。我在给模拟项目X设计这张表结构时经验是费率表必须单独抽出来而且要有版本字段。业务调价是常态没有版本控制的费率表历史账单一到对账就乱套。产品包和账户的关联表也要留“生效时间”和“失效时间”因为套餐续订、退订都是时间敏感操作。你可以在 NetBilling 的安装目录里看到类似的表结构定义核心表大概长这样-- 账户表计费主体和余额 CREATE TABLE account ( id BIGINT PRIMARY KEY, name VARCHAR(128) NOT NULL, balance_micro BIGINT NOT NULL DEFAULT 0, -- 余额单位用微单位避免浮点误差 currency VARCHAR(8) NOT NULL DEFAULT CNY, status SMALLINT NOT NULL DEFAULT 1, -- 1正常 2欠费 3冻结 created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ); -- 费率表批价引擎的价格依据带版本号 CREATE TABLE rate ( id BIGINT PRIMARY KEY, version INT NOT NULL, -- 费率版本调价时递增 name VARCHAR(64) NOT NULL, condition_sql VARCHAR(255), -- 匹配条件如 time_rangebusy unit_price_micro BIGINT NOT NULL, -- 单价微单位存储 unit VARCHAR(16) NOT NULL, -- 秒/SMS/MB effective_at TIMESTAMP NOT NULL, -- 生效时间 expire_at TIMESTAMP NOT NULL DEFAULT 2999-12-31 );余额和单价都建议用“微单位”存储也就是把元放大到百万倍存成整数。为什么浮点数在累计扣费场景下会产生精度漂移你单价 0.1 元扣 1000 次浮点累加很可能出现 99.999999 或 100.000001对账时就是分毫之差。用整数存微单位所有加减都是整数运算账目才能长期对平。对外展示时再除以 1000000 转成元这只是展示层的事情。NetBilling 的数据模型里我见过直接用 DECIMAL(20,4) 的那也行但上面这套整数方案在性能和对账上更省心。2.3 自己造轮子 vs 开源方案什么场景适合 NetBilling聊完链路和模型说点现实的。很多团队评估“要不要用开源计费系统”我给的判断标准很简单计费核心逻辑是不是你的业务壁垒。如果你的业务比的是“谁能便宜 10%”计费系统当然是核心竞争力值得自研哪怕慢一点。但如果计费只是支撑业务运转的基建那就应该站在开源方案的肩膀上把精力放在费率设计和产品策略上。我自己见过某公司一开始用一张数据库表加一个定时任务做扣费产品线从一条扩展到五条之后应付账期、退费、渠道分成、预付费余额表结构越改越乱最后花了两个月迁移到开源计费系统。迁移本身也不轻松但至少计费域的数据模型、批价流程、对账逻辑这些基础设施不用从零验证了。NetBilling 这类开源计费系统尤其适合流量型、事件型的计费场景API 调用次数、资源使用时长、消息条数、带宽流量、对象存储用量这些都是它的标准射程。不适合的场景也要说清楚如果你的计费高度依赖复杂的线下合同条款比如“A 客户充值满 10 万返 3 万分期抵扣抵扣比例每季度变化”这种倒不是开源系统做不了而是定制成本会很高。开源计费系统擅长的是“规则化、批量化的定价”那种极度个性化的合同价更适合在计费系统上层做一层策略透明、垫资或返现的营销系统不要让核心批价引擎背上这种偏业务的分支。3. 把 NetBilling 跑起来最小部署与验证3.1 组件依赖与选择理由开源计费系统通常不只是一个单体服务而是一组组件的协作。NetBilling 的最小可用集一般包括一个消息队列承接用量事件、一个业务数据库存账户费率和账单、一个缓存存实时余额和会话状态、一个批价引擎核心服务、一个管理后台配置费率和管理账户。你可能还会看到网关或 API 服务负责对外暴露接口。这套架构不是计费系统特有它是事件驱动架构在计费场景的常规用法。消息队列存在的理由很直接计费系统的调用方是业务系统业务系统的峰值流量不可控如果计费接口本身扛不住千万级瞬时上报就会拖垮业务主链路。引入消息队列之后业务方只要把事件投递到队列就立刻返回消费速度由计费系统自己控制流量再大也只是队列积压给扩容争取时间。数据库选型上业务数据一致性要求高账单、流水、账户余额这些必须用支持事务的关系型数据库MySQL 或 PostgreSQL 都行。缓存则用来扛高频的余额查询和扣减比如用户每次请求都要检查余额是否充足这种读多写少的场景用 Redis 能省掉大量数据库查询。实时扣费、实时余额控制这类功能需要缓存参与后面第六章会讲。部署方式上我一般会在生产环境用 Kubernetes 部署计费引擎通过水平扩展提升吞吐。但如果你只是评估或试用Docker Compose 起一套就足够了。下面这套最小集群就是基于 Compose 的思路你机器上装了 Docker 就能复现。3.2 用 Docker Compose 启动一个最小集群NetBilling 的发布包里通常会给出 docker-compose.yml 示例我习惯在这个基础上裁剪成最小的依赖集合。整体包含四个容器消息队列采用 Kafka 或 RabbitMQ 之一此处以 Kafka 作为示例、数据库采用 MySQL 或 PostgreSQL此处以 PostgreSQL 作为示例一是 JSONB 支持好二是对时间序列查询优化好三是许可证友好、缓存采用 Redis、以及计费引擎服务本体含一个简单的前端配置页。version: 3.8 services: postgres: image: postgres:15 environment: POSTGRES_DB: netbilling POSTGRES_USER: billing POSTGRES_PASSWORD: billing_pass volumes: - pg_data:/var/lib/postgresql/data ports: - 5432:5432 redis: image: redis:7 command: [redis-server, --appendonly, yes] ports: - 6379:6379 kafka: image: bitnami/kafka:3.4 environment: KAFKA_CFG_NODE_ID: 0 KAFKA_CFG_PROCESS_ROLES: controller,broker KAFKA_CFG_CONTROLLER_QUORUM_VOTERS: 0kafka:9093 KAFKA_CFG_LISTENERS: PLAINTEXT://:9092,CONTROLLER://:9093 KAFKA_CFG_ADVERTISED_LISTENERS: PLAINTEXT://localhost:9092 ports: - 9092:9092 engine: image: netbilling-engine:dev depends_on: - postgres - redis - kafka environment: DB_DSN: postgres://billing:billing_passpostgres:5432/netbilling REDIS_ADDR: redis:6379 KAFKA_BROKERS: kafka:9092 KAFKA_TOPIC_USAGE: usage-events ports: - 8080:8080 volumes: pg_data:这段编排里最需要注意的是 KAFKA 的 ADVERTISED_LISTENERS。如果你从宿主机上的客户端连 Kafka必须使用 localhost:9092如果你是容器间互连就要换成 kafka:9092。我第一次跑的时候没注意这个参数结果是容器里消费正常、宿主机里的命令行工具死活连不上换了 advertised listener 就好了。启动之后进入引擎容器的初始化脚本执行建表这是从源码仓库里的 migrations 目录映射进来的。初始化完成后引擎会在 8080 端口提供两个入口对业务方的计费 API 和对运营方的管理后台。你可以打开管理后台确认服务活着然后进入下一步推送第一条用量事件。3.3 推送第一条用量事件接口调用与验证流程服务跑起来之后第一个要验证的闭环是业务方推送一条用量事件批价引擎消费并计算金额最后在账单流水里能看到这条明细。NetBilling 对外暴露的计费接口通常按 REST 风格设计事件推送接口大致长这样curl -X POST http://localhost:8080/v1/usage \ -H Content-Type: application/json \ -H X-Tenant-ID: demo-tenant \ -d { event_id: 8f6b9c2e-8a1e-4c0a-9f3d-2b0e1a2b3c4d, account_id: acc_10001, usage_type: api_call, amount: 100, unit: count, occurred_at: 2025-04-01T08:30:00Z }这里的 event_id 是幂等键必填。计费系统保证同一个 event_id 只处理一次防止业务方重试导致重复扣费。usage_type 对应费率表里配置的产品类型amount 是本次用量数值unit 是计量单位occurred_at 是实际发生时间而不是推送时间。注意这四条字段的语义不能搞混尤其是 occurred_at很多踩坑都是把“推送时间”当作“发生时间”导致账期归属错误。推送成功后引擎会先往 Kafka 的 usage-events topic 里投一条原始事件然后消费端根据费率和账户配置进行批价最后把批价结果写入数据库流水表。你可以通过管理后台查询这笔事件的批价结果看它命中了哪个费率、折扣了多少、最终金额是多少。如果查到状态是 pending说明消息还在队列里被消费等几秒再查如果状态是 failed管理后台也会展示失败原因通常是费率没匹配上或账户状态不允许计费。验证到这一步计费闭环就算通了。剩下的工作是围绕这个闭环补充你业务里真正需要的细节这个消息事件要不要加字段、批价结果怎么回调给业务方、失败事件怎么重新投递。这些细节做好了系统才真正能用。4. 费率配置与批价参数账单准不准就看这三个地方4.1 费率表怎么组织从单一价格到多维条件费率是计费系统里最灵活也最容易配错的部分。一个刚入门的团队最容易犯的错误是把费率配置成“一个产品一条价格”的平铺表。等业务上线运营你会发现价格维度远不止产品类型工作日和周末计价不同用量超过阈值后价格跳档老客户享受折扣价不同渠道来的订单结算价不同。如果费率表没有设计维度概念这些需求都要靠改代码实现。我在实际项目里习惯把费率拆成两层费率版本和费率条目。费率版本对应一次调价事件比如“2025年4月价格调整”版本里包含多条费率条目。批价引擎匹配时会先根据账户和产品包锁定一个费率的生效版本再在这个版本内按条件匹配具体条目。这样做的好处是改价不影响历史账目对账时只要核对版本号就能确认某笔费用是用的哪版价格。NetBilling 管理后台里的费率配置界面一般会提供一组条件字段时间范围、用量区间、用户标签、渠道标签。比如这样一条费率就很典型条件维度配置值说明时间忙时 09:00-23:00忙时价格更高闲时打折用量区间0-1000区间内按基础单价计算用户标签新用户匹配标签的账户命中这条费率单价0.10 元/次最终批价单价批价引擎做的是“条件匹配叠加”先匹配产品包再匹配时间条件再匹配用量区间全中则采用这条费率进行计价。设计费率条目时彼此条件要互斥否则两条费率都能匹配批价结果就有随机性对账账目自然对不上。这个互斥要求需要在配置阶段想清楚不能完全依赖系统给你做冲突检测。4.2 批价引擎的三个关键参数精度、时间窗口与幂等批价引擎引入的第三个关键参数是“阶梯计价”的阈值。阶梯计价常见两种方式一是“总量阶梯”一次用量事件的量跨档后整体按高档计价二是“分段阶梯”每个档次区间单独计价再累加。对账单准确性影响最大的是第二条——分段阶梯。拿流量计费举例假设 0-100GB 单价 1 元/GB100GB 以上单价 0.8 元/GB用户用了 120GB。总量阶梯会算成 120×0.896 元分段阶梯会算成 100×120×0.8116 元。前者是优惠策略后者是常规计费语义。NetBilling 的批价引擎默认按分段阶梯处理这是电信级计费系统的习惯因为运营商要对“未超过阈值的部分按原价收取”这件事负责。批价还有一个容易被忽视的参数批价超时时间。计费调用往往在用户操作的主链路上比如用户发起一次付费请求要检查余额、扣费、写流水。如果批价引擎处理太慢请求会拖着主业务超时。实践中把批价超时设置在 200-500ms 是一个尽量平衡的选择超过直接返回失败由业务方决定重试或降级不要让计费成为整个系统的瓶颈。在 NetBilling 的配置文件里这三个参数分别对应计价精度、阶梯配置和批价超时我通常会先把它们写成显式常量而非直接从数据库读取减少上线时误触的可能。4.3 验证费率正确性的方法造数、对账、回归费率配得再精细最终也要能证明它算得对。我见过的计费系统上线事故里相当一部分不是代码逻辑错了而是费率配置错了把忙时配置到凌晨、把“新用户”标签配置反了、阶梯阈值写错单位。所以费率验证不是一个可有可无的步骤而是计费系统上线前的必经关卡。第一步是造数验证。不要拿生产数据测手写一组覆盖常规情况的测试用例每个用例包含输入事件、预期金额、预期费率版本。NetBilling 提供了批价引擎的调试页面可以输入一条模拟事件并实时看到匹配过程包括命中了哪些条件、哪条费率。把测试用例逐条敲进调试页核对实际金额与预期金额一致。第二步是对账回归。跑一个完整的账期模拟在月初导入一批存量账户和费率然后灌入当月的模拟用量事件月底结算出账。把账单金额和手工计算的 Excel 表格对比如果两份一致说明链路是通的。这一步能一次性暴露跨阶梯金额算错、折扣顺序错误、时间边界归属错误等问题。第三步是把这些测试用例固化成自动化回归脚本。费率调整频繁每调一次价就把回归脚本跑一遍。我管这套机制叫“后陡坡自我保护”没有回归测试的费率修改等于摸着石头过河哪次误配就会直接把对账干崩。有了自动化脚本再贵的调价操作也敢动。5. 计费系统避坑指南五个真实踩坑记录5.1 坑一账期错乱导致账单归属错误现象是月初跑出来的上月账单金额对不上而且错的部分全是月初和月末那几天的数据。仔细排查发现一批用户在月初凌晨产生的用量被归到了上月账单另一些月末夜间产生的量被归到了当月。原因出在事件时间戳的处理上。业务方上报用量事件时有些系统传的是本地时间字符串有些传的是带时区的 ISO 时间还有些传的是无时区的 Unix 时间戳。计费系统内部统一按 UTC 时间存储如果业务方传的是无时区时间戳消费端默认按 UTC 解析而实际业务方期望的是东八区的本地时间一进一出就差了 8 小时恰好把边界时间推到了另一个账期。解决的方法是两道第一事件接入标准化里强制要求时间字段必须是带时区的 ISO 8601 格式不带时区的直接拒收第二在出账环节设置“账期偏移量”参数明确账期边界是按哪个时区的零点切分。NetBilling 的账期配置里有一个 timezone 字段默认 UTC你把它配成自己的业务时区就能保证账单归属和用户感知一致。之后我的习惯是代码里所有时间存 UTC展示和出账边界都走时区配置再也不手算偏移。5.2 坑二重复计费现象是用户反馈“我那次请求被扣了两次钱”查数据库流水发现同一个 event_id 出现了两条记录金额相同批价时间相差不到一秒。原因是对业务方来说调用计费接口超时了它会自动重试。第一次请求其实已经成功只是响应在网络传输中丢失业务方重试后计费系统没有识别出同一个事件又批了一次价。这是典型的幂等缺失问题事件接口必须有“按幂等键去重”的保障。解决方式分两层第一层是在数据库层给 event_id 加上唯一索引重复插入直接报唯一约束错误第二层是在批价引擎里做内存幂等判断用 Redis 存最近处理过的 event_id批量判断已经处理过的事件直接跳过。实战中发现仅靠数据库唯一约束不够因为高并发下重复事件可能同时通过唯一约束检查两个事务都判断“可以插入”最后还是落到两行记录。Redis 的 SETNX 命令配合短过期时间能把这层判断前置挡住大量重复消费。配置上也开启了批价引擎的幂等开关默认开启禁止关闭。5.3 坑三阶梯计费跨档算错现象是用户对账发现某笔大额用量比手工算出来的金额少了一大截。比如 120GB 流量手工按分段阶梯算应该是 116 元系统批价出来是 96 元等于按总量阶梯算了。原因是我前面提到的两段阶梯语义在实现时被混淆。批价引擎对“用量区间”的匹配逻辑存在两种写法一种是在事件总量上进行匹配再统一计价另一种是在各分段区间内分别计价再求和。配置费率条目时如果把阶梯区间拆成了两个独立条目而引擎匹配到第一个区间就短路返回就会直接把整个量按第一个区间结算触发总量阶梯的效果。解决的思路是在配置费率条目时给每个阶梯区间加上显式的下一档指针例如“usage_start0, usage_end100, next_tierrate_2”让引擎明确知道超过区间上限要继续走下一档。此外把分段阶梯的金额计算结果打印到批价流水明细里形成多行明细每段一行对账时一眼就能看出总额是分档累加的而不是单行大额。管理后台的批价详情页打开明细展示这一步排查成本会大幅降低。5.4 坑四消息队列积压导致出账延迟现象是月底出账期间账单生成比平时慢了十几个小时运营同事催着要数据而消费端日志显示消费速率没有明显下降。原因是月底是出账和业务高峰重叠的时期业务方也在做各种活动事件量暴增。Kafka 的分区数是启动时固定好的消费端并发度受分区数限制如果分区数配少了消费端的并发扩展不上去消息就只能排队等着。解决方式是预估峰值吞吐来配置分区数。经验做法是按日常峰值流量的 3 到 5 倍规划分区数提前创建好 topic 并指定足够的分区。这个参数一旦上线不好改因为分区数只能增不能减而且要手动重分配数据所以启动前就要规划好。另外一个排查点是消费者的 poll 间隔时间如果消费端处理一条消息耗时过长超过了 Kafka 的 max.poll.interval.ms 默认值消费者会被踢出消费组导致整个消费组频繁重平衡消费速率更加恶化。我在配置里把 max.poll.interval.ms 提到 5 分钟并确保单条批价在毫秒级完成重平衡很少再发生。5.5 坑五数据库连接池被打爆现象是计费服务正常但账单查询接口偶发超时日志里报“连接池等待超时”数据库 CPU 不算高但连接数逼近上限。原因是管理后台和账单导出功能共用了一个数据库连接池导出大账期数据时一个导出任务会占用大量连接执行查询把其他请求的连接预算全部吃光。这在部署时完全没预料到因为功能测试时数据量小连接数根本不会成为瓶颈。解决方式是拆分数据访问路径。在线事务走主库连接池连接数设成比如 50离线导出和报表查询走只读副本连接池连接数设成 20 并且加上查询超时。这样即使导出任务再重也不会挤占在线计费的连接资源。NetBilling 的配置里支持设置多数据源在配置文件里把只读副本的地址配上给管理后台单独开一个数据源分组问题就干净利落地解决了。6. 进阶用法从月结账单走向实时余额控制跑通月结模式之后很多团队会发现业务方接下来提的需求是“实时扣费”用户余额不足时立刻停服务而不是等月底账单出来才发现欠费。这是计费系统从离线走向在线的高级形态NetBilling 也能支持但要做几个关键调整。第一个调整是数据路径。离线月结可以容忍秒级甚至分钟级延迟批量处理、定时结算都可以。实时余额控制要求批价结果在几百毫秒内回传业务方所以关键路径上要引入 Redis 存账户实时余额批价引擎先扣 Redis 余额再异步把流水落到数据库。这里有个一致性保障要做Redis 扣减用 Lua 脚本保证原子性数据库流水用消息队列异步落库两者通过事件 ID 关联对账时如果发现 Redis 余额与数据库累计流水不一致以数据库流水为准回放修正。第二个调整是阈值控制。实时控制不只需要“余额够不够”还要处理信用额度、免费额度、预警阈值三层逻辑。比如余额低于 10 元时触发预警通知余额降到 0 时停止服务但允许欠费 5 元以内的用户继续用。NetBilling 的账户模型里预留了 credit_limit 字段你把这三个阈值分别映射到余额、信用线和预警线就能做出分级控制。第三个调整是追诉与补偿。实时扣费意味着用户可能在一次请求中被扣了两次或批次错乱你需要一个对账补偿任务在后台定期扫描。我的做法是每十分钟跑一次对账检查 Redis 余额变化总和与数据库流水总和是否一致差异超过阈值就告警并自动生成补偿流水。这套机制上线一年帮我拦住了三次配置错误导致的余额异常算是整个系统里性价比最高的一个定时任务。我的习惯是计费系统的每一步改动都留一份「验证记录」包括配了哪些费率、跑了哪些测试用例、对账差异是多少。这样哪天线上账单出问题翻记录比翻代码快得多。希望这些经验能帮你在落地 NetBilling 或其他开源计费系统时少走几个弯路。本文还有配套的精品资源点击获取

相关新闻

力控实时数据库PSAPI SDK开发指南:从连接到读写与历史检索

力控实时数据库PSAPI SDK开发指南:从连接到读写与历史检索

简介:psAPISDK6.0.1.9_2是力控pspace实时数据库配套的接口开发SDK,面向使用C# .NET Framework 4.0的工业自动化程序开发者,用于解决监控系统中实时数据读写、点表管理、报警事件处理与用户权限控制等集成问题。该压缩包共49个文件&#xff0c…

2026/10/18 15:41:11 阅读更多 →
MLX-Swift零转换加载揭秘:SenseNova-U1.5-8B-MoT-8step-4bit在Apple Silicon上的运行时实现原理

MLX-Swift零转换加载揭秘:SenseNova-U1.5-8B-MoT-8step-4bit在Apple Silicon上的运行时实现原理

人工智能大模型多模态媒体生成模型量化 【免费下载链接】SenseNova-U1.5-8B-MoT-8step-4bit 项目地址: https://ai.gitcode.com/hf_mirrors/mlx-community/SenseNova-U1.5-8B-MoT-8step-4bit 点击查看 免费下载 SenseNova-U1.5-8B-MoT-8step-4bit 是商汤&#xff0…

2026/10/18 15:41:11 阅读更多 →
App内测分发方案与实践:从 APK/IPA 到二维码分发

App内测分发方案与实践:从 APK/IPA 到二维码分发

摘要:本文从技术实践角度,梳理 Android / iOS 内测分发的常见方式与优劣,重点介绍第三方分发平台的一般能力,并以海哈游分发为例演示上传 APK/IPA、生成短链与二维码、设置访问控制、分享给测试人员以及查看下载数据的完整流程&am…

2026/10/18 15:41:11 阅读更多 →

最新新闻

解析TMC文件自动生成C#结构体,PLC上位机通信不再靠手抄

解析TMC文件自动生成C#结构体,PLC上位机通信不再靠手抄

简介:面向工业自动化领域C#开发人员,这份工具包围绕倍福PLC的TMC文件自动生成C#类,帮助开发者省去手工编写结构体映射的繁琐工作,直接基于ADS协议在.NET环境中读写PLC变量。压缩包共19个文件,以可执行程序、DLL动态库和…

2026/10/18 16:37:39 阅读更多 →
2025 Agent 上下文工程实战:用 TaoToken 统一 Key 打通 Context Engineering 记忆链路,避坑指南!

2025 Agent 上下文工程实战:用 TaoToken 统一 Key 打通 Context Engineering 记忆链路,避坑指南!

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

2026/10/18 16:37:39 阅读更多 →
DockerDesktop容器化部署HermesAgent:TaoToken统一Key接入与本地验证

DockerDesktop容器化部署HermesAgent: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/18 16:37:39 阅读更多 →
UltraEdit 列编辑删除整列:Ctrl+C 选中列后一键清除的快捷键配置与验证

UltraEdit 列编辑删除整列:Ctrl+C 选中列后一键清除的快捷键配置与验证

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

2026/10/18 16:37:39 阅读更多 →
Flutter CustomPainter 实战:旋转太空人与呼吸蛛网动画

Flutter CustomPainter 实战:旋转太空人与呼吸蛛网动画

1. 项目缘起与整体设计思路1.1 为什么选择这个效果作为练手项目第一次看到这个效果的时候,我正坐在工位上刷手机,屏幕上那个旋转的小太空人配合着背后若隐若现的蛛网线条,视觉冲击力确实强。当时脑子里第一反应是:这玩意儿用原生A…

2026/10/18 16:37:39 阅读更多 →
进阶技巧:tipsv2-so400m14-dpt一次调用三任务 vs 单任务推理,如何选才最省算力

进阶技巧:tipsv2-so400m14-dpt一次调用三任务 vs 单任务推理,如何选才最省算力

【免费下载链接】tipsv2-so400m14-dpt 项目地址: https://ai.gitcode.com/hf_mirrors/google/tipsv2-so400m14-dpt 点击查看 免费下载 tipsv2-so400m14-dpt 是 Google 发布的用于深度估计的 DPT(Dense Prediction Transformer)密集预测模型&…

2026/10/18 16:36:38 阅读更多 →

日新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

月新闻

我发现了一个新思路:用 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/18 0:55:02 阅读更多 →
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/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练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/18 12:16:16 阅读更多 →