惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

腾讯CDC
The Cloudflare Blog
IT之家
IT之家
V
V2EX
雷峰网
雷峰网
MyScale Blog
MyScale Blog
P
Proofpoint News Feed
Stack Overflow Blog
Stack Overflow Blog
博客园 - Franky
Engineering at Meta
Engineering at Meta
S
SegmentFault 最新的问题
GbyAI
GbyAI
Microsoft Azure Blog
Microsoft Azure Blog
博客园 - 司徒正美
云风的 BLOG
云风的 BLOG
小众软件
小众软件
博客园 - 叶小钗
Blog — PlanetScale
Blog — PlanetScale
C
Check Point Blog
A
About on SuperTechFans
B
Blog
月光博客
月光博客
宝玉的分享
宝玉的分享
Last Week in AI
Last Week in AI

分享创造

分享 KCase 脑图测试用例生成平台(AI 辅助生成测试用例) 标签页囤积症自救:写了个插件 TabRack,主打快速检索、自动分类和 AI 摘要 [file-preview]一个比较全面的在线文件预览组件库-支持 react 和 vue 撸了个 iOS 小应用[极简水印相机],直接免费 做了一个 V2EX Skill 写了个 iOS 打码 App「遮鸭 Maskduck」,纯离线免费 35 岁前端,裁员失业后,我花 1 个月做了个 AI 生图网站 亲身经历猫咪急症,我做了一款猫狗疼痛检测工具,希望能救你家毛孩一命 如何用 AI 做比较酷炫的落地页? 求真!最近 AI 生图的能力强到可怕 开源一个查看 k8s 的菜单栏工具-kubebar Packpour:我做了个专门给 App Store Connect 填多语言元数据的小工具 面对 140 年一遇的超级厄尔尼诺,我做了个全球监测小站 做了一个自动翻译的 Hacker News 客户端 做了一个 AI 头像生成器,可以免费生成 2 次 [送码 50 个] 自己手搓了个高颜值的倒数日 App——拾光机,求 V 友们指点 一个将苹果健康 APP 数据导出的工具,然后把你的数据喂给 AI 分析 我做了一个叫「订阅斩」的 iOS App,专门对付那些悄悄扣钱的订阅 做了个草率的日麻互动漫画,听听反馈 喜欢自己洗车的朋友们,我用 ai 做了一款洗车小程序 -- 洗车志 感谢 V2EX 上各位 NAS🍆 和 Datahoarder 玩家的关注和真实反馈!作为个人开发者,能得到这么多硬核玩家们的讨论,我非常荣幸。 用 AI 开发熊孩子自律的小程序 用 OpenClaw 搭建个人运动助手 今天摸鱼给 NanaAI 也接入了 GPT-Image-2 [Video Companion]一个 chrome 插件,解决大多对视频操作的需求~欢迎使用提 bug AI 时代,做产品简单了,把产品推广出去却变的更难了~ bestskills.dev - Skills 精选和评测站点 免 ROOT 强力卸载安卓广告软件 一个 All In One 的运维工具,支持 SSH、数据库、Redis 管理 [开源] Codeg V0.10:专注于代码生成的多智能体 IDE(cc、codex、gemini、opencode……),新版本重构了工作区,飞一般的体验,支持桌面端、服务器部署
用 Node.js 写了个工业级 Modbus 协议栈,想听听大家的看法
xiejay97 · 2026-06-27 · via 分享创造

最近把一个压箱底的项目开源了:njs-modbus,一个零依赖、strict TypeScript 的 Node.js Modbus 协议栈,支持 TCP / RTU / ASCII / UDP / TLS 。

先上链接:


为什么又要造轮子?

在 IIoT 边缘干了十多年,被各种 Modbus 库坑惨了:

  • GC 一抖,100 ms 轮询变 300 ms ,PLC 直接报警;
  • 帧边界全靠"睡一会儿再读",产线 EMI 一来就粘包断包;
  • 每个请求 new 对象,几千点并发时 Node.js GC 过山车;
  • 安全策略等于"端口不外开",真放 DMZ 里连白名单都没有。

大多数 Node.js Modbus 库没把自己当成工业软件写。所以我们决定自己写一个:运行时零依赖、strict TypeScript ,从第一行代码就按产线标准来。


几个我们觉得不一样的地方

1. 热路径真的在抠微秒

  • TCP 编解码约 0.11 µs,RTU 约 0.12 µs,ASCII 约 0.13 µs
  • 解码路径 gc_ns_per_op = 0,不分配对象;
  • Queue 用七个平行原始类型数组 + head index ,拒绝 Array.shift()

不是炫技,是现场 P99 真的会被这些小地方吃掉。

2. 韧性不是边缘补丁

我们做了混沌测试:截断帧、粘包、垃圾字节、CRC 篡改、超长帧。结果是 TCP/RTU/ASCII 全过,而同类库在 RTU 上只有 8/12 和 3/12 。

更具体一点:噪声过去后,TCP 模式下约 270 µs、RTU 模式下约 850 µs 就能重新锁定下一帧头部,不销毁连接、不重启实例。

3. Transport-agnostic 是真的

Pipeline 层就一个薄接口:

interface AbstractPipelineAdapter {
  write(data: Buffer, cb?: (err?: Error) => void): void
  on(event: 'data', listener: (data: Buffer) => void): this
}

TCP 、TLS 、UDP 、Serial 、WebSocket 、你自己的硬件抽象,都能接。示例里 WebSocket Pipeline 只写了 133 行。

4. 安全不是"端口不外开"

  • 三关鉴权:unit 、address 、runtime ;
  • 连接级:IP 白名单(精确/CIDR/自定义 predicate )、maxConnections 、maxConnectionsPerIp 、idleTimeout ;
  • 原生 TLS ,含 mutual TLS ;
  • 所有拒绝都生成结构化 audit log ,可直接打 SIEM 。

想聊的

  1. 大家在工业现场用 Node.js 做 Modbus 主站/从站,最怕遇到什么问题?
  2. 你们觉得一个协议栈要做到什么程度,才敢写进给客户的技术方案?
  3. 严格 TS + 零依赖这条路线,在你们的项目里吃得开吗?

欢迎拍砖,Issue 和 PR 都开放。